@seedprotocol/publish 0.6.7 → 0.6.8

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 (255) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +69 -11
  3. package/dist/chainConfig-3sSqEVQh.js +1433 -0
  4. package/dist/chainConfig-3sSqEVQh.js.map +1 -0
  5. package/dist/chainConfig-3wlYarAG.js +1433 -0
  6. package/dist/chainConfig-3wlYarAG.js.map +1 -0
  7. package/dist/chainConfig-BRcsMopd.js +1442 -0
  8. package/dist/chainConfig-BRcsMopd.js.map +1 -0
  9. package/dist/chainConfig-BYm5OXpk.js +1433 -0
  10. package/dist/chainConfig-BYm5OXpk.js.map +1 -0
  11. package/dist/chainConfig-CfVGYAsY.js +1311 -0
  12. package/dist/chainConfig-CfVGYAsY.js.map +1 -0
  13. package/dist/chainConfig-DDA4YmAB.js +1424 -0
  14. package/dist/chainConfig-DDA4YmAB.js.map +1 -0
  15. package/dist/config-CPBd5C_b.js +1201 -0
  16. package/dist/config-CPBd5C_b.js.map +1 -0
  17. package/dist/config-DkIapO94.js +955 -0
  18. package/dist/config-DkIapO94.js.map +1 -0
  19. package/dist/config-EQZZNH9H.js +955 -0
  20. package/dist/config-EQZZNH9H.js.map +1 -0
  21. package/dist/config.d.ts +85 -6
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/ensureAutomationSessionKey-BMHLKfjj.js +85 -0
  24. package/dist/ensureAutomationSessionKey-BMHLKfjj.js.map +1 -0
  25. package/dist/ensureAutomationSessionKey-BZ9_3FMW.js +86 -0
  26. package/dist/ensureAutomationSessionKey-BZ9_3FMW.js.map +1 -0
  27. package/dist/ensureAutomationSessionKey-C8D7BFjU.js +85 -0
  28. package/dist/ensureAutomationSessionKey-C8D7BFjU.js.map +1 -0
  29. package/dist/ensureAutomationSessionKey-CClLVX2w.js +85 -0
  30. package/dist/ensureAutomationSessionKey-CClLVX2w.js.map +1 -0
  31. package/dist/ensureAutomationSessionKey-CNNN1jBQ.js +85 -0
  32. package/dist/ensureAutomationSessionKey-CNNN1jBQ.js.map +1 -0
  33. package/dist/ensureAutomationSessionKey-D8Gki6U6.js +85 -0
  34. package/dist/ensureAutomationSessionKey-D8Gki6U6.js.map +1 -0
  35. package/dist/ensureAutomationSessionKey-DEH7nwUc.js +86 -0
  36. package/dist/ensureAutomationSessionKey-DEH7nwUc.js.map +1 -0
  37. package/dist/ensureAutomationSessionKey-Dhvbii2M.js +86 -0
  38. package/dist/ensureAutomationSessionKey-Dhvbii2M.js.map +1 -0
  39. package/dist/ensureAutomationSessionKey-Dyfk8qVp.js +85 -0
  40. package/dist/ensureAutomationSessionKey-Dyfk8qVp.js.map +1 -0
  41. package/dist/ensureModularPublishBootstrap-5HJDqJJM.js +24 -0
  42. package/dist/ensureModularPublishBootstrap-5HJDqJJM.js.map +1 -0
  43. package/dist/ensureModularPublishBootstrap-BW8jKN_A.js +24 -0
  44. package/dist/ensureModularPublishBootstrap-BW8jKN_A.js.map +1 -0
  45. package/dist/ensureModularPublishBootstrap-Btih5xbB.js +129 -0
  46. package/dist/ensureModularPublishBootstrap-Btih5xbB.js.map +1 -0
  47. package/dist/ensureModularPublishBootstrap-CI4U08Gc.js +129 -0
  48. package/dist/ensureModularPublishBootstrap-CI4U08Gc.js.map +1 -0
  49. package/dist/ensureModularPublishBootstrap-CcU-hXll.js +128 -0
  50. package/dist/ensureModularPublishBootstrap-CcU-hXll.js.map +1 -0
  51. package/dist/ensureModularPublishBootstrap-CdrykHAi.js +24 -0
  52. package/dist/ensureModularPublishBootstrap-CdrykHAi.js.map +1 -0
  53. package/dist/ensureModularPublishBootstrap-DGBKVGg5.js +24 -0
  54. package/dist/ensureModularPublishBootstrap-DGBKVGg5.js.map +1 -0
  55. package/dist/ensureModularPublishBootstrap-DaREOqSc.js +129 -0
  56. package/dist/ensureModularPublishBootstrap-DaREOqSc.js.map +1 -0
  57. package/dist/ensureModularPublishBootstrap-DxIG-LUP.js +24 -0
  58. package/dist/ensureModularPublishBootstrap-DxIG-LUP.js.map +1 -0
  59. package/dist/ensureSmartWalletThenPublish-BSYzckyS.js +49 -0
  60. package/dist/ensureSmartWalletThenPublish-BSYzckyS.js.map +1 -0
  61. package/dist/ensureSmartWalletThenPublish-Bf8FN1un.js +49 -0
  62. package/dist/ensureSmartWalletThenPublish-Bf8FN1un.js.map +1 -0
  63. package/dist/ensureSmartWalletThenPublish-Bl415Ss6.js +48 -0
  64. package/dist/ensureSmartWalletThenPublish-Bl415Ss6.js.map +1 -0
  65. package/dist/ensureSmartWalletThenPublish-CE7acryB.js +49 -0
  66. package/dist/ensureSmartWalletThenPublish-CE7acryB.js.map +1 -0
  67. package/dist/ensureSmartWalletThenPublish-D5GSZRyZ.js +48 -0
  68. package/dist/ensureSmartWalletThenPublish-D5GSZRyZ.js.map +1 -0
  69. package/dist/ensureSmartWalletThenPublish-DAomriGc.js +48 -0
  70. package/dist/ensureSmartWalletThenPublish-DAomriGc.js.map +1 -0
  71. package/dist/ensureSmartWalletThenPublish-DaZf3q5S.js +48 -0
  72. package/dist/ensureSmartWalletThenPublish-DaZf3q5S.js.map +1 -0
  73. package/dist/ensureSmartWalletThenPublish-ekb0xJRn.js +48 -0
  74. package/dist/ensureSmartWalletThenPublish-ekb0xJRn.js.map +1 -0
  75. package/dist/ensureSmartWalletThenPublish-v5fhvKxZ.js +48 -0
  76. package/dist/ensureSmartWalletThenPublish-v5fhvKxZ.js.map +1 -0
  77. package/dist/errors-Du3LNbJN.js.map +1 -1
  78. package/dist/errors.d.ts +2 -2
  79. package/dist/errors.d.ts.map +1 -1
  80. package/dist/helpers/abi/executor.d.ts +128 -0
  81. package/dist/helpers/abi/executor.d.ts.map +1 -1
  82. package/dist/helpers/abi/factory.d.ts +1 -1
  83. package/dist/helpers/abi/factory.d.ts.map +1 -1
  84. package/dist/helpers/abi/publisher.d.ts +11 -0
  85. package/dist/helpers/abi/publisher.d.ts.map +1 -1
  86. package/dist/helpers/abi/seedErrors.d.ts +141 -0
  87. package/dist/helpers/abi/seedErrors.d.ts.map +1 -0
  88. package/dist/helpers/abi/seedExecutorRouter.d.ts +60 -0
  89. package/dist/helpers/abi/seedExecutorRouter.d.ts.map +1 -0
  90. package/dist/helpers/adapters/permissionlessTxSender.d.ts +26 -0
  91. package/dist/helpers/adapters/permissionlessTxSender.d.ts.map +1 -1
  92. package/dist/helpers/adapters/thirdwebAccount.d.ts +10 -2
  93. package/dist/helpers/adapters/thirdwebAccount.d.ts.map +1 -1
  94. package/dist/helpers/approvedTargetsForAutomationPublish.d.ts +1 -1
  95. package/dist/helpers/blockchain.d.ts +4 -0
  96. package/dist/helpers/blockchain.d.ts.map +1 -1
  97. package/dist/helpers/chainClient.d.ts.map +1 -1
  98. package/dist/helpers/chainConfig.d.ts +2 -0
  99. package/dist/helpers/chainConfig.d.ts.map +1 -1
  100. package/dist/helpers/constants.d.ts +14 -3
  101. package/dist/helpers/constants.d.ts.map +1 -1
  102. package/dist/helpers/contracts/index.d.ts +25 -0
  103. package/dist/helpers/contracts/index.d.ts.map +1 -1
  104. package/dist/helpers/defaultApprovedTargetsForModularPublish.d.ts +12 -2
  105. package/dist/helpers/defaultApprovedTargetsForModularPublish.d.ts.map +1 -1
  106. package/dist/helpers/describeRevert.d.ts +33 -0
  107. package/dist/helpers/describeRevert.d.ts.map +1 -0
  108. package/dist/helpers/easDirect.d.ts +3 -8
  109. package/dist/helpers/easDirect.d.ts.map +1 -1
  110. package/dist/helpers/enrollPublishAutomation.d.ts +6 -2
  111. package/dist/helpers/enrollPublishAutomation.d.ts.map +1 -1
  112. package/dist/helpers/ensureAutomationSessionKey.d.ts.map +1 -1
  113. package/dist/helpers/ensureEip7702ModularAccountReady.d.ts +1 -1
  114. package/dist/helpers/ensureEip7702ModularAccountReady.d.ts.map +1 -1
  115. package/dist/helpers/ensureExecutorModule.d.ts +6 -3
  116. package/dist/helpers/ensureExecutorModule.d.ts.map +1 -1
  117. package/dist/helpers/ensureManagedAccountEasConfigured.d.ts +8 -3
  118. package/dist/helpers/ensureManagedAccountEasConfigured.d.ts.map +1 -1
  119. package/dist/helpers/ensureManagedAccountReady.d.ts.map +1 -1
  120. package/dist/helpers/ensureManagedSignerSessionKey.d.ts +5 -0
  121. package/dist/helpers/ensureManagedSignerSessionKey.d.ts.map +1 -1
  122. package/dist/helpers/ensureModularPublishBootstrap.d.ts +6 -2
  123. package/dist/helpers/ensureModularPublishBootstrap.d.ts.map +1 -1
  124. package/dist/helpers/ensureSmartWalletThenPublish.d.ts.map +1 -1
  125. package/dist/helpers/executorModuleReadiness.d.ts +28 -0
  126. package/dist/helpers/executorModuleReadiness.d.ts.map +1 -0
  127. package/dist/helpers/managedAccountAdmin.d.ts +12 -0
  128. package/dist/helpers/managedAccountAdmin.d.ts.map +1 -0
  129. package/dist/helpers/publishThirdwebClient.d.ts +10 -0
  130. package/dist/helpers/publishThirdwebClient.d.ts.map +1 -0
  131. package/dist/helpers/retryNonceTooLow.d.ts +12 -0
  132. package/dist/helpers/retryNonceTooLow.d.ts.map +1 -0
  133. package/dist/helpers/seedSigner.d.ts.map +1 -1
  134. package/dist/helpers/seedTwin.d.ts +47 -0
  135. package/dist/helpers/seedTwin.d.ts.map +1 -0
  136. package/dist/helpers/thirdweb.d.ts +21 -6
  137. package/dist/helpers/thirdweb.d.ts.map +1 -1
  138. package/dist/helpers/thirdwebChain.d.ts +21 -0
  139. package/dist/helpers/thirdwebChain.d.ts.map +1 -0
  140. package/dist/helpers/verifyPublishChain.d.ts +21 -0
  141. package/dist/helpers/verifyPublishChain.d.ts.map +1 -0
  142. package/dist/hooks/useItemPublishStatus.d.ts +2 -0
  143. package/dist/hooks/useItemPublishStatus.d.ts.map +1 -1
  144. package/dist/index.d.ts +9 -2
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +478 -398
  147. package/dist/index.js.map +1 -1
  148. package/dist/managedAccountAdmin-B64V1rlU.js +29 -0
  149. package/dist/managedAccountAdmin-B64V1rlU.js.map +1 -0
  150. package/dist/managedAccountAdmin-BVLGWpEb.js +29 -0
  151. package/dist/managedAccountAdmin-BVLGWpEb.js.map +1 -0
  152. package/dist/managedAccountAdmin-Bje6X8Ds.js +29 -0
  153. package/dist/managedAccountAdmin-Bje6X8Ds.js.map +1 -0
  154. package/dist/managedAccountAdmin-C84-IlQ9.js +29 -0
  155. package/dist/managedAccountAdmin-C84-IlQ9.js.map +1 -0
  156. package/dist/managedAccountAdmin-DhCRBoPX.js +29 -0
  157. package/dist/managedAccountAdmin-DhCRBoPX.js.map +1 -0
  158. package/dist/publishAuthorization-B0G1em4a.js +3695 -0
  159. package/dist/publishAuthorization-B0G1em4a.js.map +1 -0
  160. package/dist/publishAuthorization-B1BVVfp0.js +3604 -0
  161. package/dist/publishAuthorization-B1BVVfp0.js.map +1 -0
  162. package/dist/publishAuthorization-Bltn3y_K.js +3599 -0
  163. package/dist/publishAuthorization-Bltn3y_K.js.map +1 -0
  164. package/dist/publishAuthorization-By2Tt9kW.js +3912 -0
  165. package/dist/publishAuthorization-By2Tt9kW.js.map +1 -0
  166. package/dist/publishAuthorization-CxBkijU6.js +3925 -0
  167. package/dist/publishAuthorization-CxBkijU6.js.map +1 -0
  168. package/dist/publishAuthorization-CxWY7lAQ.js +3706 -0
  169. package/dist/publishAuthorization-CxWY7lAQ.js.map +1 -0
  170. package/dist/publishAuthorization-DEriY_jm.js +3687 -0
  171. package/dist/publishAuthorization-DEriY_jm.js.map +1 -0
  172. package/dist/publishAuthorization-DfAQs1sN.js +3707 -0
  173. package/dist/publishAuthorization-DfAQs1sN.js.map +1 -0
  174. package/dist/publishAuthorization-DqhhCAhd.js +3652 -0
  175. package/dist/publishAuthorization-DqhhCAhd.js.map +1 -0
  176. package/dist/publishThirdwebClient-BdgkcqM7.js +18 -0
  177. package/dist/publishThirdwebClient-BdgkcqM7.js.map +1 -0
  178. package/dist/publishThirdwebClient-BkmDN480.js +18 -0
  179. package/dist/publishThirdwebClient-BkmDN480.js.map +1 -0
  180. package/dist/publishThirdwebClient-BnDhP3N-.js +18 -0
  181. package/dist/publishThirdwebClient-BnDhP3N-.js.map +1 -0
  182. package/dist/publishThirdwebClient-CQ29pzG2.js +18 -0
  183. package/dist/publishThirdwebClient-CQ29pzG2.js.map +1 -0
  184. package/dist/publishThirdwebClient-CZIVmr9Z.js +18 -0
  185. package/dist/publishThirdwebClient-CZIVmr9Z.js.map +1 -0
  186. package/dist/publishThirdwebClient-DroRrOFQ.js +18 -0
  187. package/dist/publishThirdwebClient-DroRrOFQ.js.map +1 -0
  188. package/dist/publishThirdwebClient-DzXFjQ7L.js +18 -0
  189. package/dist/publishThirdwebClient-DzXFjQ7L.js.map +1 -0
  190. package/dist/publishThirdwebClient-Dzb2vcEs.js +18 -0
  191. package/dist/publishThirdwebClient-Dzb2vcEs.js.map +1 -0
  192. package/dist/publishThirdwebClient-i8P7fivi.js +18 -0
  193. package/dist/publishThirdwebClient-i8P7fivi.js.map +1 -0
  194. package/dist/react/ConnectButton.d.ts.map +1 -1
  195. package/dist/resolveRevokeAccount-B5iXpuRT.js +38 -0
  196. package/dist/resolveRevokeAccount-B5iXpuRT.js.map +1 -0
  197. package/dist/resolveRevokeAccount-B7ImSb4Y.js +38 -0
  198. package/dist/resolveRevokeAccount-B7ImSb4Y.js.map +1 -0
  199. package/dist/resolveRevokeAccount-BM1j2l5Q.js +38 -0
  200. package/dist/resolveRevokeAccount-BM1j2l5Q.js.map +1 -0
  201. package/dist/resolveRevokeAccount-BtVG0xxc.js +38 -0
  202. package/dist/resolveRevokeAccount-BtVG0xxc.js.map +1 -0
  203. package/dist/resolveRevokeAccount-CJZZdBcQ.js +39 -0
  204. package/dist/resolveRevokeAccount-CJZZdBcQ.js.map +1 -0
  205. package/dist/resolveRevokeAccount-CaIMuCee.js +39 -0
  206. package/dist/resolveRevokeAccount-CaIMuCee.js.map +1 -0
  207. package/dist/resolveRevokeAccount-Cg4TQgnd.js +38 -0
  208. package/dist/resolveRevokeAccount-Cg4TQgnd.js.map +1 -0
  209. package/dist/resolveRevokeAccount-DHnxtEIj.js +39 -0
  210. package/dist/resolveRevokeAccount-DHnxtEIj.js.map +1 -0
  211. package/dist/resolveRevokeAccount-S-2WXkNh.js +38 -0
  212. package/dist/resolveRevokeAccount-S-2WXkNh.js.map +1 -0
  213. package/dist/services/publish/actors/checking.d.ts.map +1 -1
  214. package/dist/services/publish/actors/createAttestations.d.ts.map +1 -1
  215. package/dist/services/publish/helpers/ensureEasSchemas.d.ts +12 -1
  216. package/dist/services/publish/helpers/ensureEasSchemas.d.ts.map +1 -1
  217. package/dist/services/publish/helpers/getPublishUploadData.d.ts.map +1 -1
  218. package/dist/services/publishManager/actions/createPublish.d.ts.map +1 -1
  219. package/dist/services/publishManager/actions/drainPendingCreates.d.ts +3 -0
  220. package/dist/services/publishManager/actions/drainPendingCreates.d.ts.map +1 -0
  221. package/dist/services/publishManager/actions/publishDone.d.ts.map +1 -1
  222. package/dist/services/publishManager/actions/queueCreatePublish.d.ts +2 -0
  223. package/dist/services/publishManager/actions/queueCreatePublish.d.ts.map +1 -0
  224. package/dist/services/publishManager/actors/restoreFromDb.d.ts.map +1 -1
  225. package/dist/services/publishManager/actors/savePublish.d.ts +11 -0
  226. package/dist/services/publishManager/actors/savePublish.d.ts.map +1 -1
  227. package/dist/services/publishManager/createPublishResult.d.ts +6 -0
  228. package/dist/services/publishManager/createPublishResult.d.ts.map +1 -0
  229. package/dist/services/publishManager/index.d.ts +61 -1
  230. package/dist/services/publishManager/index.d.ts.map +1 -1
  231. package/dist/services/revoke/revokeAttestations.d.ts +3 -2
  232. package/dist/services/revoke/revokeAttestations.d.ts.map +1 -1
  233. package/dist/thirdweb.d.ts +1 -0
  234. package/dist/thirdweb.d.ts.map +1 -1
  235. package/dist/thirdweb.js +193 -117
  236. package/dist/thirdweb.js.map +1 -1
  237. package/dist/worker-2dUZSapK.js +69 -0
  238. package/dist/worker-2dUZSapK.js.map +1 -0
  239. package/dist/worker-B8gN5WTx.js +69 -0
  240. package/dist/worker-B8gN5WTx.js.map +1 -0
  241. package/dist/worker-BgErCNTb.js +69 -0
  242. package/dist/worker-BgErCNTb.js.map +1 -0
  243. package/dist/worker-C07rPV2G.js +69 -0
  244. package/dist/worker-C07rPV2G.js.map +1 -0
  245. package/dist/worker-C9Za_dlQ.js +69 -0
  246. package/dist/worker-C9Za_dlQ.js.map +1 -0
  247. package/dist/worker-CEgulQnm.js +69 -0
  248. package/dist/worker-CEgulQnm.js.map +1 -0
  249. package/dist/worker-C_TL94He.js +69 -0
  250. package/dist/worker-C_TL94He.js.map +1 -0
  251. package/dist/worker-DypHzXgH.js +69 -0
  252. package/dist/worker-DypHzXgH.js.map +1 -0
  253. package/dist/worker-ZL4Wg19t.js +69 -0
  254. package/dist/worker-ZL4Wg19t.js.map +1 -0
  255. package/package.json +6 -6
package/dist/thirdweb.js CHANGED
@@ -1,58 +1,58 @@
1
- import { a as e, b as t, i as n, n as r, o as i, r as a, s as o, v as s } from "./config-BA9la8B6.js";
2
- import { o as c, r as l } from "./errors-Du3LNbJN.js";
3
- import { A as u, C as d, D as f, E as ee, F as p, H as m, I as h, L as g, M as _, N as te, O as v, P as y, Q as b, R as x, S, T as C, U as w, V as ne, Z as re, a as ie, b as ae, d as oe, f as se, h as T, j as E, k as D, l as O, m as k, p as A, u as j, w as M, x as N, y as P, z as F } from "./publishAuthorization-DgdmgLTa.js";
4
- import { t as I } from "./ensureSmartWalletThenPublish-Bmm5Fpat.js";
5
- import { a as L, i as R, r as z, t as B } from "./ensureModularPublishBootstrap-C8wdnH1P.js";
6
- import { i as V, r as H, t as U } from "./ensureAutomationSessionKey-DKriW4Hr.js";
7
- import { client as W } from "@seedprotocol/sdk";
8
- import { getContract as G } from "thirdweb";
9
- import { optimismSepolia as K } from "thirdweb/chains";
10
- import { useCallback as ce, useEffect as q, useRef as J } from "react";
11
- import { jsx as Y } from "react/jsx-runtime";
12
- import { SeedProvider as le } from "@seedprotocol/react";
13
- import { ConnectButton as ue, ThirdwebProvider as de, darkTheme as fe, useActiveAccount as pe, useActiveWallet as me, useActiveWalletConnectionStatus as he, useIsAutoConnecting as ge } from "thirdweb/react";
14
- import { getInstalledModules as _e } from "thirdweb/modules";
15
- import { assessPublishAuthorization as ve, decodePublishAuthorizationData as ye, getPublishAuthorizationFromEas as be } from "@seedprotocol/eas";
1
+ import { $ as e, A as t, O as n, _ as r, a as i, ct as a, h as o, m as s, o as c, ot as l, p as u, s as d, st as f, t as p } from "./chainConfig-BYm5OXpk.js";
2
+ import { n as m, r as h } from "./errors-Du3LNbJN.js";
3
+ import { $ as ee, A as g, B as _, C as v, D as y, E as b, F as x, H as te, I as S, L as C, M as w, N as T, O as E, P as ne, R as re, S as ie, T as ae, U as oe, W as se, a as ce, d as le, et as D, f as ue, h as O, j as de, k as fe, l as pe, m as k, p as A, u as j, w as M, x as N, y as P, z as F } from "./publishAuthorization-CxBkijU6.js";
4
+ import { t as I } from "./publishThirdwebClient-BnDhP3N-.js";
5
+ import { t as L } from "./ensureSmartWalletThenPublish-DAomriGc.js";
6
+ import { t as R } from "./ensureModularPublishBootstrap-BW8jKN_A.js";
7
+ import { i as z, r as B, t as V } from "./ensureAutomationSessionKey-CClLVX2w.js";
8
+ import { client as H } from "@seedprotocol/sdk";
9
+ import { deploySmartAccount as me, getContract as U, sendTransaction as he } from "thirdweb";
10
+ import { assessPublishAuthorization as ge, decodePublishAuthorizationData as _e, getPublishAuthorizationFromEas as ve } from "@seedprotocol/eas";
11
+ import { useCallback as ye, useEffect as W, useRef as G } from "react";
12
+ import { jsx as K } from "react/jsx-runtime";
13
+ import { SeedProvider as be } from "@seedprotocol/react";
14
+ import { ConnectButton as xe, ThirdwebProvider as Se, darkTheme as Ce, useActiveAccount as we, useActiveWallet as Te, useActiveWalletConnectionStatus as Ee, useIsAutoConnecting as De } from "thirdweb/react";
15
+ import { addSessionKey as Oe, shouldUpdateSessionKey as ke } from "thirdweb/extensions/erc4337";
16
16
  //#region src/react/ConnectButton.tsx
17
- var X = "seedProtocol:publish:userChoseWalletDisconnect";
18
- function xe(e) {
19
- console.warn("[ConnectButton] Wallet setup / module install skipped:", e), a().onWalletSetupWarning?.(e);
17
+ var q = "seedProtocol:publish:userChoseWalletDisconnect";
18
+ function Ae(e) {
19
+ console.warn("[ConnectButton] Wallet setup / module install skipped:", e), c().onWalletSetupWarning?.(e);
20
20
  }
21
- function Se() {
22
- return W.isInitialized() ? Promise.resolve() : new Promise((e) => {
23
- W.onReady(() => e());
21
+ function je() {
22
+ return H.isInitialized() ? Promise.resolve() : new Promise((e) => {
23
+ H.onReady(() => e());
24
24
  });
25
25
  }
26
- async function Z(e, t, n) {
26
+ async function Me(e, t, n) {
27
27
  if (n.modularAccountModuleContract) {
28
28
  if (n.useModularExecutor) {
29
29
  if (!t) return;
30
30
  try {
31
- F();
32
- let e = E();
31
+ _();
32
+ let e = w();
33
33
  await e.autoConnect({
34
- client: f(),
35
- chain: K
34
+ client: I(),
35
+ chain: r(n)
36
36
  });
37
- let r = e.getAccount();
38
- if (!r) return;
39
- await S(t, r, n);
37
+ let i = e.getAccount();
38
+ if (!i) return;
39
+ await M(t, i, n);
40
40
  } catch {}
41
41
  return;
42
42
  }
43
43
  try {
44
- await S(e.address, e, n);
44
+ await M(e.address, e, n);
45
45
  } catch (e) {
46
- xe(e);
46
+ Ae(e);
47
47
  }
48
48
  }
49
49
  }
50
- var Ce = () => {
51
- let e = b(), n = me(), r = pe(), i = he(), a = ge(), c = J(null), l = J(!1), u = J(!1);
52
- q(() => {
50
+ var Ne = () => {
51
+ let e = D(), i = r(e), a = Te(), s = we(), c = Ee(), l = De(), u = G(null), d = G(!1), f = G(!1);
52
+ W(() => {
53
53
  if (typeof window > "u") return;
54
- let t = l.current;
55
- l.current = a;
54
+ let t = d.current;
55
+ d.current = l;
56
56
  let n;
57
57
  try {
58
58
  n = performance.getEntriesByType("navigation")[0]?.type;
@@ -62,102 +62,103 @@ var Ce = () => {
62
62
  if (n !== "reload") return;
63
63
  let r = !1;
64
64
  try {
65
- r = sessionStorage.getItem(X) === "1";
65
+ r = sessionStorage.getItem(q) === "1";
66
66
  } catch {
67
67
  r = !1;
68
68
  }
69
- r || t && !a && i === "disconnected" && (u.current || (u.current = !0, (e.useModularExecutor ? _() : E()).autoConnect({
70
- client: f(),
71
- chain: K
69
+ r || t && !l && c === "disconnected" && (f.current || (f.current = !0, (e.useModularExecutor ? T() : w()).autoConnect({
70
+ client: I(),
71
+ chain: i
72
72
  }).catch(() => {})));
73
73
  }, [
74
- i,
75
- a,
76
- e.useModularExecutor
74
+ c,
75
+ l,
76
+ e.useModularExecutor,
77
+ i
77
78
  ]);
78
- let d = ce(async (n) => {
79
+ let p = ye(async (n) => {
79
80
  let r = n.getAccount();
80
81
  if (!r) return;
81
- await Se(), T.stopAll();
82
- let i = /* @__PURE__ */ new Set([r.address.toLowerCase()]), a;
82
+ await je(), O.stopAll();
83
+ let a = /* @__PURE__ */ new Set([r.address.toLowerCase()]), s;
83
84
  if (e.useModularExecutor) {
84
- F();
85
+ _();
85
86
  let e = n.getAdminAccount?.()?.address ?? r.address, t = async () => {
86
87
  try {
87
- return await D(K);
88
+ return await g(i);
88
89
  } catch {
89
90
  try {
90
- return await y(e);
91
+ return await x(e);
91
92
  } catch {
92
93
  return;
93
94
  }
94
95
  }
95
96
  };
96
- a = await t(), a ||= (await new Promise((e) => queueMicrotask(() => e())), await t()), a && i.add(a.toLowerCase());
97
+ s = await t(), s ||= (await new Promise((e) => queueMicrotask(() => e())), await t()), s && a.add(s.toLowerCase());
97
98
  }
98
- let s = [...i].sort().join(",");
99
- if (c.current !== s) {
100
- c.current = s;
99
+ let c = [...a].sort().join(",");
100
+ if (u.current !== c) {
101
+ u.current = c;
101
102
  try {
102
103
  let e = o(r);
103
104
  await t({
104
105
  ...e,
105
- ownedAddresses: [...i],
106
- publisherAddress: a ?? r.address
106
+ ownedAddresses: [...a],
107
+ publisherAddress: s ?? r.address
107
108
  });
108
109
  } catch (e) {
109
- throw c.current = null, console.warn("[ConnectButton] Failed to set seed client addresses:", e), e;
110
+ throw u.current = null, console.warn("[ConnectButton] Failed to set seed client addresses:", e), e;
110
111
  }
111
- await Z(r, a, e);
112
+ await Me(r, s, e);
112
113
  }
113
114
  }, [e]);
114
- return q(() => {
115
- if (a) return;
116
- if (i !== "connected") {
117
- c.current = null;
115
+ return W(() => {
116
+ if (l) return;
117
+ if (c !== "connected") {
118
+ u.current = null;
118
119
  return;
119
120
  }
120
- if (!n) return;
121
+ if (!a) return;
121
122
  let e = !1;
122
123
  return (async () => {
123
124
  try {
124
125
  if (e) return;
125
- await d(n);
126
+ await p(a);
126
127
  } catch {}
127
128
  })(), () => {
128
129
  e = !0;
129
130
  };
130
131
  }, [
131
- n,
132
- r?.address,
133
- i,
134
132
  a,
135
- d
136
- ]), /* @__PURE__ */ Y(ue, {
137
- client: f(),
138
- wallets: p(),
133
+ s?.address,
134
+ c,
135
+ l,
136
+ p
137
+ ]), /* @__PURE__ */ K(xe, {
138
+ client: I(),
139
+ wallets: S(e),
139
140
  autoConnect: !0,
140
- chain: K,
141
- chains: [K],
141
+ chain: i,
142
+ chains: [i],
142
143
  onConnect: async (e, t) => {
143
144
  let n = e.getAccount();
144
145
  if (n) {
145
146
  try {
146
- sessionStorage.removeItem(X);
147
+ sessionStorage.removeItem(q);
147
148
  } catch {}
148
149
  console.log("[ConnectButton] Connected", n.address);
149
150
  try {
150
- await d(e);
151
+ await p(e);
151
152
  } catch {}
152
153
  }
153
154
  },
154
155
  onDisconnect: () => {
155
156
  try {
156
- sessionStorage.setItem(X, "1");
157
+ sessionStorage.setItem(q, "1");
157
158
  } catch {}
158
- s(), T.stopAll();
159
+ n(), O.stopAll();
159
160
  },
160
- theme: fe({ colors: {
161
+ theme: Ce({ colors: {
161
162
  primaryButtonBg: "#1D2939",
162
163
  primaryButtonText: "#FFFFFF",
163
164
  secondaryButtonHoverBg: "#1D2939",
@@ -166,54 +167,129 @@ var Ce = () => {
166
167
  borderColor: "#344054"
167
168
  } })
168
169
  });
169
- }, we = ({ children: e, config: t, queryClient: i, queryClientRef: a }) => (q(() => {
170
- t && n(t);
171
- }, [t]), /* @__PURE__ */ Y(re.Provider, {
172
- value: t ?? r(),
173
- children: /* @__PURE__ */ Y(de, { children: /* @__PURE__ */ Y(le, {
174
- queryClient: i,
175
- queryClientRef: a,
170
+ }, Pe = ({ children: e, config: t, queryClient: n, queryClientRef: r }) => (W(() => {
171
+ t && d(t);
172
+ }, [t]), /* @__PURE__ */ K(ee.Provider, {
173
+ value: t ?? i(),
174
+ children: /* @__PURE__ */ K(Se, { children: /* @__PURE__ */ K(be, {
175
+ queryClient: n,
176
+ queryClientRef: r,
176
177
  children: e
177
178
  }) })
178
- }));
179
+ })), Fe = "Modular (EIP-7702) wallet is not connected. Sign in with the same method and try again.", Ie = () => `Your modular account is not upgraded to an EIP-7702 smart account on ${p()} yet. Enable autoDeployEip7702ModularAccount in publish config or complete wallet setup, then retry.`, Le = () => `Automatic EIP-7702 smart account setup failed on ${p()}. Retry or reconnect your wallet.`, Re = "EIP-7702 upgrade was sent but on-chain bytecode was not detected yet. Wait a moment and retry.", J = 5;
180
+ async function Y() {
181
+ let { autoDeployEip7702ModularAccount: e } = c(), t = T();
182
+ await t.autoConnect({
183
+ client: I(),
184
+ chain: r()
185
+ });
186
+ let n = t.getAccount();
187
+ if (!n) throw new m(Fe, "EIP7702_MODULAR_ACCOUNT_UNAVAILABLE");
188
+ let i = I(), a = U({
189
+ client: i,
190
+ chain: r(),
191
+ address: n.address
192
+ });
193
+ if (!await l(n.address)) {
194
+ if (!e) throw new m(Ie(), "EIP7702_MODULAR_NOT_UPGRADED", n.address);
195
+ try {
196
+ await me({
197
+ smartAccount: n,
198
+ chain: r(),
199
+ client: i,
200
+ accountContract: a
201
+ });
202
+ } catch (e) {
203
+ if (await f(n.address, J)) return;
204
+ throw new m(Le(), "EIP7702_MODULAR_DEPLOY_FAILED", n.address, e);
205
+ }
206
+ if (!await f(n.address, J)) throw new m(Re, "EIP7702_MODULAR_NOT_CONFIRMED", n.address);
207
+ }
208
+ }
209
+ //#endregion
210
+ //#region src/helpers/defaultApprovedTargetsForModularPublish.ts
211
+ function X(e) {
212
+ return k();
213
+ }
214
+ //#endregion
215
+ //#region src/helpers/ensureManagedSignerSessionKey.ts
216
+ var ze = () => `Could not connect the managed publishing account to authorize the modular signer on ${p()}. Reconnect and try again.`, Z = () => `Could not authorize the modular wallet as a session signer on your publishing account on ${p()}.`;
217
+ async function Be(t) {
218
+ let { managedAddress: n, signerAddress: i } = t, o = w();
219
+ await o.autoConnect({
220
+ client: I(),
221
+ chain: r()
222
+ });
223
+ let s = o.getAccount();
224
+ if (!s) throw new h(ze(), "MODULAR_SIGNER_ACTIVATION_FAILED", n);
225
+ let c = U({
226
+ client: I(),
227
+ chain: r(),
228
+ address: n
229
+ }), l = {
230
+ approvedTargets: X(n),
231
+ nativeTokenLimitPerTransaction: 0
232
+ }, u = !1;
233
+ try {
234
+ u = await ke({
235
+ accountContract: c,
236
+ sessionKeyAddress: i,
237
+ newPermissions: l
238
+ });
239
+ } catch (e) {
240
+ throw new h(Z(), "MODULAR_SIGNER_ACTIVATION_FAILED", n, e);
241
+ }
242
+ if (u) try {
243
+ let e = Oe({
244
+ contract: c,
245
+ account: s,
246
+ sessionKeyAddress: i,
247
+ permissions: l
248
+ }), t = await he({
249
+ account: s,
250
+ transaction: e
251
+ });
252
+ await a(t.transactionHash);
253
+ } catch (e) {
254
+ throw new h(Z(), "MODULAR_SIGNER_ACTIVATION_FAILED", n, e);
255
+ }
256
+ let d = !1;
257
+ try {
258
+ d = await e(n, i);
259
+ } catch (e) {
260
+ throw new h(Z(), "MODULAR_SIGNER_ACTIVATION_FAILED", n, e);
261
+ }
262
+ if (!d) throw new h(Z(), "MODULAR_SIGNER_ACTIVATION_FAILED", n);
263
+ }
179
264
  //#endregion
180
265
  //#region src/helpers/enrollPublishAutomation.ts
181
266
  async function Q(e) {
182
- let t = E();
267
+ let t = w();
183
268
  await t.autoConnect({
184
- client: f(),
185
- chain: K
269
+ client: I(),
270
+ chain: r()
186
271
  });
187
272
  let n = t.getAccount();
188
- if (!n) throw new l("Could not connect the managed publishing account to enroll or revoke publish automation.", "MANAGED_ACCOUNT_UNAVAILABLE", e);
273
+ if (!n) throw new h("Could not connect the managed publishing account to enroll or revoke publish automation.", "MANAGED_ACCOUNT_UNAVAILABLE", e);
189
274
  return n;
190
275
  }
191
276
  async function $(e, t) {
192
277
  return t || o(await Q(e));
193
278
  }
194
- async function Te(e) {
195
- let t = a(), n = t.modularAccountModuleContract?.trim();
196
- if (!n) throw Error("@seedprotocol/publish: enrollPublishAutomation requires PublishConfig.modularAccountModuleContract");
197
- let r = await Q(e);
198
- try {
199
- await S(e, r, t);
200
- } catch (t) {
201
- throw t instanceof l ? t : new l("Executor module setup failed for publish automation.", "EXECUTOR_MODULE_NOT_INSTALLED", e, t);
202
- }
279
+ async function Ve(e) {
280
+ let t = c();
281
+ if (!t.modularAccountModuleContract?.trim()) throw Error("@seedprotocol/publish: enrollPublishAutomation requires PublishConfig.modularAccountModuleContract");
282
+ let n = await Q(e);
203
283
  try {
204
- let t = G({
205
- client: f(),
206
- chain: K,
207
- address: e
208
- }), r = await _e({ contract: t }), i = n.toLowerCase();
209
- if (!r.some((e) => e.implementation?.toLowerCase() === i)) throw new l("Executor module is not installed on the ManagedAccount (ModularCore required for automation grants).", "EXECUTOR_MODULE_NOT_INSTALLED", e);
284
+ await M(e, n, t);
210
285
  } catch (t) {
211
- throw t instanceof l ? t : c(t) ? new l("ManagedAccount is not ModularCore; cannot install the executor module required for automation grants.", "EXECUTOR_MODULE_NOT_INSTALLED", e, t) : new l("Could not verify executor module installation for publish automation.", "EXECUTOR_MODULE_NOT_INSTALLED", e, t);
286
+ throw t instanceof h ? t : new h("Executor module setup failed for publish automation.", "EXECUTOR_MODULE_NOT_INSTALLED", e, t);
212
287
  }
288
+ await P(e);
213
289
  }
214
- async function Ee(e) {
290
+ async function He(e) {
215
291
  let { managedAddress: t, sessionKeyAddress: n, appAddress: r, expiresAt: i } = e;
216
- await Te(t), await U({
292
+ await Ve(t), await V({
217
293
  managedAddress: t,
218
294
  sessionKeyAddress: n,
219
295
  expiresAt: i
@@ -222,7 +298,7 @@ async function Ee(e) {
222
298
  return {
223
299
  managedAddress: t,
224
300
  sessionKeyAddress: n,
225
- authorization: await ie({
301
+ authorization: await ce({
226
302
  wallet: a,
227
303
  identity: t,
228
304
  sessionKey: n,
@@ -231,19 +307,19 @@ async function Ee(e) {
231
307
  })
232
308
  };
233
309
  }
234
- async function De(e) {
310
+ async function Ue(e) {
235
311
  let { managedAddress: t, sessionKeyAddress: n, authorizationUid: r } = e, i = await $(t, e.userWallet);
236
- await V({
312
+ await z({
237
313
  managedAddress: t,
238
314
  sessionKeyAddress: n
239
- }), await O({
315
+ }), await pe({
240
316
  wallet: i,
241
317
  uid: r
242
318
  });
243
319
  }
244
320
  //#endregion
245
321
  //#region src/helpers/assertStorageBoundToIdentity.ts
246
- async function Oe(e) {
322
+ async function We(e) {
247
323
  let { managedAddress: t, dataItemOwner: n, atTime: r, allowActiveSessionKey: i = !0, allowSidecar: a = !0 } = e, o = [], s = n.trim().toLowerCase(), c = t.trim().toLowerCase();
248
324
  if (!/^0x[0-9a-fA-F]{40}$/.test(s) || !/^0x[0-9a-fA-F]{40}$/.test(c)) return {
249
325
  bound: !1,
@@ -251,7 +327,7 @@ async function Oe(e) {
251
327
  warnings: ["Invalid managedAddress or dataItemOwner"]
252
328
  };
253
329
  if (i) try {
254
- if (await H(t, n)) return {
330
+ if (await B(t, n)) return {
255
331
  bound: !0,
256
332
  via: "active_session_key",
257
333
  warnings: o
@@ -260,15 +336,15 @@ async function Oe(e) {
260
336
  o.push(e instanceof Error ? e.message : "isActiveSigner check failed");
261
337
  }
262
338
  if (a) try {
263
- let e = await be({
339
+ let e = await ve({
264
340
  identities: [t],
265
341
  sessionKeys: [n],
266
342
  excludeRevoked: !0
267
343
  }), i = r == null ? Date.now() : r * 1e3;
268
344
  for (let t of e) try {
269
- let e = ye(t.decodedDataJson ?? "[]");
345
+ let e = _e(t.decodedDataJson ?? "[]");
270
346
  if (e.identity.toLowerCase() !== c || e.sessionKey.toLowerCase() !== s) continue;
271
- let n = typeof t.expirationTime == "number" ? t.expirationTime : null, r = ve({
347
+ let n = typeof t.expirationTime == "number" ? t.expirationTime : null, r = ge({
272
348
  decoded: e,
273
349
  expirationTime: n,
274
350
  now: i
@@ -290,6 +366,6 @@ async function Oe(e) {
290
366
  };
291
367
  }
292
368
  //#endregion
293
- export { Ce as ConnectButton, d as ExternalWalletsForDeploy, j as PUBLISH_AUTOMATION_SCOPES, we as PublishProvider, M as appMetadata, k as approvedTargetsForAutomationPublish, e as asSeedSignerFromThirdweb, i as asThirdwebPublishWallet, Oe as assertStorageBoundToIdentity, oe as buildAutomationSessionKeyPermissions, R as defaultApprovedTargetsForModularPublish, C as deployManagedAccountViaFactory, ee as deploySmartWalletContract, Ee as enrollPublishAutomation, U as ensureAutomationSessionKey, L as ensureEip7702ModularAccountReady, S as ensureExecutorModuleInstalled, P as ensureManagedAccountReady, z as ensureManagedSignerSessionKey, B as ensureModularPublishBootstrap, I as ensureSmartWalletThenPublish, o as fromThirdwebAccount, f as getClient, v as getConnectedAccount, D as getConnectedManagedAccountAddress, u as getConnectedModularAccount, E as getManagedAccountWallet, _ as getModularAccountWallet, te as getSharedPublishInAppWalletStorage, y as getSmartWalletAddressForAdmin, p as getWalletsForConnectButton, se as hashAutomationSessionKeyPermissions, H as isAutomationSessionActive, h as isSmartWalletDeployed, g as pollSmartWalletDeployed, V as removeAutomationSessionKey, x as resolveSmartWalletForPublish, De as revokePublishAutomation, ae as runModularExecutorPublishPrep, A as toThirdwebSessionKeyPermissions, N as tryDeployManagedAccount, ne as useActiveSmartWalletContract, m as useLocalWalletAccount, b as usePublishConfig, w as wallets };
369
+ export { Ne as ConnectButton, ae as ExternalWalletsForDeploy, j as PUBLISH_AUTOMATION_SCOPES, Pe as PublishProvider, b as appMetadata, k as approvedTargetsForAutomationPublish, u as asSeedSignerFromThirdweb, s as asThirdwebPublishWallet, We as assertStorageBoundToIdentity, le as buildAutomationSessionKeyPermissions, X as defaultApprovedTargetsForModularPublish, y as deployManagedAccountViaFactory, E as deploySmartWalletContract, He as enrollPublishAutomation, V as ensureAutomationSessionKey, Y as ensureEip7702ModularAccountReady, M as ensureExecutorModuleInstalled, N as ensureManagedAccountReady, Be as ensureManagedSignerSessionKey, R as ensureModularPublishBootstrap, L as ensureSmartWalletThenPublish, o as fromThirdwebAccount, I as getClient, fe as getConnectedAccount, g as getConnectedManagedAccountAddress, de as getConnectedModularAccount, w as getManagedAccountWallet, T as getModularAccountWallet, r as getPublishThirdwebChain, ne as getSharedPublishInAppWalletStorage, x as getSmartWalletAddressForAdmin, S as getWalletsForConnectButton, ue as hashAutomationSessionKeyPermissions, B as isAutomationSessionActive, C as isSmartWalletDeployed, re as pollSmartWalletDeployed, z as removeAutomationSessionKey, F as resolveSmartWalletForPublish, Ue as revokePublishAutomation, ie as runModularExecutorPublishPrep, A as toThirdwebSessionKeyPermissions, v as tryDeployManagedAccount, te as useActiveSmartWalletContract, oe as useLocalWalletAccount, D as usePublishConfig, se as wallets };
294
370
 
295
371
  //# sourceMappingURL=thirdweb.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"thirdweb.js","names":[],"sources":["../src/react/ConnectButton.tsx","../src/react/PublishProvider.thirdweb.tsx","../src/helpers/enrollPublishAutomation.ts","../src/helpers/assertStorageBoundToIdentity.ts"],"sourcesContent":["import React, { FC, useCallback, useEffect, useRef } from \"react\"\nimport {\n ConnectButton as ConnectButtonThirdweb,\n darkTheme,\n useActiveAccount,\n useActiveWallet,\n useActiveWalletConnectionStatus,\n useIsAutoConnecting,\n} from \"thirdweb/react\"\nimport { client as seedClient } from \"@seedprotocol/sdk\"\nimport {\n getClient,\n getConnectedManagedAccountAddress,\n getManagedAccountWallet,\n getModularAccountWallet,\n getSmartWalletAddressForAdmin,\n getWalletsForConnectButton,\n syncPublishInAppAuthToken,\n} from \"../helpers/thirdweb\"\nimport { fromThirdwebAccount } from \"../helpers/adapters/thirdwebAccount\"\nimport { setPublishWallet, clearPublishWallet } from \"../helpers/publishWalletRegistry\"\nimport { usePublishConfig } from \"./PublishConfigContext\"\nimport { getPublishConfig } from \"../config\"\nimport { optimismSepolia } from \"thirdweb/chains\"\nimport type { Account, Wallet } from \"thirdweb/wallets\"\nimport type { PublishConfig } from \"../config\"\nimport { ensureExecutorModuleInstalled } from \"../helpers/ensureExecutorModule\"\nimport { PublishManager } from \"../services/publishManager\"\n\n/** Session flag so we do not force autoConnect after an explicit UI disconnect (survives reload). */\nconst USER_DISCONNECTED_SESSION_KEY = \"seedProtocol:publish:userChoseWalletDisconnect\"\n\nfunction reportWalletSetupWarning(err: unknown) {\n // Expected when managed-wallet autoConnect is still catching up; publish prep retries.\n console.warn(\"[ConnectButton] Wallet setup / module install skipped:\", err)\n getPublishConfig().onWalletSetupWarning?.(err)\n}\n\n/** Resolves after `ClientManager.init()` has finished; `setAddresses` requires this. */\nfunction waitUntilSeedInitialized(): Promise<void> {\n if (seedClient.isInitialized()) return Promise.resolve()\n return new Promise((resolve) => {\n seedClient.onReady(() => resolve())\n })\n}\n\n/**\n * Executor module (ModularCore) must be installed on the **ManagedAccount** (EIP-4337) contract.\n * The EIP-7702 modular wallet contract does not expose Thirdweb's installModule / Router API;\n * calling it there reverts with \"Router: function does not exist.\"\n */\nasync function ensureExecutorModulesForConnect(\n modularAccount: Account,\n managedAddress: string | undefined,\n config: PublishConfig,\n): Promise<void> {\n if (!config.modularAccountModuleContract) {\n return\n }\n\n if (config.useModularExecutor) {\n if (!managedAddress) {\n return\n }\n try {\n syncPublishInAppAuthToken()\n const mw = getManagedAccountWallet()\n await mw.autoConnect({ client: getClient(), chain: optimismSepolia })\n const ma = mw.getAccount()\n if (!ma) {\n return\n }\n await ensureExecutorModuleInstalled(managedAddress, ma, config)\n } catch {\n /* managed wallet session may lag modular connect; publish prep retries module install */\n }\n return\n }\n\n try {\n await ensureExecutorModuleInstalled(modularAccount.address, modularAccount, config)\n } catch (err) {\n reportWalletSetupWarning(err)\n }\n}\n\nconst ConnectButton: FC = () => {\n const config = usePublishConfig()\n const wallet = useActiveWallet()\n const activeAccount = useActiveAccount()\n const connectionStatus = useActiveWalletConnectionStatus()\n const isAutoConnecting = useIsAutoConnecting()\n /** Avoid duplicate setAddresses when onConnect and the reconcile effect both run. */\n const lastSyncedOwnedKey = useRef<string | null>(null)\n const prevIsAutoConnecting = useRef(false)\n const reloadAutoConnectRetried = useRef(false)\n\n /**\n * Thirdweb sometimes finishes autoConnect on full reload with `disconnected` and no wallet\n * (see debug: isAutoConnecting true→false then disconnected). One explicit in-app autoConnect\n * retry recovers without affecting users who chose Disconnect (sessionStorage gate).\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return\n const prev = prevIsAutoConnecting.current\n prevIsAutoConnecting.current = isAutoConnecting\n\n let navType: string | undefined\n try {\n navType = (\n performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined\n )?.type\n } catch {\n navType = undefined\n }\n if (navType !== \"reload\") return\n\n let userChoseDisconnect = false\n try {\n userChoseDisconnect =\n sessionStorage.getItem(USER_DISCONNECTED_SESSION_KEY) === \"1\"\n } catch {\n userChoseDisconnect = false\n }\n if (userChoseDisconnect) return\n\n if (!prev || isAutoConnecting || connectionStatus !== \"disconnected\") return\n if (reloadAutoConnectRetried.current) return\n reloadAutoConnectRetried.current = true\n\n void (config.useModularExecutor ? getModularAccountWallet() : getManagedAccountWallet())\n .autoConnect({ client: getClient(), chain: optimismSepolia })\n .catch(() => {\n /* no session or iframe not ready; Connect UI can still sign in */\n })\n }, [connectionStatus, isAutoConnecting, config.useModularExecutor])\n\n const syncActiveWalletToSeed = useCallback(\n async (activeWallet: Wallet) => {\n const account = activeWallet.getAccount()\n if (!account) {\n return\n }\n await waitUntilSeedInitialized()\n PublishManager.stopAll()\n const owned = new Set<string>([account.address.toLowerCase()])\n let managedAddress: string | undefined\n if (config.useModularExecutor) {\n syncPublishInAppAuthToken()\n const adminAddress =\n activeWallet.getAdminAccount?.()?.address ?? account.address\n const tryManaged = async () => {\n try {\n return await getConnectedManagedAccountAddress(optimismSepolia)\n } catch {\n try {\n return await getSmartWalletAddressForAdmin(adminAddress)\n } catch {\n return undefined\n }\n }\n }\n managedAddress = await tryManaged()\n if (!managedAddress) {\n await new Promise<void>((r) => queueMicrotask(() => r()))\n managedAddress = await tryManaged()\n }\n if (managedAddress) {\n owned.add(managedAddress.toLowerCase())\n }\n }\n const ownedKey = [...owned].sort().join(\",\")\n if (lastSyncedOwnedKey.current === ownedKey) {\n return\n }\n lastSyncedOwnedKey.current = ownedKey\n try {\n const publishWallet = fromThirdwebAccount(account)\n await setPublishWallet({\n ...publishWallet,\n ownedAddresses: [...owned],\n publisherAddress: managedAddress ?? account.address,\n })\n } catch (err) {\n lastSyncedOwnedKey.current = null\n console.warn(\"[ConnectButton] Failed to set seed client addresses:\", err)\n throw err\n }\n await ensureExecutorModulesForConnect(account, managedAddress, config)\n },\n [config],\n )\n\n /**\n * Thirdweb autoConnect restores the wallet without calling onConnect. Seed addresses live in\n * SQLite (OPFS); after a wipe there is no app_state row until setAddresses runs again.\n */\n useEffect(() => {\n if (isAutoConnecting) {\n return\n }\n if (connectionStatus !== \"connected\") {\n lastSyncedOwnedKey.current = null\n return\n }\n if (!wallet) {\n return\n }\n let cancelled = false\n void (async () => {\n try {\n if (cancelled) return\n await syncActiveWalletToSeed(wallet)\n } catch {\n /* logged in syncActiveWalletToSeed */\n }\n })()\n return () => {\n cancelled = true\n }\n }, [\n wallet,\n activeAccount?.address,\n connectionStatus,\n isAutoConnecting,\n syncActiveWalletToSeed,\n ])\n\n const handleDisconnect = () => {\n try {\n sessionStorage.setItem(USER_DISCONNECTED_SESSION_KEY, \"1\")\n } catch {\n /* private mode / SSR */\n }\n clearPublishWallet()\n PublishManager.stopAll()\n }\n\n const handleConnect = async (activeWallet: Wallet, _allConnectedWallets: Wallet[]) => {\n const account = activeWallet.getAccount()\n if (!account) return\n try {\n sessionStorage.removeItem(USER_DISCONNECTED_SESSION_KEY)\n } catch {\n /* ignore */\n }\n console.log('[ConnectButton] Connected', account.address)\n try {\n await syncActiveWalletToSeed(activeWallet)\n } catch {\n /* syncActiveWalletToSeed logs */\n }\n }\n\n return (\n <ConnectButtonThirdweb\n client={getClient()}\n wallets={getWalletsForConnectButton()}\n autoConnect={true}\n chain={optimismSepolia}\n chains={[ optimismSepolia, ]}\n onConnect={handleConnect}\n onDisconnect={handleDisconnect}\n theme={darkTheme({\n colors: {\n primaryButtonBg: '#1D2939',\n primaryButtonText: '#FFFFFF',\n secondaryButtonHoverBg: '#1D2939',\n connectedButtonBg: '#101828',\n connectedButtonBgHover: '#1D2939',\n borderColor: '#344054',\n },\n })}\n />\n )\n}\n\nexport default ConnectButton\n","import React, { FC, useEffect } from \"react\"\nimport type { MutableRefObject } from \"react\"\nimport type { QueryClient } from \"@tanstack/react-query\"\nimport { ThirdwebProvider } from \"thirdweb/react\"\nimport { SeedProvider } from '@seedprotocol/react'\nimport { initPublish, getConfigRef, type PublishConfig } from \"../config\"\nimport { PublishConfigContext, usePublishConfig } from \"./PublishConfigContext\"\nimport type { PublishProviderProps } from \"./PublishProvider\"\n\nexport { usePublishConfig }\nexport type { PublishProviderProps }\n\n/**\n * Thirdweb-backed PublishProvider (includes ThirdwebProvider).\n */\nconst PublishProviderThirdweb: FC<PublishProviderProps> = ({\n children,\n config,\n queryClient,\n queryClientRef,\n}) => {\n useEffect(() => {\n if (config) {\n initPublish(config)\n }\n }, [config])\n\n return (\n <PublishConfigContext.Provider value={config ?? getConfigRef()}>\n <ThirdwebProvider>\n <SeedProvider queryClient={queryClient} queryClientRef={queryClientRef}>\n {children}\n </SeedProvider>\n </ThirdwebProvider>\n </PublishConfigContext.Provider>\n )\n}\n\nexport default PublishProviderThirdweb\n","import type { Account } from 'thirdweb/wallets'\nimport { getContract } from 'thirdweb'\nimport { getInstalledModules } from 'thirdweb/modules'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport type { PublishWallet } from './seedSigner'\nimport { fromThirdwebAccount } from './adapters/thirdwebAccount'\nimport { getPublishConfig } from '../config'\nimport { isRouterNonModularCoreAccountError, ManagedAccountPublishError } from '../errors'\nimport { ensureExecutorModuleInstalled } from './ensureExecutorModule'\nimport {\n ensureAutomationSessionKey,\n removeAutomationSessionKey,\n} from './ensureAutomationSessionKey'\nimport {\n attestPublishAuthorization,\n revokePublishAuthorization,\n type AttestPublishAuthorizationResult,\n} from '../services/publishAuthorization'\nimport { getClient, getManagedAccountWallet } from './thirdweb'\n\nexport type EnrollPublishAutomationParams = {\n managedAddress: string\n sessionKeyAddress: string\n /** Optional app label stored in the sidecar (defaults to zero address). */\n appAddress?: string\n /** Unix seconds session / grant end (optional). */\n expiresAt?: number\n /**\n * User-controlled ManagedAccount wallet used to add the session key and attest the sidecar.\n * When omitted, uses the connected managed in-app wallet.\n */\n userWallet?: PublishWallet\n}\n\nexport type EnrollPublishAutomationResult = {\n managedAddress: string\n sessionKeyAddress: string\n authorization: AttestPublishAuthorizationResult\n}\n\nexport type RevokePublishAutomationParams = {\n managedAddress: string\n sessionKeyAddress: string\n authorizationUid: string\n userWallet?: PublishWallet\n}\n\nasync function connectManagedAccount(managedAddress: string): Promise<Account> {\n const managedWallet = getManagedAccountWallet()\n await managedWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const account = managedWallet.getAccount()\n if (!account) {\n throw new ManagedAccountPublishError(\n 'Could not connect the managed publishing account to enroll or revoke publish automation.',\n 'MANAGED_ACCOUNT_UNAVAILABLE',\n managedAddress,\n )\n }\n return account\n}\n\nasync function resolveUserWallet(\n managedAddress: string,\n userWallet?: PublishWallet,\n): Promise<PublishWallet> {\n if (userWallet) return userWallet\n return fromThirdwebAccount(await connectManagedAccount(managedAddress))\n}\n\nasync function assertExecutorModuleInstalled(managedAddress: string): Promise<void> {\n const config = getPublishConfig()\n const moduleAddr = config.modularAccountModuleContract?.trim()\n if (!moduleAddr) {\n throw new Error(\n '@seedprotocol/publish: enrollPublishAutomation requires PublishConfig.modularAccountModuleContract',\n )\n }\n\n const twAccount = await connectManagedAccount(managedAddress)\n try {\n await ensureExecutorModuleInstalled(managedAddress, twAccount, config)\n } catch (cause) {\n if (cause instanceof ManagedAccountPublishError) throw cause\n throw new ManagedAccountPublishError(\n 'Executor module setup failed for publish automation.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n cause,\n )\n }\n\n try {\n const accountContract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: managedAddress,\n })\n const installed = await getInstalledModules({ contract: accountContract })\n const want = moduleAddr.toLowerCase()\n const ok = installed.some(\n (m: { implementation: string }) => m.implementation?.toLowerCase() === want,\n )\n if (!ok) {\n throw new ManagedAccountPublishError(\n 'Executor module is not installed on the ManagedAccount (ModularCore required for automation grants).',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n )\n }\n } catch (cause) {\n if (cause instanceof ManagedAccountPublishError) throw cause\n if (isRouterNonModularCoreAccountError(cause)) {\n throw new ManagedAccountPublishError(\n 'ManagedAccount is not ModularCore; cannot install the executor module required for automation grants.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n cause,\n )\n }\n throw new ManagedAccountPublishError(\n 'Could not verify executor module installation for publish automation.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n cause,\n )\n }\n}\n\n/**\n * Enroll an app automation key: install executor module → add module-only session key →\n * attest PublishAuthorization sidecar (ManagedAccount attester).\n */\nexport async function enrollPublishAutomation(\n params: EnrollPublishAutomationParams,\n): Promise<EnrollPublishAutomationResult> {\n const { managedAddress, sessionKeyAddress, appAddress, expiresAt } = params\n\n await assertExecutorModuleInstalled(managedAddress)\n await ensureAutomationSessionKey({\n managedAddress,\n sessionKeyAddress,\n expiresAt,\n })\n\n const userWallet = await resolveUserWallet(managedAddress, params.userWallet)\n const authorization = await attestPublishAuthorization({\n wallet: userWallet,\n identity: managedAddress,\n sessionKey: sessionKeyAddress,\n app: appAddress,\n expiresAt,\n })\n\n return {\n managedAddress,\n sessionKeyAddress,\n authorization,\n }\n}\n\n/**\n * Disconnect automation: remove session key, then revoke PublishAuthorization sidecar.\n */\nexport async function revokePublishAutomation(\n params: RevokePublishAutomationParams,\n): Promise<void> {\n const { managedAddress, sessionKeyAddress, authorizationUid } = params\n const userWallet = await resolveUserWallet(managedAddress, params.userWallet)\n\n await removeAutomationSessionKey({\n managedAddress,\n sessionKeyAddress,\n })\n\n await revokePublishAuthorization({\n wallet: userWallet,\n uid: authorizationUid,\n })\n}\n","import {\n assessPublishAuthorization,\n decodePublishAuthorizationData,\n getPublishAuthorizationFromEas,\n} from '@seedprotocol/eas'\nimport { isAutomationSessionActive } from './ensureAutomationSessionKey'\n\nexport type AssertStorageBoundToIdentityParams = {\n managedAddress: string\n /** Recovered ANS-104 DataItem owner (Ethereum address). */\n dataItemOwner: string\n /**\n * Unix seconds for historical binding checks against PublishAuthorization expiry.\n * Defaults to now. Session-key live check always uses current `isActiveSigner`.\n */\n atTime?: number\n /**\n * When true (default), accept a live active session key on the ManagedAccount.\n */\n allowActiveSessionKey?: boolean\n /**\n * When true (default), accept a non-revoked PublishAuthorization sidecar valid at `atTime`.\n */\n allowSidecar?: boolean\n}\n\nexport type AssertStorageBoundToIdentityResult = {\n bound: boolean\n via: 'active_session_key' | 'publish_authorization' | null\n warnings: string[]\n}\n\n/**\n * Whether an Arweave DataItem owner is bound to a ManagedAccount identity for authorship.\n * Prefer live `isActiveSigner` for current publishes; use the PublishAuthorization sidecar\n * for discoverability / historical grants (revoking the session key stops new binds via\n * active check; sidecar validity is assessed at `atTime`).\n */\nexport async function assertStorageBoundToIdentity(\n params: AssertStorageBoundToIdentityParams,\n): Promise<AssertStorageBoundToIdentityResult> {\n const {\n managedAddress,\n dataItemOwner,\n atTime,\n allowActiveSessionKey = true,\n allowSidecar = true,\n } = params\n const warnings: string[] = []\n const owner = dataItemOwner.trim().toLowerCase()\n const identity = managedAddress.trim().toLowerCase()\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(owner) || !/^0x[0-9a-fA-F]{40}$/.test(identity)) {\n return { bound: false, via: null, warnings: ['Invalid managedAddress or dataItemOwner'] }\n }\n\n if (allowActiveSessionKey) {\n try {\n const active = await isAutomationSessionActive(managedAddress, dataItemOwner)\n if (active) {\n return { bound: true, via: 'active_session_key', warnings }\n }\n } catch (e) {\n warnings.push(\n e instanceof Error ? e.message : 'isActiveSigner check failed',\n )\n }\n }\n\n if (allowSidecar) {\n try {\n const rows = await getPublishAuthorizationFromEas({\n identities: [managedAddress],\n sessionKeys: [dataItemOwner],\n excludeRevoked: true,\n })\n const nowMs = atTime != null ? atTime * 1000 : Date.now()\n for (const row of rows) {\n try {\n const decoded = decodePublishAuthorizationData(row.decodedDataJson ?? '[]')\n if (decoded.identity.toLowerCase() !== identity) continue\n if (decoded.sessionKey.toLowerCase() !== owner) continue\n const expirationTime =\n typeof row.expirationTime === 'number' ? row.expirationTime : null\n const assess = assessPublishAuthorization({\n decoded,\n expirationTime,\n now: nowMs,\n })\n if (assess.status === 'valid') {\n return {\n bound: true,\n via: 'publish_authorization',\n warnings: [...warnings, ...assess.warnings],\n }\n }\n warnings.push(...assess.warnings)\n } catch {\n // skip undecodable row\n }\n }\n } catch (e) {\n warnings.push(\n e instanceof Error ? e.message : 'PublishAuthorization query failed',\n )\n }\n }\n\n return { bound: false, via: null, warnings }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"thirdweb.js","names":[],"sources":["../src/react/ConnectButton.tsx","../src/react/PublishProvider.thirdweb.tsx","../src/helpers/ensureEip7702ModularAccountReady.ts","../src/helpers/defaultApprovedTargetsForModularPublish.ts","../src/helpers/ensureManagedSignerSessionKey.ts","../src/helpers/enrollPublishAutomation.ts","../src/helpers/assertStorageBoundToIdentity.ts"],"sourcesContent":["import React, { FC, useCallback, useEffect, useRef } from \"react\"\nimport {\n ConnectButton as ConnectButtonThirdweb,\n darkTheme,\n useActiveAccount,\n useActiveWallet,\n useActiveWalletConnectionStatus,\n useIsAutoConnecting,\n} from \"thirdweb/react\"\nimport { client as seedClient } from \"@seedprotocol/sdk\"\nimport {\n getClient,\n getConnectedManagedAccountAddress,\n getManagedAccountWallet,\n getModularAccountWallet,\n getSmartWalletAddressForAdmin,\n getWalletsForConnectButton,\n syncPublishInAppAuthToken,\n} from \"../helpers/thirdweb\"\nimport { fromThirdwebAccount } from \"../helpers/adapters/thirdwebAccount\"\nimport { setPublishWallet, clearPublishWallet } from \"../helpers/publishWalletRegistry\"\nimport { usePublishConfig } from \"./PublishConfigContext\"\nimport { getPublishConfig } from \"../config\"\nimport type { Account, Wallet } from \"thirdweb/wallets\"\nimport type { PublishConfig } from \"../config\"\nimport { ensureExecutorModuleInstalled } from \"../helpers/ensureExecutorModule\"\nimport { PublishManager } from \"../services/publishManager\"\nimport { getPublishThirdwebChain } from '../helpers/thirdwebChain'\n\n/** Session flag so we do not force autoConnect after an explicit UI disconnect (survives reload). */\nconst USER_DISCONNECTED_SESSION_KEY = \"seedProtocol:publish:userChoseWalletDisconnect\"\n\nfunction reportWalletSetupWarning(err: unknown) {\n // Expected when managed-wallet autoConnect is still catching up; publish prep retries.\n console.warn(\"[ConnectButton] Wallet setup / module install skipped:\", err)\n getPublishConfig().onWalletSetupWarning?.(err)\n}\n\n/** Resolves after `ClientManager.init()` has finished; `setAddresses` requires this. */\nfunction waitUntilSeedInitialized(): Promise<void> {\n if (seedClient.isInitialized()) return Promise.resolve()\n return new Promise((resolve) => {\n seedClient.onReady(() => resolve())\n })\n}\n\n/**\n * Executor module (ModularCore) must be installed on the **ManagedAccount** (EIP-4337) contract.\n * The EIP-7702 modular wallet contract does not expose Thirdweb's installModule / Router API;\n * calling it there reverts with \"Router: function does not exist.\"\n */\nasync function ensureExecutorModulesForConnect(\n modularAccount: Account,\n managedAddress: string | undefined,\n config: PublishConfig,\n): Promise<void> {\n if (!config.modularAccountModuleContract) {\n return\n }\n\n if (config.useModularExecutor) {\n if (!managedAddress) {\n return\n }\n try {\n syncPublishInAppAuthToken()\n const mw = getManagedAccountWallet()\n await mw.autoConnect({ client: getClient(), chain: getPublishThirdwebChain(config) })\n const ma = mw.getAccount()\n if (!ma) {\n return\n }\n await ensureExecutorModuleInstalled(managedAddress, ma, config)\n } catch {\n /* managed wallet session may lag modular connect; publish prep retries module install */\n }\n return\n }\n\n try {\n await ensureExecutorModuleInstalled(modularAccount.address, modularAccount, config)\n } catch (err) {\n reportWalletSetupWarning(err)\n }\n}\n\nconst ConnectButton: FC = () => {\n const config = usePublishConfig()\n const thirdwebChain = getPublishThirdwebChain(config)\n const wallet = useActiveWallet()\n const activeAccount = useActiveAccount()\n const connectionStatus = useActiveWalletConnectionStatus()\n const isAutoConnecting = useIsAutoConnecting()\n /** Avoid duplicate setAddresses when onConnect and the reconcile effect both run. */\n const lastSyncedOwnedKey = useRef<string | null>(null)\n const prevIsAutoConnecting = useRef(false)\n const reloadAutoConnectRetried = useRef(false)\n\n /**\n * Thirdweb sometimes finishes autoConnect on full reload with `disconnected` and no wallet\n * (see debug: isAutoConnecting true→false then disconnected). One explicit in-app autoConnect\n * retry recovers without affecting users who chose Disconnect (sessionStorage gate).\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return\n const prev = prevIsAutoConnecting.current\n prevIsAutoConnecting.current = isAutoConnecting\n\n let navType: string | undefined\n try {\n navType = (\n performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined\n )?.type\n } catch {\n navType = undefined\n }\n if (navType !== \"reload\") return\n\n let userChoseDisconnect = false\n try {\n userChoseDisconnect =\n sessionStorage.getItem(USER_DISCONNECTED_SESSION_KEY) === \"1\"\n } catch {\n userChoseDisconnect = false\n }\n if (userChoseDisconnect) return\n\n if (!prev || isAutoConnecting || connectionStatus !== \"disconnected\") return\n if (reloadAutoConnectRetried.current) return\n reloadAutoConnectRetried.current = true\n\n void (config.useModularExecutor ? getModularAccountWallet() : getManagedAccountWallet())\n .autoConnect({ client: getClient(), chain: thirdwebChain })\n .catch(() => {\n /* no session or iframe not ready; Connect UI can still sign in */\n })\n }, [connectionStatus, isAutoConnecting, config.useModularExecutor, thirdwebChain])\n\n const syncActiveWalletToSeed = useCallback(\n async (activeWallet: Wallet) => {\n const account = activeWallet.getAccount()\n if (!account) {\n return\n }\n await waitUntilSeedInitialized()\n PublishManager.stopAll()\n const owned = new Set<string>([account.address.toLowerCase()])\n let managedAddress: string | undefined\n if (config.useModularExecutor) {\n syncPublishInAppAuthToken()\n const adminAddress =\n activeWallet.getAdminAccount?.()?.address ?? account.address\n const tryManaged = async () => {\n try {\n return await getConnectedManagedAccountAddress(thirdwebChain)\n } catch {\n try {\n return await getSmartWalletAddressForAdmin(adminAddress)\n } catch {\n return undefined\n }\n }\n }\n managedAddress = await tryManaged()\n if (!managedAddress) {\n await new Promise<void>((r) => queueMicrotask(() => r()))\n managedAddress = await tryManaged()\n }\n if (managedAddress) {\n owned.add(managedAddress.toLowerCase())\n }\n }\n const ownedKey = [...owned].sort().join(\",\")\n if (lastSyncedOwnedKey.current === ownedKey) {\n return\n }\n lastSyncedOwnedKey.current = ownedKey\n try {\n const publishWallet = fromThirdwebAccount(account)\n await setPublishWallet({\n ...publishWallet,\n ownedAddresses: [...owned],\n publisherAddress: managedAddress ?? account.address,\n })\n } catch (err) {\n lastSyncedOwnedKey.current = null\n console.warn(\"[ConnectButton] Failed to set seed client addresses:\", err)\n throw err\n }\n await ensureExecutorModulesForConnect(account, managedAddress, config)\n },\n [config],\n )\n\n /**\n * Thirdweb autoConnect restores the wallet without calling onConnect. Seed addresses live in\n * SQLite (OPFS); after a wipe there is no app_state row until setAddresses runs again.\n */\n useEffect(() => {\n if (isAutoConnecting) {\n return\n }\n if (connectionStatus !== \"connected\") {\n lastSyncedOwnedKey.current = null\n return\n }\n if (!wallet) {\n return\n }\n let cancelled = false\n void (async () => {\n try {\n if (cancelled) return\n await syncActiveWalletToSeed(wallet)\n } catch {\n /* logged in syncActiveWalletToSeed */\n }\n })()\n return () => {\n cancelled = true\n }\n }, [\n wallet,\n activeAccount?.address,\n connectionStatus,\n isAutoConnecting,\n syncActiveWalletToSeed,\n ])\n\n const handleDisconnect = () => {\n try {\n sessionStorage.setItem(USER_DISCONNECTED_SESSION_KEY, \"1\")\n } catch {\n /* private mode / SSR */\n }\n clearPublishWallet()\n PublishManager.stopAll()\n }\n\n const handleConnect = async (activeWallet: Wallet, _allConnectedWallets: Wallet[]) => {\n const account = activeWallet.getAccount()\n if (!account) return\n try {\n sessionStorage.removeItem(USER_DISCONNECTED_SESSION_KEY)\n } catch {\n /* ignore */\n }\n console.log('[ConnectButton] Connected', account.address)\n try {\n await syncActiveWalletToSeed(activeWallet)\n } catch {\n /* syncActiveWalletToSeed logs */\n }\n }\n\n return (\n <ConnectButtonThirdweb\n client={getClient()}\n wallets={getWalletsForConnectButton(config)}\n autoConnect={true}\n chain={thirdwebChain}\n chains={[ thirdwebChain, ]}\n onConnect={handleConnect}\n onDisconnect={handleDisconnect}\n theme={darkTheme({\n colors: {\n primaryButtonBg: '#1D2939',\n primaryButtonText: '#FFFFFF',\n secondaryButtonHoverBg: '#1D2939',\n connectedButtonBg: '#101828',\n connectedButtonBgHover: '#1D2939',\n borderColor: '#344054',\n },\n })}\n />\n )\n}\n\nexport default ConnectButton\n","import React, { FC, useEffect } from \"react\"\nimport type { MutableRefObject } from \"react\"\nimport type { QueryClient } from \"@tanstack/react-query\"\nimport { ThirdwebProvider } from \"thirdweb/react\"\nimport { SeedProvider } from '@seedprotocol/react'\nimport { initPublish, getConfigRef, type PublishConfig } from \"../config\"\nimport { PublishConfigContext, usePublishConfig } from \"./PublishConfigContext\"\nimport type { PublishProviderProps } from \"./PublishProvider\"\n\nexport { usePublishConfig }\nexport type { PublishProviderProps }\n\n/**\n * Thirdweb-backed PublishProvider (includes ThirdwebProvider).\n */\nconst PublishProviderThirdweb: FC<PublishProviderProps> = ({\n children,\n config,\n queryClient,\n queryClientRef,\n}) => {\n useEffect(() => {\n if (config) {\n initPublish(config)\n }\n }, [config])\n\n return (\n <PublishConfigContext.Provider value={config ?? getConfigRef()}>\n <ThirdwebProvider>\n <SeedProvider queryClient={queryClient} queryClientRef={queryClientRef}>\n {children}\n </SeedProvider>\n </ThirdwebProvider>\n </PublishConfigContext.Provider>\n )\n}\n\nexport default PublishProviderThirdweb\n","import { deploySmartAccount, getContract } from 'thirdweb'\nimport { getPublishConfig } from '../config'\nimport { Eip7702ModularAccountPublishError } from '../errors'\nimport { isContractDeployed, pollSmartWalletDeployed } from './chainClient'\nimport { getClient, getModularAccountWallet } from './thirdweb'\nimport { getPublishThirdwebChain } from './thirdwebChain'\nimport { getPublishChainName } from './chainConfig'\n\nconst MSG_NO_ACCOUNT =\n 'Modular (EIP-7702) wallet is not connected. Sign in with the same method and try again.'\nconst MSG_NOT_UPGRADED = () =>\n `Your modular account is not upgraded to an EIP-7702 smart account on ${getPublishChainName()} yet. Enable autoDeployEip7702ModularAccount in publish config or complete wallet setup, then retry.`\nconst MSG_DEPLOY_FAILED = () =>\n `Automatic EIP-7702 smart account setup failed on ${getPublishChainName()}. Retry or reconnect your wallet.`\nconst MSG_NOT_CONFIRMED =\n 'EIP-7702 upgrade was sent but on-chain bytecode was not detected yet. Wait a moment and retry.'\n\nconst DEPLOY_POLL_ATTEMPTS = 5\n\n/**\n * Ensures the Thirdweb in-app modular wallet (EIP-7702) has non-empty bytecode at its address\n * on the publish chain. deploySmartAccount remains Thirdweb; bytecode checks use viem.\n */\nexport async function ensureEip7702ModularAccountReady(): Promise<void> {\n const { autoDeployEip7702ModularAccount } = getPublishConfig()\n const modularAccountWallet = getModularAccountWallet()\n await modularAccountWallet.autoConnect({ client: getClient(), chain: getPublishThirdwebChain() })\n const modularAccount = modularAccountWallet.getAccount()\n if (!modularAccount) {\n throw new Eip7702ModularAccountPublishError(MSG_NO_ACCOUNT, 'EIP7702_MODULAR_ACCOUNT_UNAVAILABLE')\n }\n\n const client = getClient()\n const accountContract = getContract({\n client,\n chain: getPublishThirdwebChain(),\n address: modularAccount.address,\n })\n\n if (await isContractDeployed(modularAccount.address)) {\n return\n }\n\n if (!autoDeployEip7702ModularAccount) {\n throw new Eip7702ModularAccountPublishError(\n MSG_NOT_UPGRADED(),\n 'EIP7702_MODULAR_NOT_UPGRADED',\n modularAccount.address,\n )\n }\n\n try {\n await deploySmartAccount({\n smartAccount: modularAccount,\n chain: getPublishThirdwebChain(),\n client,\n accountContract,\n })\n } catch (cause) {\n if (await pollSmartWalletDeployed(modularAccount.address, DEPLOY_POLL_ATTEMPTS)) {\n return\n }\n throw new Eip7702ModularAccountPublishError(\n MSG_DEPLOY_FAILED(),\n 'EIP7702_MODULAR_DEPLOY_FAILED',\n modularAccount.address,\n cause,\n )\n }\n\n if (!(await pollSmartWalletDeployed(modularAccount.address, DEPLOY_POLL_ATTEMPTS))) {\n throw new Eip7702ModularAccountPublishError(\n MSG_NOT_CONFIRMED,\n 'EIP7702_MODULAR_NOT_CONFIRMED',\n modularAccount.address,\n )\n }\n}\n","import { approvedTargetsForAutomationPublish } from './approvedTargetsForAutomationPublish'\n\n/**\n * Allowlisted call targets for a modular session signer: only the Seed executor module.\n *\n * Never the ManagedAccount (a key could then make any self-call, which the account trusts) and\n * never EAS (a direct EAS target bypasses the Seed extension's forced revocability).\n *\n * @deprecated Interactive publishing is a UserOp from the ManagedAccount itself and needs no\n * session key; automation keys use {@link approvedTargetsForAutomationPublish}, which this now\n * returns. `managedAddress` is ignored.\n * @throws if `modularAccountModuleContract` is unset or invalid\n */\nexport function defaultApprovedTargetsForModularPublish(_managedAddress?: string): `0x${string}`[] {\n return approvedTargetsForAutomationPublish()\n}\n","import { getContract, sendTransaction } from 'thirdweb'\nimport { addSessionKey, shouldUpdateSessionKey } from 'thirdweb/extensions/erc4337'\nimport type { Address } from 'viem'\nimport { ManagedAccountPublishError } from '../errors'\nimport { waitForPublishReceipt } from './chainClient'\nimport { readIsActiveSigner } from './contracts'\nimport { defaultApprovedTargetsForModularPublish } from './defaultApprovedTargetsForModularPublish'\nimport { getClient, getManagedAccountWallet } from './thirdweb'\nimport { getPublishThirdwebChain } from './thirdwebChain'\nimport { getPublishChainName } from './chainConfig'\n\nconst MSG_UNAVAILABLE = () =>\n `Could not connect the managed publishing account to authorize the modular signer on ${getPublishChainName()}. Reconnect and try again.`\nconst MSG_ACTIVATION_FAILED = () =>\n `Could not authorize the modular wallet as a session signer on your publishing account on ${getPublishChainName()}.`\n\n/**\n * Ensures the modular (EIP-7702) wallet is an active session signer on the ManagedAccount.\n * If permissions are missing or stale, sends `addSessionKey` signed by the managed EIP-4337 wallet.\n * Session-key AA extensions remain on Thirdweb; verification uses viem.\n *\n * The key may call only the Seed executor module ({@link defaultApprovedTargetsForModularPublish}).\n *\n * @deprecated Interactive publishing is a UserOp from the ManagedAccount itself and needs no\n * session key. For server-held keys use `enrollPublishAutomation`.\n */\nexport async function ensureManagedSignerSessionKey(params: {\n managedAddress: string\n signerAddress: string\n}): Promise<void> {\n const { managedAddress, signerAddress } = params\n const managedWallet = getManagedAccountWallet()\n await managedWallet.autoConnect({ client: getClient(), chain: getPublishThirdwebChain() })\n const managedAccount = managedWallet.getAccount()\n if (!managedAccount) {\n throw new ManagedAccountPublishError(\n MSG_UNAVAILABLE(),\n 'MODULAR_SIGNER_ACTIVATION_FAILED',\n managedAddress,\n )\n }\n\n const accountContract = getContract({\n client: getClient(),\n chain: getPublishThirdwebChain(),\n address: managedAddress,\n })\n const permissions = {\n approvedTargets: defaultApprovedTargetsForModularPublish(managedAddress),\n nativeTokenLimitPerTransaction: 0,\n }\n\n let shouldUpdate = false\n try {\n shouldUpdate = await shouldUpdateSessionKey({\n accountContract,\n sessionKeyAddress: signerAddress,\n newPermissions: permissions,\n })\n } catch (cause) {\n throw new ManagedAccountPublishError(\n MSG_ACTIVATION_FAILED(),\n 'MODULAR_SIGNER_ACTIVATION_FAILED',\n managedAddress,\n cause,\n )\n }\n\n if (shouldUpdate) {\n try {\n const tx = addSessionKey({\n contract: accountContract,\n account: managedAccount,\n sessionKeyAddress: signerAddress,\n permissions,\n })\n const result = await sendTransaction({ account: managedAccount, transaction: tx })\n await waitForPublishReceipt(result.transactionHash as `0x${string}`)\n } catch (cause) {\n throw new ManagedAccountPublishError(\n MSG_ACTIVATION_FAILED(),\n 'MODULAR_SIGNER_ACTIVATION_FAILED',\n managedAddress,\n cause,\n )\n }\n }\n\n let active = false\n try {\n active = await readIsActiveSigner(managedAddress as Address, signerAddress as Address)\n } catch (cause) {\n throw new ManagedAccountPublishError(\n MSG_ACTIVATION_FAILED(),\n 'MODULAR_SIGNER_ACTIVATION_FAILED',\n managedAddress,\n cause,\n )\n }\n\n if (!active) {\n throw new ManagedAccountPublishError(\n MSG_ACTIVATION_FAILED(),\n 'MODULAR_SIGNER_ACTIVATION_FAILED',\n managedAddress,\n )\n }\n}\n","import type { Account } from 'thirdweb/wallets'\nimport type { PublishWallet } from './seedSigner'\nimport { fromThirdwebAccount } from './adapters/thirdwebAccount'\nimport { getPublishConfig } from '../config'\nimport { ManagedAccountPublishError } from '../errors'\nimport { ensureExecutorModuleInstalled } from './ensureExecutorModule'\nimport { assertExecutorModuleReadyForAccount } from './executorModuleReadiness'\nimport {\n ensureAutomationSessionKey,\n removeAutomationSessionKey,\n} from './ensureAutomationSessionKey'\nimport {\n attestPublishAuthorization,\n revokePublishAuthorization,\n type AttestPublishAuthorizationResult,\n} from '../services/publishAuthorization'\nimport { getClient, getManagedAccountWallet } from './thirdweb'\nimport { getPublishThirdwebChain } from './thirdwebChain'\n\nexport type EnrollPublishAutomationParams = {\n managedAddress: string\n sessionKeyAddress: string\n /** Optional app label stored in the sidecar (defaults to zero address). */\n appAddress?: string\n /** Unix seconds session / grant end (optional). */\n expiresAt?: number\n /**\n * User-controlled ManagedAccount wallet used to add the session key and attest the sidecar.\n * When omitted, uses the connected managed in-app wallet.\n */\n userWallet?: PublishWallet\n}\n\nexport type EnrollPublishAutomationResult = {\n managedAddress: string\n sessionKeyAddress: string\n authorization: AttestPublishAuthorizationResult\n}\n\nexport type RevokePublishAutomationParams = {\n managedAddress: string\n sessionKeyAddress: string\n authorizationUid: string\n userWallet?: PublishWallet\n}\n\nasync function connectManagedAccount(managedAddress: string): Promise<Account> {\n const managedWallet = getManagedAccountWallet()\n await managedWallet.autoConnect({ client: getClient(), chain: getPublishThirdwebChain() })\n const account = managedWallet.getAccount()\n if (!account) {\n throw new ManagedAccountPublishError(\n 'Could not connect the managed publishing account to enroll or revoke publish automation.',\n 'MANAGED_ACCOUNT_UNAVAILABLE',\n managedAddress,\n )\n }\n return account\n}\n\nasync function resolveUserWallet(\n managedAddress: string,\n userWallet?: PublishWallet,\n): Promise<PublishWallet> {\n if (userWallet) return userWallet\n return fromThirdwebAccount(await connectManagedAccount(managedAddress))\n}\n\nasync function assertExecutorModuleInstalled(managedAddress: string): Promise<void> {\n const config = getPublishConfig()\n const moduleAddr = config.modularAccountModuleContract?.trim()\n if (!moduleAddr) {\n throw new Error(\n '@seedprotocol/publish: enrollPublishAutomation requires PublishConfig.modularAccountModuleContract',\n )\n }\n\n const twAccount = await connectManagedAccount(managedAddress)\n try {\n await ensureExecutorModuleInstalled(managedAddress, twAccount, config)\n } catch (cause) {\n if (cause instanceof ManagedAccountPublishError) throw cause\n throw new ManagedAccountPublishError(\n 'Executor module setup failed for publish automation.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n cause,\n )\n }\n\n // The session key may only call the module, so refuse to enroll unless the module can act\n // for this account. Otherwise every automation publish would revert.\n await assertExecutorModuleReadyForAccount(managedAddress)\n}\n\n/**\n * Enroll an app automation key: install the Seed executor (`installSeedExecutor` on Router\n * accounts with the executor router extension, `installModule` on ModularCore), add an\n * executor-only session key, then attest the PublishAuthorization sidecar (ManagedAccount attester).\n *\n * @throws ManagedAccountPublishError `AUTOMATION_UNSUPPORTED_ACCOUNT` before adding the session\n * key when the executor cannot act for the account (e.g. Router accounts without the extension)\n */\nexport async function enrollPublishAutomation(\n params: EnrollPublishAutomationParams,\n): Promise<EnrollPublishAutomationResult> {\n const { managedAddress, sessionKeyAddress, appAddress, expiresAt } = params\n\n await assertExecutorModuleInstalled(managedAddress)\n await ensureAutomationSessionKey({\n managedAddress,\n sessionKeyAddress,\n expiresAt,\n })\n\n const userWallet = await resolveUserWallet(managedAddress, params.userWallet)\n const authorization = await attestPublishAuthorization({\n wallet: userWallet,\n identity: managedAddress,\n sessionKey: sessionKeyAddress,\n app: appAddress,\n expiresAt,\n })\n\n return {\n managedAddress,\n sessionKeyAddress,\n authorization,\n }\n}\n\n/**\n * Disconnect automation: remove session key, then revoke PublishAuthorization sidecar.\n */\nexport async function revokePublishAutomation(\n params: RevokePublishAutomationParams,\n): Promise<void> {\n const { managedAddress, sessionKeyAddress, authorizationUid } = params\n const userWallet = await resolveUserWallet(managedAddress, params.userWallet)\n\n await removeAutomationSessionKey({\n managedAddress,\n sessionKeyAddress,\n })\n\n await revokePublishAuthorization({\n wallet: userWallet,\n uid: authorizationUid,\n })\n}\n","import {\n assessPublishAuthorization,\n decodePublishAuthorizationData,\n getPublishAuthorizationFromEas,\n} from '@seedprotocol/eas'\nimport { isAutomationSessionActive } from './ensureAutomationSessionKey'\n\nexport type AssertStorageBoundToIdentityParams = {\n managedAddress: string\n /** Recovered ANS-104 DataItem owner (Ethereum address). */\n dataItemOwner: string\n /**\n * Unix seconds for historical binding checks against PublishAuthorization expiry.\n * Defaults to now. Session-key live check always uses current `isActiveSigner`.\n */\n atTime?: number\n /**\n * When true (default), accept a live active session key on the ManagedAccount.\n */\n allowActiveSessionKey?: boolean\n /**\n * When true (default), accept a non-revoked PublishAuthorization sidecar valid at `atTime`.\n */\n allowSidecar?: boolean\n}\n\nexport type AssertStorageBoundToIdentityResult = {\n bound: boolean\n via: 'active_session_key' | 'publish_authorization' | null\n warnings: string[]\n}\n\n/**\n * Whether an Arweave DataItem owner is bound to a ManagedAccount identity for authorship.\n * Prefer live `isActiveSigner` for current publishes; use the PublishAuthorization sidecar\n * for discoverability / historical grants (revoking the session key stops new binds via\n * active check; sidecar validity is assessed at `atTime`).\n */\nexport async function assertStorageBoundToIdentity(\n params: AssertStorageBoundToIdentityParams,\n): Promise<AssertStorageBoundToIdentityResult> {\n const {\n managedAddress,\n dataItemOwner,\n atTime,\n allowActiveSessionKey = true,\n allowSidecar = true,\n } = params\n const warnings: string[] = []\n const owner = dataItemOwner.trim().toLowerCase()\n const identity = managedAddress.trim().toLowerCase()\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(owner) || !/^0x[0-9a-fA-F]{40}$/.test(identity)) {\n return { bound: false, via: null, warnings: ['Invalid managedAddress or dataItemOwner'] }\n }\n\n if (allowActiveSessionKey) {\n try {\n const active = await isAutomationSessionActive(managedAddress, dataItemOwner)\n if (active) {\n return { bound: true, via: 'active_session_key', warnings }\n }\n } catch (e) {\n warnings.push(\n e instanceof Error ? e.message : 'isActiveSigner check failed',\n )\n }\n }\n\n if (allowSidecar) {\n try {\n const rows = await getPublishAuthorizationFromEas({\n identities: [managedAddress],\n sessionKeys: [dataItemOwner],\n excludeRevoked: true,\n })\n const nowMs = atTime != null ? atTime * 1000 : Date.now()\n for (const row of rows) {\n try {\n const decoded = decodePublishAuthorizationData(row.decodedDataJson ?? '[]')\n if (decoded.identity.toLowerCase() !== identity) continue\n if (decoded.sessionKey.toLowerCase() !== owner) continue\n const expirationTime =\n typeof row.expirationTime === 'number' ? row.expirationTime : null\n const assess = assessPublishAuthorization({\n decoded,\n expirationTime,\n now: nowMs,\n })\n if (assess.status === 'valid') {\n return {\n bound: true,\n via: 'publish_authorization',\n warnings: [...warnings, ...assess.warnings],\n }\n }\n warnings.push(...assess.warnings)\n } catch {\n // skip undecodable row\n }\n }\n } catch (e) {\n warnings.push(\n e instanceof Error ? e.message : 'PublishAuthorization query failed',\n )\n }\n }\n\n return { bound: false, via: null, warnings }\n}\n"],"mappings":"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"}