@seedprotocol/publish 0.6.8 → 0.6.10

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 (278) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +1 -19
  3. package/dist/{chainConfig-3sSqEVQh.js → chainConfig-DWzoOtkS.js} +439 -419
  4. package/dist/chainConfig-DWzoOtkS.js.map +1 -0
  5. package/dist/config.d.ts +5 -11
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/ensureAutomationSessionKey-h3zOmDr5.js +84 -0
  8. package/dist/ensureAutomationSessionKey-h3zOmDr5.js.map +1 -0
  9. package/dist/{ensureModularPublishBootstrap-DGBKVGg5.js → ensureModularPublishBootstrap-BImiIFJe.js} +9 -10
  10. package/dist/{ensureModularPublishBootstrap-5HJDqJJM.js.map → ensureModularPublishBootstrap-BImiIFJe.js.map} +1 -1
  11. package/dist/{ensureSmartWalletThenPublish-D5GSZRyZ.js → ensureSmartWalletThenPublish-DuOYPJFd.js} +9 -10
  12. package/dist/{ensureSmartWalletThenPublish-D5GSZRyZ.js.map → ensureSmartWalletThenPublish-DuOYPJFd.js.map} +1 -1
  13. package/dist/errors.d.ts +9 -0
  14. package/dist/errors.d.ts.map +1 -1
  15. package/dist/helpers/abi/executor.d.ts +16 -7
  16. package/dist/helpers/abi/executor.d.ts.map +1 -1
  17. package/dist/helpers/abi/factory.d.ts +11 -0
  18. package/dist/helpers/abi/factory.d.ts.map +1 -1
  19. package/dist/helpers/abi/publisher.d.ts +7 -74
  20. package/dist/helpers/abi/publisher.d.ts.map +1 -1
  21. package/dist/helpers/abi/seedExecutorRouter.d.ts +9 -1
  22. package/dist/helpers/abi/seedExecutorRouter.d.ts.map +1 -1
  23. package/dist/helpers/adapters/thirdwebAccount.d.ts.map +1 -1
  24. package/dist/helpers/chainClient.d.ts +18 -2
  25. package/dist/helpers/chainClient.d.ts.map +1 -1
  26. package/dist/helpers/contracts/index.d.ts +15 -18
  27. package/dist/helpers/contracts/index.d.ts.map +1 -1
  28. package/dist/helpers/describeRevert.d.ts +3 -2
  29. package/dist/helpers/describeRevert.d.ts.map +1 -1
  30. package/dist/helpers/enrollPublishAutomation.d.ts +2 -2
  31. package/dist/helpers/enrollPublishAutomation.d.ts.map +1 -1
  32. package/dist/helpers/ensureAutomationSessionKey.d.ts.map +1 -1
  33. package/dist/helpers/ensureExecutorModule.d.ts +28 -5
  34. package/dist/helpers/ensureExecutorModule.d.ts.map +1 -1
  35. package/dist/helpers/executorModuleReadiness.d.ts +15 -1
  36. package/dist/helpers/executorModuleReadiness.d.ts.map +1 -1
  37. package/dist/helpers/gasLog.d.ts +8 -0
  38. package/dist/helpers/gasLog.d.ts.map +1 -0
  39. package/dist/helpers/seedPaymaster.d.ts +27 -0
  40. package/dist/helpers/seedPaymaster.d.ts.map +1 -0
  41. package/dist/helpers/thirdweb.d.ts.map +1 -1
  42. package/dist/index.d.ts +3 -4
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +316 -342
  45. package/dist/index.js.map +1 -1
  46. package/dist/{managedAccountAdmin-B64V1rlU.js → managedAccountAdmin-B4HkLWWE.js} +9 -10
  47. package/dist/{managedAccountAdmin-B64V1rlU.js.map → managedAccountAdmin-B4HkLWWE.js.map} +1 -1
  48. package/dist/{publishAuthorization-CxBkijU6.js → publishAuthorization-DgDI4zor.js} +1104 -1018
  49. package/dist/publishAuthorization-DgDI4zor.js.map +1 -0
  50. package/dist/{publishThirdwebClient-CQ29pzG2.js → publishThirdwebClient-CO18ST7C.js} +2 -2
  51. package/dist/{publishThirdwebClient-CQ29pzG2.js.map → publishThirdwebClient-CO18ST7C.js.map} +1 -1
  52. package/dist/{resolveRevokeAccount-CehU81k6.js → resolveRevokeAccount-DsNod8ti.js} +11 -11
  53. package/dist/{resolveRevokeAccount-B5iXpuRT.js.map → resolveRevokeAccount-DsNod8ti.js.map} +1 -1
  54. package/dist/thirdweb.d.ts +2 -1
  55. package/dist/thirdweb.d.ts.map +1 -1
  56. package/dist/thirdweb.js +155 -156
  57. package/dist/thirdweb.js.map +1 -1
  58. package/dist/{worker-2dUZSapK.js → worker-CN7zg73B.js} +2 -2
  59. package/dist/{worker-2dUZSapK.js.map → worker-CN7zg73B.js.map} +1 -1
  60. package/package.json +6 -6
  61. package/dist/chainConfig-3sSqEVQh.js.map +0 -1
  62. package/dist/chainConfig-3wlYarAG.js +0 -1433
  63. package/dist/chainConfig-3wlYarAG.js.map +0 -1
  64. package/dist/chainConfig-BRcsMopd.js +0 -1442
  65. package/dist/chainConfig-BRcsMopd.js.map +0 -1
  66. package/dist/chainConfig-BYm5OXpk.js +0 -1433
  67. package/dist/chainConfig-BYm5OXpk.js.map +0 -1
  68. package/dist/chainConfig-CfVGYAsY.js +0 -1311
  69. package/dist/chainConfig-CfVGYAsY.js.map +0 -1
  70. package/dist/chainConfig-DDA4YmAB.js +0 -1424
  71. package/dist/chainConfig-DDA4YmAB.js.map +0 -1
  72. package/dist/config-BA9la8B6.js +0 -941
  73. package/dist/config-BA9la8B6.js.map +0 -1
  74. package/dist/config-BqguD2Tt.js +0 -806
  75. package/dist/config-BqguD2Tt.js.map +0 -1
  76. package/dist/config-CPBd5C_b.js +0 -1201
  77. package/dist/config-CPBd5C_b.js.map +0 -1
  78. package/dist/config-DkIapO94.js +0 -955
  79. package/dist/config-DkIapO94.js.map +0 -1
  80. package/dist/config-EQZZNH9H.js +0 -955
  81. package/dist/config-EQZZNH9H.js.map +0 -1
  82. package/dist/config-qjpaJcBA.js +0 -947
  83. package/dist/config-qjpaJcBA.js.map +0 -1
  84. package/dist/deploy-BJYwLfz-.js +0 -15
  85. package/dist/deploy-BJYwLfz-.js.map +0 -1
  86. package/dist/enrollPublishAutomation-DYQMoylY.js +0 -3422
  87. package/dist/enrollPublishAutomation-DYQMoylY.js.map +0 -1
  88. package/dist/ensureAutomationSessionKey-BMHLKfjj.js +0 -85
  89. package/dist/ensureAutomationSessionKey-BMHLKfjj.js.map +0 -1
  90. package/dist/ensureAutomationSessionKey-BZ9_3FMW.js +0 -86
  91. package/dist/ensureAutomationSessionKey-BZ9_3FMW.js.map +0 -1
  92. package/dist/ensureAutomationSessionKey-Bq0PaTYE.js +0 -84
  93. package/dist/ensureAutomationSessionKey-Bq0PaTYE.js.map +0 -1
  94. package/dist/ensureAutomationSessionKey-C8D7BFjU.js +0 -85
  95. package/dist/ensureAutomationSessionKey-C8D7BFjU.js.map +0 -1
  96. package/dist/ensureAutomationSessionKey-CClLVX2w.js +0 -85
  97. package/dist/ensureAutomationSessionKey-CClLVX2w.js.map +0 -1
  98. package/dist/ensureAutomationSessionKey-CNNN1jBQ.js +0 -85
  99. package/dist/ensureAutomationSessionKey-CNNN1jBQ.js.map +0 -1
  100. package/dist/ensureAutomationSessionKey-D8Gki6U6.js +0 -85
  101. package/dist/ensureAutomationSessionKey-D8Gki6U6.js.map +0 -1
  102. package/dist/ensureAutomationSessionKey-DEH7nwUc.js +0 -86
  103. package/dist/ensureAutomationSessionKey-DEH7nwUc.js.map +0 -1
  104. package/dist/ensureAutomationSessionKey-DKriW4Hr.js +0 -85
  105. package/dist/ensureAutomationSessionKey-DKriW4Hr.js.map +0 -1
  106. package/dist/ensureAutomationSessionKey-Dhvbii2M.js +0 -86
  107. package/dist/ensureAutomationSessionKey-Dhvbii2M.js.map +0 -1
  108. package/dist/ensureAutomationSessionKey-Dyfk8qVp.js +0 -85
  109. package/dist/ensureAutomationSessionKey-Dyfk8qVp.js.map +0 -1
  110. package/dist/ensureModularPublishBootstrap-5HJDqJJM.js +0 -24
  111. package/dist/ensureModularPublishBootstrap-BW8jKN_A.js +0 -24
  112. package/dist/ensureModularPublishBootstrap-BW8jKN_A.js.map +0 -1
  113. package/dist/ensureModularPublishBootstrap-Btih5xbB.js +0 -129
  114. package/dist/ensureModularPublishBootstrap-Btih5xbB.js.map +0 -1
  115. package/dist/ensureModularPublishBootstrap-C8wdnH1P.js +0 -128
  116. package/dist/ensureModularPublishBootstrap-C8wdnH1P.js.map +0 -1
  117. package/dist/ensureModularPublishBootstrap-CI4U08Gc.js +0 -129
  118. package/dist/ensureModularPublishBootstrap-CI4U08Gc.js.map +0 -1
  119. package/dist/ensureModularPublishBootstrap-CcU-hXll.js +0 -128
  120. package/dist/ensureModularPublishBootstrap-CcU-hXll.js.map +0 -1
  121. package/dist/ensureModularPublishBootstrap-CdrykHAi.js +0 -24
  122. package/dist/ensureModularPublishBootstrap-CdrykHAi.js.map +0 -1
  123. package/dist/ensureModularPublishBootstrap-DGBKVGg5.js.map +0 -1
  124. package/dist/ensureModularPublishBootstrap-DaREOqSc.js +0 -129
  125. package/dist/ensureModularPublishBootstrap-DaREOqSc.js.map +0 -1
  126. package/dist/ensureModularPublishBootstrap-DxIG-LUP.js +0 -24
  127. package/dist/ensureModularPublishBootstrap-DxIG-LUP.js.map +0 -1
  128. package/dist/ensureModularPublishBootstrap-Jm1AAqBo.js +0 -127
  129. package/dist/ensureModularPublishBootstrap-Jm1AAqBo.js.map +0 -1
  130. package/dist/ensureSessionKey-D2Lq-56x.js +0 -363
  131. package/dist/ensureSessionKey-D2Lq-56x.js.map +0 -1
  132. package/dist/ensureSmartWalletThenPublish-BFPugsKJ.js +0 -48
  133. package/dist/ensureSmartWalletThenPublish-BFPugsKJ.js.map +0 -1
  134. package/dist/ensureSmartWalletThenPublish-BSYzckyS.js +0 -49
  135. package/dist/ensureSmartWalletThenPublish-BSYzckyS.js.map +0 -1
  136. package/dist/ensureSmartWalletThenPublish-Bf8FN1un.js +0 -49
  137. package/dist/ensureSmartWalletThenPublish-Bf8FN1un.js.map +0 -1
  138. package/dist/ensureSmartWalletThenPublish-Bl415Ss6.js +0 -48
  139. package/dist/ensureSmartWalletThenPublish-Bl415Ss6.js.map +0 -1
  140. package/dist/ensureSmartWalletThenPublish-Bmm5Fpat.js +0 -49
  141. package/dist/ensureSmartWalletThenPublish-Bmm5Fpat.js.map +0 -1
  142. package/dist/ensureSmartWalletThenPublish-CE7acryB.js +0 -49
  143. package/dist/ensureSmartWalletThenPublish-CE7acryB.js.map +0 -1
  144. package/dist/ensureSmartWalletThenPublish-DAomriGc.js +0 -48
  145. package/dist/ensureSmartWalletThenPublish-DAomriGc.js.map +0 -1
  146. package/dist/ensureSmartWalletThenPublish-DaZf3q5S.js +0 -48
  147. package/dist/ensureSmartWalletThenPublish-DaZf3q5S.js.map +0 -1
  148. package/dist/ensureSmartWalletThenPublish-ekb0xJRn.js +0 -48
  149. package/dist/ensureSmartWalletThenPublish-ekb0xJRn.js.map +0 -1
  150. package/dist/ensureSmartWalletThenPublish-v5fhvKxZ.js +0 -48
  151. package/dist/ensureSmartWalletThenPublish-v5fhvKxZ.js.map +0 -1
  152. package/dist/errors-Du3LNbJN.js +0 -70
  153. package/dist/errors-Du3LNbJN.js.map +0 -1
  154. package/dist/errors-PZAaDlkq.js +0 -79
  155. package/dist/errors-PZAaDlkq.js.map +0 -1
  156. package/dist/helpers/adapters/managedAccountTxSender.d.ts +0 -21
  157. package/dist/helpers/adapters/managedAccountTxSender.d.ts.map +0 -1
  158. package/dist/helpers/modularAccount/abi.d.ts +0 -173
  159. package/dist/helpers/modularAccount/abi.d.ts.map +0 -1
  160. package/dist/helpers/modularAccount/deploy.d.ts +0 -13
  161. package/dist/helpers/modularAccount/deploy.d.ts.map +0 -1
  162. package/dist/helpers/modularAccount/eip712.d.ts +0 -30
  163. package/dist/helpers/modularAccount/eip712.d.ts.map +0 -1
  164. package/dist/helpers/modularAccount/encode.d.ts +0 -16
  165. package/dist/helpers/modularAccount/encode.d.ts.map +0 -1
  166. package/dist/helpers/modularAccount/ensureModule.d.ts +0 -10
  167. package/dist/helpers/modularAccount/ensureModule.d.ts.map +0 -1
  168. package/dist/helpers/modularAccount/ensureSessionKey.d.ts +0 -25
  169. package/dist/helpers/modularAccount/ensureSessionKey.d.ts.map +0 -1
  170. package/dist/helpers/modularAccount/index.d.ts +0 -9
  171. package/dist/helpers/modularAccount/index.d.ts.map +0 -1
  172. package/dist/helpers/modularAccount/permissions.d.ts +0 -32
  173. package/dist/helpers/modularAccount/permissions.d.ts.map +0 -1
  174. package/dist/helpers/modularAccount/reads.d.ts +0 -28
  175. package/dist/helpers/modularAccount/reads.d.ts.map +0 -1
  176. package/dist/helpers/thirdwebEnrollPublishAutomation.d.ts +0 -31
  177. package/dist/helpers/thirdwebEnrollPublishAutomation.d.ts.map +0 -1
  178. package/dist/helpers/thirdwebModularBootstrap.d.ts +0 -8
  179. package/dist/helpers/thirdwebModularBootstrap.d.ts.map +0 -1
  180. package/dist/helpers/transformPayloadToIntegerIds.d.ts +0 -34
  181. package/dist/helpers/transformPayloadToIntegerIds.d.ts.map +0 -1
  182. package/dist/managedAccountAdmin-BVLGWpEb.js +0 -29
  183. package/dist/managedAccountAdmin-BVLGWpEb.js.map +0 -1
  184. package/dist/managedAccountAdmin-Bje6X8Ds.js +0 -29
  185. package/dist/managedAccountAdmin-Bje6X8Ds.js.map +0 -1
  186. package/dist/managedAccountAdmin-C84-IlQ9.js +0 -29
  187. package/dist/managedAccountAdmin-C84-IlQ9.js.map +0 -1
  188. package/dist/managedAccountAdmin-DhCRBoPX.js +0 -29
  189. package/dist/managedAccountAdmin-DhCRBoPX.js.map +0 -1
  190. package/dist/publishAuthorization-B0G1em4a.js +0 -3695
  191. package/dist/publishAuthorization-B0G1em4a.js.map +0 -1
  192. package/dist/publishAuthorization-B1BVVfp0.js +0 -3604
  193. package/dist/publishAuthorization-B1BVVfp0.js.map +0 -1
  194. package/dist/publishAuthorization-Bltn3y_K.js +0 -3599
  195. package/dist/publishAuthorization-Bltn3y_K.js.map +0 -1
  196. package/dist/publishAuthorization-By2Tt9kW.js +0 -3912
  197. package/dist/publishAuthorization-By2Tt9kW.js.map +0 -1
  198. package/dist/publishAuthorization-CSN2FsQk.js +0 -3479
  199. package/dist/publishAuthorization-CSN2FsQk.js.map +0 -1
  200. package/dist/publishAuthorization-CxBkijU6.js.map +0 -1
  201. package/dist/publishAuthorization-CxWY7lAQ.js +0 -3706
  202. package/dist/publishAuthorization-CxWY7lAQ.js.map +0 -1
  203. package/dist/publishAuthorization-DEriY_jm.js +0 -3687
  204. package/dist/publishAuthorization-DEriY_jm.js.map +0 -1
  205. package/dist/publishAuthorization-DfAQs1sN.js +0 -3707
  206. package/dist/publishAuthorization-DfAQs1sN.js.map +0 -1
  207. package/dist/publishAuthorization-DgdmgLTa.js +0 -3520
  208. package/dist/publishAuthorization-DgdmgLTa.js.map +0 -1
  209. package/dist/publishAuthorization-DqhhCAhd.js +0 -3652
  210. package/dist/publishAuthorization-DqhhCAhd.js.map +0 -1
  211. package/dist/publishThirdwebClient-BdgkcqM7.js +0 -18
  212. package/dist/publishThirdwebClient-BdgkcqM7.js.map +0 -1
  213. package/dist/publishThirdwebClient-BkmDN480.js +0 -18
  214. package/dist/publishThirdwebClient-BkmDN480.js.map +0 -1
  215. package/dist/publishThirdwebClient-BnDhP3N-.js +0 -18
  216. package/dist/publishThirdwebClient-BnDhP3N-.js.map +0 -1
  217. package/dist/publishThirdwebClient-CZIVmr9Z.js +0 -18
  218. package/dist/publishThirdwebClient-CZIVmr9Z.js.map +0 -1
  219. package/dist/publishThirdwebClient-DroRrOFQ.js +0 -18
  220. package/dist/publishThirdwebClient-DroRrOFQ.js.map +0 -1
  221. package/dist/publishThirdwebClient-DzXFjQ7L.js +0 -18
  222. package/dist/publishThirdwebClient-DzXFjQ7L.js.map +0 -1
  223. package/dist/publishThirdwebClient-Dzb2vcEs.js +0 -18
  224. package/dist/publishThirdwebClient-Dzb2vcEs.js.map +0 -1
  225. package/dist/publishThirdwebClient-i8P7fivi.js +0 -18
  226. package/dist/publishThirdwebClient-i8P7fivi.js.map +0 -1
  227. package/dist/publishWalletRegistry-Cugh691z.js +0 -37
  228. package/dist/publishWalletRegistry-Cugh691z.js.map +0 -1
  229. package/dist/resolveRevokeAccount-B5iXpuRT.js +0 -38
  230. package/dist/resolveRevokeAccount-B7ImSb4Y.js +0 -38
  231. package/dist/resolveRevokeAccount-B7ImSb4Y.js.map +0 -1
  232. package/dist/resolveRevokeAccount-BEhKQBTm.js +0 -38
  233. package/dist/resolveRevokeAccount-BEhKQBTm.js.map +0 -1
  234. package/dist/resolveRevokeAccount-BM1j2l5Q.js +0 -38
  235. package/dist/resolveRevokeAccount-BM1j2l5Q.js.map +0 -1
  236. package/dist/resolveRevokeAccount-BtVG0xxc.js +0 -38
  237. package/dist/resolveRevokeAccount-BtVG0xxc.js.map +0 -1
  238. package/dist/resolveRevokeAccount-CJZZdBcQ.js +0 -39
  239. package/dist/resolveRevokeAccount-CJZZdBcQ.js.map +0 -1
  240. package/dist/resolveRevokeAccount-CaIMuCee.js +0 -39
  241. package/dist/resolveRevokeAccount-CaIMuCee.js.map +0 -1
  242. package/dist/resolveRevokeAccount-CehU81k6.js.map +0 -1
  243. package/dist/resolveRevokeAccount-Cg4TQgnd.js +0 -38
  244. package/dist/resolveRevokeAccount-Cg4TQgnd.js.map +0 -1
  245. package/dist/resolveRevokeAccount-DHnxtEIj.js +0 -39
  246. package/dist/resolveRevokeAccount-DHnxtEIj.js.map +0 -1
  247. package/dist/resolveRevokeAccount-S-2WXkNh.js +0 -38
  248. package/dist/resolveRevokeAccount-S-2WXkNh.js.map +0 -1
  249. package/dist/resolveRevokeAccount-yWARIv9i.js +0 -38
  250. package/dist/resolveRevokeAccount-yWARIv9i.js.map +0 -1
  251. package/dist/seedSigner-CFzMD7Rb.js +0 -66
  252. package/dist/seedSigner-CFzMD7Rb.js.map +0 -1
  253. package/dist/thirdweb-BoksPRz3.js +0 -194
  254. package/dist/thirdweb-BoksPRz3.js.map +0 -1
  255. package/dist/thirdwebAccount-C2iOcp4_.js +0 -59
  256. package/dist/thirdwebAccount-C2iOcp4_.js.map +0 -1
  257. package/dist/worker-B1PcFPLi.js +0 -69
  258. package/dist/worker-B1PcFPLi.js.map +0 -1
  259. package/dist/worker-B8gN5WTx.js +0 -69
  260. package/dist/worker-B8gN5WTx.js.map +0 -1
  261. package/dist/worker-BCG1r0AS.js +0 -69
  262. package/dist/worker-BCG1r0AS.js.map +0 -1
  263. package/dist/worker-BgErCNTb.js +0 -69
  264. package/dist/worker-BgErCNTb.js.map +0 -1
  265. package/dist/worker-C07rPV2G.js +0 -69
  266. package/dist/worker-C07rPV2G.js.map +0 -1
  267. package/dist/worker-C9Za_dlQ.js +0 -69
  268. package/dist/worker-C9Za_dlQ.js.map +0 -1
  269. package/dist/worker-CEgulQnm.js +0 -69
  270. package/dist/worker-CEgulQnm.js.map +0 -1
  271. package/dist/worker-C_TL94He.js +0 -69
  272. package/dist/worker-C_TL94He.js.map +0 -1
  273. package/dist/worker-DBC_g-3I.js +0 -69
  274. package/dist/worker-DBC_g-3I.js.map +0 -1
  275. package/dist/worker-DypHzXgH.js +0 -69
  276. package/dist/worker-DypHzXgH.js.map +0 -1
  277. package/dist/worker-ZL4Wg19t.js +0 -69
  278. package/dist/worker-ZL4Wg19t.js.map +0 -1
@@ -1 +1 @@
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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"}
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 * Installs the Seed executor on the **ManagedAccount** (EIP-4337 Router) contract via its\n * `SeedExecutorRouterExtension`. Other accounts, such as the EIP-7702 modular wallet, have no\n * extension, so `ensureExecutorModuleInstalled` skips them.\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, type EnsureExecutorModuleResult } 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 let install: EnsureExecutorModuleResult\n try {\n install = 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. A fresh install is\n // confirmed from its receipt; otherwise the read may still trail an install that just landed.\n await assertExecutorModuleReadyForAccount(\n managedAddress,\n install.status === 'installed'\n ? { installedEas: install.eas }\n : { readAttempts: install.status === 'already-installed' ? 5 : 1 },\n )\n}\n\n/**\n * Enroll an app automation key: install the Seed executor (`installSeedExecutor` on Router\n * accounts with the executor router extension), add an executor-only session key, then attest\n * 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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"}
@@ -1,4 +1,4 @@
1
- import { r as e } from "./config-DkIapO94.js";
1
+ import { o as e } from "./chainConfig-DWzoOtkS.js";
2
2
  import { BaseDb as t, applyArweaveL1TransactionIdLocal as n, arweaveL1FinalizeJobs as r, getArweaveUploadStatus as i, isArweaveL1AnchoringComplete as a, queryArweaveGatewayTransactionWithFallback as o } from "@seedprotocol/sdk";
3
3
  import s from "debug";
4
4
  import { eq as c } from "drizzle-orm";
@@ -66,4 +66,4 @@ async function p() {
66
66
  //#endregion
67
67
  export { f as startArweaveL1FinalizeWorker };
68
68
 
69
- //# sourceMappingURL=worker-2dUZSapK.js.map
69
+ //# sourceMappingURL=worker-CN7zg73B.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-2dUZSapK.js","names":[],"sources":["../src/services/arweaveL1Finalize/worker.ts"],"sourcesContent":["import {\n applyArweaveL1TransactionIdLocal,\n arweaveL1FinalizeJobs,\n BaseDb,\n getArweaveUploadStatus,\n isArweaveL1AnchoringComplete,\n queryArweaveGatewayTransactionWithFallback,\n} from '@seedprotocol/sdk'\nimport { eq } from 'drizzle-orm'\nimport { getPublishConfig } from '~/config'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:arweaveL1Finalize:worker')\n\nconst TICK_MS = 45_000\n\nlet intervalId: ReturnType<typeof setInterval> | null = null\n\nexport function startArweaveL1FinalizeWorker(): void {\n if (intervalId != null) return\n intervalId = setInterval(() => {\n void runArweaveL1FinalizeTick()\n }, TICK_MS)\n void runArweaveL1FinalizeTick()\n}\n\nexport function stopArweaveL1FinalizeWorker(): void {\n if (intervalId != null) {\n clearInterval(intervalId)\n intervalId = null\n }\n}\n\nasync function runArweaveL1FinalizeTick(): Promise<void> {\n let config: ReturnType<typeof getPublishConfig>\n try {\n config = getPublishConfig()\n } catch {\n return\n }\n if (!config.useArweaveBundler) return\n\n // initPublish may start this worker before Seed platformClassesInit configures BaseDb.\n if (!BaseDb.isAppDbReady()) return\n const db = BaseDb.getAppDb()\n if (!db) return\n\n const pending = await db\n .select()\n .from(arweaveL1FinalizeJobs)\n .where(eq(arweaveL1FinalizeJobs.phase, 'pending_l1'))\n .limit(25)\n\n if (pending.length === 0) return\n\n const uploadBase = config.arweaveUploadVerificationBaseUrl\n const graphqlUrl = config.arweaveGraphqlUrl\n\n for (const job of pending) {\n const dataItemId = job.dataItemId\n try {\n let l1TxId = job.l1TransactionId\n\n if (!l1TxId) {\n const gql = await queryArweaveGatewayTransactionWithFallback(graphqlUrl, dataItemId)\n const bundled = gql?.bundledInId ?? null\n if (bundled) {\n l1TxId = bundled\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n l1TransactionId: bundled,\n bundleId: bundled,\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n }\n }\n\n const status = await getArweaveUploadStatus(uploadBase, dataItemId)\n const statusStr = status ? JSON.stringify(status) : null\n\n if (status && isArweaveL1AnchoringComplete(status)) {\n const resolvedL1 =\n l1TxId ??\n status.bundleId ??\n status.turbo?.bundleId ??\n job.l1TransactionId ??\n null\n\n if (resolvedL1) {\n await applyArweaveL1TransactionIdLocal({\n seedLocalId: job.seedLocalId,\n versionLocalId: job.versionLocalId,\n dataItemId,\n l1TransactionId: resolvedL1,\n })\n }\n\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n phase: 'confirmed',\n statusJson: statusStr,\n l1TransactionId: resolvedL1 ?? job.l1TransactionId,\n bundleId: status.bundleId ?? job.bundleId,\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n continue\n }\n\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n statusJson: statusStr,\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n } catch (err) {\n logger('tick error for job', job.id, err)\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n errorMessage: err instanceof Error ? err.message : String(err),\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n }\n }\n}\n"],"mappings":";;;;;AAYA,IAAM,IAAS,EAAM,uCAAuC,GAEtD,IAAU,MAEZ,IAAoD;AAExD,SAAgB,IAAqC;CAC/C,MACJ,IAAa,kBAAkB;EAC7B,EAA8B;CAChC,GAAG,CAAO,GACV,EAA8B;AAChC;AASA,eAAe,IAA0C;CACvD,IAAI;CACJ,IAAI;EACF,IAAS,EAAiB;CAC5B,QAAQ;EACN;CACF;CAIA,IAHI,CAAC,EAAO,qBAGR,CAAC,EAAO,aAAa,GAAG;CAC5B,IAAM,IAAK,EAAO,SAAS;CAC3B,IAAI,CAAC,GAAI;CAET,IAAM,IAAU,MAAM,EACnB,OAAO,CAAC,CACR,KAAK,CAAqB,CAAC,CAC3B,MAAM,EAAG,EAAsB,OAAO,YAAY,CAAC,CAAC,CACpD,MAAM,EAAE;CAEX,IAAI,EAAQ,WAAW,GAAG;CAE1B,IAAM,IAAa,EAAO,kCACpB,IAAa,EAAO;CAE1B,KAAK,IAAM,KAAO,GAAS;EACzB,IAAM,IAAa,EAAI;EACvB,IAAI;GACF,IAAI,IAAS,EAAI;GAEjB,IAAI,CAAC,GAAQ;IAEX,IAAM,KAAU,MADE,EAA2C,GAAY,CAAU,EAAA,EAC9D,eAAe;IACpC,AAAI,MACF,IAAS,GACT,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;KACH,iBAAiB;KACjB,UAAU;KACV,WAAW,KAAK,IAAI;IACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;GAElD;GAEA,IAAM,IAAS,MAAM,EAAuB,GAAY,CAAU,GAC5D,IAAY,IAAS,KAAK,UAAU,CAAM,IAAI;GAEpD,IAAI,KAAU,EAA6B,CAAM,GAAG;IAClD,IAAM,IACJ,KACA,EAAO,YACP,EAAO,OAAO,YACd,EAAI,mBACJ;IAWF,AATI,KACF,MAAM,EAAiC;KACrC,aAAa,EAAI;KACjB,gBAAgB,EAAI;KACpB;KACA,iBAAiB;IACnB,CAAC,GAGH,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;KACH,OAAO;KACP,YAAY;KACZ,iBAAiB,KAAc,EAAI;KACnC,UAAU,EAAO,YAAY,EAAI;KACjC,WAAW,KAAK,IAAI;IACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;IAC9C;GACF;GAEA,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;IACH,YAAY;IACZ,WAAW,KAAK,IAAI;GACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;EAChD,SAAS,GAAK;GAEZ,AADA,EAAO,sBAAsB,EAAI,IAAI,CAAG,GACxC,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;IACH,cAAc,aAAe,QAAQ,EAAI,UAAU,OAAO,CAAG;IAC7D,WAAW,KAAK,IAAI;GACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;EAChD;CACF;AACF"}
1
+ {"version":3,"file":"worker-CN7zg73B.js","names":[],"sources":["../src/services/arweaveL1Finalize/worker.ts"],"sourcesContent":["import {\n applyArweaveL1TransactionIdLocal,\n arweaveL1FinalizeJobs,\n BaseDb,\n getArweaveUploadStatus,\n isArweaveL1AnchoringComplete,\n queryArweaveGatewayTransactionWithFallback,\n} from '@seedprotocol/sdk'\nimport { eq } from 'drizzle-orm'\nimport { getPublishConfig } from '~/config'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:arweaveL1Finalize:worker')\n\nconst TICK_MS = 45_000\n\nlet intervalId: ReturnType<typeof setInterval> | null = null\n\nexport function startArweaveL1FinalizeWorker(): void {\n if (intervalId != null) return\n intervalId = setInterval(() => {\n void runArweaveL1FinalizeTick()\n }, TICK_MS)\n void runArweaveL1FinalizeTick()\n}\n\nexport function stopArweaveL1FinalizeWorker(): void {\n if (intervalId != null) {\n clearInterval(intervalId)\n intervalId = null\n }\n}\n\nasync function runArweaveL1FinalizeTick(): Promise<void> {\n let config: ReturnType<typeof getPublishConfig>\n try {\n config = getPublishConfig()\n } catch {\n return\n }\n if (!config.useArweaveBundler) return\n\n // initPublish may start this worker before Seed platformClassesInit configures BaseDb.\n if (!BaseDb.isAppDbReady()) return\n const db = BaseDb.getAppDb()\n if (!db) return\n\n const pending = await db\n .select()\n .from(arweaveL1FinalizeJobs)\n .where(eq(arweaveL1FinalizeJobs.phase, 'pending_l1'))\n .limit(25)\n\n if (pending.length === 0) return\n\n const uploadBase = config.arweaveUploadVerificationBaseUrl\n const graphqlUrl = config.arweaveGraphqlUrl\n\n for (const job of pending) {\n const dataItemId = job.dataItemId\n try {\n let l1TxId = job.l1TransactionId\n\n if (!l1TxId) {\n const gql = await queryArweaveGatewayTransactionWithFallback(graphqlUrl, dataItemId)\n const bundled = gql?.bundledInId ?? null\n if (bundled) {\n l1TxId = bundled\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n l1TransactionId: bundled,\n bundleId: bundled,\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n }\n }\n\n const status = await getArweaveUploadStatus(uploadBase, dataItemId)\n const statusStr = status ? JSON.stringify(status) : null\n\n if (status && isArweaveL1AnchoringComplete(status)) {\n const resolvedL1 =\n l1TxId ??\n status.bundleId ??\n status.turbo?.bundleId ??\n job.l1TransactionId ??\n null\n\n if (resolvedL1) {\n await applyArweaveL1TransactionIdLocal({\n seedLocalId: job.seedLocalId,\n versionLocalId: job.versionLocalId,\n dataItemId,\n l1TransactionId: resolvedL1,\n })\n }\n\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n phase: 'confirmed',\n statusJson: statusStr,\n l1TransactionId: resolvedL1 ?? job.l1TransactionId,\n bundleId: status.bundleId ?? job.bundleId,\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n continue\n }\n\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n statusJson: statusStr,\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n } catch (err) {\n logger('tick error for job', job.id, err)\n await db\n .update(arweaveL1FinalizeJobs)\n .set({\n errorMessage: err instanceof Error ? err.message : String(err),\n updatedAt: Date.now(),\n })\n .where(eq(arweaveL1FinalizeJobs.id, job.id!))\n }\n }\n}\n"],"mappings":";;;;;AAYA,IAAM,IAAS,EAAM,uCAAuC,GAEtD,IAAU,MAEZ,IAAoD;AAExD,SAAgB,IAAqC;CAC/C,MACJ,IAAa,kBAAkB;EAC7B,EAA8B;CAChC,GAAG,CAAO,GACV,EAA8B;AAChC;AASA,eAAe,IAA0C;CACvD,IAAI;CACJ,IAAI;EACF,IAAS,EAAiB;CAC5B,QAAQ;EACN;CACF;CAIA,IAHI,CAAC,EAAO,qBAGR,CAAC,EAAO,aAAa,GAAG;CAC5B,IAAM,IAAK,EAAO,SAAS;CAC3B,IAAI,CAAC,GAAI;CAET,IAAM,IAAU,MAAM,EACnB,OAAO,CAAC,CACR,KAAK,CAAqB,CAAC,CAC3B,MAAM,EAAG,EAAsB,OAAO,YAAY,CAAC,CAAC,CACpD,MAAM,EAAE;CAEX,IAAI,EAAQ,WAAW,GAAG;CAE1B,IAAM,IAAa,EAAO,kCACpB,IAAa,EAAO;CAE1B,KAAK,IAAM,KAAO,GAAS;EACzB,IAAM,IAAa,EAAI;EACvB,IAAI;GACF,IAAI,IAAS,EAAI;GAEjB,IAAI,CAAC,GAAQ;IAEX,IAAM,KAAU,MADE,EAA2C,GAAY,CAAU,EAAA,EAC9D,eAAe;IACpC,AAAI,MACF,IAAS,GACT,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;KACH,iBAAiB;KACjB,UAAU;KACV,WAAW,KAAK,IAAI;IACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;GAElD;GAEA,IAAM,IAAS,MAAM,EAAuB,GAAY,CAAU,GAC5D,IAAY,IAAS,KAAK,UAAU,CAAM,IAAI;GAEpD,IAAI,KAAU,EAA6B,CAAM,GAAG;IAClD,IAAM,IACJ,KACA,EAAO,YACP,EAAO,OAAO,YACd,EAAI,mBACJ;IAWF,AATI,KACF,MAAM,EAAiC;KACrC,aAAa,EAAI;KACjB,gBAAgB,EAAI;KACpB;KACA,iBAAiB;IACnB,CAAC,GAGH,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;KACH,OAAO;KACP,YAAY;KACZ,iBAAiB,KAAc,EAAI;KACnC,UAAU,EAAO,YAAY,EAAI;KACjC,WAAW,KAAK,IAAI;IACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;IAC9C;GACF;GAEA,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;IACH,YAAY;IACZ,WAAW,KAAK,IAAI;GACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;EAChD,SAAS,GAAK;GAEZ,AADA,EAAO,sBAAsB,EAAI,IAAI,CAAG,GACxC,MAAM,EACH,OAAO,CAAqB,CAAC,CAC7B,IAAI;IACH,cAAc,aAAe,QAAQ,EAAI,UAAU,OAAO,CAAG;IAC7D,WAAW,KAAK,IAAI;GACtB,CAAC,CAAC,CACD,MAAM,EAAG,EAAsB,IAAI,EAAI,EAAG,CAAC;EAChD;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seedprotocol/publish",
3
- "version": "0.6.8",
3
+ "version": "0.6.10",
4
4
  "description": "Publish UI components and helpers for Seed Protocol",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,14 +34,14 @@
34
34
  "scripts": {
35
35
  "build": "tsc -p tsconfig.build.json && vite build",
36
36
  "prepublishOnly": "npm run build && node ../../scripts/sync-versions.js",
37
- "test": "bun test src/helpers/arweave.test.ts src/helpers/defaultApprovedTargetsForModularPublish.test.ts src/helpers/ensureManagedAccountReady.test.ts src/helpers/ensureEip7702ModularAccountReady.test.ts src/helpers/ensureManagedSignerSessionKey.test.ts src/helpers/publishDisplayHelpers.test.ts src/services/publish/actors/createAttestationsRouting.test.ts src/services/publish/actors/seedUidHelpers.test.ts src/config.autoDeployEip7702.test.ts src/config.chain.test.ts && bun test src/helpers/ensureSmartWalletThenPublish.test.ts && bun test src/helpers/ensureManagedAccountEasConfigured.test.ts && bun test src/services/domainOwnership/domainOwnership.test.ts && bun test src/services/publishAuthorization/publishAuthorization.test.ts && bun test src/helpers/approvedTargetsForAutomationPublish.test.ts && bun test src/helpers/easDirect.multiRevoke.test.ts && bun test src/helpers/ensureAutomationSessionKey.test.ts && bun test src/helpers/enrollPublishAutomation.test.ts && bun test src/helpers/executorModuleReadiness.test.ts src/helpers/describeRevert.test.ts && bun test src/helpers/contracts/encodeExecutorMultiPublish.test.ts && bun test src/helpers/assertStorageBoundToIdentity.test.ts && bun test src/services/publishCost/estimatePublishCost.test.ts && bun test src/services/publishCost/watchPublishCost.test.ts && bun test src/services/publishedBy/publishedBy.test.ts && bun test src/helpers/publishThirdwebClient.test.ts src/helpers/chainClient.secretKey.test.ts && bun test src/helpers/adapters/thirdwebAccount.test.ts && bun test src/services/publishManager/publishManager.node.test.ts && bun test src/services/publish/helpers/ensureEasSchemas.test.ts && bun test src/helpers/verifyPublishChain.test.ts && bun test src/helpers/thirdwebWallets.test.ts && bun test src/helpers/ensureExecutorModule.test.ts && bun test src/services/revoke/revokeAttestations.test.ts && bun test src/helpers/ensureModularPublishBootstrap.test.ts && bun test src/helpers/blockchain.test.ts src/helpers/retryNonceTooLow.test.ts src/helpers/seedTwin.test.ts && bun test src/helpers/runModularExecutorPublishPrep.test.ts && bun test src/helpers/adapters/permissionlessTxSender.test.ts"
37
+ "test": "bun test src/helpers/arweave.test.ts src/helpers/defaultApprovedTargetsForModularPublish.test.ts src/helpers/ensureManagedAccountReady.test.ts src/helpers/ensureEip7702ModularAccountReady.test.ts src/helpers/ensureManagedSignerSessionKey.test.ts src/helpers/publishDisplayHelpers.test.ts src/services/publish/actors/createAttestationsRouting.test.ts src/services/publish/actors/seedUidHelpers.test.ts src/config.autoDeployEip7702.test.ts src/config.chain.test.ts && bun test src/helpers/ensureSmartWalletThenPublish.test.ts && bun test src/helpers/ensureManagedAccountEasConfigured.test.ts && bun test src/services/domainOwnership/domainOwnership.test.ts && bun test src/services/publishAuthorization/publishAuthorization.test.ts && bun test src/helpers/approvedTargetsForAutomationPublish.test.ts && bun test src/helpers/easDirect.multiRevoke.test.ts && bun test src/helpers/ensureAutomationSessionKey.test.ts && bun test src/helpers/enrollPublishAutomation.test.ts && bun test src/helpers/executorModuleReadiness.test.ts src/helpers/describeRevert.test.ts && bun test src/helpers/contracts/encodeMultiPublish.test.ts && bun test src/helpers/assertStorageBoundToIdentity.test.ts && bun test src/services/publishCost/estimatePublishCost.test.ts && bun test src/services/publishCost/watchPublishCost.test.ts && bun test src/services/publishedBy/publishedBy.test.ts && bun test src/helpers/publishThirdwebClient.test.ts src/helpers/chainClient.secretKey.test.ts src/helpers/chainClient.receipt.test.ts && bun test src/helpers/adapters/thirdwebAccount.test.ts && bun test src/services/publishManager/publishManager.node.test.ts && bun test src/services/publish/helpers/ensureEasSchemas.test.ts && bun test src/helpers/verifyPublishChain.test.ts && bun test src/helpers/thirdwebWallets.test.ts && bun test src/helpers/seedPaymaster.test.ts && bun test src/helpers/ensureExecutorModule.test.ts && bun test src/services/revoke/revokeAttestations.test.ts && bun test src/helpers/ensureModularPublishBootstrap.test.ts && bun test src/helpers/blockchain.test.ts src/helpers/retryNonceTooLow.test.ts src/helpers/seedTwin.test.ts && bun test src/helpers/runModularExecutorPublishPrep.test.ts && bun test src/helpers/adapters/permissionlessTxSender.test.ts"
38
38
  },
39
39
  "dependencies": {
40
40
  "@ethereum-attestation-service/eas-sdk": "^2.9.0",
41
- "@seedprotocol/arweave": "0.6.8",
42
- "@seedprotocol/eas": "0.6.8",
43
- "@seedprotocol/react": "0.6.8",
44
- "@seedprotocol/sdk": "0.6.8",
41
+ "@seedprotocol/arweave": "0.6.10",
42
+ "@seedprotocol/eas": "0.6.10",
43
+ "@seedprotocol/react": "0.6.10",
44
+ "@seedprotocol/sdk": "0.6.10",
45
45
  "@xstate/react": "^6.1.0",
46
46
  "arweave": "^1.15.7",
47
47
  "debug": "^4.4.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"chainConfig-3sSqEVQh.js","names":[],"sources":["../src/helpers/constants.ts","../src/helpers/defaultChain.ts","../src/helpers/abi/eas.ts","../src/helpers/abi/publisher.ts","../src/helpers/abi/factory.ts","../src/helpers/abi/executor.ts","../src/helpers/abi/seedExecutorRouter.ts","../src/helpers/abi/schemaRegistry.ts","../src/helpers/chainClient.ts","../src/helpers/contracts/index.ts","../src/helpers/easDirect.ts","../src/helpers/publishWalletRegistry.ts","../src/helpers/retryNonceTooLow.ts","../src/helpers/seedSigner.ts","../src/helpers/thirdwebChain.ts","../src/helpers/adapters/thirdwebAccount.ts","../src/helpers/verifyPublishChain.ts","../src/services/revoke/revokeAttestations.ts","../src/config.ts","../src/helpers/chainConfig.ts"],"sourcesContent":["/**\n * Constants for the publish package.\n */\n/**\n * @deprecated OP Stack predeploy; wrong on non-OP chains. Use `getPublishConfig().schemaRegistryAddress`.\n */\nexport const SCHEMA_REGISTRY_ADDRESS =\n '0x4200000000000000000000000000000000000020' as const\n\n/** Schema #1 (Name a Schema) - universal UID for naming attestations */\nexport const EAS_SCHEMA_NAME_ATTESTATION_UID =\n '0x44d562ac1d7cd77e232978687fea027ace48f719cf1d58c7888e509663bb87fc' as const\n\n/**\n * Thirdweb ManagedAccount factories Seed Protocol has deployed, keyed by chain id.\n * Chains not listed here need `PublishConfig.managedAccountFactoryAddress` for managed / modular flows.\n */\nexport const MANAGED_ACCOUNT_FACTORY_ADDRESSES: Readonly<Record<number, `0x${string}`>> = {\n 11155420: '0x76f47d88bfaf670f5208911181fcdc0e160cb16d',\n}\n\n/**\n * @deprecated Optimism Sepolia only. Use `getPublishConfig().thirdwebAccountFactoryAddress`.\n */\nexport const THIRDWEB_ACCOUNT_FACTORY_ADDRESS =\n '0x76f47d88bfaf670f5208911181fcdc0e160cb16d' as const\n\n/**\n * @deprecated OP Stack predeploy; wrong on non-OP chains. Use `getPublishConfig().easContractAddress`.\n */\nexport const EAS_CONTRACT_ADDRESS =\n '0x4200000000000000000000000000000000000021' as const\n\n/**\n * Optimism Sepolia address of the deployment the **`multiPublish` ABI** was generated from.\n *\n * **Do not use as the transaction `to` for user publishes.** Runtime `multiPublish` targets the\n * publisher’s deployed ManagedAccount (non-modular), `managedAddress` (modular), or is not used\n * when attesting via direct EAS (EOA path).\n */\nexport const MULTI_PUBLISH_ABI_REFERENCE_ADDRESS_OP_SEPOLIA =\n '0xcd8c945872df8e664e55cf8885c85ea3ea8f2148' as const\n\n/**\n * @deprecated Misleading name: this is the ABI reference deployment, not a shared on-chain router.\n * Use {@link MULTI_PUBLISH_ABI_REFERENCE_ADDRESS_OP_SEPOLIA}.\n */\nexport const SEED_PROTOCOL_CONTRACT_ADDRESS_OP_SEPOLIA =\n MULTI_PUBLISH_ABI_REFERENCE_ADDRESS_OP_SEPOLIA\n\nexport const PublishMachineStates = {\n SUCCESS: 'success',\n FAILURE: 'failure',\n} as const\n\n/** States that run for a long time without snapshot changes; need periodic saves. */\nexport const LONG_RUNNING_PUBLISH_STATES = [\n 'pollingForConfirmation',\n 'uploadingData',\n 'uploadingViaBundler',\n 'uploadingViaBundlerPhase2',\n] as const\n\nexport const PERIODIC_SAVE_INTERVAL_MS = 30_000\n","import type { Chain } from 'viem'\nimport { optimismSepolia } from 'viem/chains'\n\n/** Default chain when apps omit `PublishConfig.chain`. */\nexport const DEFAULT_PUBLISH_CHAIN: Chain = optimismSepolia\n","/**\n * EAS contract ABI fragments + custom errors for revert decoding.\n */\n\nexport const EAS_ERRORS_ABI = [\n { type: 'error' as const, name: 'AccessDenied', inputs: [] },\n { type: 'error' as const, name: 'AlreadyRevoked', inputs: [] },\n { type: 'error' as const, name: 'InvalidRevocation', inputs: [] },\n { type: 'error' as const, name: 'InvalidRevocations', inputs: [] },\n { type: 'error' as const, name: 'InvalidSchema', inputs: [] },\n { type: 'error' as const, name: 'Irrevocable', inputs: [] },\n { type: 'error' as const, name: 'NotFound', inputs: [] },\n { type: 'error' as const, name: 'NotPayable', inputs: [] },\n { type: 'error' as const, name: 'InsufficientValue', inputs: [] },\n { type: 'error' as const, name: 'InvalidLength', inputs: [] },\n] as const\n\nconst attestationRequestData = [\n { name: 'recipient', type: 'address' },\n { name: 'expirationTime', type: 'uint64' },\n { name: 'revocable', type: 'bool' },\n { name: 'refUID', type: 'bytes32' },\n { name: 'data', type: 'bytes' },\n { name: 'value', type: 'uint256' },\n] as const\n\nexport const easAbi = [\n {\n type: 'function',\n name: 'attest',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'request',\n type: 'tuple',\n components: [\n { name: 'schema', type: 'bytes32' },\n {\n name: 'data',\n type: 'tuple',\n components: attestationRequestData,\n },\n ],\n },\n ],\n outputs: [{ type: 'bytes32' }],\n },\n {\n type: 'function',\n name: 'multiAttest',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'requests',\n type: 'tuple[]',\n components: [\n { name: 'schema', type: 'bytes32' },\n {\n name: 'data',\n type: 'tuple[]',\n components: attestationRequestData,\n },\n ],\n },\n ],\n outputs: [{ type: 'bytes32[]' }],\n },\n {\n type: 'function',\n name: 'multiRevoke',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'multiRequests',\n type: 'tuple[]',\n components: [\n { name: 'schema', type: 'bytes32' },\n {\n name: 'data',\n type: 'tuple[]',\n components: [\n { name: 'uid', type: 'bytes32' },\n { name: 'value', type: 'uint256' },\n ],\n },\n ],\n },\n ],\n outputs: [],\n },\n {\n type: 'event',\n name: 'Attested',\n inputs: [\n { name: 'recipient', type: 'address', indexed: true },\n { name: 'attester', type: 'address', indexed: true },\n { name: 'uid', type: 'bytes32', indexed: false },\n { name: 'schemaUID', type: 'bytes32', indexed: true },\n ],\n },\n ...EAS_ERRORS_ABI,\n] as const\n","/** Attestation request tuple shared by multiPublish variants. */\nconst attestationDataComponents = [\n { name: 'recipient', type: 'address' },\n { name: 'expirationTime', type: 'uint64' },\n { name: 'revocable', type: 'bool' },\n { name: 'refUID', type: 'bytes32' },\n { name: 'data', type: 'bytes' },\n { name: 'value', type: 'uint256' },\n] as const\n\nconst listOfAttestationsComponents = [\n { name: 'schema', type: 'bytes32' },\n {\n name: 'data',\n type: 'tuple[]',\n components: attestationDataComponents,\n },\n] as const\n\n/** multiPublish with string localIds (selector 0x31e19cb8). */\nexport const multiPublishAbi = [\n {\n type: 'function',\n name: 'multiPublish',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'requests',\n type: 'tuple[]',\n components: [\n { name: 'localId', type: 'string' },\n { name: 'seedUid', type: 'bytes32' },\n { name: 'seedSchemaUid', type: 'bytes32' },\n { name: 'versionUid', type: 'bytes32' },\n { name: 'versionSchemaUid', type: 'bytes32' },\n { name: 'seedIsRevocable', type: 'bool' },\n {\n name: 'listOfAttestations',\n type: 'tuple[]',\n components: listOfAttestationsComponents,\n },\n {\n name: 'propertiesToUpdate',\n type: 'tuple[]',\n components: [\n { name: 'publishLocalId', type: 'string' },\n { name: 'propertySchemaUid', type: 'bytes32' },\n ],\n },\n ],\n },\n ],\n outputs: [{ type: 'bytes32[]' }],\n },\n] as const\n\n/** multiPublish with uint256 localId indices (selector 0xd688e801). */\nexport const multiPublishIntegerAbi = [\n {\n type: 'function',\n name: 'multiPublish',\n stateMutability: 'nonpayable',\n inputs: [\n {\n name: 'requests',\n type: 'tuple[]',\n components: [\n { name: 'localIdIndex', type: 'uint256' },\n { name: 'seedUid', type: 'bytes32' },\n { name: 'seedSchemaUid', type: 'bytes32' },\n { name: 'versionUid', type: 'bytes32' },\n { name: 'versionSchemaUid', type: 'bytes32' },\n { name: 'seedIsRevocable', type: 'bool' },\n {\n name: 'listOfAttestations',\n type: 'tuple[]',\n components: listOfAttestationsComponents,\n },\n {\n name: 'propertiesToUpdate',\n type: 'tuple[]',\n components: [\n { name: 'publishLocalIdIndex', type: 'uint256' },\n { name: 'propertySchemaUid', type: 'bytes32' },\n ],\n },\n ],\n },\n ],\n outputs: [{ type: 'bytes32[]' }],\n },\n] as const\n\nexport const publisherReadWriteAbi = [\n {\n type: 'function',\n name: 'getEas',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'address' }],\n },\n {\n type: 'function',\n name: 'setEas',\n stateMutability: 'nonpayable',\n inputs: [{ name: '_eas', type: 'address' }],\n outputs: [{ type: 'string' }],\n },\n {\n type: 'function',\n name: 'isActiveSigner',\n stateMutability: 'view',\n inputs: [{ name: 'signer', type: 'address' }],\n outputs: [{ type: 'bool' }],\n },\n {\n type: 'function',\n name: 'isAdmin',\n stateMutability: 'view',\n inputs: [{ name: 'signer', type: 'address' }],\n outputs: [{ type: 'bool' }],\n },\n] as const\n\n/** Extension / ManagedAccount publisher events. */\nexport const publisherEventsAbi = [\n {\n type: 'event',\n name: 'CreatedAttestation',\n inputs: [\n {\n name: 'result',\n type: 'tuple',\n indexed: false,\n components: [\n { name: 'schemaUid', type: 'bytes32' },\n { name: 'attestationUid', type: 'bytes32' },\n ],\n },\n ],\n },\n {\n type: 'event',\n name: 'SeedPublished',\n inputs: [{ name: 'returnedDataFromEAS', type: 'bytes', indexed: false }],\n },\n] as const\n","/** Thirdweb ManagedAccount factory ABI (see `MANAGED_ACCOUNT_FACTORY_ADDRESSES` for deployments). */\nexport const managedAccountFactoryAbi = [\n {\n type: 'function',\n name: 'getAddress',\n stateMutability: 'view',\n inputs: [\n { name: '_adminSigner', type: 'address' },\n { name: '_data', type: 'bytes' },\n ],\n outputs: [{ type: 'address' }],\n },\n {\n type: 'function',\n name: 'createAccount',\n stateMutability: 'nonpayable',\n inputs: [\n { name: '_admin', type: 'address' },\n { name: '_data', type: 'bytes' },\n ],\n outputs: [{ type: 'address' }],\n },\n] as const\n","/**\n * Modular executor module events (0x043462…).\n * CreatedAttestation matches publisher; SeedPublished uses typed bytes32 args.\n */\nexport const executorEventsAbi = [\n {\n type: 'event',\n name: 'CreatedAttestation',\n inputs: [\n {\n name: 'result',\n type: 'tuple',\n indexed: false,\n components: [\n { name: 'schemaUid', type: 'bytes32' },\n { name: 'attestationUid', type: 'bytes32' },\n ],\n },\n ],\n },\n {\n type: 'event',\n name: 'SeedPublished',\n inputs: [\n { name: 'seedUid', type: 'bytes32', indexed: false },\n { name: 'versionUid', type: 'bytes32', indexed: false },\n ],\n },\n] as const\n\nconst attestationDataComponents = [\n { name: 'recipient', type: 'address' },\n { name: 'expirationTime', type: 'uint64' },\n { name: 'revocable', type: 'bool' },\n { name: 'refUID', type: 'bytes32' },\n { name: 'data', type: 'bytes' },\n { name: 'value', type: 'uint256' },\n] as const\n\n/**\n * SeedProtocolExecutor (ERC-7579 executor module) calls and errors.\n * `multiPublish` takes `PublishRequestData` (selector 0x2a29fadc), which differs from the\n * ManagedAccount extension's `PublishRequestDataLegacy`: bytes32 fields are ordered\n * seedUid, versionUid, seedSchemaUid, versionSchemaUid, and propertiesToUpdate uses a\n * uint256 `publishIndex` instead of a string `publishLocalId`.\n */\nexport const executorModuleAbi = [\n {\n type: 'function',\n name: 'multiPublish',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'requests',\n type: 'tuple[]',\n components: [\n { name: 'localId', type: 'string' },\n { name: 'seedUid', type: 'bytes32' },\n { name: 'versionUid', type: 'bytes32' },\n { name: 'seedSchemaUid', type: 'bytes32' },\n { name: 'versionSchemaUid', type: 'bytes32' },\n { name: 'seedIsRevocable', type: 'bool' },\n {\n name: 'listOfAttestations',\n type: 'tuple[]',\n components: [\n { name: 'schema', type: 'bytes32' },\n { name: 'data', type: 'tuple[]', components: attestationDataComponents },\n ],\n },\n {\n name: 'propertiesToUpdate',\n type: 'tuple[]',\n components: [\n { name: 'publishIndex', type: 'uint256' },\n { name: 'propertySchemaUid', type: 'bytes32' },\n ],\n },\n ],\n },\n ],\n outputs: [{ name: '', type: 'bytes32[]' }],\n },\n {\n type: 'function',\n name: 'isInitialized',\n stateMutability: 'view',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'bool' }],\n },\n {\n type: 'function',\n name: 'getEAS',\n stateMutability: 'view',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'address' }],\n },\n { type: 'error', name: 'AlreadyInitialized', inputs: [{ name: 'account', type: 'address' }] },\n { type: 'error', name: 'NotInitialized', inputs: [{ name: 'account', type: 'address' }] },\n { type: 'error', name: 'InvalidEASAddress', inputs: [] },\n { type: 'error', name: 'AttestationFailed', inputs: [] },\n { type: 'error', name: 'MultiAttestFailed', inputs: [] },\n] as const\n","/**\n * `SeedExecutorRouterExtension`, routed on ManagedAccounts by the factory\n * (seed-protocol contracts/SeedExecutorRouterExtension.sol). Installs the Seed executor on a\n * Router (non-ModularCore) account.\n */\nexport const seedExecutorRouterAbi = [\n { type: 'function', name: 'installSeedExecutor', stateMutability: 'nonpayable', inputs: [], outputs: [] },\n {\n type: 'function',\n name: 'getSeedExecutor',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n { name: 'executor', type: 'address' },\n { name: 'eas', type: 'address' },\n ],\n },\n {\n type: 'function',\n name: 'isModuleInstalled',\n stateMutability: 'view',\n inputs: [\n { name: 'moduleTypeId', type: 'uint256' },\n { name: 'module', type: 'address' },\n { name: 'additionalContext', type: 'bytes' },\n ],\n outputs: [{ name: '', type: 'bool' }],\n },\n { type: 'error', name: 'Unauthorized', inputs: [{ name: 'caller', type: 'address' }] },\n { type: 'error', name: 'SeedExecutorAlreadyInstalled', inputs: [] },\n { type: 'error', name: 'SeedExecutorNotInstalled', inputs: [] },\n] as const\n\n/** ERC-7579 module type id for executors. */\nexport const MODULE_TYPE_EXECUTOR = 2n\n","/** EAS Schema Registry on OP Stack predeploy. */\nexport const schemaRegistryAbi = [\n {\n type: 'function',\n name: 'getSchema',\n stateMutability: 'view',\n inputs: [{ name: 'uid', type: 'bytes32' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'uid', type: 'bytes32' },\n { name: 'resolver', type: 'address' },\n { name: 'revocable', type: 'bool' },\n { name: 'schema', type: 'string' },\n ],\n },\n ],\n },\n {\n type: 'function',\n name: 'register',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'schema', type: 'string' },\n { name: 'resolver', type: 'address' },\n { name: 'revocable', type: 'bool' },\n ],\n outputs: [{ type: 'bytes32' }],\n },\n] as const\n","import { createPublicClient, http, type Address, type Hex, type PublicClient } from 'viem'\nimport { getPublishConfig } from '../config'\nimport { getPublishRpcUrl, getPublishViemChain } from './chainConfig'\n\ntype PublishPublicClient = PublicClient\n\nlet _client: PublishPublicClient | null = null\nlet _clientKey: string | null = null\n\nfunction publishRpcFetchOptions(): { headers: { 'x-secret-key': string } } | undefined {\n try {\n const secret = getPublishConfig().thirdwebSecretKey\n if (!secret) return undefined\n return { headers: { 'x-secret-key': secret } }\n } catch {\n return undefined\n }\n}\n\nfunction createPublishPublicClient(): PublishPublicClient {\n const chain = getPublishViemChain()\n const rpcUrl = getPublishRpcUrl()\n const fetchOptions = publishRpcFetchOptions()\n return createPublicClient({\n chain,\n transport: http(rpcUrl, fetchOptions ? { fetchOptions } : undefined),\n })\n}\n\n/**\n * Viem public client for reads / receipts on the configured publish chain.\n */\nexport function getPublishPublicClient(): PublishPublicClient {\n const chain = getPublishViemChain()\n const rpcUrl = getPublishRpcUrl()\n let secret = ''\n try {\n secret = getPublishConfig().thirdwebSecretKey ?? ''\n } catch {\n secret = ''\n }\n const key = `${chain.id}:${rpcUrl}:${secret ? '1' : '0'}:${secret}`\n if (!_client || _clientKey !== key) {\n _clientKey = key\n _client = createPublishPublicClient()\n }\n return _client\n}\n\n/** Reset cached client (tests). */\nexport function resetPublishPublicClient(): void {\n _client = null\n _clientKey = null\n}\n\nexport async function waitForPublishReceipt(transactionHash: Hex) {\n return getPublishPublicClient().waitForTransactionReceipt({ hash: transactionHash })\n}\n\nexport async function isContractDeployed(address: string): Promise<boolean> {\n const code = await getPublishPublicClient().getBytecode({\n address: address as Address,\n })\n return !!code && code !== '0x'\n}\n\nexport async function getBlockTimestampMs(blockNumber: bigint): Promise<number | null> {\n try {\n const block = await getPublishPublicClient().getBlock({ blockNumber })\n if (block?.timestamp != null) return Number(block.timestamp) * 1000\n } catch {\n // ignore\n }\n return null\n}\n\nconst DEFAULT_DEPLOY_POLL_ATTEMPTS = 5\nconst DEFAULT_DEPLOY_POLL_INTERVAL_MS = 6_000\n\n/** Polls chain bytecode until the smart account is deployed or attempts are exhausted. */\nexport async function pollSmartWalletDeployed(\n smartWalletAddress: string,\n attempts: number = DEFAULT_DEPLOY_POLL_ATTEMPTS,\n intervalMs: number = DEFAULT_DEPLOY_POLL_INTERVAL_MS,\n): Promise<boolean> {\n for (let i = 0; i < attempts; i++) {\n if (await isContractDeployed(smartWalletAddress)) {\n return true\n }\n if (i < attempts - 1) {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, intervalMs)\n })\n }\n }\n return false\n}\n","import {\n encodeFunctionData,\n type Address,\n type Hex,\n} from 'viem'\nimport {\n multiPublishAbi,\n multiPublishIntegerAbi,\n publisherReadWriteAbi,\n} from '../abi/publisher'\nimport { managedAccountFactoryAbi } from '../abi/factory'\nimport { executorModuleAbi } from '../abi/executor'\nimport { MODULE_TYPE_EXECUTOR, seedExecutorRouterAbi } from '../abi/seedExecutorRouter'\nimport { easAbi } from '../abi/eas'\nimport { schemaRegistryAbi } from '../abi/schemaRegistry'\nimport type { SeedTxRequest } from '../seedSigner'\nimport { getPublishPublicClient } from '../chainClient'\nimport { getPublishConfig, requireManagedAccountFactoryAddress } from '../../config'\n\nexport type MultiPublishRequest = {\n localId: string\n seedUid: `0x${string}`\n seedSchemaUid: `0x${string}`\n versionUid: `0x${string}`\n versionSchemaUid: `0x${string}`\n seedIsRevocable: boolean\n listOfAttestations: Array<{\n schema: `0x${string}`\n data: Array<{\n recipient: `0x${string}`\n expirationTime: bigint\n revocable: boolean\n refUID: `0x${string}`\n data: `0x${string}`\n value: bigint\n }>\n }>\n propertiesToUpdate: Array<{\n publishLocalId: string\n propertySchemaUid: `0x${string}`\n }>\n}\n\nexport type MultiPublishIntegerRequest = {\n localIdIndex: bigint\n seedUid: `0x${string}`\n seedSchemaUid: `0x${string}`\n versionUid: `0x${string}`\n versionSchemaUid: `0x${string}`\n seedIsRevocable: boolean\n listOfAttestations: MultiPublishRequest['listOfAttestations']\n propertiesToUpdate: Array<{\n publishLocalIdIndex: bigint\n propertySchemaUid: `0x${string}`\n }>\n}\n\nexport function encodeMultiPublish(\n to: Address,\n requests: MultiPublishRequest[],\n gas?: bigint,\n): SeedTxRequest {\n return {\n to,\n data: encodeFunctionData({\n abi: multiPublishAbi,\n functionName: 'multiPublish',\n args: [requests],\n }),\n gas,\n }\n}\n\nexport function encodeMultiPublishInteger(\n to: Address,\n requests: MultiPublishIntegerRequest[],\n gas?: bigint,\n): SeedTxRequest {\n return {\n to,\n data: encodeFunctionData({\n abi: multiPublishIntegerAbi,\n functionName: 'multiPublish',\n args: [requests],\n }),\n gas,\n }\n}\n\n/**\n * Encode `multiPublish` for the SeedProtocolExecutor module. Takes the same request shape as\n * {@link encodeMultiPublish} and maps each `publishLocalId` to its index in `requests`.\n * Entries whose `publishLocalId` is not in `requests` are dropped, matching the extension,\n * whose string comparison finds no request for them.\n */\nexport function encodeExecutorMultiPublish(\n to: Address,\n requests: MultiPublishRequest[],\n gas?: bigint,\n): SeedTxRequest {\n const indexByLocalId = new Map<string, bigint>()\n requests.forEach((r, i) => {\n if (r.localId) indexByLocalId.set(r.localId, BigInt(i))\n })\n const executorRequests = requests.map((r) => ({\n localId: r.localId,\n seedUid: r.seedUid,\n versionUid: r.versionUid,\n seedSchemaUid: r.seedSchemaUid,\n versionSchemaUid: r.versionSchemaUid,\n seedIsRevocable: r.seedIsRevocable,\n listOfAttestations: r.listOfAttestations,\n propertiesToUpdate: (r.propertiesToUpdate ?? []).flatMap((pu) => {\n const publishIndex = pu.publishLocalId ? indexByLocalId.get(pu.publishLocalId) : undefined\n return publishIndex === undefined\n ? []\n : [{ publishIndex, propertySchemaUid: pu.propertySchemaUid }]\n }),\n }))\n return {\n to,\n data: encodeFunctionData({\n abi: executorModuleAbi,\n functionName: 'multiPublish',\n args: [executorRequests],\n }),\n gas,\n }\n}\n\nexport async function readExecutorModuleIsInitialized(\n moduleAddress: Address,\n account: Address,\n): Promise<boolean> {\n return getPublishPublicClient().readContract({\n address: moduleAddress,\n abi: executorModuleAbi,\n functionName: 'isInitialized',\n args: [account],\n })\n}\n\nexport async function readExecutorModuleEas(\n moduleAddress: Address,\n account: Address,\n): Promise<Address> {\n return getPublishPublicClient().readContract({\n address: moduleAddress,\n abi: executorModuleAbi,\n functionName: 'getEAS',\n args: [account],\n })\n}\n\n/**\n * The executor and EAS pinned by the account's `SeedExecutorRouterExtension`, or `null` when the\n * account has no such extension (pre-rollout Router accounts, ModularCore accounts).\n */\nexport async function readSeedExecutorRouter(\n account: Address,\n): Promise<{ executor: Address; eas: Address } | null> {\n try {\n const [executor, eas] = await getPublishPublicClient().readContract({\n address: account,\n abi: seedExecutorRouterAbi,\n functionName: 'getSeedExecutor',\n })\n return { executor, eas }\n } catch {\n return null\n }\n}\n\n/** Whether the router extension reports `executor` installed on `account`. */\nexport async function readSeedExecutorInstalled(account: Address, executor: Address): Promise<boolean> {\n return getPublishPublicClient().readContract({\n address: account,\n abi: seedExecutorRouterAbi,\n functionName: 'isModuleInstalled',\n args: [MODULE_TYPE_EXECUTOR, executor, '0x'],\n })\n}\n\n/**\n * `installSeedExecutor()` on `account`. Admin-only: send it from the account's admin EOA\n * directly; a self-call via `execute` (what smart-account wallets send) is rejected.\n */\nexport function encodeInstallSeedExecutor(account: Address): SeedTxRequest {\n return {\n to: account,\n data: encodeFunctionData({ abi: seedExecutorRouterAbi, functionName: 'installSeedExecutor' }),\n }\n}\n\nexport function encodeSetEas(to: Address, eas: Address): SeedTxRequest {\n return {\n to,\n data: encodeFunctionData({\n abi: publisherReadWriteAbi,\n functionName: 'setEas',\n args: [eas],\n }),\n }\n}\n\nexport async function readGetEas(managedAddress: Address): Promise<Address> {\n return getPublishPublicClient().readContract({\n address: managedAddress,\n abi: publisherReadWriteAbi,\n functionName: 'getEas',\n })\n}\n\nexport async function readIsActiveSigner(\n managedAddress: Address,\n signer: Address,\n): Promise<boolean> {\n return getPublishPublicClient().readContract({\n address: managedAddress,\n abi: publisherReadWriteAbi,\n functionName: 'isActiveSigner',\n args: [signer],\n })\n}\n\nexport async function readIsAdmin(managedAddress: Address, signer: Address): Promise<boolean> {\n return getPublishPublicClient().readContract({\n address: managedAddress,\n abi: publisherReadWriteAbi,\n functionName: 'isAdmin',\n args: [signer],\n })\n}\n\nexport async function readFactoryGetAddress(\n adminSigner: Address,\n data: Hex = '0x',\n): Promise<Address> {\n return getPublishPublicClient().readContract({\n address: requireManagedAccountFactoryAddress() as Address,\n abi: managedAccountFactoryAbi,\n functionName: 'getAddress',\n args: [adminSigner, data],\n })\n}\n\nexport function encodeCreateAccount(\n admin: Address,\n data: Hex = '0x',\n): SeedTxRequest {\n return {\n to: requireManagedAccountFactoryAddress() as Address,\n data: encodeFunctionData({\n abi: managedAccountFactoryAbi,\n functionName: 'createAccount',\n args: [admin, data],\n }),\n }\n}\n\nexport type EasAttestParams = {\n schema: `0x${string}`\n data: {\n recipient?: `0x${string}`\n expirationTime?: bigint\n revocable?: boolean\n refUID: `0x${string}`\n data: `0x${string}`\n value?: bigint\n }\n}\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const\n\nexport function encodeEasAttest(params: EasAttestParams): SeedTxRequest {\n const { easContractAddress } = getPublishConfig()\n return {\n to: easContractAddress as Address,\n data: encodeFunctionData({\n abi: easAbi,\n functionName: 'attest',\n args: [\n {\n schema: params.schema,\n data: {\n recipient: (params.data.recipient ?? ZERO_ADDRESS) as Address,\n expirationTime: params.data.expirationTime ?? 0n,\n revocable: params.data.revocable ?? true,\n refUID: params.data.refUID,\n data: params.data.data,\n value: params.data.value ?? 0n,\n },\n },\n ],\n }),\n }\n}\n\nexport type MultiAttestationRequest = {\n schema: `0x${string}`\n data: Array<{\n recipient: `0x${string}`\n expirationTime: bigint\n revocable: boolean\n refUID: `0x${string}`\n data: `0x${string}`\n value: bigint\n }>\n}\n\nexport function encodeEasMultiAttest(requests: MultiAttestationRequest[]): SeedTxRequest {\n const { easContractAddress } = getPublishConfig()\n return {\n to: easContractAddress as Address,\n data: encodeFunctionData({\n abi: easAbi,\n functionName: 'multiAttest',\n args: [requests],\n }),\n }\n}\n\nexport type MultiRevocationRequest = {\n schema: `0x${string}`\n data: Array<{\n uid: `0x${string}`\n value?: bigint\n }>\n}\n\nexport function encodeEasMultiRevoke(requests: MultiRevocationRequest[]): SeedTxRequest {\n const { easContractAddress } = getPublishConfig()\n return {\n to: easContractAddress as Address,\n data: encodeFunctionData({\n abi: easAbi,\n functionName: 'multiRevoke',\n args: [\n requests.map((r) => ({\n schema: r.schema,\n data: r.data.map((d) => ({\n uid: d.uid,\n value: d.value ?? 0n,\n })),\n })),\n ],\n }),\n }\n}\n\nexport type SchemaRecord = {\n uid: string\n resolver: string\n revocable: boolean\n schema: string\n}\n\nconst ZERO_BYTES32 = '0x' + '0'.repeat(64)\n\nexport async function readSchemaRecord(uid: string): Promise<SchemaRecord | null> {\n const result = await getPublishPublicClient().readContract({\n address: getPublishConfig().schemaRegistryAddress as Address,\n abi: schemaRegistryAbi,\n functionName: 'getSchema',\n args: [uid as Hex],\n })\n if (!result || result.uid === ZERO_BYTES32) return null\n return {\n uid: result.uid,\n resolver: result.resolver,\n revocable: result.revocable,\n schema: result.schema,\n }\n}\n\nexport function encodeRegisterSchema(params: {\n schema: string\n resolverAddress: string\n revocable: boolean\n}): SeedTxRequest {\n return {\n to: getPublishConfig().schemaRegistryAddress as Address,\n data: encodeFunctionData({\n abi: schemaRegistryAbi,\n functionName: 'register',\n args: [params.schema, params.resolverAddress as Address, params.revocable],\n }),\n }\n}\n","import { encodeAbiParameters, parseEventLogs, type Log } from 'viem'\nimport { easAbi } from './abi/eas'\nimport {\n encodeEasAttest,\n encodeEasMultiAttest,\n encodeEasMultiRevoke,\n type EasAttestParams,\n type MultiAttestationRequest,\n type MultiRevocationRequest,\n} from './contracts'\nimport type { SeedTxRequest } from './seedSigner'\n\nexport type { EasAttestParams, MultiAttestationRequest, MultiRevocationRequest }\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const\nconst ZERO_BYTES32 = ('0x' + '0'.repeat(64)) as `0x${string}`\n\n/**\n * Prepares a single EAS attest call (encoded SeedTxRequest).\n */\nexport function prepareEasAttest(params: EasAttestParams): SeedTxRequest {\n return encodeEasAttest(params)\n}\n\n/**\n * Prepares an EAS multiAttest call for batch attestations.\n */\nexport function prepareEasMultiAttest(requests: MultiAttestationRequest[]): SeedTxRequest {\n return encodeEasMultiAttest(requests)\n}\n\n/**\n * Encodes a bytes32 value for Seed/Version attestation data.\n * Equivalent to Solidity abi.encode(bytes32).\n */\nexport function encodeBytes32(value: `0x${string}`): `0x${string}` {\n return encodeAbiParameters([{ type: 'bytes32' }], [value]) as `0x${string}`\n}\n\n/**\n * Extracts the attestation UID from an EAS attest transaction receipt.\n */\nexport function getAttestationUidFromReceipt(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n easContractAddress: string,\n): string | undefined {\n const all = getAttestedUidsFromReceipt(receipt, easContractAddress)\n return all[0]?.uid\n}\n\nexport type EasAttestedPair = { schemaUid: string; uid: string }\n\n/**\n * All `Attested` events from the EAS contract in this receipt, in log order.\n */\nexport function getAttestedUidsFromReceipt(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n easContractAddress: string,\n): EasAttestedPair[] {\n if (!receipt.logs?.length) return []\n const want = easContractAddress.toLowerCase()\n const logs = receipt.logs.filter((l) => l.address && l.address.toLowerCase() === want)\n if (!logs.length) return []\n try {\n const parsed = parseEventLogs({\n abi: easAbi,\n eventName: 'Attested',\n logs: logs as Log[],\n strict: false,\n })\n const out: EasAttestedPair[] = []\n for (const ev of parsed) {\n const uid = ev.args?.uid as string | undefined\n const schemaUid = ev.args?.schemaUID as string | undefined\n if (!uid || uid === ZERO_BYTES32) continue\n if (!schemaUid) continue\n out.push({ schemaUid, uid })\n }\n return out\n } catch {\n return []\n }\n}\n\n/**\n * Prepares an EAS multiRevoke call for batch revocation. Targets EAS directly; only the attester\n * (an EOA, or a ManagedAccount executing as itself) can revoke. The Seed executor module has no\n * revoke path.\n */\nexport function prepareEasMultiRevoke(requests: MultiRevocationRequest[]): SeedTxRequest {\n return encodeEasMultiRevoke(requests)\n}\n\nexport { ZERO_ADDRESS, ZERO_BYTES32 }\n","import { client as seedClient } from '@seedprotocol/sdk'\nimport type { PublishWallet, SeedSigner, SeedTxSender } from './seedSigner'\n\nexport type PublishWalletSession = PublishWallet & {\n /** Addresses to treat as owned in the Seed SDK (EOA + smart account, etc.). */\n ownedAddresses?: string[]\n /** Preferred publisher address for new seeds (defaults to signer.address). */\n publisherAddress?: string\n}\n\nlet session: PublishWalletSession | null = null\n\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 * Register the active publish wallet (EIP-1193, ethers, Thirdweb adapter, etc.).\n * Syncs owned addresses into the Seed SDK when possible.\n */\nexport async function setPublishWallet(\n next: PublishWalletSession | null,\n): Promise<void> {\n session = next\n if (!next) return\n await waitUntilSeedInitialized()\n const owned = new Set<string>()\n for (const a of next.ownedAddresses ?? []) {\n if (a) owned.add(a.toLowerCase())\n }\n owned.add(next.signer.address.toLowerCase())\n owned.add(next.txSender.address.toLowerCase())\n if (next.publisherAddress) owned.add(next.publisherAddress.toLowerCase())\n try {\n await seedClient.setAddresses({ owned: [...owned] })\n const claimAs = next.publisherAddress ?? next.signer.address\n if (claimAs) {\n await seedClient.claimUnpublishedDrafts(claimAs)\n }\n } catch (err) {\n console.warn('[publishWalletRegistry] Failed to set seed client addresses:', err)\n }\n}\n\nexport function getPublishWallet(): PublishWalletSession | null {\n return session\n}\n\nexport function clearPublishWallet(): void {\n session = null\n}\n\n/** Convenience for callers that only need signing. */\nexport function getRegisteredSigner(): SeedSigner | null {\n return session?.signer ?? null\n}\n\n/** Convenience for callers that only need sending. */\nexport function getRegisteredTxSender(): SeedTxSender | null {\n return session?.txSender ?? null\n}\n","/** True for \"the nonce was already used\" rejections, which mean the tx was not accepted. */\nexport function isNonceTooLowError(err: unknown): boolean {\n const parts: string[] = []\n let cur: unknown = err\n for (let i = 0; cur && i < 5; i++) {\n const e = cur as { message?: unknown; shortMessage?: unknown; details?: unknown; code?: unknown; cause?: unknown }\n parts.push(String(e.message ?? ''), String(e.shortMessage ?? ''), String(e.details ?? ''), String(e.code ?? ''))\n cur = e.cause\n }\n return /nonce too low|nonce has already been used|NONCE_EXPIRED|nonce.*already.*(used|known)|lower than the current nonce/i.test(parts.join(' '))\n}\n\n/**\n * Retries `send` when the node rejects it for a stale nonce. A local fork's pending-nonce lookup\n * can trail the chain by a block, so back-to-back sends from one EOA may pick a used nonce.\n * Such a rejection means nothing was sent, so retrying cannot double-send.\n */\nexport async function retryNonceTooLow<T>(\n send: () => Promise<T>,\n { attempts = 3, delayMs = 1000 }: { attempts?: number; delayMs?: number } = {},\n): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await send()\n } catch (err) {\n if (attempt >= attempts || !isNonceTooLowError(err)) throw err\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n }\n }\n}\n","import type { Address, Hex, SignableMessage } from 'viem'\nimport { retryNonceTooLow } from './retryNonceTooLow'\nimport { ethers } from 'ethers'\n\n/** Encoded calldata ready for submission (viem path). */\nexport type SeedTxRequest = {\n to: Address\n data: Hex\n value?: bigint\n gas?: bigint\n}\n\n/**\n * Vendor-neutral key custody for Arweave DataItems and message signing.\n * Does not submit on-chain transactions.\n */\nexport interface SeedSigner {\n readonly address: Address\n\n /**\n * personal_sign. For Arweave/ANS-104 use `message: { raw: Hex | Uint8Array }`.\n * Plain string is UTF-8 prefixed hash.\n */\n signMessage(args: { message: SignableMessage }): Promise<Hex>\n}\n\n/**\n * Vendor-neutral transaction submission (EOA, AA, sponsored, etc.).\n */\nexport interface SeedTxSender {\n readonly address: Address\n\n /** Submit already-encoded calldata. */\n sendTransaction(tx: SeedTxRequest): Promise<{ transactionHash: Hex }>\n\n waitForReceipt?(transactionHash: Hex): Promise<{ status: 'success' | 'reverted' }>\n}\n\n/** Bundle used by publish / revoke flows that need both signing and sending. */\nexport type PublishWallet = {\n signer: SeedSigner\n txSender: SeedTxSender\n}\n\nconst SEED_SIGNER_BRAND = Symbol.for('seedprotocol.SeedSigner')\nconst SEED_TX_SENDER_BRAND = Symbol.for('seedprotocol.SeedTxSender')\n\ntype BrandedSeedSigner = SeedSigner & { readonly [SEED_SIGNER_BRAND]: true }\ntype BrandedSeedTxSender = SeedTxSender & { readonly [SEED_TX_SENDER_BRAND]: true }\n\nfunction brandSigner(signer: SeedSigner): SeedSigner {\n return Object.assign(signer, { [SEED_SIGNER_BRAND]: true as const }) as BrandedSeedSigner\n}\n\nfunction brandTxSender(sender: SeedTxSender): SeedTxSender {\n return Object.assign(sender, { [SEED_TX_SENDER_BRAND]: true as const }) as BrandedSeedTxSender\n}\n\nexport function isSeedSigner(value: unknown): value is SeedSigner {\n return !!value && typeof value === 'object' && SEED_SIGNER_BRAND in value\n}\n\nexport function isSeedTxSender(value: unknown): value is SeedTxSender {\n return !!value && typeof value === 'object' && SEED_TX_SENDER_BRAND in value\n}\n\nexport function isPublishWallet(value: unknown): value is PublishWallet {\n return (\n !!value &&\n typeof value === 'object' &&\n 'signer' in value &&\n 'txSender' in value &&\n isSeedSigner((value as PublishWallet).signer) &&\n isSeedTxSender((value as PublishWallet).txSender)\n )\n}\n\n/**\n * Wrap an ethers Wallet for tests / EOA scripts (signs + sends; no AA sponsorship).\n * Suitable for ANS-104 DataItem signing. Not a ManagedAccount session-key UserOp sender —\n * for automation on-chain publish, use a PublishWallet whose txSender submits UserOps\n * through the ManagedAccount (see docs/PUBLISH_AUTOMATION.md).\n */\nexport function fromEthersWallet(wallet: ethers.Wallet): PublishWallet {\n const address = wallet.address as Address\n const signer = brandSigner({\n address,\n signMessage: async ({ message }) => {\n if (typeof message === 'string') {\n return (await wallet.signMessage(message)) as Hex\n }\n const raw = message.raw\n const bytes =\n typeof raw === 'string'\n ? ethers.getBytes(raw)\n : raw instanceof Uint8Array\n ? raw\n : new Uint8Array(raw)\n return (await wallet.signMessage(bytes)) as Hex\n },\n })\n const txSender = brandTxSender({\n address,\n sendTransaction: async (tx) => {\n const result = await retryNonceTooLow(() =>\n wallet.sendTransaction({\n to: tx.to,\n data: tx.data,\n value: tx.value,\n gasLimit: tx.gas,\n }),\n )\n return { transactionHash: result.hash as Hex }\n },\n })\n return { signer, txSender }\n}\n\n/**\n * Coerce a branded SeedSigner, PublishWallet.signer, or pass-through unknown branded value.\n * Does not wrap Thirdweb Accounts — use `fromThirdwebAccount` from `@seedprotocol/publish/thirdweb`.\n */\nexport function asSeedSigner(value: SeedSigner | PublishWallet): SeedSigner {\n if (isPublishWallet(value)) return value.signer\n if (isSeedSigner(value)) return value\n throw new Error(\n '@seedprotocol/publish: expected a SeedSigner or PublishWallet. Use fromEthersWallet, fromEip1193Provider, or fromThirdwebAccount.',\n )\n}\n\n/** Resolve tx sender from a PublishWallet or branded SeedTxSender. */\nexport function asSeedTxSender(value: SeedTxSender | PublishWallet): SeedTxSender {\n if (isPublishWallet(value)) return value.txSender\n if (isSeedTxSender(value)) return value\n throw new Error(\n '@seedprotocol/publish: expected a SeedTxSender or PublishWallet. Use fromEthersWallet, fromEip1193Provider, or fromThirdwebAccount.',\n )\n}\n\n/** Prefer PublishWallet; if only a branded SeedSigner is passed, throw (tx path needs a sender). */\nexport function asPublishWallet(value: PublishWallet | SeedSigner): PublishWallet {\n if (isPublishWallet(value)) return value\n throw new Error(\n '@seedprotocol/publish: expected a PublishWallet (signer + txSender). Use fromEthersWallet, fromEip1193Provider, or fromThirdwebAccount.',\n )\n}\n\n/** @internal used by optional Thirdweb adapter */\nexport { brandSigner, brandTxSender }\n","import { defineChain, optimismSepolia, type Chain as ThirdwebChain } from 'thirdweb/chains'\nimport type { Chain as ViemChain } from 'viem'\nimport { getConfigRef } from '../config'\nimport { DEFAULT_PUBLISH_CHAIN } from './defaultChain'\n\nlet cached: { key: string; chain: ThirdwebChain } | null = null\n\n/**\n * Thirdweb chain matching the publish chain (`PublishConfig.chain`) and RPC (`PublishConfig.rpcUrl`).\n * All Thirdweb wallet connect / deploy / contract calls must use this instead of a fixed chain.\n *\n * With `rpcUrl` set, Thirdweb uses it too, so Seed's own reads and Thirdweb's calls always reach\n * the same node (e.g. a local fork). Without it, Thirdweb uses its RPC edge, as viem does.\n *\n * Pass `source` when the config ref may not be set yet (e.g. first React render).\n */\nexport function getPublishThirdwebChain(source?: { chain?: ViemChain; rpcUrl?: string }): ThirdwebChain {\n const ref = source ?? getConfigRef() ?? {}\n const viemChain = ref.chain ?? DEFAULT_PUBLISH_CHAIN\n const rpcUrl = ref.rpcUrl?.trim() || undefined\n const key = `${viemChain.id}|${rpcUrl ?? ''}`\n if (cached?.key === key) return cached.chain\n\n let chain: ThirdwebChain\n if (viemChain.id === optimismSepolia.id && !rpcUrl) {\n chain = optimismSepolia\n } else {\n // Without `rpc`, defineChain fills in Thirdweb's RPC edge for the chain id.\n chain = defineChain({\n id: viemChain.id,\n name: viemChain.name,\n nativeCurrency: viemChain.nativeCurrency,\n testnet: viemChain.testnet ? true : undefined,\n blockExplorers: viemChain.blockExplorers\n ? Object.values(viemChain.blockExplorers).map(({ name, url, apiUrl }) => ({ name, url, apiUrl }))\n : undefined,\n ...(rpcUrl ? { rpc: rpcUrl } : {}),\n })\n }\n cached = { key, chain }\n return chain\n}\n\nconst LOCAL_CHAIN_IDS = new Set([31337, 1337])\n\n/**\n * True for a dev chain (Anvil / Hardhat ids) or any chain reached through a loopback or `.localhost`\n * RPC, such as a fork. Thirdweb's hosted bundler, paymaster and EIP-7702 relayer cannot reach these.\n */\nexport function isLocalThirdwebChain(chain: Pick<ThirdwebChain, 'id' | 'rpc'>): boolean {\n if (LOCAL_CHAIN_IDS.has(chain.id)) return true\n try {\n const host = new URL(chain.rpc).hostname.replace(/^\\[|\\]$/g, '')\n return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host.endsWith('.localhost')\n } catch {\n return false\n }\n}\n","import { prepareTransaction, sendTransaction, type ThirdwebClient } from 'thirdweb'\nimport type { Account } from 'thirdweb/wallets'\nimport type { Address, Hex } from 'viem'\nimport {\n brandSigner,\n brandTxSender,\n isPublishWallet,\n isSeedSigner,\n type PublishWallet,\n type SeedSigner,\n} from '../seedSigner'\nimport { getPublishThirdwebChain } from '../thirdwebChain'\nimport { retryNonceTooLow } from '../retryNonceTooLow'\n\nexport type FromThirdwebAccountOptions = {\n /**\n * Thirdweb client for `prepareTransaction`. A Thirdweb Account does not carry a client.\n * Pass the secret-key client from the server, or omit this to use `getClient()`.\n */\n client?: ThirdwebClient\n}\n\n/**\n * Wrap a Thirdweb Account so AA gas sponsorship still flows through thirdweb `sendTransaction`.\n */\nexport function fromThirdwebAccount(\n account: Account,\n options?: FromThirdwebAccountOptions,\n): PublishWallet {\n const explicitClient = options?.client\n const address = account.address as Address\n const signer = brandSigner({\n address,\n signMessage: async ({ message }) => {\n const sig = await account.signMessage({ message })\n return sig as Hex\n },\n })\n const txSender = brandTxSender({\n address,\n sendTransaction: async (tx) => {\n const client = explicitClient ?? (await import('../publishThirdwebClient')).getClient()\n const chain = getPublishThirdwebChain()\n const transaction = prepareTransaction({\n client,\n chain,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n gas: tx.gas,\n })\n // Smart accounts send UserOps (EntryPoint nonces); this only matters for plain EOAs.\n const result = await retryNonceTooLow(() => sendTransaction({ account, transaction }))\n return { transactionHash: result.transactionHash as Hex }\n },\n })\n return { signer, txSender }\n}\n\n/**\n * Coerce Thirdweb Account, SeedSigner, or PublishWallet to PublishWallet.\n */\nexport function asThirdwebPublishWallet(\n accountOrWallet: Account | SeedSigner | PublishWallet,\n options?: FromThirdwebAccountOptions,\n): PublishWallet {\n if (isPublishWallet(accountOrWallet)) return accountOrWallet\n if (isSeedSigner(accountOrWallet)) {\n throw new Error(\n '@seedprotocol/publish/thirdweb: SeedSigner alone cannot send sponsored txs. Pass fromThirdwebAccount(account) or a PublishWallet.',\n )\n }\n return fromThirdwebAccount(accountOrWallet, options)\n}\n\n/** @deprecated Prefer {@link asThirdwebPublishWallet}; kept for call-site migration. */\nexport function asSeedSignerFromThirdweb(\n accountOrWallet: Account | SeedSigner | PublishWallet,\n): SeedSigner {\n if (isPublishWallet(accountOrWallet)) return accountOrWallet.signer\n if (isSeedSigner(accountOrWallet)) return accountOrWallet\n return fromThirdwebAccount(accountOrWallet).signer\n}\n","import { getPublishConfig } from '../config'\nimport { getPublishPublicClient, isContractDeployed } from './chainClient'\nimport { getPublishRpcUrl } from './chainConfig'\n\n/** Thrown by {@link verifyPublishChain}; `problems` lists every check that failed. */\nexport class PublishChainConfigError extends Error {\n override name = 'PublishChainConfigError'\n constructor(\n readonly chainId: number,\n readonly problems: string[],\n ) {\n super(\n `@seedprotocol/publish: chain ${chainId} is not set up for publishing:\\n- ${problems.join('\\n- ')}`,\n )\n }\n}\n\nlet verified: { key: string; result: Promise<void> } | null = null\n\nfunction configKey(): string {\n const cfg = getPublishConfig()\n return [\n cfg.chain.id,\n getPublishRpcUrl(),\n cfg.easContractAddress,\n cfg.schemaRegistryAddress,\n cfg.thirdwebAccountFactoryAddress ?? '',\n cfg.modularAccountModuleContract ?? '',\n ]\n .join('|')\n .toLowerCase()\n}\n\nasync function runChecks(): Promise<void> {\n const cfg = getPublishConfig()\n const { chain } = cfg\n const problems: string[] = []\n\n let rpcChainId: number | undefined\n try {\n rpcChainId = await getPublishPublicClient().getChainId()\n } catch (cause) {\n throw new PublishChainConfigError(chain.id, [\n `could not reach the RPC (${redactRpcUrl(getPublishRpcUrl())}): ${cause instanceof Error ? cause.message : String(cause)}`,\n ])\n }\n if (rpcChainId !== chain.id) {\n // Contract checks against the wrong chain would only add noise.\n throw new PublishChainConfigError(chain.id, [\n `the RPC reports chain ${rpcChainId}, but PublishConfig.chain is ${chain.name} (${chain.id}). Point rpcUrl at ${chain.name}.`,\n ])\n }\n\n const contracts: Array<[label: string, address: string | undefined, fix: string]> = [\n ['EAS contract', cfg.easContractAddress, 'set easContractAddress'],\n ['EAS SchemaRegistry', cfg.schemaRegistryAddress, 'set schemaRegistryAddress'],\n [\n 'ManagedAccount factory',\n cfg.thirdwebAccountFactoryAddress,\n 'deploy the factory or fix managedAccountFactoryAddress',\n ],\n [\n 'executor module',\n cfg.modularAccountModuleContract?.trim() || undefined,\n 'deploy the module or fix modularAccountModuleContract',\n ],\n ]\n const results = await Promise.all(\n contracts.map(async ([label, address, fix]) => {\n if (!address) return null\n const deployed = await isContractDeployed(address)\n return deployed ? null : `no ${label} at ${address} on ${chain.name}; ${fix}.`\n }),\n )\n for (const r of results) if (r) problems.push(r)\n\n if (problems.length > 0) throw new PublishChainConfigError(chain.id, problems)\n}\n\n/** Hide API keys embedded in RPC URLs (e.g. Thirdweb client ids) from error messages. */\nfunction redactRpcUrl(url: string): string {\n try {\n const u = new URL(url)\n return `${u.protocol}//${u.host}`\n } catch {\n return 'configured rpcUrl'\n }\n}\n\n/**\n * Checks that the configured chain is usable before anything is sent: the RPC reports\n * `PublishConfig.chain.id`, and EAS, the SchemaRegistry and (when configured) the ManagedAccount\n * factory and executor module have code at their addresses.\n *\n * Runs once per configuration (cached; a failure is retried on the next call). The publish\n * flow calls it before the first attestation; apps can call it at startup to fail early.\n *\n * @throws PublishChainConfigError listing every failed check\n */\nexport function verifyPublishChain(): Promise<void> {\n const key = configKey()\n if (verified?.key === key) return verified.result\n const result = runChecks()\n verified = { key, result }\n result.catch(() => {\n if (verified?.result === result) verified = null\n })\n return result\n}\n\n/** @internal Tests only. */\nexport function resetVerifiedPublishChain(): void {\n verified = null\n}\n","import { prepareEasMultiRevoke } from '~/helpers/easDirect'\nimport { waitForPublishReceipt } from '~/helpers/chainClient'\nimport { getPublishWallet } from '~/helpers/publishWalletRegistry'\nimport { fromThirdwebAccount } from '~/helpers/adapters/thirdwebAccount'\nimport type { PublishWallet } from '~/helpers/seedSigner'\nimport { getPublishConfig } from '~/config'\nimport { verifyPublishChain } from '~/helpers/verifyPublishChain'\nimport {\n getVersionsForSeedUid,\n getMetadataAttestationUidsForSeedUid,\n getAttesterForSeed,\n updateSeedRevokedAt,\n VERSION_SCHEMA_UID,\n isValidEasAttestationUid,\n getGetAdditionalSyncAddresses,\n assertLocalDbChain,\n} from '@seedprotocol/sdk'\n\n/**\n * True when the EAS attester is the configured executor module (legacy path where the\n * module itself was recorded as attester). ManagedAccount attesters are not blocked.\n */\nasync function isLegacyModularExecutorAttester(attester: string | null): Promise<boolean> {\n if (!attester) return false\n const additionalGetter = getGetAdditionalSyncAddresses()\n if (!additionalGetter) return false\n const additional = await additionalGetter()\n const attesterLower = attester.toLowerCase()\n return !!additional?.some((a: string | undefined) => a?.toLowerCase() === attesterLower)\n}\n\n/**\n * True when `wallet` is an automation session key on the ManagedAccount that attested the seed.\n * Read failures count as false: the revoke then goes to EAS, and the account rejects it.\n */\nasync function isAutomationRevoke(\n wallet: PublishWallet,\n attester: string | null,\n): Promise<boolean> {\n if (!attester || !getPublishConfig().modularAccountModuleContract?.trim()) return false\n const signerAddress = wallet.signer?.address\n if (!signerAddress || signerAddress.toLowerCase() === attester.toLowerCase()) return false\n try {\n const { isAutomationSessionActive } = await import('~/helpers/ensureAutomationSessionKey')\n return await isAutomationSessionActive(attester, signerAddress)\n } catch {\n return false\n }\n}\n\n/**\n * Revokes the Seed attestation and all Version and metadata attestations on EAS.\n * Prefer the registered publish wallet; fall back to Thirdweb connected account when present.\n *\n * Only the attester's owner can revoke: `multiRevoke` goes to EAS from the publishing account\n * (for a ManagedAccount, a UserOp `execute(EAS, multiRevoke)`). The Seed executor has no revoke,\n * so automation session keys and seeds attested by the executor itself cannot be revoked here.\n */\nexport async function revokeAttestations(params: {\n seedLocalId: string\n seedUid: string\n seedSchemaUid: string\n}): Promise<void> {\n const { seedLocalId, seedUid, seedSchemaUid } = params\n // Revoking on one chain must not update revokedAt for a seed attested on another.\n await assertLocalDbChain()\n await verifyPublishChain()\n const attester = await getAttesterForSeed({ seedLocalId, seedUid })\n if (await isLegacyModularExecutorAttester(attester)) {\n throw new Error(\n 'Revocation not supported for items attested by the Seed executor module: the executor has no revoke and is the only attester that could revoke them.',\n )\n }\n\n let wallet: PublishWallet | null = getPublishWallet()\n if (!wallet) {\n try {\n const { getConnectedAccount } = await import('~/helpers/thirdweb')\n const { resolveRevokeAccount } = await import('~/helpers/resolveRevokeAccount')\n const account = await getConnectedAccount()\n if (!account) {\n throw new Error('No wallet connected. Connect a wallet to revoke attestations.')\n }\n const revokeAccount = await resolveRevokeAccount({ account, attester })\n wallet = fromThirdwebAccount(revokeAccount)\n } catch (err) {\n if (err instanceof Error && err.message.includes('No wallet connected')) throw err\n if (err instanceof Error && err.message.includes('Revocation not supported')) throw err\n throw new Error(\n 'No wallet connected. Use useSeedWallet / setPublishWallet, or @seedprotocol/publish/thirdweb ConnectButton.',\n { cause: err },\n )\n }\n }\n\n const txSender = wallet.txSender\n if (await isAutomationRevoke(wallet, attester)) {\n throw new Error(\n 'Automation session keys cannot revoke attestations. Revoking is owner-only: connect the account that published this item.',\n )\n }\n\n const [versionRows, metadataRows] = await Promise.all([\n getVersionsForSeedUid(seedUid),\n getMetadataAttestationUidsForSeedUid(seedUid),\n ])\n\n const versionUids = versionRows\n .map((r: { uid: string }) => r.uid)\n .filter((uid: string) => isValidEasAttestationUid(uid))\n const metadataBySchema = new Map<string, string[]>()\n for (const { uid, schemaUid } of metadataRows) {\n if (!isValidEasAttestationUid(uid)) continue\n const list = metadataBySchema.get(schemaUid) ?? []\n list.push(uid)\n metadataBySchema.set(schemaUid, list)\n }\n\n const requests: Array<{\n schema: `0x${string}`\n data: Array<{ uid: `0x${string}`; value?: bigint }>\n }> = []\n\n for (const [schemaUid, uids] of metadataBySchema) {\n if (uids.length > 0) {\n requests.push({\n schema: schemaUid as `0x${string}`,\n data: uids.map((uid: string) => ({ uid: uid as `0x${string}` })),\n })\n }\n }\n\n if (versionUids.length > 0) {\n requests.push({\n schema: VERSION_SCHEMA_UID as `0x${string}`,\n data: versionUids.map((uid: string) => ({ uid: uid as `0x${string}` })),\n })\n }\n\n requests.push({\n schema: seedSchemaUid as `0x${string}`,\n data: [{ uid: seedUid as `0x${string}` }],\n })\n\n for (const req of requests) {\n if (req.data.length === 0) continue\n const multiRevokeTx = prepareEasMultiRevoke([req])\n try {\n const result = await txSender.sendTransaction(multiRevokeTx)\n await waitForPublishReceipt(result.transactionHash)\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err)\n if (msg.includes('AccessDenied') || msg.includes('0x4ca88867')) {\n throw new Error(\n 'Only the original attester can revoke attestations. Connect the wallet that published this item.',\n )\n }\n if (msg.includes('AlreadyRevoked')) {\n continue\n }\n throw err\n }\n }\n\n const revokedAt = Math.floor(Date.now() / 1000)\n await updateSeedRevokedAt({ seedLocalId, revokedAt })\n}\n","import {\n DEFAULT_ARWEAVE_GRAPHQL_URL,\n setAdditionalSyncAddresses,\n setGetPublisherForNewSeeds,\n setRevokeExecutor,\n type TransactionTag,\n} from '@seedprotocol/sdk'\nimport type { Chain } from 'viem'\nimport { revokeAttestations } from './services/revoke/revokeAttestations'\nimport {\n configureEasReadChain,\n expectEasReadChain,\n resolveEasChainDeployment,\n type EasChainDeployment,\n} from '@seedprotocol/eas'\nimport { MANAGED_ACCOUNT_FACTORY_ADDRESSES } from './helpers/constants'\nimport { ethers } from 'ethers'\nimport { DEFAULT_PUBLISH_CHAIN } from './helpers/defaultChain'\nimport { getPublishWallet } from './helpers/publishWalletRegistry'\n\n// initPublish will set the chain. Until then the SDK's EAS sync waits instead of reading the\n// default chain into a local DB that publish is about to point elsewhere.\nexpectEasReadChain('publish')\n\n/** Serialized upload item for Arweave signing (input to callback or used internally with JWK) */\nexport interface SerializedPublishUpload {\n versionLocalId: string\n itemPropertyName: string\n transactionJson: Record<string, unknown>\n}\n\n/** Result from Arweave signing (signed transaction + metadata) */\nexport interface ArweaveTransactionInfoResult {\n transaction: Record<string, unknown> & { chunks?: unknown }\n versionId: string\n modelName: string\n}\n\n/** Result from DataItem signing (compatible shape for createAttestations) */\nexport interface ArweaveDataItemInfoResult {\n transaction: { id: string }\n versionId?: string\n modelName?: string\n}\n\nexport type PublishAccountMode = 'eoa' | 'eip7702'\n\nexport interface ThirdwebWalletOptions {\n /**\n * Bundler for the managed (EIP-4337, EntryPoint v0.6) smart account's UserOps. Defaults to\n * Thirdweb's hosted bundler for the chain; required on a local chain. This is the bundler a\n * local twin uses, not the top-level {@link PublishConfig.bundlerUrl}.\n */\n bundlerUrl?: string\n /**\n * Sponsor gas through Thirdweb: the managed smart account's UserOps and, in `'EIP7702'` mode,\n * the in-app EOA's transactions. Default `true`. Set `false` where Thirdweb's paymaster is\n * unavailable (local chains); the accounts then pay their own gas and must hold ETH.\n */\n sponsorGas?: boolean\n /**\n * How the user's in-app EOA (the managed account's admin) sends its own transactions, such as\n * installing the Seed executor: `'EIP7702'` (default) goes through Thirdweb's hosted EIP-7702\n * service (gas-sponsored per `sponsorGas`); `'EOA'` sends plain transactions and needs ETH.\n * A local chain requires `'EOA'`: the wallet throws for `'EIP7702'` there. The address is the\n * same either way.\n */\n modularWalletMode?: 'EIP7702' | 'EOA'\n}\n\nexport interface PublishConfig {\n /**\n * Thirdweb client id — only required when using `@seedprotocol/publish/thirdweb`.\n * When set without `rpcUrl`, the public client falls back to Thirdweb’s RPC edge.\n * Browser client ids are usually locked to app origins; Node servers should also set\n * `thirdwebSecretKey` or those RPC and bundler calls return 401.\n */\n thirdwebClientId?: string\n /**\n * Thirdweb secret key for server-side clients. Sent as `x-secret-key` on viem reads\n * of the Thirdweb RPC URL, and passed to `createThirdwebClient` for sends.\n * Do not ship this to the browser. It does not replace `rpcUrl` or `thirdwebClientId`\n * when building the viem RPC URL.\n */\n thirdwebSecretKey?: string\n /**\n * Viem chain for reads, writes and wallet connection. Defaults to Optimism Sepolia.\n * Any EVM chain with EAS deployed works. Chains in `EAS_CHAIN_DEPLOYMENTS` (`@seedprotocol/eas`)\n * resolve contract addresses automatically; others need {@link easContractAddress} and\n * {@link schemaRegistryAddress}.\n */\n chain?: Chain\n /** EAS contract on {@link chain}. Defaults to the known deployment for `chain.id`. */\n easContractAddress?: string\n /** EAS SchemaRegistry on {@link chain}. Defaults to the known deployment for `chain.id`. */\n schemaRegistryAddress?: string\n /**\n * Thirdweb ManagedAccount factory on {@link chain}. Only used by managed / modular account flows.\n * Built in for Optimism Sepolia; required on other chains when those flows are enabled.\n */\n managedAccountFactoryAddress?: string\n /**\n * JSON-RPC URL for the publish chain. Required when `thirdwebClientId` is unset.\n * Prefer a public chain RPC from Node. A domain-locked client id in the default\n * Thirdweb URL returns 401 unless `thirdwebSecretKey` is also set.\n * Thirdweb wallets and contract calls use it too; without it they use Thirdweb's RPC edge.\n */\n rpcUrl?: string\n /**\n * Thirdweb in-app wallet settings (`@seedprotocol/publish/thirdweb`). Defaults suit Thirdweb-hosted\n * chains; a local chain (e.g. the OP Sepolia twin) needs `bundlerUrl`, `sponsorGas: false` and\n * `modularWalletMode: 'EOA'`.\n */\n thirdweb?: ThirdwebWalletOptions\n /**\n * EntryPoint v0.8 bundler for the permissionless EIP-7702 `SeedTxSender` used by non-Thirdweb\n * wallets. Setting it switches `accountMode` to `eip7702`. Not used by Thirdweb wallets: a local\n * twin's (v0.6) bundler goes in {@link ThirdwebWalletOptions.bundlerUrl}. A bundler that\n * reports no v0.8 support is rejected when the sender is created.\n */\n bundlerUrl?: string\n /**\n * Paymaster / sponsorship endpoint for permissionless EIP-7702 sends.\n */\n paymasterUrl?: string\n /**\n * How non-Thirdweb wallets submit txs. Defaults to `eip7702` when `bundlerUrl` is set, else `eoa`.\n */\n accountMode?: PublishAccountMode\n /** Upload API base URL (e.g. from VITE_UPLOAD_API_BASE_URL or NEXT_PUBLIC_UPLOAD_API_BASE_URL). Also used for bundler when useArweaveBundler is true. */\n uploadApiBaseUrl: string\n /**\n * Gateway transport for publish + read paths. Prefer resolving once via\n * `resolveSeedGatewayEndpoints(seedGatewayConfigFromSeedConfig(config))` at app bootstrap\n * and passing `uploadApiBaseUrl` / `arweaveGraphqlUrl` from the result.\n */\n gatewayTransport?: 'http-gateway' | 'hyper' | 'hybrid'\n /** Operator Gateway Hyper key (z32) — informational; sidecar is configured separately. */\n gatewayHyperKey?: string\n /**\n * Optional origin for verifying uploads via `GET /api/upload/arweave/data/:id`.\n * Defaults to {@link uploadApiBaseUrl} (e.g. set `ARWEAVE_UPLOAD_API_BASE_URL` as `uploadApiBaseUrl`).\n */\n arweaveUploadVerificationBaseUrl?: string\n /**\n * Arweave gateway GraphQL URL for resolving L1 bundle tx ids after bundler upload.\n * Defaults to {@link DEFAULT_ARWEAVE_GRAPHQL_URL}.\n */\n arweaveGraphqlUrl?: string\n /**\n * Use integer indices instead of string localId/publishLocalId for multiPublish (gas-efficient).\n * Set to true when using the new contract that expects uint256 localIdIndex/publishLocalIdIndex.\n * Default: false (uses string-based payload for backward compatibility).\n */\n useIntegerLocalIds?: boolean\n /**\n * Bypass the SeedProtocol contract and call EAS attest/multiAttest directly from the user's wallet.\n * Default: false (uses contract multiPublish).\n */\n useDirectEas?: boolean\n /**\n * Optional IModularCore module to ensure is installed on the **ModularCore** account contract.\n * When set, onConnect / publish prep will check getInstalledModules and install if missing.\n * If the smart account is not ModularCore (no Router), install is skipped — typical for default EIP-4337 accounts.\n */\n modularAccountModuleContract?: string\n /** Optional module install data (default \"0x\"). Used with modularAccountModuleContract. */\n modularAccountModuleData?: string\n /**\n * Use the modular executor for multiPublish.\n * Default: false (uses the smart wallet executor).\n */\n useModularExecutor?: boolean\n /**\n * When true (and `useModularExecutor`), attempts to deploy / bootstrap the modular in-app wallet’s\n * EIP-7702 smart account on the publish chain via Thirdweb’s `deploySmartAccount` when bytecode is still empty.\n * When **undefined** and `useModularExecutor` is true, defaults to **true**. Set explicitly to **false** to surface\n * an error instead of auto-deploying.\n */\n autoDeployEip7702ModularAccount?: boolean\n /**\n * When true (and `useModularExecutor`), attempts to deploy the ManagedAccount via the factory\n * if it is not yet deployed on the publish chain. Default: false (surface `managed_not_ready` instead).\n */\n autoDeployManagedAccount?: boolean\n /**\n * Optional override for automatic ManagedAccount factory deploy when {@link autoDeployManagedAccount} is true.\n * When unset, uses Thirdweb `deploySmartAccount` on the managed EIP-4337 in-app wallet account.\n */\n deployManagedAccount?: (params: {\n managedAddress: string\n managedSigningAccount: import('./helpers/seedSigner').PublishWallet\n }) => Promise<void>\n /**\n * Called when optional wallet setup steps fail after connect (e.g. executor module install).\n */\n onWalletSetupWarning?: (error: unknown) => void\n /**\n * EXPERIMENTAL: Use Arweave bundler for instant uploads instead of reimbursement + chunk upload.\n * When true, skips sendReimbursementRequest, pollForConfirmation, and chunk-by-chunk uploadData.\n * Uses uploadApiBaseUrl for the bundler endpoint. Not yet validated for production.\n */\n useArweaveBundler?: boolean\n /**\n * Tags appended to every Arweave upload after Content-SHA-256 / Content-Type (e.g. App-Name).\n * Merged at publish time with {@link CreatePublishOptions.arweaveUploadTags} as\n * `[...config, ...options]`.\n */\n arweaveUploadTags?: TransactionTag[]\n /**\n * Default Html embedded data-URI policy for publishes when not overridden per {@link CreatePublishOptions}.\n * Default behavior when unset: `materialize`.\n */\n htmlEmbeddedDataUriPolicy?: import('./types').HtmlEmbeddedDataUriPolicy\n /**\n * Optional fallback: Sign Arweave upload transactions (non-bundler path). Prefer passing at createPublish time.\n */\n signArweaveTransactions?: (\n uploads: SerializedPublishUpload[]\n ) => Promise<ArweaveTransactionInfoResult[]>\n /**\n * Optional fallback: Arweave JWK for in-process signing (non-bundler path). Prefer passing at createPublish time.\n */\n arweaveJwk?: { kty: string; n: string; e: string; d?: string; [key: string]: unknown }\n /**\n * Optional fallback: Signer for DataItem creation when useArweaveBundler is true. Prefer passing at createPublish time.\n */\n dataItemSigner?: ethers.Wallet | import('./helpers/seedSigner').SeedSigner\n /**\n * Optional fallback: Sign DataItems when useArweaveBundler is true. Prefer passing at createPublish time.\n * Each upload includes `tags` (content + configured {@link arweaveUploadTags}); forward them into the DataItem.\n */\n signDataItems?: (\n uploads: import('./services/publish/helpers/getPublishUploadData').PublishUploadData[]\n ) => Promise<ArweaveDataItemInfoResult[]>\n /**\n * Optional USD spot prices for publish cost estimates. When unset, Coinbase ETH-USD / AR-USD spots are used.\n * Results are cached for 60s.\n */\n getTokenPrices?: () => Promise<{ ethUsd: number; arUsd: number }>\n /**\n * Called when an author publish run reaches success with the resolved batch UID list.\n * Tool backends use this to call {@link import('./services/publishedBy').attestPublishedBy}.\n * Per-publish {@link CreatePublishOptions.onPublished} overrides this when set.\n */\n onPublished?: import('./services/publishedBy').OnPublishedCallback\n}\n\n/** Options passed at createPublish time. Signers here override config fallbacks. */\nexport interface CreatePublishOptions {\n /** `patch` (default): pending properties only. `new_version`: new Version attestation + all properties. */\n publishMode?: import('./types').PublishMode\n /**\n * Required when useArweaveBundler: sign DataItems (wallet flow).\n * Use each upload's `tags` when building the signed DataItem.\n */\n signDataItems?: (\n uploads: import('./services/publish/helpers/getPublishUploadData').PublishUploadData[]\n ) => Promise<ArweaveDataItemInfoResult[]>\n /** Required when useArweaveBundler: signer for DataItems (backend/script flow) */\n dataItemSigner?: ethers.Wallet | import('./helpers/seedSigner').SeedSigner\n /** Required when NOT useArweaveBundler: sign Arweave transactions */\n signArweaveTransactions?: (\n uploads: SerializedPublishUpload[]\n ) => Promise<ArweaveTransactionInfoResult[]>\n /** Required when NOT useArweaveBundler: JWK for in-process signing */\n arweaveJwk?: { kty: string; n: string; e: string; d?: string; [key: string]: unknown }\n /**\n * Extra tags for this publish only, appended after {@link PublishConfig.arweaveUploadTags}.\n * Resolved order: `[...initPublishTags, ...theseTags]`.\n */\n arweaveUploadTags?: TransactionTag[]\n /**\n * Default for Html embedded data-URI handling when a property does not set `htmlEmbeddedDataUriPolicy`.\n * Default: `materialize`.\n */\n htmlEmbeddedDataUriPolicy?: import('./types').HtmlEmbeddedDataUriPolicy\n /**\n * Called when this publish run succeeds with the resolved Seed/Version/property UID batch.\n * Overrides {@link PublishConfig.onPublished} when both are set.\n */\n onPublished?: import('./services/publishedBy').OnPublishedCallback\n}\n\n/** Internal: module-level config ref set by PublishProvider on mount. */\nlet configRef: PublishConfig | null = null\n\n/**\n * Internal: Set config ref. Called by PublishProvider on mount or initPublish.\n */\nexport function setConfigRef(c: PublishConfig | null): void {\n configRef = c\n}\n\n/**\n * Internal: Get current config ref. Used by PublishProvider when config is not passed.\n */\nexport function getConfigRef(): PublishConfig | null {\n return configRef\n}\n\n/**\n * Initialize the publish package. Call once before using PublishManager or other publish APIs.\n * Registers the config and SDK hooks (revoke executor, getPublisherForNewSeeds, etc.).\n * For React apps, you can alternatively pass config to PublishProvider.\n */\nexport function initPublish(c: PublishConfig): void {\n // Fail fast on chains without a known EAS deployment and no address overrides.\n const easChain = resolvePublishEasChain(c)\n // Point SDK reads (EAS sync, schema lookups) at the chain we publish to. Throws when\n // SeedConfig.eas.chainId names a different chain.\n configureEasReadChain('publish', { chainId: easChain.chainId, indexerUrl: easChain.indexerUrl })\n setConfigRef(c)\n setGetPublisherForNewSeeds(async () => {\n const wallet = getPublishWallet()\n if (wallet?.publisherAddress) return wallet.publisherAddress\n if (wallet?.signer?.address) return wallet.signer.address\n return undefined\n })\n setRevokeExecutor(revokeAttestations)\n void import('./services/arweaveL1Finalize/worker').then((m) => {\n m.startArweaveL1FinalizeWorker()\n })\n setAdditionalSyncAddresses(async () => {\n if (c.useModularExecutor && c.modularAccountModuleContract) {\n return [c.modularAccountModuleContract]\n }\n return []\n })\n}\n\n/** Alias for initPublish. Use initPublish for the primary API. */\nexport const configurePublish = initPublish\n\nexport interface ResolvedPublishConfig extends PublishConfig {\n /**\n * ManagedAccount factory on the publish chain, or undefined when none is known for this chain.\n * Use {@link requireManagedAccountFactoryAddress} where a factory is mandatory.\n */\n thirdwebAccountFactoryAddress: string | undefined\n uploadApiBaseUrl: string\n /** Resolved verification origin (defaults to uploadApiBaseUrl). */\n arweaveUploadVerificationBaseUrl: string\n /** Resolved GraphQL endpoint for L1 tx resolution (defaults to DEFAULT_ARWEAVE_GRAPHQL_URL). */\n arweaveGraphqlUrl: string\n easContractAddress: string\n schemaRegistryAddress: string\n /** EAS deployment for the publish chain (addresses, indexer and explorer URLs). */\n easChain: EasChainDeployment\n useIntegerLocalIds: boolean\n useDirectEas: boolean\n modularAccountModuleData: string\n useModularExecutor: boolean\n useArweaveBundler: boolean\n /** Resolved: defaults to false. */\n autoDeployManagedAccount: boolean\n /**\n * Resolved: when `useModularExecutor` is true, defaults to true unless explicitly false.\n */\n autoDeployEip7702ModularAccount: boolean\n /** Resolved viem chain (defaults to Optimism Sepolia; see `DEFAULT_PUBLISH_CHAIN`). */\n chain: Chain\n /** Resolved account mode for non-Thirdweb senders. */\n accountMode: PublishAccountMode\n /** Resolved Thirdweb wallet settings (defaults applied). */\n thirdweb: ResolvedThirdwebWalletOptions\n}\n\nexport type ResolvedThirdwebWalletOptions = {\n bundlerUrl: string | undefined\n sponsorGas: boolean\n modularWalletMode: 'EIP7702' | 'EOA'\n}\n\n/** Applies defaults to {@link PublishConfig.thirdweb}. */\nexport function resolveThirdwebWalletOptions(\n config: Pick<PublishConfig, 'thirdweb'> | null | undefined,\n): ResolvedThirdwebWalletOptions {\n const tw = config?.thirdweb ?? {}\n return {\n bundlerUrl: tw.bundlerUrl?.trim() || undefined,\n sponsorGas: tw.sponsorGas ?? true,\n modularWalletMode: tw.modularWalletMode ?? 'EIP7702',\n }\n}\n\n/**\n * Returns the resolved publish config: defaults, env-driven fields, and\n * {@link ResolvedPublishConfig.autoDeployEip7702ModularAccount}.\n *\n * Reads the ref set by {@link initPublish} or {@link PublishProvider} with a `config` prop.\n * **Throws** if publish has not been initialized (same error as other publish APIs).\n */\nexport function getPublishConfig(): ResolvedPublishConfig {\n const config = configRef\n if (!config) {\n throw new Error(\n '@seedprotocol/publish: Call initPublish() or ensure PublishProvider is mounted with config before using the publish package'\n )\n }\n const useArweaveBundler = config.useArweaveBundler ?? false\n const arweaveUploadVerificationBaseUrl =\n config.arweaveUploadVerificationBaseUrl ?? config.uploadApiBaseUrl\n const arweaveGraphqlUrl = config.arweaveGraphqlUrl ?? DEFAULT_ARWEAVE_GRAPHQL_URL\n const useModularExecutor = config.useModularExecutor ?? false\n const chain = config.chain ?? DEFAULT_PUBLISH_CHAIN\n const easChain = resolvePublishEasChain(config)\n const accountMode: PublishAccountMode =\n config.accountMode ?? (config.bundlerUrl ? 'eip7702' : 'eoa')\n return {\n ...config,\n thirdwebAccountFactoryAddress:\n config.managedAccountFactoryAddress ?? MANAGED_ACCOUNT_FACTORY_ADDRESSES[chain.id],\n easContractAddress: easChain.easContractAddress,\n schemaRegistryAddress: easChain.schemaRegistryAddress,\n easChain,\n useIntegerLocalIds: config.useIntegerLocalIds ?? false,\n useDirectEas: config.useDirectEas ?? false,\n modularAccountModuleData: config.modularAccountModuleData ?? '0x',\n useModularExecutor,\n useArweaveBundler,\n arweaveUploadVerificationBaseUrl,\n arweaveGraphqlUrl,\n autoDeployManagedAccount: config.autoDeployManagedAccount ?? false,\n autoDeployEip7702ModularAccount: resolveAutoDeployEip7702ModularAccount(config, useModularExecutor),\n chain,\n accountMode,\n thirdweb: resolveThirdwebWalletOptions(config),\n }\n}\n\n/**\n * EAS deployment for the configured chain, with {@link PublishConfig.easContractAddress} /\n * {@link PublishConfig.schemaRegistryAddress} overrides applied.\n */\nexport function resolvePublishEasChain(config: PublishConfig): EasChainDeployment {\n const chain = config.chain ?? DEFAULT_PUBLISH_CHAIN\n try {\n return resolveEasChainDeployment(chain.id, {\n name: chain.name,\n easContractAddress: config.easContractAddress as `0x${string}` | undefined,\n schemaRegistryAddress: config.schemaRegistryAddress as `0x${string}` | undefined,\n })\n } catch (error) {\n throw new Error(\n `@seedprotocol/publish: ${chain.name} (chain ${chain.id}) has no known EAS deployment. Pass easContractAddress and schemaRegistryAddress in initPublish / PublishProvider config.`,\n { cause: error },\n )\n }\n}\n\n/** ManagedAccount factory for the publish chain; throws when none is configured. */\nexport function requireManagedAccountFactoryAddress(): string {\n const { thirdwebAccountFactoryAddress, chain } = getPublishConfig()\n if (!thirdwebAccountFactoryAddress) {\n throw new Error(\n `@seedprotocol/publish: no ManagedAccount factory is known for ${chain.name} (chain ${chain.id}). Pass managedAccountFactoryAddress in publish config, or use the EOA / direct EAS path.`,\n )\n }\n return thirdwebAccountFactoryAddress\n}\n\n/** @internal Exported for unit tests. */\nexport function resolveAutoDeployEip7702ModularAccount(\n config: PublishConfig,\n useModularExecutor: boolean,\n): boolean {\n if (config.autoDeployEip7702ModularAccount === true) return true\n if (config.autoDeployEip7702ModularAccount === false) return false\n return useModularExecutor\n}\n","import type { Chain } from 'viem'\nimport { getPublishConfig } from '../config'\nimport { DEFAULT_PUBLISH_CHAIN } from './defaultChain'\n\nexport { DEFAULT_PUBLISH_CHAIN }\n\n/**\n * Resolved viem chain for public client + adapters.\n */\nexport function getPublishViemChain(): Chain {\n try {\n return getPublishConfig().chain ?? DEFAULT_PUBLISH_CHAIN\n } catch {\n return DEFAULT_PUBLISH_CHAIN\n }\n}\n\n/**\n * Resolved RPC URL. Prefer explicit `rpcUrl`; fall back to Thirdweb edge URL when client id is set.\n */\nexport function getPublishRpcUrl(): string {\n const config = getPublishConfig()\n if (config.rpcUrl) return config.rpcUrl\n if (config.thirdwebClientId) {\n const chainId = (config.chain ?? DEFAULT_PUBLISH_CHAIN).id\n return `https://${chainId}.rpc.thirdweb.com/${config.thirdwebClientId}`\n }\n throw new Error(\n '@seedprotocol/publish: rpcUrl is required when thirdwebClientId is not set. A thirdwebSecretKey authenticates Thirdweb RPC but does not build this URL. Pass rpcUrl or thirdwebClientId in initPublish / PublishProvider config.',\n )\n}\n\n/** Display name of the publish chain for user-facing messages. */\nexport function getPublishChainName(): string {\n return getPublishViemChain().name\n}\n"],"mappings":"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"}