thirdweb 5.61.7-nightly-da9f1964e4ae74ed5d33666788e2d16e4d56614d-20241015000333 → 5.63.0-nightly-3a141e742c19eeeecf031a3014cb476ee69d4c0c-20241016000332

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 (264) hide show
  1. package/dist/cjs/exports/extensions/erc1155.js +3 -1
  2. package/dist/cjs/exports/extensions/erc1155.js.map +1 -1
  3. package/dist/cjs/extensions/erc1155/write/mintToBatch.js +79 -0
  4. package/dist/cjs/extensions/erc1155/write/mintToBatch.js.map +1 -0
  5. package/dist/cjs/extensions/erc721/lazyMinting/write/createDelayedRevealBatch.js +15 -4
  6. package/dist/cjs/extensions/erc721/lazyMinting/write/createDelayedRevealBatch.js.map +1 -1
  7. package/dist/cjs/react/core/utils/walletIcon.js +4 -0
  8. package/dist/cjs/react/core/utils/walletIcon.js.map +1 -1
  9. package/dist/cjs/react/native/ui/components/WalletImage.js +5 -2
  10. package/dist/cjs/react/native/ui/components/WalletImage.js.map +1 -1
  11. package/dist/cjs/react/native/ui/connect/ConnectModal.js +6 -6
  12. package/dist/cjs/react/native/ui/connect/ConnectModal.js.map +1 -1
  13. package/dist/cjs/react/native/ui/connect/ConnectedButton.js +2 -2
  14. package/dist/cjs/react/native/ui/connect/ConnectedButton.js.map +1 -1
  15. package/dist/cjs/react/native/ui/connect/ConnectedModal.js +3 -3
  16. package/dist/cjs/react/native/ui/connect/ConnectedModal.js.map +1 -1
  17. package/dist/cjs/react/native/ui/connect/InAppWalletUI.js +1 -0
  18. package/dist/cjs/react/native/ui/connect/InAppWalletUI.js.map +1 -1
  19. package/dist/cjs/react/native/ui/connect/ReceiveScreen.js +2 -2
  20. package/dist/cjs/react/native/ui/connect/ReceiveScreen.js.map +1 -1
  21. package/dist/cjs/react/native/ui/icons/svgs.js +20 -1
  22. package/dist/cjs/react/native/ui/icons/svgs.js.map +1 -1
  23. package/dist/cjs/react/web/wallets/in-app/WalletAuth.js +8 -0
  24. package/dist/cjs/react/web/wallets/in-app/WalletAuth.js.map +1 -1
  25. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js +2 -0
  26. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  27. package/dist/cjs/react/web/wallets/shared/OTPLoginUI.js +11 -16
  28. package/dist/cjs/react/web/wallets/shared/OTPLoginUI.js.map +1 -1
  29. package/dist/cjs/react/web/wallets/shared/PassKeyLogin.js +7 -0
  30. package/dist/cjs/react/web/wallets/shared/PassKeyLogin.js.map +1 -1
  31. package/dist/cjs/react/web/wallets/shared/SocialLogin.js +9 -12
  32. package/dist/cjs/react/web/wallets/shared/SocialLogin.js.map +1 -1
  33. package/dist/cjs/react/web/wallets/shared/oauthSignIn.js +1 -0
  34. package/dist/cjs/react/web/wallets/shared/oauthSignIn.js.map +1 -1
  35. package/dist/cjs/version.js +1 -1
  36. package/dist/cjs/wallets/in-app/{web/lib → core}/actions/generate-wallet.enclave.js +2 -2
  37. package/dist/cjs/wallets/in-app/core/actions/generate-wallet.enclave.js.map +1 -0
  38. package/dist/cjs/wallets/in-app/{web/lib → core}/actions/get-enclave-user-status.js +2 -2
  39. package/dist/cjs/wallets/in-app/core/actions/get-enclave-user-status.js.map +1 -0
  40. package/dist/cjs/wallets/in-app/{web/lib → core}/actions/sign-message.enclave.js +6 -5
  41. package/dist/cjs/wallets/in-app/core/actions/sign-message.enclave.js.map +1 -0
  42. package/dist/cjs/wallets/in-app/{web/lib → core}/actions/sign-transaction.enclave.js +6 -5
  43. package/dist/cjs/wallets/in-app/core/actions/sign-transaction.enclave.js.map +1 -0
  44. package/dist/cjs/wallets/in-app/{web/lib → core}/actions/sign-typed-data.enclave.js +6 -5
  45. package/dist/cjs/wallets/in-app/core/actions/sign-typed-data.enclave.js.map +1 -0
  46. package/dist/cjs/wallets/in-app/core/authentication/client-scoped-storage.js +9 -2
  47. package/dist/cjs/wallets/in-app/core/authentication/client-scoped-storage.js.map +1 -1
  48. package/dist/cjs/wallets/in-app/core/authentication/guest.js +1 -1
  49. package/dist/cjs/wallets/in-app/core/authentication/guest.js.map +1 -1
  50. package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js +4 -8
  51. package/dist/cjs/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
  52. package/dist/cjs/wallets/in-app/native/auth/passkeys.js +1 -1
  53. package/dist/cjs/wallets/in-app/native/auth/passkeys.js.map +1 -1
  54. package/dist/cjs/wallets/in-app/native/helpers/api/fetchers.js +14 -0
  55. package/dist/cjs/wallets/in-app/native/helpers/api/fetchers.js.map +1 -1
  56. package/dist/cjs/wallets/in-app/native/helpers/auth/middleware.js +3 -2
  57. package/dist/cjs/wallets/in-app/native/helpers/auth/middleware.js.map +1 -1
  58. package/dist/cjs/wallets/in-app/native/helpers/constants.js +2 -1
  59. package/dist/cjs/wallets/in-app/native/helpers/constants.js.map +1 -1
  60. package/dist/cjs/wallets/in-app/native/helpers/wallet/migration.js +133 -0
  61. package/dist/cjs/wallets/in-app/native/helpers/wallet/migration.js.map +1 -0
  62. package/dist/cjs/wallets/in-app/native/helpers/wallet/retrieval.js +2 -0
  63. package/dist/cjs/wallets/in-app/native/helpers/wallet/retrieval.js.map +1 -1
  64. package/dist/cjs/wallets/in-app/native/native-connector.js +50 -28
  65. package/dist/cjs/wallets/in-app/native/native-connector.js.map +1 -1
  66. package/dist/cjs/wallets/in-app/web/lib/auth/iframe-auth.js +2 -2
  67. package/dist/cjs/wallets/in-app/web/lib/auth/iframe-auth.js.map +1 -1
  68. package/dist/cjs/wallets/in-app/web/lib/auth/passkeys.js +1 -1
  69. package/dist/cjs/wallets/in-app/web/lib/auth/passkeys.js.map +1 -1
  70. package/dist/cjs/wallets/in-app/web/lib/web-connector.js +15 -13
  71. package/dist/cjs/wallets/in-app/web/lib/web-connector.js.map +1 -1
  72. package/dist/cjs/wallets/in-app/web/utils/iFrameCommunication/InAppWalletIframeCommunicator.js +1 -1
  73. package/dist/cjs/wallets/in-app/web/utils/iFrameCommunication/InAppWalletIframeCommunicator.js.map +1 -1
  74. package/dist/cjs/wallets/types.js +1 -0
  75. package/dist/cjs/wallets/types.js.map +1 -1
  76. package/dist/esm/exports/extensions/erc1155.js +1 -0
  77. package/dist/esm/exports/extensions/erc1155.js.map +1 -1
  78. package/dist/esm/extensions/erc1155/write/mintToBatch.js +76 -0
  79. package/dist/esm/extensions/erc1155/write/mintToBatch.js.map +1 -0
  80. package/dist/esm/extensions/erc721/lazyMinting/write/createDelayedRevealBatch.js +15 -4
  81. package/dist/esm/extensions/erc721/lazyMinting/write/createDelayedRevealBatch.js.map +1 -1
  82. package/dist/esm/react/core/utils/walletIcon.js +4 -0
  83. package/dist/esm/react/core/utils/walletIcon.js.map +1 -1
  84. package/dist/esm/react/native/ui/components/WalletImage.js +6 -3
  85. package/dist/esm/react/native/ui/components/WalletImage.js.map +1 -1
  86. package/dist/esm/react/native/ui/connect/ConnectModal.js +6 -6
  87. package/dist/esm/react/native/ui/connect/ConnectModal.js.map +1 -1
  88. package/dist/esm/react/native/ui/connect/ConnectedButton.js +2 -2
  89. package/dist/esm/react/native/ui/connect/ConnectedButton.js.map +1 -1
  90. package/dist/esm/react/native/ui/connect/ConnectedModal.js +3 -3
  91. package/dist/esm/react/native/ui/connect/ConnectedModal.js.map +1 -1
  92. package/dist/esm/react/native/ui/connect/InAppWalletUI.js +2 -1
  93. package/dist/esm/react/native/ui/connect/InAppWalletUI.js.map +1 -1
  94. package/dist/esm/react/native/ui/connect/ReceiveScreen.js +2 -2
  95. package/dist/esm/react/native/ui/connect/ReceiveScreen.js.map +1 -1
  96. package/dist/esm/react/native/ui/icons/svgs.js +19 -0
  97. package/dist/esm/react/native/ui/icons/svgs.js.map +1 -1
  98. package/dist/esm/react/web/wallets/in-app/WalletAuth.js +8 -0
  99. package/dist/esm/react/web/wallets/in-app/WalletAuth.js.map +1 -1
  100. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js +2 -0
  101. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  102. package/dist/esm/react/web/wallets/shared/OTPLoginUI.js +12 -17
  103. package/dist/esm/react/web/wallets/shared/OTPLoginUI.js.map +1 -1
  104. package/dist/esm/react/web/wallets/shared/PassKeyLogin.js +7 -0
  105. package/dist/esm/react/web/wallets/shared/PassKeyLogin.js.map +1 -1
  106. package/dist/esm/react/web/wallets/shared/SocialLogin.js +9 -12
  107. package/dist/esm/react/web/wallets/shared/SocialLogin.js.map +1 -1
  108. package/dist/esm/react/web/wallets/shared/oauthSignIn.js +1 -0
  109. package/dist/esm/react/web/wallets/shared/oauthSignIn.js.map +1 -1
  110. package/dist/esm/version.js +1 -1
  111. package/dist/esm/wallets/in-app/{web/lib → core}/actions/generate-wallet.enclave.js +2 -2
  112. package/dist/esm/wallets/in-app/core/actions/generate-wallet.enclave.js.map +1 -0
  113. package/dist/esm/wallets/in-app/{web/lib → core}/actions/get-enclave-user-status.js +2 -2
  114. package/dist/esm/wallets/in-app/core/actions/get-enclave-user-status.js.map +1 -0
  115. package/dist/esm/wallets/in-app/{web/lib → core}/actions/sign-message.enclave.js +6 -5
  116. package/dist/esm/wallets/in-app/core/actions/sign-message.enclave.js.map +1 -0
  117. package/dist/esm/wallets/in-app/{web/lib → core}/actions/sign-transaction.enclave.js +6 -5
  118. package/dist/esm/wallets/in-app/core/actions/sign-transaction.enclave.js.map +1 -0
  119. package/dist/esm/wallets/in-app/{web/lib → core}/actions/sign-typed-data.enclave.js +6 -5
  120. package/dist/esm/wallets/in-app/core/actions/sign-typed-data.enclave.js.map +1 -0
  121. package/dist/esm/wallets/in-app/core/authentication/client-scoped-storage.js +9 -2
  122. package/dist/esm/wallets/in-app/core/authentication/client-scoped-storage.js.map +1 -1
  123. package/dist/esm/wallets/in-app/core/authentication/guest.js +1 -1
  124. package/dist/esm/wallets/in-app/core/authentication/guest.js.map +1 -1
  125. package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js +4 -8
  126. package/dist/esm/wallets/in-app/core/wallet/enclave-wallet.js.map +1 -1
  127. package/dist/esm/wallets/in-app/native/auth/passkeys.js +1 -1
  128. package/dist/esm/wallets/in-app/native/auth/passkeys.js.map +1 -1
  129. package/dist/esm/wallets/in-app/native/helpers/api/fetchers.js +14 -0
  130. package/dist/esm/wallets/in-app/native/helpers/api/fetchers.js.map +1 -1
  131. package/dist/esm/wallets/in-app/native/helpers/auth/middleware.js +3 -2
  132. package/dist/esm/wallets/in-app/native/helpers/auth/middleware.js.map +1 -1
  133. package/dist/esm/wallets/in-app/native/helpers/constants.js +1 -0
  134. package/dist/esm/wallets/in-app/native/helpers/constants.js.map +1 -1
  135. package/dist/esm/wallets/in-app/native/helpers/wallet/migration.js +130 -0
  136. package/dist/esm/wallets/in-app/native/helpers/wallet/migration.js.map +1 -0
  137. package/dist/esm/wallets/in-app/native/helpers/wallet/retrieval.js +2 -2
  138. package/dist/esm/wallets/in-app/native/helpers/wallet/retrieval.js.map +1 -1
  139. package/dist/esm/wallets/in-app/native/native-connector.js +50 -28
  140. package/dist/esm/wallets/in-app/native/native-connector.js.map +1 -1
  141. package/dist/esm/wallets/in-app/web/lib/auth/iframe-auth.js +2 -2
  142. package/dist/esm/wallets/in-app/web/lib/auth/iframe-auth.js.map +1 -1
  143. package/dist/esm/wallets/in-app/web/lib/auth/passkeys.js +1 -1
  144. package/dist/esm/wallets/in-app/web/lib/auth/passkeys.js.map +1 -1
  145. package/dist/esm/wallets/in-app/web/lib/web-connector.js +15 -13
  146. package/dist/esm/wallets/in-app/web/lib/web-connector.js.map +1 -1
  147. package/dist/esm/wallets/in-app/web/utils/iFrameCommunication/InAppWalletIframeCommunicator.js +1 -1
  148. package/dist/esm/wallets/in-app/web/utils/iFrameCommunication/InAppWalletIframeCommunicator.js.map +1 -1
  149. package/dist/esm/wallets/types.js +1 -0
  150. package/dist/esm/wallets/types.js.map +1 -1
  151. package/dist/types/exports/extensions/erc1155.d.ts +1 -0
  152. package/dist/types/exports/extensions/erc1155.d.ts.map +1 -1
  153. package/dist/types/extensions/erc1155/write/mintToBatch.d.ts +72 -0
  154. package/dist/types/extensions/erc1155/write/mintToBatch.d.ts.map +1 -0
  155. package/dist/types/extensions/erc721/lazyMinting/write/createDelayedRevealBatch.d.ts.map +1 -1
  156. package/dist/types/react/core/utils/walletIcon.d.ts +2 -1
  157. package/dist/types/react/core/utils/walletIcon.d.ts.map +1 -1
  158. package/dist/types/react/native/ui/components/WalletImage.d.ts +2 -0
  159. package/dist/types/react/native/ui/components/WalletImage.d.ts.map +1 -1
  160. package/dist/types/react/native/ui/connect/ConnectModal.d.ts.map +1 -1
  161. package/dist/types/react/native/ui/connect/ConnectedButton.d.ts.map +1 -1
  162. package/dist/types/react/native/ui/connect/ConnectedModal.d.ts.map +1 -1
  163. package/dist/types/react/native/ui/connect/InAppWalletUI.d.ts.map +1 -1
  164. package/dist/types/react/native/ui/connect/ReceiveScreen.d.ts +2 -0
  165. package/dist/types/react/native/ui/connect/ReceiveScreen.d.ts.map +1 -1
  166. package/dist/types/react/native/ui/icons/svgs.d.ts +1 -0
  167. package/dist/types/react/native/ui/icons/svgs.d.ts.map +1 -1
  168. package/dist/types/react/web/wallets/in-app/WalletAuth.d.ts.map +1 -1
  169. package/dist/types/react/web/wallets/shared/ConnectWalletSocialOptions.d.ts.map +1 -1
  170. package/dist/types/react/web/wallets/shared/OTPLoginUI.d.ts.map +1 -1
  171. package/dist/types/react/web/wallets/shared/SocialLogin.d.ts.map +1 -1
  172. package/dist/types/react/web/wallets/shared/oauthSignIn.d.ts.map +1 -1
  173. package/dist/types/version.d.ts +1 -1
  174. package/dist/types/wallets/in-app/core/actions/generate-wallet.enclave.d.ts +13 -0
  175. package/dist/types/wallets/in-app/core/actions/generate-wallet.enclave.d.ts.map +1 -0
  176. package/dist/types/wallets/in-app/core/actions/get-enclave-user-status.d.ts +14 -0
  177. package/dist/types/wallets/in-app/core/actions/get-enclave-user-status.d.ts.map +1 -0
  178. package/dist/types/wallets/in-app/core/actions/sign-message.enclave.d.ts +17 -0
  179. package/dist/types/wallets/in-app/core/actions/sign-message.enclave.d.ts.map +1 -0
  180. package/dist/types/wallets/in-app/core/actions/sign-transaction.enclave.d.ts +9 -0
  181. package/dist/types/wallets/in-app/core/actions/sign-transaction.enclave.d.ts.map +1 -0
  182. package/dist/types/wallets/in-app/{web/lib → core}/actions/sign-typed-data.enclave.d.ts +3 -5
  183. package/dist/types/wallets/in-app/core/actions/sign-typed-data.enclave.d.ts.map +1 -0
  184. package/dist/types/wallets/in-app/core/authentication/client-scoped-storage.d.ts +4 -3
  185. package/dist/types/wallets/in-app/core/authentication/client-scoped-storage.d.ts.map +1 -1
  186. package/dist/types/wallets/in-app/core/authentication/types.d.ts +1 -1
  187. package/dist/types/wallets/in-app/core/authentication/types.d.ts.map +1 -1
  188. package/dist/types/wallets/in-app/core/wallet/enclave-wallet.d.ts +6 -7
  189. package/dist/types/wallets/in-app/core/wallet/enclave-wallet.d.ts.map +1 -1
  190. package/dist/types/wallets/in-app/native/helpers/api/fetchers.d.ts.map +1 -1
  191. package/dist/types/wallets/in-app/native/helpers/constants.d.ts +1 -0
  192. package/dist/types/wallets/in-app/native/helpers/constants.d.ts.map +1 -1
  193. package/dist/types/wallets/in-app/native/helpers/wallet/migration.d.ts +17 -0
  194. package/dist/types/wallets/in-app/native/helpers/wallet/migration.d.ts.map +1 -0
  195. package/dist/types/wallets/in-app/native/helpers/wallet/retrieval.d.ts +27 -0
  196. package/dist/types/wallets/in-app/native/helpers/wallet/retrieval.d.ts.map +1 -1
  197. package/dist/types/wallets/in-app/native/native-connector.d.ts +2 -2
  198. package/dist/types/wallets/in-app/native/native-connector.d.ts.map +1 -1
  199. package/dist/types/wallets/in-app/web/lib/auth/iframe-auth.d.ts.map +1 -1
  200. package/dist/types/wallets/in-app/web/lib/web-connector.d.ts +1 -1
  201. package/dist/types/wallets/in-app/web/lib/web-connector.d.ts.map +1 -1
  202. package/dist/types/wallets/types.d.ts +2 -2
  203. package/dist/types/wallets/types.d.ts.map +1 -1
  204. package/package.json +5 -1
  205. package/src/exports/extensions/erc1155.ts +5 -0
  206. package/src/extensions/erc1155/write/mintToBatch.test.ts +74 -0
  207. package/src/extensions/erc1155/write/mintToBatch.ts +117 -0
  208. package/src/extensions/erc721/lazyMinting/write/createDelayedRevealBatch.test.ts +75 -80
  209. package/src/extensions/erc721/lazyMinting/write/createDelayedRevealBatch.ts +18 -4
  210. package/src/react/core/utils/walletIcon.ts +5 -0
  211. package/src/react/native/ui/components/WalletImage.tsx +8 -2
  212. package/src/react/native/ui/connect/ConnectModal.tsx +19 -2
  213. package/src/react/native/ui/connect/ConnectedButton.tsx +8 -2
  214. package/src/react/native/ui/connect/ConnectedModal.tsx +9 -2
  215. package/src/react/native/ui/connect/InAppWalletUI.tsx +2 -0
  216. package/src/react/native/ui/connect/ReceiveScreen.tsx +5 -2
  217. package/src/react/native/ui/icons/svgs.ts +20 -0
  218. package/src/react/web/wallets/in-app/WalletAuth.tsx +8 -0
  219. package/src/react/web/wallets/shared/ConnectWalletSocialOptions.tsx +2 -0
  220. package/src/react/web/wallets/shared/OTPLoginUI.tsx +12 -18
  221. package/src/react/web/wallets/shared/PassKeyLogin.tsx +7 -0
  222. package/src/react/web/wallets/shared/SocialLogin.tsx +9 -12
  223. package/src/react/web/wallets/shared/oauthSignIn.ts +1 -0
  224. package/src/version.ts +1 -1
  225. package/src/wallets/in-app/{web/lib → core}/actions/generate-wallet.enclave.ts +6 -8
  226. package/src/wallets/in-app/{web/lib → core}/actions/get-enclave-user-status.ts +5 -5
  227. package/src/wallets/in-app/{web/lib → core}/actions/sign-message.enclave.ts +7 -9
  228. package/src/wallets/in-app/{web/lib → core}/actions/sign-transaction.enclave.ts +8 -10
  229. package/src/wallets/in-app/{web/lib → core}/actions/sign-typed-data.enclave.ts +7 -9
  230. package/src/wallets/in-app/core/authentication/client-scoped-storage.ts +6 -4
  231. package/src/wallets/in-app/core/authentication/guest.ts +1 -1
  232. package/src/wallets/in-app/core/authentication/types.ts +1 -0
  233. package/src/wallets/in-app/core/wallet/enclave-wallet.ts +11 -17
  234. package/src/wallets/in-app/native/auth/passkeys.ts +1 -1
  235. package/src/wallets/in-app/native/helpers/api/fetchers.ts +14 -0
  236. package/src/wallets/in-app/native/helpers/auth/middleware.ts +3 -2
  237. package/src/wallets/in-app/native/helpers/constants.ts +2 -0
  238. package/src/wallets/in-app/native/helpers/wallet/migration.ts +185 -0
  239. package/src/wallets/in-app/native/helpers/wallet/retrieval.ts +2 -2
  240. package/src/wallets/in-app/native/native-connector.ts +62 -28
  241. package/src/wallets/in-app/web/lib/auth/iframe-auth.ts +2 -2
  242. package/src/wallets/in-app/web/lib/auth/passkeys.ts +1 -1
  243. package/src/wallets/in-app/web/lib/web-connector.ts +15 -13
  244. package/src/wallets/in-app/web/utils/iFrameCommunication/InAppWalletIframeCommunicator.ts +1 -1
  245. package/src/wallets/types.ts +1 -0
  246. package/dist/cjs/wallets/in-app/web/lib/actions/generate-wallet.enclave.js.map +0 -1
  247. package/dist/cjs/wallets/in-app/web/lib/actions/get-enclave-user-status.js.map +0 -1
  248. package/dist/cjs/wallets/in-app/web/lib/actions/sign-message.enclave.js.map +0 -1
  249. package/dist/cjs/wallets/in-app/web/lib/actions/sign-transaction.enclave.js.map +0 -1
  250. package/dist/cjs/wallets/in-app/web/lib/actions/sign-typed-data.enclave.js.map +0 -1
  251. package/dist/esm/wallets/in-app/web/lib/actions/generate-wallet.enclave.js.map +0 -1
  252. package/dist/esm/wallets/in-app/web/lib/actions/get-enclave-user-status.js.map +0 -1
  253. package/dist/esm/wallets/in-app/web/lib/actions/sign-message.enclave.js.map +0 -1
  254. package/dist/esm/wallets/in-app/web/lib/actions/sign-transaction.enclave.js.map +0 -1
  255. package/dist/esm/wallets/in-app/web/lib/actions/sign-typed-data.enclave.js.map +0 -1
  256. package/dist/types/wallets/in-app/web/lib/actions/generate-wallet.enclave.d.ts +0 -15
  257. package/dist/types/wallets/in-app/web/lib/actions/generate-wallet.enclave.d.ts.map +0 -1
  258. package/dist/types/wallets/in-app/web/lib/actions/get-enclave-user-status.d.ts +0 -14
  259. package/dist/types/wallets/in-app/web/lib/actions/get-enclave-user-status.d.ts.map +0 -1
  260. package/dist/types/wallets/in-app/web/lib/actions/sign-message.enclave.d.ts +0 -19
  261. package/dist/types/wallets/in-app/web/lib/actions/sign-message.enclave.d.ts.map +0 -1
  262. package/dist/types/wallets/in-app/web/lib/actions/sign-transaction.enclave.d.ts +0 -11
  263. package/dist/types/wallets/in-app/web/lib/actions/sign-transaction.enclave.d.ts.map +0 -1
  264. package/dist/types/wallets/in-app/web/lib/actions/sign-typed-data.enclave.d.ts.map +0 -1
@@ -0,0 +1,117 @@
1
+ import { maxUint256 } from "viem";
2
+ import { multicall } from "../../../extensions/common/__generated__/IMulticall/write/multicall.js";
3
+ import { upload } from "../../../storage/upload.js";
4
+ import type {
5
+ BaseTransactionOptions,
6
+ WithOverrides,
7
+ } from "../../../transaction/types.js";
8
+ import type { NFTInput } from "../../../utils/nft/parseNft.js";
9
+ import { encodeMintTo } from "../__generated__/IMintableERC1155/write/mintTo.js";
10
+
11
+ /**
12
+ * @extension ERC1155
13
+ */
14
+ export type MintToBatchParams = WithOverrides<{
15
+ /**
16
+ * The wallet that the NFTs will be minted to
17
+ */
18
+ to: string;
19
+ /**
20
+ * An array of NFT metadata & supply to mint
21
+ * @example
22
+ * ```ts
23
+ * const nfts = [
24
+ * {
25
+ * metadata: { name: "token 0" },
26
+ * supply: 1n,
27
+ * },
28
+ * {
29
+ * metadata: { name: "token 1" },
30
+ * supply: 10n,
31
+ * },
32
+ * ]
33
+ * ```
34
+ */
35
+ nfts: Array<{
36
+ supply: bigint;
37
+ metadata: NFTInput | string;
38
+ }>;
39
+ }>;
40
+
41
+ /**
42
+ * This extension batches multiple `mintTo` extensions into one single multicall.
43
+ * Keep in mind that there is a limit of how many NFTs you can mint per transaction.
44
+ * This limit varies depends on the network that you are transacting on.
45
+ *
46
+ * You are recommended to experiment with the number to figure out the best number for your chain of choice.
47
+ * @param options - the transaction options
48
+ * @returns A promise that resolves to the transaction result.
49
+ * @extension ERC1155
50
+ * @example
51
+ * ```ts
52
+ * import { mintBatchTo } from "thirdweb/extension/erc1155";
53
+ *
54
+ * const transaction = mintToBatch({
55
+ * contract: editionContract,
56
+ * to: "0x...",
57
+ * nfts: [
58
+ * {
59
+ * metadata: {
60
+ * name: "Token #0",
61
+ * image: "...",
62
+ * attributes: [],
63
+ * },
64
+ * supply: 100n,
65
+ * },
66
+ * {
67
+ * metadata: {
68
+ * name: "Token #1",
69
+ * image: "...",
70
+ * attributes: [],
71
+ * },
72
+ * supply: 111n,
73
+ * },
74
+ * ],
75
+ * });
76
+ *
77
+ * await sendTransaction({ transaction, account });
78
+ * ```
79
+ */
80
+ export function mintToBatch(
81
+ options: BaseTransactionOptions<MintToBatchParams>,
82
+ ) {
83
+ return multicall({
84
+ contract: options.contract,
85
+ asyncParams: async () => {
86
+ const uris = await Promise.all(
87
+ options.nfts.map((item) => {
88
+ if (typeof item.metadata === "string") {
89
+ return item.metadata;
90
+ }
91
+ return upload({
92
+ client: options.contract.client,
93
+ files: [item.metadata],
94
+ });
95
+ }),
96
+ );
97
+
98
+ const data = uris.map((uri, index) => {
99
+ const item = options.nfts[index];
100
+ if (!item) {
101
+ // Should not happen
102
+ throw new Error("Index mismatch");
103
+ }
104
+ return encodeMintTo({
105
+ to: options.to,
106
+ // maxUint256 is used to indicate that this is a NEW token!
107
+ tokenId: maxUint256,
108
+ uri,
109
+ amount: item.supply,
110
+ });
111
+ });
112
+
113
+ return { data };
114
+ },
115
+ overrides: options.overrides,
116
+ });
117
+ }
@@ -1,97 +1,92 @@
1
- import { beforeAll, describe, expect, it, vi } from "vitest";
1
+ import { describe, expect, it } from "vitest";
2
+ import { TEST_CONTRACT_URI } from "~test/ipfs-uris.js";
3
+ import { TEST_ACCOUNT_D } from "~test/test-wallets.js";
2
4
  import { ANVIL_CHAIN } from "../../../../../test/src/chains.js";
3
5
  import { TEST_CLIENT } from "../../../../../test/src/test-clients.js";
4
- import {
5
- type ThirdwebContract,
6
- getContract,
7
- } from "../../../../contract/contract.js";
8
- import type { Hex } from "../../../../utils/encoding/hex.js";
6
+ import { getContract } from "../../../../contract/contract.js";
7
+ import { deployERC721Contract } from "../../../../extensions/prebuilts/deploy-erc721.js";
8
+ import { sendAndConfirmTransaction } from "../../../../transaction/actions/send-and-confirm-transaction.js";
9
+ import { getNFT } from "../../read/getNFT.js";
9
10
  import { createDelayedRevealBatch } from "./createDelayedRevealBatch.js";
11
+ import { reveal } from "./reveal.js";
10
12
 
11
- const mocks = vi.hoisted(() => ({
12
- getBaseUriFromBatch: vi.fn(),
13
- getBaseURICount: vi.fn(),
14
- encryptDecrypt: vi.fn(),
15
- lazyMint: vi.fn(),
16
- upload: vi.fn(),
17
- }));
18
-
19
- vi.mock("../../../../utils/ipfs.js", () => ({
20
- getBaseUriFromBatch: mocks.getBaseUriFromBatch,
21
- }));
22
-
23
- vi.mock(
24
- "../../__generated__/IBatchMintMetadata/read/getBaseURICount.js",
25
- () => ({
26
- getBaseURICount: mocks.getBaseURICount,
27
- }),
28
- );
29
-
30
- vi.mock("../../__generated__/IDelayedReveal/read/encryptDecrypt.js", () => ({
31
- encryptDecrypt: mocks.encryptDecrypt,
32
- }));
33
-
34
- vi.mock("../../../../storage/upload.js", () => ({
35
- upload: mocks.upload,
36
- }));
37
-
38
- const placeholderNFT = {
13
+ const placeholderMetadata = {
39
14
  name: "Hidden NFT",
40
15
  description: "Will be revealed next week!",
41
16
  };
17
+ const account = TEST_ACCOUNT_D;
18
+ const chain = ANVIL_CHAIN;
19
+ const client = TEST_CLIENT;
20
+ const password = "1234";
42
21
 
43
- const realNFTs = [
44
- {
45
- name: "Common NFT #1",
46
- description: "Common NFT, one of many.",
47
- },
48
- {
49
- name: "Super Rare NFT #2",
50
- description: "You got a Super Rare NFT!",
51
- },
52
- ];
22
+ describe.runIf(process.env.TW_SECRET_KEY)("createDelayedRevealedBatch", () => {
23
+ it("should create delayed-reveal batches properly", async () => {
24
+ const contract = getContract({
25
+ address: await deployERC721Contract({
26
+ account,
27
+ chain,
28
+ client,
29
+ type: "DropERC721",
30
+ params: {
31
+ name: "nftdrop",
32
+ contractURI: TEST_CONTRACT_URI,
33
+ },
34
+ }),
35
+ chain,
36
+ client,
37
+ });
53
38
 
54
- describe("createDelayedRevealedBatch", () => {
55
- let contract: ThirdwebContract;
56
- beforeAll(() => {
57
- vi.clearAllMocks();
58
- contract = getContract({
59
- chain: ANVIL_CHAIN,
60
- address: "0x708781BAE850faA490cB5b5b16b4687Ec0A8D65D",
61
- client: TEST_CLIENT,
39
+ // Create batch #0
40
+ await sendAndConfirmTransaction({
41
+ account,
42
+ transaction: createDelayedRevealBatch({
43
+ contract,
44
+ placeholderMetadata,
45
+ password: "1234",
46
+ metadata: [{ name: "token 0" }, { name: "token 1" }],
47
+ }),
62
48
  });
63
- });
64
49
 
65
- it("should generate the proper calldata", async () => {
66
- mocks.getBaseUriFromBatch
67
- .mockReturnValueOnce(
68
- "ipfs://QmQbqDu4aT7sMJHNUk76s4F6DgGk2hVYXYSqpsTRoRM5G8/",
69
- )
70
- .mockReturnValueOnce(
71
- "ipfs://QmRhASFGXNRE3NXNTfakz82j4Tmv5A9rBezTKGZ5DL6uip/",
72
- );
73
- mocks.getBaseURICount.mockResolvedValue(0n);
74
- mocks.encryptDecrypt.mockResolvedValue(
75
- "0x8967ae24bd1c6439791bc1c8ca3b3499537283b71af366693792a707eb99e80bc0058c90c1f92f18ec716e4760fdf9279241d442b5b5",
76
- );
50
+ // Create batch #1
51
+ await sendAndConfirmTransaction({
52
+ account,
53
+ transaction: createDelayedRevealBatch({
54
+ contract,
55
+ placeholderMetadata,
56
+ password,
57
+ metadata: [{ name: "token 2" }, { name: "token 3" }],
58
+ }),
59
+ });
77
60
 
78
- const tx = createDelayedRevealBatch({
79
- contract,
80
- placeholderMetadata: placeholderNFT,
81
- metadata: realNFTs,
82
- password: "password123",
61
+ // Reveal batch #0
62
+ await sendAndConfirmTransaction({
63
+ account,
64
+ transaction: reveal({ contract, batchId: 0n, password }),
65
+ });
66
+ // Reveal batch #1
67
+ await sendAndConfirmTransaction({
68
+ account,
69
+ transaction: reveal({ contract, batchId: 1n, password }),
83
70
  });
84
71
 
85
- let data: Hex;
86
- if (typeof tx.data === "string") {
87
- data = tx.data;
88
- } else {
89
- data = (await tx.data?.()) || "0x";
90
- }
72
+ /**
73
+ * The token URIs of batch 0 should end with "/0" and "/1"
74
+ * while the token URIs of batch 1 should end with "/2" and "/3"
75
+ */
76
+ const [token0, token1, token2, token3] = await Promise.all([
77
+ getNFT({ contract, tokenId: 0n }),
78
+ getNFT({ contract, tokenId: 1n }),
79
+ getNFT({ contract, tokenId: 2n }),
80
+ getNFT({ contract, tokenId: 3n }),
81
+ ]);
91
82
 
92
- expect(data).toEqual(
93
- "0xd37c353b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d516271447534615437734d4a484e556b3736733446364467476b3268565958595371707354526f524d3547382f0000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000040963325533d81f66ae93aff4f562735814e51020ea8bf2bd48eb983ae88cbc40b00000000000000000000000000000000000000000000000000000000000000368967ae24bd1c6439791bc1c8ca3b3499537283b71af366693792a707eb99e80bc0058c90c1f92f18ec716e4760fdf9279241d442b5b500000000000000000000",
94
- );
95
- expect(mocks.upload).toHaveBeenCalledTimes(2);
83
+ expect(token0.tokenURI.endsWith("/0")).toBe(true);
84
+ expect(token0.metadata.name).toBe("token 0");
85
+ expect(token1.tokenURI.endsWith("/1")).toBe(true);
86
+ expect(token1.metadata.name).toBe("token 1");
87
+ expect(token2.tokenURI.endsWith("/2")).toBe(true);
88
+ expect(token2.metadata.name).toBe("token 2");
89
+ expect(token3.tokenURI.endsWith("/3")).toBe(true);
90
+ expect(token3.metadata.name).toBe("token 3");
96
91
  });
97
92
  });
@@ -14,6 +14,7 @@ import {
14
14
  encryptDecrypt,
15
15
  isEncryptDecryptSupported,
16
16
  } from "../../__generated__/IDelayedReveal/read/encryptDecrypt.js";
17
+ import { nextTokenIdToMint } from "../../__generated__/IERC721Enumerable/read/nextTokenIdToMint.js";
17
18
  import {
18
19
  lazyMint as generatedLazyMint,
19
20
  isLazyMintSupported,
@@ -80,16 +81,29 @@ export function createDelayedRevealBatch(
80
81
  return generatedLazyMint({
81
82
  contract: options.contract,
82
83
  asyncParams: async () => {
83
- const placeholderUris = await upload({
84
- client: options.contract.client,
85
- files: Array(options.metadata.length).fill(options.placeholderMetadata),
86
- });
84
+ const [placeholderUris, startFileNumber] = await Promise.all([
85
+ upload({
86
+ client: options.contract.client,
87
+ files: Array(options.metadata.length).fill(
88
+ options.placeholderMetadata,
89
+ ),
90
+ }),
91
+ nextTokenIdToMint({
92
+ contract: options.contract,
93
+ }),
94
+ ]);
87
95
  const placeholderUri = getBaseUriFromBatch(placeholderUris);
88
96
 
89
97
  const uris = await upload({
90
98
  client: options.contract.client,
91
99
  files: options.metadata,
100
+ // IMPORTANT: File number has to be calculated properly otherwise the whole batch will break
101
+ // e.g: If you are uploading a second batch, the file name should never start from `0`
102
+ rewriteFileNames: {
103
+ fileStartNumber: Number(startFileNumber),
104
+ },
92
105
  });
106
+
93
107
  const baseUri = getBaseUriFromBatch(uris);
94
108
  const baseUriId = await getBaseURICount({
95
109
  contract: options.contract,
@@ -15,6 +15,8 @@ const farcasterIconUri =
15
15
  "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cmVjdCB3aWR0aD0iMTAwMCIgaGVpZ2h0PSIxMDAwIiByeD0iMjAwIiBmaWxsPSIjODU1RENEIi8+CjxwYXRoIGQ9Ik0yNTcuNzc4IDE1NS41NTZINzQyLjIyMlY4NDQuNDQ0SDY3MS4xMTFWNTI4Ljg4OUg2NzAuNDE0QzY2Mi41NTQgNDQxLjY3NyA1ODkuMjU4IDM3My4zMzMgNTAwIDM3My4zMzNDNDEwLjc0MiAzNzMuMzMzIDMzNy40NDYgNDQxLjY3NyAzMjkuNTg2IDUyOC44ODlIMzI4Ljg4OVY4NDQuNDQ0SDI1Ny43NzhWMTU1LjU1NloiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik0xMjguODg5IDI1My4zMzNMMTU3Ljc3OCAzNTEuMTExSDE4Mi4yMjJWNzQ2LjY2N0MxNjkuOTQ5IDc0Ni42NjcgMTYwIDc1Ni42MTYgMTYwIDc2OC44ODlWNzk1LjU1NkgxNTUuNTU2QzE0My4yODMgNzk1LjU1NiAxMzMuMzMzIDgwNS41MDUgMTMzLjMzMyA4MTcuNzc4Vjg0NC40NDRIMzgyLjIyMlY4MTcuNzc4QzM4Mi4yMjIgODA1LjUwNSAzNzIuMjczIDc5NS41NTYgMzYwIDc5NS41NTZIMzU1LjU1NlY3NjguODg5QzM1NS41NTYgNzU2LjYxNiAzNDUuNjA2IDc0Ni42NjcgMzMzLjMzMyA3NDYuNjY3SDMwNi42NjdWMjUzLjMzM0gxMjguODg5WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTY3NS41NTYgNzQ2LjY2N0M2NjMuMjgzIDc0Ni42NjcgNjUzLjMzMyA3NTYuNjE2IDY1My4zMzMgNzY4Ljg4OVY3OTUuNTU2SDY0OC44ODlDNjM2LjYxNiA3OTUuNTU2IDYyNi42NjcgODA1LjUwNSA2MjYuNjY3IDgxNy43NzhWODQ0LjQ0NEg4NzUuNTU2VjgxNy43NzhDODc1LjU1NiA4MDUuNTA1IDg2NS42MDYgNzk1LjU1NiA4NTMuMzMzIDc5NS41NTZIODQ4Ljg4OVY3NjguODg5Qzg0OC44ODkgNzU2LjYxNiA4MzguOTQgNzQ2LjY2NyA4MjYuNjY3IDc0Ni42NjdWMzUxLjExMUg4NTEuMTExTDg4MCAyNTMuMzMzSDcwMi4yMjJWNzQ2LjY2N0g2NzUuNTU2WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==";
16
16
  const telegramIconUri =
17
17
  "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAwMHB4IiBoZWlnaHQ9IjEwMDBweCIgdmlld0JveD0iMCAwIDEwMDAgMTAwMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNTMuMiAoNzI2NDMpIC0gaHR0cHM6Ly9za2V0Y2hhcHAuY29tIC0tPgogICAgPHRpdGxlPkFydGJvYXJkPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI1MCUiIHkxPSIwJSIgeDI9IjUwJSIgeTI9Ijk5LjI1ODM0MDQlIiBpZD0ibGluZWFyR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyQUFCRUUiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIyOUVEOSIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJBcnRib2FyZCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudC0xKSIgY3g9IjUwMCIgY3k9IjUwMCIgcj0iNTAwIj48L2NpcmNsZT4KICAgICAgICA8cGF0aCBkPSJNMjI2LjMyODQxOSw0OTQuNzIyMDY5IEMzNzIuMDg4NTczLDQzMS4yMTY2ODUgNDY5LjI4NDgzOSwzODkuMzUwMDQ5IDUxNy45MTcyMTYsMzY5LjEyMjE2MSBDNjU2Ljc3MjUzNSwzMTEuMzY3NDMgNjg1LjYyNTQ4MSwzMDEuMzM0ODE1IDcwNC40MzE0MjcsMzAxLjAwMzUzMiBDNzA4LjU2NzYyMSwzMDAuOTMwNjcgNzE3LjgxNTgzOSwzMDEuOTU1NzQzIDcyMy44MDY0NDYsMzA2LjgxNjcwNyBDNzI4Ljg2NDc5NywzMTAuOTIxMjEgNzMwLjI1NjU1MiwzMTYuNDY1ODEgNzMwLjkyMjU1MSwzMjAuMzU3MzI5IEM3MzEuNTg4NTUxLDMyNC4yNDg4NDggNzMyLjQxNzg3OSwzMzMuMTEzODI4IDczMS43NTg2MjYsMzQwLjA0MDY2NiBDNzI0LjIzNDAwNyw0MTkuMTAyNDg2IDY5MS42NzUxMDQsNjEwLjk2NDY3NCA2NzUuMTEwOTgyLDY5OS41MTUyNjcgQzY2OC4xMDIwOCw3MzYuOTg0MzQyIDY1NC4zMDEzMzYsNzQ5LjU0NzUzMiA2NDAuOTQwNjE4LDc1MC43NzcwMDYgQzYxMS45MDQ2ODQsNzUzLjQ0ODkzOCA1ODkuODU2MTE1LDczMS41ODgwMzUgNTYxLjczMzM5Myw3MTMuMTUzMjM3IEM1MTcuNzI2ODg2LDY4NC4zMDY0MTYgNDkyLjg2NjAwOSw2NjYuMzQ5MTgxIDQ1MC4xNTAwNzQsNjM4LjIwMDAxMyBDNDAwLjc4NDQyLDYwNS42Njg3OCA0MzIuNzg2MTE5LDU4Ny43ODkwNDggNDYwLjkxOTQ2Miw1NTguNTY4NTYzIEM0NjguMjgyMDkxLDU1MC45MjE0MjMgNTk2LjIxNTA4LDQzNC41NTY0NzkgNTk4LjY5MTIyNyw0MjQuMDAwMzU1IEM1OTkuMDAwOTEsNDIyLjY4MDEzNSA1OTkuMjg4MzEyLDQxNy43NTg5ODEgNTk2LjM2NDc0LDQxNS4xNjA0MzEgQzU5My40NDExNjgsNDEyLjU2MTg4MSA1ODkuMTI2MjI5LDQxMy40NTA0ODQgNTg2LjAxMjQ0OCw0MTQuMTU3MTk4IEM1ODEuNTk4NzU4LDQxNS4xNTg5NDMgNTExLjI5Nzc5Myw0NjEuNjI1Mjc0IDM3NS4xMDk1NTMsNTUzLjU1NjE4OSBDMzU1LjE1NDg1OCw1NjcuMjU4NjIzIDMzNy4wODA1MTUsNTczLjkzNDkwOCAzMjAuODg2NTI0LDU3My41ODUwNDYgQzMwMy4wMzM5NDgsNTczLjE5OTM1MSAyNjguNjkyNzU0LDU2My40OTA5MjggMjQzLjE2MzYwNiw1NTUuMTkyNDA4IEMyMTEuODUxMDY3LDU0NS4wMTM5MzYgMTg2Ljk2NDQ4NCw1MzkuNjMyNTA0IDE4OS4xMzE1NDcsNTIyLjM0NjMwOSBDMTkwLjI2MDI4Nyw1MTMuMzQyNTg5IDIwMi42NTkyNDQsNTA0LjEzNDUwOSAyMjYuMzI4NDE5LDQ5NC43MjIwNjkgWiIgaWQ9IlBhdGgtMyIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=";
18
+ const twitchIconUri =
19
+ "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMjQwMCAyODAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNDAwIDI4MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRkZGRkZGO30KCS5zdDF7ZmlsbDojOTE0NkZGO30KPC9zdHlsZT4KPHRpdGxlPkFzc2V0IDI8L3RpdGxlPgo8Zz4KCTxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMjIwMCwxMzAwIDE4MDAsMTcwMCAxNDAwLDE3MDAgMTA1MCwyMDUwIDEwNTAsMTcwMCA2MDAsMTcwMCA2MDAsMjAwIDIyMDAsMjAwIAkiLz4KCTxnPgoJCTxnIGlkPSJMYXllcl8xLTIiPgoJCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNNTAwLDBMMCw1MDB2MTgwMGg2MDB2NTAwbDUwMC01MDBoNDAwbDkwMC05MDBWMEg1MDB6IE0yMjAwLDEzMDBsLTQwMCw0MDBoLTQwMGwtMzUwLDM1MHYtMzUwSDYwMFYyMDBoMTYwMAoJCQkJVjEzMDB6Ii8+CgkJCTxyZWN0IHg9IjE3MDAiIHk9IjU1MCIgY2xhc3M9InN0MSIgd2lkdGg9IjIwMCIgaGVpZ2h0PSI2MDAiLz4KCQkJPHJlY3QgeD0iMTE1MCIgeT0iNTUwIiBjbGFzcz0ic3QxIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjYwMCIvPgoJCTwvZz4KCTwvZz4KPC9nPgo8L3N2Zz4K";
18
20
  const xIcon =
19
21
  "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIwIiBoZWlnaHQ9IjMyMCIgdmlld0JveD0iMCAwIDMyMCAzMjAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIzMjAiIGhlaWdodD0iMzIwIiByeD0iMjQiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0xNzcuMzE1IDE0NS4zMzVMMjQ1LjA2OCA2N0gyMjkuMDEzTDE3MC4xODIgMTM1LjAxN0wxMjMuMTk1IDY3SDY5TDE0MC4wNTUgMTY5Ljg1NEw2OSAyNTJIODUuMDU2M0wxNDcuMTgzIDE4MC4xNzJMMTk2LjgwNSAyNTJIMjUxTDE3Ny4zMTEgMTQ1LjMzNUgxNzcuMzE1Wk0xNTUuMzIzIDE3MC43NkwxNDguMTI0IDE2MC41MThMOTAuODQxNyA3OS4wMjJIMTE1LjUwM0wxNjEuNzMxIDE0NC43OTJMMTY4LjkzIDE1NS4wMzRMMjI5LjAyIDI0MC41MjVIMjA0LjM1OUwxNTUuMzIzIDE3MC43NjRWMTcwLjc2WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==";
20
22
  export const emailIcon =
@@ -40,6 +42,7 @@ export const socialIcons = {
40
42
  x: xIcon,
41
43
  farcaster: farcasterIconUri,
42
44
  telegram: telegramIconUri,
45
+ twitch: twitchIconUri,
43
46
  };
44
47
 
45
48
  // TODO: this should return actual <svg> elements so they can be themed
@@ -69,6 +72,8 @@ export function getWalletIcon(provider: string) {
69
72
  return farcasterIconUri;
70
73
  case "telegram":
71
74
  return telegramIconUri;
75
+ case "twitch":
76
+ return twitchIconUri;
72
77
  case "guest":
73
78
  return guestIcon;
74
79
  default:
@@ -1,4 +1,6 @@
1
1
  import { useQuery } from "@tanstack/react-query";
2
+ import type { ThirdwebClient } from "../../../../client/client.js";
3
+ import { resolveScheme } from "../../../../utils/ipfs.js";
2
4
  import { nativeLocalStorage } from "../../../../utils/storage/nativeStorage.js";
3
5
  import { getWalletInfo } from "../../../../wallets/__generated__/getWalletInfo.js";
4
6
  import type { Wallet } from "../../../../wallets/interfaces/wallet.js";
@@ -17,6 +19,7 @@ import {
17
19
  PASSKEY_ICON,
18
20
  PHONE_ICON,
19
21
  TELEGRAM_ICON,
22
+ TWITCH_ICON,
20
23
  WALLET_ICON,
21
24
  X_ICON,
22
25
  } from "../icons/svgs.js";
@@ -25,10 +28,11 @@ import { RNImage } from "./RNImage.js";
25
28
  export const WalletImage = (props: {
26
29
  theme: Theme;
27
30
  wallet: Wallet;
31
+ client: ThirdwebClient;
28
32
  size: number;
29
33
  avatar?: string | null;
30
34
  }) => {
31
- const { wallet, avatar, size } = props;
35
+ const { wallet, avatar, size, client } = props;
32
36
 
33
37
  const { data: imageData } = useQuery({
34
38
  queryKey: ["wallet-image", wallet.id, wallet.getAccount()?.address],
@@ -55,7 +59,7 @@ export const WalletImage = (props: {
55
59
  try {
56
60
  const externalWalletImage = await getWalletInfo(activeEOAId, true);
57
61
  if (externalWalletImage) {
58
- return externalWalletImage;
62
+ return resolveScheme({ client, uri: externalWalletImage });
59
63
  }
60
64
  } catch {}
61
65
 
@@ -99,6 +103,8 @@ export function getAuthProviderImage(authProvider: string | null): string {
99
103
  return FARCASTER_ICON;
100
104
  case "telegram":
101
105
  return TELEGRAM_ICON;
106
+ case "twitch":
107
+ return TWITCH_ICON;
102
108
  case "guest":
103
109
  return GUEST_ICON;
104
110
  default:
@@ -2,6 +2,7 @@ import { useCallback, useState } from "react";
2
2
  import { Platform, StyleSheet, View } from "react-native";
3
3
  import { SvgXml } from "react-native-svg";
4
4
  import type { Chain } from "../../../../chains/types.js";
5
+ import type { ThirdwebClient } from "../../../../client/client.js";
5
6
  import type { MultiStepAuthProviderType } from "../../../../wallets/in-app/core/authentication/types.js";
6
7
  import type { InAppWalletAuth } from "../../../../wallets/in-app/core/wallet/types.js";
7
8
  import type { Wallet } from "../../../../wallets/interfaces/wallet.js";
@@ -269,6 +270,7 @@ export function ConnectModal(
269
270
  <WalletLoadingView
270
271
  theme={theme}
271
272
  wallet={modalState.wallet}
273
+ client={client}
272
274
  authProvider={modalState.authMethod}
273
275
  />
274
276
  {containerType === "modal" ? (
@@ -328,6 +330,7 @@ export function ConnectModal(
328
330
  )}
329
331
  <SignInView
330
332
  theme={theme}
333
+ client={client}
331
334
  siweAuth={siweAuth}
332
335
  onSignIn={() => props.onClose?.()}
333
336
  onError={(error) => setModalState({ screen: "error", error })}
@@ -462,10 +465,12 @@ export function ConnectModal(
462
465
  function WalletLoadingView({
463
466
  theme,
464
467
  wallet,
468
+ client,
465
469
  authProvider,
466
470
  }: {
467
471
  theme: Theme;
468
472
  wallet: Wallet;
473
+ client: ThirdwebClient;
469
474
  authProvider?: InAppWalletAuth;
470
475
  }) {
471
476
  const walletInfo = useWalletInfo(wallet.id);
@@ -500,7 +505,12 @@ function WalletLoadingView({
500
505
  />
501
506
  </View>
502
507
  ) : (
503
- <WalletImage theme={theme} size={90} wallet={wallet} />
508
+ <WalletImage
509
+ theme={theme}
510
+ size={90}
511
+ wallet={wallet}
512
+ client={client}
513
+ />
504
514
  )}
505
515
  </WalletLoadingThumbnail>
506
516
  <Spacer size="xl" />
@@ -522,12 +532,14 @@ function WalletLoadingView({
522
532
  function SignInView({
523
533
  theme,
524
534
  siweAuth,
535
+ client,
525
536
  onSignIn,
526
537
  onError,
527
538
  onDisconnect,
528
539
  }: {
529
540
  theme: Theme;
530
541
  siweAuth: ReturnType<typeof useSiweAuth>;
542
+ client: ThirdwebClient;
531
543
  onSignIn: () => void;
532
544
  onError: (error: string) => void;
533
545
  onDisconnect: () => void;
@@ -552,7 +564,12 @@ function SignInView({
552
564
  imageSize={100}
553
565
  animate={isSigningIn}
554
566
  >
555
- <WalletImage theme={theme} size={90} wallet={wallet} />
567
+ <WalletImage
568
+ theme={theme}
569
+ size={90}
570
+ wallet={wallet}
571
+ client={client}
572
+ />
556
573
  </WalletLoadingThumbnail>
557
574
  <Spacer size="xl" />
558
575
  <ThemedText theme={theme} type="subtitle">
@@ -20,7 +20,7 @@ export function ConnectedButton(
20
20
  },
21
21
  ) {
22
22
  const theme = parseTheme(props.theme);
23
- const { account, wallet } = props;
23
+ const { account, wallet, client } = props;
24
24
  const walletChain = useActiveWalletChain();
25
25
  const { pfp, name, balanceQuery } = useConnectedWalletDetails(
26
26
  props.client,
@@ -40,7 +40,13 @@ export function ConnectedButton(
40
40
  }}
41
41
  >
42
42
  <View style={styles.row}>
43
- <WalletImage theme={theme} size={40} wallet={wallet} avatar={pfp} />
43
+ <WalletImage
44
+ theme={theme}
45
+ size={40}
46
+ wallet={wallet}
47
+ avatar={pfp}
48
+ client={client}
49
+ />
44
50
  <View style={styles.col}>
45
51
  <ThemedText
46
52
  theme={theme}
@@ -85,6 +85,7 @@ export function ConnectedModal(props: ConnectedModalProps) {
85
85
  <ReceiveScreen
86
86
  account={props.account}
87
87
  wallet={props.wallet}
88
+ client={props.client}
88
89
  theme={theme}
89
90
  containerType={props.containerType}
90
91
  onBack={() => setModalState({ screen: "account" })}
@@ -161,7 +162,7 @@ export function ConnectedModal(props: ConnectedModalProps) {
161
162
  }
162
163
 
163
164
  const AccountHeader = (props: ConnectedModalProps) => {
164
- const { account, wallet, theme } = props;
165
+ const { account, wallet, theme, client } = props;
165
166
  const walletChain = useActiveWalletChain();
166
167
  const { pfp, name, balanceQuery } = useConnectedWalletDetails(
167
168
  props.client,
@@ -171,7 +172,13 @@ const AccountHeader = (props: ConnectedModalProps) => {
171
172
  );
172
173
  return (
173
174
  <View style={styles.accountHeaderContainer}>
174
- <WalletImage theme={theme} size={70} wallet={wallet} avatar={pfp} />
175
+ <WalletImage
176
+ theme={theme}
177
+ size={70}
178
+ wallet={wallet}
179
+ avatar={pfp}
180
+ client={client}
181
+ />
175
182
  <SmartAccountBadge client={props.client} theme={theme} />
176
183
  <Spacer size="smd" />
177
184
  <Address account={account} theme={theme} addressOrENS={name} />
@@ -37,6 +37,7 @@ import {
37
37
  GOOGLE_ICON,
38
38
  LINE_ICON,
39
39
  TELEGRAM_ICON,
40
+ TWITCH_ICON,
40
41
  X_ICON,
41
42
  } from "../icons/svgs.js";
42
43
  import type { ModalState } from "./ConnectModal.js";
@@ -61,6 +62,7 @@ const socialIcons = {
61
62
  x: X_ICON,
62
63
  farcaster: FARCASTER_ICON,
63
64
  telegram: TELEGRAM_ICON,
65
+ twitch: TWITCH_ICON,
64
66
  };
65
67
 
66
68
  type InAppWalletFormUIProps = {
@@ -1,4 +1,5 @@
1
1
  import { StyleSheet, View } from "react-native";
2
+ import type { ThirdwebClient } from "../../../../client/client.js";
2
3
  import { shortenAddress } from "../../../../utils/address.js";
3
4
  import type { Account, Wallet } from "../../../../wallets/interfaces/wallet.js";
4
5
  import type { Theme } from "../../../core/design-system/index.js";
@@ -16,10 +17,12 @@ type ReceiveScreenProps = {
16
17
  onClose?: () => void;
17
18
  onBack?: () => void;
18
19
  containerType: ContainerType;
20
+ client: ThirdwebClient;
19
21
  };
20
22
 
21
23
  export const ReceiveScreen = (props: ReceiveScreenProps) => {
22
- const { wallet, account, theme, onClose, onBack, containerType } = props;
24
+ const { wallet, account, theme, onClose, onBack, containerType, client } =
25
+ props;
23
26
 
24
27
  return (
25
28
  <>
@@ -32,7 +35,7 @@ export const ReceiveScreen = (props: ReceiveScreenProps) => {
32
35
  />
33
36
  <View style={styles.container}>
34
37
  {/* TODO (rn) QR code scanning */}
35
- <WalletImage theme={theme} wallet={wallet} size={80} />
38
+ <WalletImage theme={theme} wallet={wallet} size={80} client={client} />
36
39
  <Spacer size="lg" />
37
40
  <View
38
41
  style={[
@@ -71,6 +71,26 @@ export const TELEGRAM_ICON = `<svg width={width} height={height} viewBox="0 0 10
71
71
  </g>
72
72
  </svg>`;
73
73
 
74
+ export const TWITCH_ICON = `<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
75
+ viewBox="0 0 2400 2800" style="enable-background:new 0 0 2400 2800;" xml:space="preserve">
76
+ <style type="text/css">
77
+ .st0{fill:#FFFFFF;}
78
+ .st1{fill:#9146FF;}
79
+ </style>
80
+ <title>Asset 2</title>
81
+ <g>
82
+ <polygon class="st0" points="2200,1300 1800,1700 1400,1700 1050,2050 1050,1700 600,1700 600,200 2200,200 "/>
83
+ <g>
84
+ <g id="Layer_1-2">
85
+ <path class="st1" d="M500,0L0,500v1800h600v500l500-500h400l900-900V0H500z M2200,1300l-400,400h-400l-350,350v-350H600V200h1600
86
+ V1300z"/>
87
+ <rect x="1700" y="550" class="st1" width="200" height="600"/>
88
+ <rect x="1150" y="550" class="st1" width="200" height="600"/>
89
+ </g>
90
+ </g>
91
+ </g>
92
+ </svg>`;
93
+
74
94
  export const EMAIL_ICON = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
75
95
  <path d="M13.3335 2.6665H2.66683C1.93045 2.6665 1.3335 3.26346 1.3335 3.99984V11.9998C1.3335 12.7362 1.93045 13.3332 2.66683 13.3332H13.3335C14.0699 13.3332 14.6668 12.7362 14.6668 11.9998V3.99984C14.6668 3.26346 14.0699 2.6665 13.3335 2.6665Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
76
96
  <path d="M14.6668 4.6665L8.68683 8.4665C8.48101 8.59545 8.24304 8.66384 8.00016 8.66384C7.75728 8.66384 7.51931 8.59545 7.3135 8.4665L1.3335 4.6665" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
@@ -1,6 +1,7 @@
1
1
  import { Suspense, useRef, useState } from "react";
2
2
  import { defineChain } from "../../../../chains/utils.js";
3
3
  import type { ThirdwebClient } from "../../../../client/client.js";
4
+ import { isEcosystemWallet } from "../../../../wallets/ecosystem/is-ecosystem-wallet.js";
4
5
  import { linkProfile } from "../../../../wallets/in-app/web/lib/auth/index.js";
5
6
  import type { Wallet } from "../../../../wallets/interfaces/wallet.js";
6
7
  import type { EcosystemWalletId } from "../../../../wallets/wallet-types.js";
@@ -43,6 +44,12 @@ export function WalletAuth(props: {
43
44
  );
44
45
  const [error, setError] = useState<string | undefined>();
45
46
  const [showAll, setShowAll] = useState<boolean>(false);
47
+ const ecosystem = isEcosystemWallet(wallet)
48
+ ? {
49
+ id: wallet.id,
50
+ partnerId: wallet.getConfig()?.partnerId,
51
+ }
52
+ : undefined;
46
53
 
47
54
  const back = () => {
48
55
  setStatus("selecting");
@@ -59,6 +66,7 @@ export function WalletAuth(props: {
59
66
  strategy: "wallet",
60
67
  wallet: walletToLink,
61
68
  chain: wallet.getChain() || defineChain(1),
69
+ ecosystem,
62
70
  }).catch((e) => {
63
71
  setError(e.message);
64
72
  throw e;
@@ -114,6 +114,7 @@ export const ConnectWalletSocialOptions = (
114
114
  coinbase: "Coinbase",
115
115
  farcaster: "Farcaster",
116
116
  telegram: "Telegram",
117
+ twitch: "Twitch",
117
118
  };
118
119
 
119
120
  const { data: ecosystemAuthOptions, isLoading } = useQuery({
@@ -262,6 +263,7 @@ export const ConnectWalletSocialOptions = (
262
263
  closeOpenedWindow: (openedWindow: Window) => {
263
264
  openedWindow.close();
264
265
  },
266
+ ecosystem: ecosystemInfo,
265
267
  };
266
268
 
267
269
  const connectPromise = (() => {