@seedprotocol/publish 0.5.1 → 0.5.3
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.
- package/CHANGELOG.md +15 -0
- package/README.md +7 -1
- package/dist/config-BBL0ILr9.js +945 -0
- package/dist/config-BBL0ILr9.js.map +1 -0
- package/dist/config-DLoMtwmG.js +945 -0
- package/dist/config-DLoMtwmG.js.map +1 -0
- package/dist/ensureAutomationSessionKey-BuM0gQfL.js +84 -0
- package/dist/ensureAutomationSessionKey-BuM0gQfL.js.map +1 -0
- package/dist/ensureAutomationSessionKey-BwIqDrG9.js +84 -0
- package/dist/ensureAutomationSessionKey-BwIqDrG9.js.map +1 -0
- package/dist/ensureManagedAccountEasConfigured-CLB69z0D.js +1206 -0
- package/dist/ensureManagedAccountEasConfigured-CLB69z0D.js.map +1 -0
- package/dist/ensureManagedAccountEasConfigured-DkRwHXL2.js +1204 -0
- package/dist/ensureManagedAccountEasConfigured-DkRwHXL2.js.map +1 -0
- package/dist/ensureModularPublishBootstrap-B_w6G5EL.js +125 -0
- package/dist/ensureModularPublishBootstrap-B_w6G5EL.js.map +1 -0
- package/dist/ensureModularPublishBootstrap-BafX1eks.js +124 -0
- package/dist/ensureModularPublishBootstrap-BafX1eks.js.map +1 -0
- package/dist/ensureModularPublishBootstrap-CPEwnTCw.js +127 -0
- package/dist/ensureModularPublishBootstrap-CPEwnTCw.js.map +1 -0
- package/dist/ensureModularPublishBootstrap-CqKKjChn.js +127 -0
- package/dist/ensureModularPublishBootstrap-CqKKjChn.js.map +1 -0
- package/dist/ensureSmartWalletThenPublish-BDX7FxdV.js +47 -0
- package/dist/ensureSmartWalletThenPublish-BDX7FxdV.js.map +1 -0
- package/dist/ensureSmartWalletThenPublish-CgCb9kZy.js +47 -0
- package/dist/ensureSmartWalletThenPublish-CgCb9kZy.js.map +1 -0
- package/dist/ensureSmartWalletThenPublish-Ch7BST2M.js +48 -0
- package/dist/ensureSmartWalletThenPublish-Ch7BST2M.js.map +1 -0
- package/dist/ensureSmartWalletThenPublish-DaLwVUBl.js +47 -0
- package/dist/ensureSmartWalletThenPublish-DaLwVUBl.js.map +1 -0
- package/dist/ensureSmartWalletThenPublish-s7MBAeky.js +48 -0
- package/dist/ensureSmartWalletThenPublish-s7MBAeky.js.map +1 -0
- package/dist/errors-Du3LNbJN.js +70 -0
- package/dist/errors-Du3LNbJN.js.map +1 -0
- package/dist/helpers/approvedTargetsForAutomationPublish.d.ts +9 -0
- package/dist/helpers/approvedTargetsForAutomationPublish.d.ts.map +1 -0
- package/dist/helpers/assertStorageBoundToIdentity.d.ts +31 -0
- package/dist/helpers/assertStorageBoundToIdentity.d.ts.map +1 -0
- package/dist/helpers/automationSessionKeyPermissions.d.ts +26 -0
- package/dist/helpers/automationSessionKeyPermissions.d.ts.map +1 -0
- package/dist/helpers/easDirect.d.ts +7 -0
- package/dist/helpers/easDirect.d.ts.map +1 -1
- package/dist/helpers/enrollPublishAutomation.d.ts +36 -0
- package/dist/helpers/enrollPublishAutomation.d.ts.map +1 -0
- package/dist/helpers/ensureAutomationSessionKey.d.ts +20 -0
- package/dist/helpers/ensureAutomationSessionKey.d.ts.map +1 -0
- package/dist/helpers/ensureManagedAccountEasConfigured.d.ts +5 -0
- package/dist/helpers/ensureManagedAccountEasConfigured.d.ts.map +1 -1
- package/dist/helpers/resolveRevokeAccount.d.ts +3 -6
- package/dist/helpers/resolveRevokeAccount.d.ts.map +1 -1
- package/dist/helpers/seedSigner.d.ts +3 -0
- package/dist/helpers/seedSigner.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +573 -198
- package/dist/index.js.map +1 -1
- package/dist/publishAuthorization-9WO-Zbcj.js +3426 -0
- package/dist/publishAuthorization-9WO-Zbcj.js.map +1 -0
- package/dist/publishAuthorization-CSyAV8Hf.js +3403 -0
- package/dist/publishAuthorization-CSyAV8Hf.js.map +1 -0
- package/dist/publishManager-B7zTF25-.js +3018 -0
- package/dist/publishManager-B7zTF25-.js.map +1 -0
- package/dist/publishManager-DFIx_0eN.js +3060 -0
- package/dist/publishManager-DFIx_0eN.js.map +1 -0
- package/dist/publishManager-luSstTr_.js +3008 -0
- package/dist/publishManager-luSstTr_.js.map +1 -0
- package/dist/resolveRevokeAccount-B4J_Jo76.js +38 -0
- package/dist/resolveRevokeAccount-B4J_Jo76.js.map +1 -0
- package/dist/resolveRevokeAccount-Bo1IMYOj.js +38 -0
- package/dist/resolveRevokeAccount-Bo1IMYOj.js.map +1 -0
- package/dist/resolveRevokeAccount-FYMP0Qz6.js +30 -0
- package/dist/resolveRevokeAccount-FYMP0Qz6.js.map +1 -0
- package/dist/resolveRevokeAccount-mMTFtVDR.js +30 -0
- package/dist/resolveRevokeAccount-mMTFtVDR.js.map +1 -0
- package/dist/services/PublishManager/index.d.ts +2 -2
- package/dist/services/PublishManager/index.d.ts.map +1 -1
- package/dist/services/domainOwnership/challenge.d.ts +34 -0
- package/dist/services/domainOwnership/challenge.d.ts.map +1 -0
- package/dist/services/domainOwnership/dnsVerify.d.ts +23 -0
- package/dist/services/domainOwnership/dnsVerify.d.ts.map +1 -0
- package/dist/services/domainOwnership/index.d.ts +121 -0
- package/dist/services/domainOwnership/index.d.ts.map +1 -0
- package/dist/services/domainOwnership/public.d.ts +2 -0
- package/dist/services/domainOwnership/public.d.ts.map +1 -0
- package/dist/services/domainOwnership/registry.d.ts +18 -0
- package/dist/services/domainOwnership/registry.d.ts.map +1 -0
- package/dist/services/publish/actors/createAttestations.d.ts +6 -0
- package/dist/services/publish/actors/createAttestations.d.ts.map +1 -1
- package/dist/services/publish/index.d.ts +17 -17
- package/dist/services/publish/index.d.ts.map +1 -1
- package/dist/services/publishAuthorization/index.d.ts +68 -0
- package/dist/services/publishAuthorization/index.d.ts.map +1 -0
- package/dist/services/publishAuthorization/public.d.ts +2 -0
- package/dist/services/publishAuthorization/public.d.ts.map +1 -0
- package/dist/services/revoke/revokeAttestations.d.ts +3 -0
- package/dist/services/revoke/revokeAttestations.d.ts.map +1 -1
- package/dist/services/upload/uploadMachine.d.ts +2 -2
- package/dist/services/upload/uploadMachine.d.ts.map +1 -1
- package/dist/thirdweb.d.ts +5 -0
- package/dist/thirdweb.d.ts.map +1 -1
- package/dist/thirdweb.js +202 -83
- package/dist/thirdweb.js.map +1 -1
- package/dist/worker-BaZK7VaR.js +69 -0
- package/dist/worker-BaZK7VaR.js.map +1 -0
- package/dist/worker-ChGaz4Bg.js +69 -0
- package/dist/worker-ChGaz4Bg.js.map +1 -0
- package/dist/worker-Nx2FsrmM.js +69 -0
- package/dist/worker-Nx2FsrmM.js.map +1 -0
- package/dist/worker-eQpROLst.js +69 -0
- package/dist/worker-eQpROLst.js.map +1 -0
- package/package.json +7 -4
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Revokes the Seed attestation and all Version and metadata attestations on EAS.
|
|
3
3
|
* Prefer the registered publish wallet; fall back to Thirdweb connected account when present.
|
|
4
|
+
*
|
|
5
|
+
* When `modularAccountModuleContract` is set, `multiRevoke` is sent to the executor module
|
|
6
|
+
* so automation session keys (module-only targets) can revoke as the ManagedAccount.
|
|
4
7
|
*/
|
|
5
8
|
export declare function revokeAttestations(params: {
|
|
6
9
|
seedLocalId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revokeAttestations.d.ts","sourceRoot":"","sources":["../../../src/services/revoke/revokeAttestations.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"revokeAttestations.d.ts","sourceRoot":"","sources":["../../../src/services/revoke/revokeAttestations.ts"],"names":[],"mappings":"AA6BA;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoGhB"}
|
|
@@ -15,7 +15,7 @@ export declare const uploadMachine: import("xstate").StateMachine<UploadMachineC
|
|
|
15
15
|
[x: string]: import("xstate").ActorRefFromLogic<import("xstate").PromiseActorLogic<ReimbursementResponse, {
|
|
16
16
|
context: UploadMachineContext;
|
|
17
17
|
event?: unknown;
|
|
18
|
-
}, import("xstate").EventObject
|
|
18
|
+
}, import("xstate").EventObject> | import("xstate").CallbackActorLogic<import("xstate").EventObject, {
|
|
19
19
|
context: UploadMachineContext;
|
|
20
20
|
}, import("xstate").EventObject>> | undefined;
|
|
21
21
|
}, {
|
|
@@ -44,5 +44,5 @@ export declare const uploadMachine: import("xstate").StateMachine<UploadMachineC
|
|
|
44
44
|
readonly success: {};
|
|
45
45
|
readonly failure: {};
|
|
46
46
|
};
|
|
47
|
-
}>;
|
|
47
|
+
}, import("xstate").MetaObject>;
|
|
48
48
|
//# sourceMappingURL=uploadMachine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadMachine.d.ts","sourceRoot":"","sources":["../../../src/services/upload/uploadMachine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEzD,MAAM,MAAM,qBAAqB,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7D,MAAM,MAAM,oBAAoB,GAAG;IACjC,kBAAkB,EAAE,sBAAsB,EAAE,CAAA;IAC5C,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,qBAAqB,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"uploadMachine.d.ts","sourceRoot":"","sources":["../../../src/services/upload/uploadMachine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEzD,MAAM,MAAM,qBAAqB,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7D,MAAM,MAAM,oBAAoB,GAAG;IACjC,kBAAkB,EAAE,sBAAsB,EAAE,CAAA;IAC5C,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,qBAAqB,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAiFxB,CAAA"}
|
package/dist/thirdweb.d.ts
CHANGED
|
@@ -14,4 +14,9 @@ export { ensureEip7702ModularAccountReady } from './helpers/ensureEip7702Modular
|
|
|
14
14
|
export { ensureManagedSignerSessionKey } from './helpers/ensureManagedSignerSessionKey';
|
|
15
15
|
export { ensureModularPublishBootstrap } from './helpers/ensureModularPublishBootstrap';
|
|
16
16
|
export { defaultApprovedTargetsForModularPublish } from './helpers/defaultApprovedTargetsForModularPublish';
|
|
17
|
+
export { approvedTargetsForAutomationPublish } from './helpers/approvedTargetsForAutomationPublish';
|
|
18
|
+
export { ensureAutomationSessionKey, removeAutomationSessionKey, isAutomationSessionActive, } from './helpers/ensureAutomationSessionKey';
|
|
19
|
+
export { PUBLISH_AUTOMATION_SCOPES, buildAutomationSessionKeyPermissions, hashAutomationSessionKeyPermissions, toThirdwebSessionKeyPermissions, type AutomationSessionKeyPermissions, } from './helpers/automationSessionKeyPermissions';
|
|
20
|
+
export { enrollPublishAutomation, revokePublishAutomation, type EnrollPublishAutomationParams, type EnrollPublishAutomationResult, type RevokePublishAutomationParams, } from './helpers/enrollPublishAutomation';
|
|
21
|
+
export { assertStorageBoundToIdentity, type AssertStorageBoundToIdentityParams, type AssertStorageBoundToIdentityResult, } from './helpers/assertStorageBoundToIdentity';
|
|
17
22
|
//# sourceMappingURL=thirdweb.d.ts.map
|
package/dist/thirdweb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thirdweb.d.ts","sourceRoot":"","sources":["../src/thirdweb.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE3H,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,WAAW,EACX,OAAO,EACP,wBAAwB,EACxB,kCAAkC,EAClC,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAC/F,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEnE,OAAO,EACL,4BAA4B,EAC5B,KAAK,uBAAuB,GAC7B,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,GACtC,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAA;AAC7F,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,uCAAuC,EAAE,MAAM,mDAAmD,CAAA"}
|
|
1
|
+
{"version":3,"file":"thirdweb.d.ts","sourceRoot":"","sources":["../src/thirdweb.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE3H,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,WAAW,EACX,OAAO,EACP,wBAAwB,EACxB,kCAAkC,EAClC,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAC/F,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEnE,OAAO,EACL,4BAA4B,EAC5B,KAAK,uBAAuB,GAC7B,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,GACtC,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAA;AAC7F,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,uCAAuC,EAAE,MAAM,mDAAmD,CAAA;AAC3G,OAAO,EAAE,mCAAmC,EAAE,MAAM,+CAA+C,CAAA;AACnG,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EACL,yBAAyB,EACzB,oCAAoC,EACpC,mCAAmC,EACnC,+BAA+B,EAC/B,KAAK,+BAA+B,GACrC,MAAM,2CAA2C,CAAA;AAClD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,GACnC,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EACL,4BAA4B,EAC5B,KAAK,kCAAkC,EACvC,KAAK,kCAAkC,GACxC,MAAM,wCAAwC,CAAA"}
|
package/dist/thirdweb.js
CHANGED
|
@@ -1,53 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
1
|
+
import { a as e, b as t, i as n, n as r, o as i, r as a, s as o, v as s } from "./config-BBL0ILr9.js";
|
|
2
|
+
import { o as c, r as l } from "./errors-Du3LNbJN.js";
|
|
3
|
+
import { A as u, C as d, D as f, E as ee, F as p, H as m, I as h, L as g, M as _, N as te, O as v, P as y, Q as b, R as x, S, T as C, U as w, V as ne, Z as re, a as ie, b as ae, d as oe, f as se, h as T, j as E, k as D, l as O, m as k, p as A, u as j, w as M, x as N, y as P, z as F } from "./publishAuthorization-9WO-Zbcj.js";
|
|
4
|
+
import { t as I } from "./ensureSmartWalletThenPublish-s7MBAeky.js";
|
|
5
|
+
import { a as L, i as R, r as z, t as B } from "./ensureModularPublishBootstrap-CqKKjChn.js";
|
|
6
|
+
import { i as V, r as H, t as U } from "./ensureAutomationSessionKey-BuM0gQfL.js";
|
|
7
|
+
import { client as W } from "@seedprotocol/sdk";
|
|
8
|
+
import { getContract as G } from "thirdweb";
|
|
9
|
+
import { optimismSepolia as K } from "thirdweb/chains";
|
|
10
|
+
import { useCallback as ce, useEffect as q, useRef as J } from "react";
|
|
11
|
+
import { jsx as Y } from "react/jsx-runtime";
|
|
12
|
+
import { SeedProvider as le } from "@seedprotocol/react";
|
|
13
|
+
import { ConnectButton as ue, ThirdwebProvider as de, darkTheme as fe, useActiveAccount as pe, useActiveWallet as me, useActiveWalletConnectionStatus as he, useIsAutoConnecting as ge } from "thirdweb/react";
|
|
14
|
+
import { getInstalledModules as _e } from "thirdweb/modules";
|
|
15
|
+
import { assessPublishAuthorization as ve, decodePublishAuthorizationData as ye, getPublishAuthorizationFromEas as be } from "@seedprotocol/eas";
|
|
11
16
|
//#region src/react/ConnectButton.tsx
|
|
12
|
-
var
|
|
13
|
-
function
|
|
14
|
-
console.warn("[ConnectButton] Wallet setup / module install skipped:", e),
|
|
17
|
+
var X = "seedProtocol:publish:userChoseWalletDisconnect";
|
|
18
|
+
function xe(e) {
|
|
19
|
+
console.warn("[ConnectButton] Wallet setup / module install skipped:", e), a().onWalletSetupWarning?.(e);
|
|
15
20
|
}
|
|
16
|
-
function
|
|
17
|
-
return
|
|
18
|
-
|
|
21
|
+
function Se() {
|
|
22
|
+
return W.isInitialized() ? Promise.resolve() : new Promise((e) => {
|
|
23
|
+
W.onReady(() => e());
|
|
19
24
|
});
|
|
20
25
|
}
|
|
21
|
-
async function
|
|
26
|
+
async function Z(e, t, n) {
|
|
22
27
|
if (n.modularAccountModuleContract) {
|
|
23
28
|
if (n.useModularExecutor) {
|
|
24
29
|
if (!t) return;
|
|
25
30
|
try {
|
|
26
|
-
|
|
27
|
-
let e =
|
|
31
|
+
F();
|
|
32
|
+
let e = E();
|
|
28
33
|
await e.autoConnect({
|
|
29
|
-
client:
|
|
30
|
-
chain:
|
|
34
|
+
client: f(),
|
|
35
|
+
chain: K
|
|
31
36
|
});
|
|
32
37
|
let r = e.getAccount();
|
|
33
38
|
if (!r) return;
|
|
34
|
-
await
|
|
39
|
+
await S(t, r, n);
|
|
35
40
|
} catch {}
|
|
36
41
|
return;
|
|
37
42
|
}
|
|
38
43
|
try {
|
|
39
|
-
await
|
|
44
|
+
await S(e.address, e, n);
|
|
40
45
|
} catch (e) {
|
|
41
|
-
|
|
46
|
+
xe(e);
|
|
42
47
|
}
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
|
-
var
|
|
46
|
-
let
|
|
47
|
-
|
|
50
|
+
var Ce = () => {
|
|
51
|
+
let e = b(), n = me(), r = pe(), i = he(), a = ge(), c = J(null), l = J(!1), u = J(!1);
|
|
52
|
+
q(() => {
|
|
48
53
|
if (typeof window > "u") return;
|
|
49
|
-
let
|
|
50
|
-
|
|
54
|
+
let t = l.current;
|
|
55
|
+
l.current = a;
|
|
51
56
|
let n;
|
|
52
57
|
try {
|
|
53
58
|
n = performance.getEntriesByType("navigation")[0]?.type;
|
|
@@ -57,57 +62,58 @@ var ie = () => {
|
|
|
57
62
|
if (n !== "reload") return;
|
|
58
63
|
let r = !1;
|
|
59
64
|
try {
|
|
60
|
-
r = sessionStorage.getItem(
|
|
65
|
+
r = sessionStorage.getItem(X) === "1";
|
|
61
66
|
} catch {
|
|
62
67
|
r = !1;
|
|
63
68
|
}
|
|
64
|
-
r ||
|
|
65
|
-
client:
|
|
66
|
-
chain:
|
|
67
|
-
}).catch(() => {}));
|
|
69
|
+
r || t && !a && i === "disconnected" && (u.current || (u.current = !0, (e.useModularExecutor ? _() : E()).autoConnect({
|
|
70
|
+
client: f(),
|
|
71
|
+
chain: K
|
|
72
|
+
}).catch(() => {})));
|
|
68
73
|
}, [
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
i,
|
|
75
|
+
a,
|
|
76
|
+
e.useModularExecutor
|
|
72
77
|
]);
|
|
73
|
-
let
|
|
74
|
-
let
|
|
75
|
-
if (!
|
|
76
|
-
await
|
|
77
|
-
let
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
let
|
|
78
|
+
let d = ce(async (n) => {
|
|
79
|
+
let r = n.getAccount();
|
|
80
|
+
if (!r) return;
|
|
81
|
+
await Se(), T.stopAll();
|
|
82
|
+
let i = /* @__PURE__ */ new Set([r.address.toLowerCase()]), a;
|
|
83
|
+
if (e.useModularExecutor) {
|
|
84
|
+
F();
|
|
85
|
+
let e = n.getAdminAccount?.()?.address ?? r.address, t = async () => {
|
|
81
86
|
try {
|
|
82
|
-
return await
|
|
87
|
+
return await D(K);
|
|
83
88
|
} catch {
|
|
84
89
|
try {
|
|
85
|
-
return await
|
|
90
|
+
return await y(e);
|
|
86
91
|
} catch {
|
|
87
92
|
return;
|
|
88
93
|
}
|
|
89
94
|
}
|
|
90
95
|
};
|
|
91
|
-
a = await
|
|
96
|
+
a = await t(), a ||= (await new Promise((e) => queueMicrotask(() => e())), await t()), a && i.add(a.toLowerCase());
|
|
92
97
|
}
|
|
93
|
-
let
|
|
94
|
-
if (c.current !==
|
|
95
|
-
c.current =
|
|
98
|
+
let s = [...i].sort().join(",");
|
|
99
|
+
if (c.current !== s) {
|
|
100
|
+
c.current = s;
|
|
96
101
|
try {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
let e = o(r);
|
|
103
|
+
await t({
|
|
104
|
+
...e,
|
|
105
|
+
ownedAddresses: [...i],
|
|
106
|
+
publisherAddress: a ?? r.address
|
|
101
107
|
});
|
|
102
108
|
} catch (e) {
|
|
103
109
|
throw c.current = null, console.warn("[ConnectButton] Failed to set seed client addresses:", e), e;
|
|
104
110
|
}
|
|
105
|
-
await
|
|
111
|
+
await Z(r, a, e);
|
|
106
112
|
}
|
|
107
|
-
}, [
|
|
108
|
-
return
|
|
109
|
-
if (
|
|
110
|
-
if (
|
|
113
|
+
}, [e]);
|
|
114
|
+
return q(() => {
|
|
115
|
+
if (a) return;
|
|
116
|
+
if (i !== "connected") {
|
|
111
117
|
c.current = null;
|
|
112
118
|
return;
|
|
113
119
|
}
|
|
@@ -116,42 +122,42 @@ var ie = () => {
|
|
|
116
122
|
return (async () => {
|
|
117
123
|
try {
|
|
118
124
|
if (e) return;
|
|
119
|
-
await
|
|
125
|
+
await d(n);
|
|
120
126
|
} catch {}
|
|
121
127
|
})(), () => {
|
|
122
128
|
e = !0;
|
|
123
129
|
};
|
|
124
130
|
}, [
|
|
125
131
|
n,
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
]), /* @__PURE__ */
|
|
131
|
-
client:
|
|
132
|
-
wallets:
|
|
132
|
+
r?.address,
|
|
133
|
+
i,
|
|
134
|
+
a,
|
|
135
|
+
d
|
|
136
|
+
]), /* @__PURE__ */ Y(ue, {
|
|
137
|
+
client: f(),
|
|
138
|
+
wallets: p(),
|
|
133
139
|
autoConnect: !0,
|
|
134
|
-
chain:
|
|
135
|
-
chains: [
|
|
140
|
+
chain: K,
|
|
141
|
+
chains: [K],
|
|
136
142
|
onConnect: async (e, t) => {
|
|
137
143
|
let n = e.getAccount();
|
|
138
144
|
if (n) {
|
|
139
145
|
try {
|
|
140
|
-
sessionStorage.removeItem(
|
|
146
|
+
sessionStorage.removeItem(X);
|
|
141
147
|
} catch {}
|
|
142
148
|
console.log("[ConnectButton] Connected", n.address);
|
|
143
149
|
try {
|
|
144
|
-
await
|
|
150
|
+
await d(e);
|
|
145
151
|
} catch {}
|
|
146
152
|
}
|
|
147
153
|
},
|
|
148
154
|
onDisconnect: () => {
|
|
149
155
|
try {
|
|
150
|
-
sessionStorage.setItem(
|
|
156
|
+
sessionStorage.setItem(X, "1");
|
|
151
157
|
} catch {}
|
|
152
|
-
|
|
158
|
+
s(), T.stopAll();
|
|
153
159
|
},
|
|
154
|
-
theme:
|
|
160
|
+
theme: fe({ colors: {
|
|
155
161
|
primaryButtonBg: "#1D2939",
|
|
156
162
|
primaryButtonText: "#FFFFFF",
|
|
157
163
|
secondaryButtonHoverBg: "#1D2939",
|
|
@@ -160,17 +166,130 @@ var ie = () => {
|
|
|
160
166
|
borderColor: "#344054"
|
|
161
167
|
} })
|
|
162
168
|
});
|
|
163
|
-
},
|
|
164
|
-
t &&
|
|
165
|
-
}, [t]), /* @__PURE__ */
|
|
166
|
-
value: t ??
|
|
167
|
-
children: /* @__PURE__ */
|
|
168
|
-
queryClient:
|
|
169
|
-
queryClientRef:
|
|
169
|
+
}, we = ({ children: e, config: t, queryClient: i, queryClientRef: a }) => (q(() => {
|
|
170
|
+
t && n(t);
|
|
171
|
+
}, [t]), /* @__PURE__ */ Y(re.Provider, {
|
|
172
|
+
value: t ?? r(),
|
|
173
|
+
children: /* @__PURE__ */ Y(de, { children: /* @__PURE__ */ Y(le, {
|
|
174
|
+
queryClient: i,
|
|
175
|
+
queryClientRef: a,
|
|
170
176
|
children: e
|
|
171
177
|
}) })
|
|
172
178
|
}));
|
|
173
179
|
//#endregion
|
|
174
|
-
|
|
180
|
+
//#region src/helpers/enrollPublishAutomation.ts
|
|
181
|
+
async function Q(e) {
|
|
182
|
+
let t = E();
|
|
183
|
+
await t.autoConnect({
|
|
184
|
+
client: f(),
|
|
185
|
+
chain: K
|
|
186
|
+
});
|
|
187
|
+
let n = t.getAccount();
|
|
188
|
+
if (!n) throw new l("Could not connect the managed publishing account to enroll or revoke publish automation.", "MANAGED_ACCOUNT_UNAVAILABLE", e);
|
|
189
|
+
return n;
|
|
190
|
+
}
|
|
191
|
+
async function $(e, t) {
|
|
192
|
+
return t || o(await Q(e));
|
|
193
|
+
}
|
|
194
|
+
async function Te(e) {
|
|
195
|
+
let t = a(), n = t.modularAccountModuleContract?.trim();
|
|
196
|
+
if (!n) throw Error("@seedprotocol/publish: enrollPublishAutomation requires PublishConfig.modularAccountModuleContract");
|
|
197
|
+
let r = await Q(e);
|
|
198
|
+
try {
|
|
199
|
+
await S(e, r, t);
|
|
200
|
+
} catch (t) {
|
|
201
|
+
throw t instanceof l ? t : new l("Executor module setup failed for publish automation.", "EXECUTOR_MODULE_NOT_INSTALLED", e, t);
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
let t = G({
|
|
205
|
+
client: f(),
|
|
206
|
+
chain: K,
|
|
207
|
+
address: e
|
|
208
|
+
}), r = await _e({ contract: t }), i = n.toLowerCase();
|
|
209
|
+
if (!r.some((e) => e.implementation?.toLowerCase() === i)) throw new l("Executor module is not installed on the ManagedAccount (ModularCore required for automation grants).", "EXECUTOR_MODULE_NOT_INSTALLED", e);
|
|
210
|
+
} catch (t) {
|
|
211
|
+
throw t instanceof l ? t : c(t) ? new l("ManagedAccount is not ModularCore; cannot install the executor module required for automation grants.", "EXECUTOR_MODULE_NOT_INSTALLED", e, t) : new l("Could not verify executor module installation for publish automation.", "EXECUTOR_MODULE_NOT_INSTALLED", e, t);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function Ee(e) {
|
|
215
|
+
let { managedAddress: t, sessionKeyAddress: n, appAddress: r, expiresAt: i } = e;
|
|
216
|
+
await Te(t), await U({
|
|
217
|
+
managedAddress: t,
|
|
218
|
+
sessionKeyAddress: n,
|
|
219
|
+
expiresAt: i
|
|
220
|
+
});
|
|
221
|
+
let a = await $(t, e.userWallet);
|
|
222
|
+
return {
|
|
223
|
+
managedAddress: t,
|
|
224
|
+
sessionKeyAddress: n,
|
|
225
|
+
authorization: await ie({
|
|
226
|
+
wallet: a,
|
|
227
|
+
identity: t,
|
|
228
|
+
sessionKey: n,
|
|
229
|
+
app: r,
|
|
230
|
+
expiresAt: i
|
|
231
|
+
})
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
async function De(e) {
|
|
235
|
+
let { managedAddress: t, sessionKeyAddress: n, authorizationUid: r } = e, i = await $(t, e.userWallet);
|
|
236
|
+
await V({
|
|
237
|
+
managedAddress: t,
|
|
238
|
+
sessionKeyAddress: n
|
|
239
|
+
}), await O({
|
|
240
|
+
wallet: i,
|
|
241
|
+
uid: r
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
//#endregion
|
|
245
|
+
//#region src/helpers/assertStorageBoundToIdentity.ts
|
|
246
|
+
async function Oe(e) {
|
|
247
|
+
let { managedAddress: t, dataItemOwner: n, atTime: r, allowActiveSessionKey: i = !0, allowSidecar: a = !0 } = e, o = [], s = n.trim().toLowerCase(), c = t.trim().toLowerCase();
|
|
248
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(s) || !/^0x[0-9a-fA-F]{40}$/.test(c)) return {
|
|
249
|
+
bound: !1,
|
|
250
|
+
via: null,
|
|
251
|
+
warnings: ["Invalid managedAddress or dataItemOwner"]
|
|
252
|
+
};
|
|
253
|
+
if (i) try {
|
|
254
|
+
if (await H(t, n)) return {
|
|
255
|
+
bound: !0,
|
|
256
|
+
via: "active_session_key",
|
|
257
|
+
warnings: o
|
|
258
|
+
};
|
|
259
|
+
} catch (e) {
|
|
260
|
+
o.push(e instanceof Error ? e.message : "isActiveSigner check failed");
|
|
261
|
+
}
|
|
262
|
+
if (a) try {
|
|
263
|
+
let e = await be({
|
|
264
|
+
identities: [t],
|
|
265
|
+
sessionKeys: [n],
|
|
266
|
+
excludeRevoked: !0
|
|
267
|
+
}), i = r == null ? Date.now() : r * 1e3;
|
|
268
|
+
for (let t of e) try {
|
|
269
|
+
let e = ye(t.decodedDataJson ?? "[]");
|
|
270
|
+
if (e.identity.toLowerCase() !== c || e.sessionKey.toLowerCase() !== s) continue;
|
|
271
|
+
let n = typeof t.expirationTime == "number" ? t.expirationTime : null, r = ve({
|
|
272
|
+
decoded: e,
|
|
273
|
+
expirationTime: n,
|
|
274
|
+
now: i
|
|
275
|
+
});
|
|
276
|
+
if (r.status === "valid") return {
|
|
277
|
+
bound: !0,
|
|
278
|
+
via: "publish_authorization",
|
|
279
|
+
warnings: [...o, ...r.warnings]
|
|
280
|
+
};
|
|
281
|
+
o.push(...r.warnings);
|
|
282
|
+
} catch {}
|
|
283
|
+
} catch (e) {
|
|
284
|
+
o.push(e instanceof Error ? e.message : "PublishAuthorization query failed");
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
bound: !1,
|
|
288
|
+
via: null,
|
|
289
|
+
warnings: o
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
//#endregion
|
|
293
|
+
export { Ce as ConnectButton, d as ExternalWalletsForDeploy, j as PUBLISH_AUTOMATION_SCOPES, we as PublishProvider, M as appMetadata, k as approvedTargetsForAutomationPublish, e as asSeedSignerFromThirdweb, i as asThirdwebPublishWallet, Oe as assertStorageBoundToIdentity, oe as buildAutomationSessionKeyPermissions, R as defaultApprovedTargetsForModularPublish, C as deployManagedAccountViaFactory, ee as deploySmartWalletContract, Ee as enrollPublishAutomation, U as ensureAutomationSessionKey, L as ensureEip7702ModularAccountReady, S as ensureExecutorModuleInstalled, P as ensureManagedAccountReady, z as ensureManagedSignerSessionKey, B as ensureModularPublishBootstrap, I as ensureSmartWalletThenPublish, o as fromThirdwebAccount, f as getClient, v as getConnectedAccount, D as getConnectedManagedAccountAddress, u as getConnectedModularAccount, E as getManagedAccountWallet, _ as getModularAccountWallet, te as getSharedPublishInAppWalletStorage, y as getSmartWalletAddressForAdmin, p as getWalletsForConnectButton, se as hashAutomationSessionKeyPermissions, H as isAutomationSessionActive, h as isSmartWalletDeployed, g as pollSmartWalletDeployed, V as removeAutomationSessionKey, x as resolveSmartWalletForPublish, De as revokePublishAutomation, ae as runModularExecutorPublishPrep, A as toThirdwebSessionKeyPermissions, N as tryDeployManagedAccount, ne as useActiveSmartWalletContract, m as useLocalWalletAccount, b as usePublishConfig, w as wallets };
|
|
175
294
|
|
|
176
295
|
//# sourceMappingURL=thirdweb.js.map
|
package/dist/thirdweb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thirdweb.js","names":[],"sources":["../src/react/ConnectButton.tsx","../src/react/PublishProvider.thirdweb.tsx"],"sourcesContent":["import React, { FC, useCallback, useEffect, useRef } from \"react\"\nimport {\n ConnectButton as ConnectButtonThirdweb,\n darkTheme,\n useActiveAccount,\n useActiveWallet,\n useActiveWalletConnectionStatus,\n useIsAutoConnecting,\n} from \"thirdweb/react\"\nimport { client as seedClient } from \"@seedprotocol/sdk\"\nimport {\n getClient,\n getConnectedManagedAccountAddress,\n getManagedAccountWallet,\n getModularAccountWallet,\n getSmartWalletAddressForAdmin,\n getWalletsForConnectButton,\n syncPublishInAppAuthToken,\n} from \"../helpers/thirdweb\"\nimport { fromThirdwebAccount } from \"../helpers/adapters/thirdwebAccount\"\nimport { setPublishWallet, clearPublishWallet } from \"../helpers/publishWalletRegistry\"\nimport { usePublishConfig } from \"./PublishConfigContext\"\nimport { getPublishConfig } from \"../config\"\nimport { optimismSepolia } from \"thirdweb/chains\"\nimport type { Account, Wallet } from \"thirdweb/wallets\"\nimport type { PublishConfig } from \"../config\"\nimport { ensureExecutorModuleInstalled } from \"../helpers/ensureExecutorModule\"\nimport { PublishManager } from \"../services/publishManager\"\n\n/** Session flag so we do not force autoConnect after an explicit UI disconnect (survives reload). */\nconst USER_DISCONNECTED_SESSION_KEY = \"seedProtocol:publish:userChoseWalletDisconnect\"\n\nfunction reportWalletSetupWarning(err: unknown) {\n // Expected when managed-wallet autoConnect is still catching up; publish prep retries.\n console.warn(\"[ConnectButton] Wallet setup / module install skipped:\", err)\n getPublishConfig().onWalletSetupWarning?.(err)\n}\n\n/** Resolves after `ClientManager.init()` has finished; `setAddresses` requires this. */\nfunction waitUntilSeedInitialized(): Promise<void> {\n if (seedClient.isInitialized()) return Promise.resolve()\n return new Promise((resolve) => {\n seedClient.onReady(() => resolve())\n })\n}\n\n/**\n * Executor module (ModularCore) must be installed on the **ManagedAccount** (EIP-4337) contract.\n * The EIP-7702 modular wallet contract does not expose Thirdweb's installModule / Router API;\n * calling it there reverts with \"Router: function does not exist.\"\n */\nasync function ensureExecutorModulesForConnect(\n modularAccount: Account,\n managedAddress: string | undefined,\n config: PublishConfig,\n): Promise<void> {\n if (!config.modularAccountModuleContract) {\n return\n }\n\n if (config.useModularExecutor) {\n if (!managedAddress) {\n return\n }\n try {\n syncPublishInAppAuthToken()\n const mw = getManagedAccountWallet()\n await mw.autoConnect({ client: getClient(), chain: optimismSepolia })\n const ma = mw.getAccount()\n if (!ma) {\n return\n }\n await ensureExecutorModuleInstalled(managedAddress, ma, config)\n } catch {\n /* managed wallet session may lag modular connect; publish prep retries module install */\n }\n return\n }\n\n try {\n await ensureExecutorModuleInstalled(modularAccount.address, modularAccount, config)\n } catch (err) {\n reportWalletSetupWarning(err)\n }\n}\n\nconst ConnectButton: FC = () => {\n const config = usePublishConfig()\n const wallet = useActiveWallet()\n const activeAccount = useActiveAccount()\n const connectionStatus = useActiveWalletConnectionStatus()\n const isAutoConnecting = useIsAutoConnecting()\n /** Avoid duplicate setAddresses when onConnect and the reconcile effect both run. */\n const lastSyncedOwnedKey = useRef<string | null>(null)\n const prevIsAutoConnecting = useRef(false)\n const reloadAutoConnectRetried = useRef(false)\n\n /**\n * Thirdweb sometimes finishes autoConnect on full reload with `disconnected` and no wallet\n * (see debug: isAutoConnecting true→false then disconnected). One explicit in-app autoConnect\n * retry recovers without affecting users who chose Disconnect (sessionStorage gate).\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return\n const prev = prevIsAutoConnecting.current\n prevIsAutoConnecting.current = isAutoConnecting\n\n let navType: string | undefined\n try {\n navType = (\n performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined\n )?.type\n } catch {\n navType = undefined\n }\n if (navType !== \"reload\") return\n\n let userChoseDisconnect = false\n try {\n userChoseDisconnect =\n sessionStorage.getItem(USER_DISCONNECTED_SESSION_KEY) === \"1\"\n } catch {\n userChoseDisconnect = false\n }\n if (userChoseDisconnect) return\n\n if (!prev || isAutoConnecting || connectionStatus !== \"disconnected\") return\n if (reloadAutoConnectRetried.current) return\n reloadAutoConnectRetried.current = true\n\n void (config.useModularExecutor ? getModularAccountWallet() : getManagedAccountWallet())\n .autoConnect({ client: getClient(), chain: optimismSepolia })\n .catch(() => {\n /* no session or iframe not ready; Connect UI can still sign in */\n })\n }, [connectionStatus, isAutoConnecting, config.useModularExecutor])\n\n const syncActiveWalletToSeed = useCallback(\n async (activeWallet: Wallet) => {\n const account = activeWallet.getAccount()\n if (!account) {\n return\n }\n await waitUntilSeedInitialized()\n PublishManager.stopAll()\n const owned = new Set<string>([account.address.toLowerCase()])\n let managedAddress: string | undefined\n if (config.useModularExecutor) {\n syncPublishInAppAuthToken()\n const adminAddress =\n activeWallet.getAdminAccount?.()?.address ?? account.address\n const tryManaged = async () => {\n try {\n return await getConnectedManagedAccountAddress(optimismSepolia)\n } catch {\n try {\n return await getSmartWalletAddressForAdmin(adminAddress)\n } catch {\n return undefined\n }\n }\n }\n managedAddress = await tryManaged()\n if (!managedAddress) {\n await new Promise<void>((r) => queueMicrotask(() => r()))\n managedAddress = await tryManaged()\n }\n if (managedAddress) {\n owned.add(managedAddress.toLowerCase())\n }\n }\n const ownedKey = [...owned].sort().join(\",\")\n if (lastSyncedOwnedKey.current === ownedKey) {\n return\n }\n lastSyncedOwnedKey.current = ownedKey\n try {\n const publishWallet = fromThirdwebAccount(account)\n await setPublishWallet({\n ...publishWallet,\n ownedAddresses: [...owned],\n publisherAddress: managedAddress ?? account.address,\n })\n } catch (err) {\n lastSyncedOwnedKey.current = null\n console.warn(\"[ConnectButton] Failed to set seed client addresses:\", err)\n throw err\n }\n await ensureExecutorModulesForConnect(account, managedAddress, config)\n },\n [config],\n )\n\n /**\n * Thirdweb autoConnect restores the wallet without calling onConnect. Seed addresses live in\n * SQLite (OPFS); after a wipe there is no app_state row until setAddresses runs again.\n */\n useEffect(() => {\n if (isAutoConnecting) {\n return\n }\n if (connectionStatus !== \"connected\") {\n lastSyncedOwnedKey.current = null\n return\n }\n if (!wallet) {\n return\n }\n let cancelled = false\n void (async () => {\n try {\n if (cancelled) return\n await syncActiveWalletToSeed(wallet)\n } catch {\n /* logged in syncActiveWalletToSeed */\n }\n })()\n return () => {\n cancelled = true\n }\n }, [\n wallet,\n activeAccount?.address,\n connectionStatus,\n isAutoConnecting,\n syncActiveWalletToSeed,\n ])\n\n const handleDisconnect = () => {\n try {\n sessionStorage.setItem(USER_DISCONNECTED_SESSION_KEY, \"1\")\n } catch {\n /* private mode / SSR */\n }\n clearPublishWallet()\n PublishManager.stopAll()\n }\n\n const handleConnect = async (activeWallet: Wallet, _allConnectedWallets: Wallet[]) => {\n const account = activeWallet.getAccount()\n if (!account) return\n try {\n sessionStorage.removeItem(USER_DISCONNECTED_SESSION_KEY)\n } catch {\n /* ignore */\n }\n console.log('[ConnectButton] Connected', account.address)\n try {\n await syncActiveWalletToSeed(activeWallet)\n } catch {\n /* syncActiveWalletToSeed logs */\n }\n }\n\n return (\n <ConnectButtonThirdweb\n client={getClient()}\n wallets={getWalletsForConnectButton()}\n autoConnect={true}\n chain={optimismSepolia}\n chains={[ optimismSepolia, ]}\n onConnect={handleConnect}\n onDisconnect={handleDisconnect}\n theme={darkTheme({\n colors: {\n primaryButtonBg: '#1D2939',\n primaryButtonText: '#FFFFFF',\n secondaryButtonHoverBg: '#1D2939',\n connectedButtonBg: '#101828',\n connectedButtonBgHover: '#1D2939',\n borderColor: '#344054',\n },\n })}\n />\n )\n}\n\nexport default ConnectButton\n","import React, { FC, useEffect } from \"react\"\nimport type { MutableRefObject } from \"react\"\nimport type { QueryClient } from \"@tanstack/react-query\"\nimport { ThirdwebProvider } from \"thirdweb/react\"\nimport { SeedProvider } from '@seedprotocol/react'\nimport { initPublish, getConfigRef, type PublishConfig } from \"../config\"\nimport { PublishConfigContext, usePublishConfig } from \"./PublishConfigContext\"\nimport type { PublishProviderProps } from \"./PublishProvider\"\n\nexport { usePublishConfig }\nexport type { PublishProviderProps }\n\n/**\n * Thirdweb-backed PublishProvider (includes ThirdwebProvider).\n */\nconst PublishProviderThirdweb: FC<PublishProviderProps> = ({\n children,\n config,\n queryClient,\n queryClientRef,\n}) => {\n useEffect(() => {\n if (config) {\n initPublish(config)\n }\n }, [config])\n\n return (\n <PublishConfigContext.Provider value={config ?? getConfigRef()}>\n <ThirdwebProvider>\n <SeedProvider queryClient={queryClient} queryClientRef={queryClientRef}>\n {children}\n </SeedProvider>\n </ThirdwebProvider>\n </PublishConfigContext.Provider>\n )\n}\n\nexport default PublishProviderThirdweb\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thirdweb.js","names":[],"sources":["../src/react/ConnectButton.tsx","../src/react/PublishProvider.thirdweb.tsx","../src/helpers/enrollPublishAutomation.ts","../src/helpers/assertStorageBoundToIdentity.ts"],"sourcesContent":["import React, { FC, useCallback, useEffect, useRef } from \"react\"\nimport {\n ConnectButton as ConnectButtonThirdweb,\n darkTheme,\n useActiveAccount,\n useActiveWallet,\n useActiveWalletConnectionStatus,\n useIsAutoConnecting,\n} from \"thirdweb/react\"\nimport { client as seedClient } from \"@seedprotocol/sdk\"\nimport {\n getClient,\n getConnectedManagedAccountAddress,\n getManagedAccountWallet,\n getModularAccountWallet,\n getSmartWalletAddressForAdmin,\n getWalletsForConnectButton,\n syncPublishInAppAuthToken,\n} from \"../helpers/thirdweb\"\nimport { fromThirdwebAccount } from \"../helpers/adapters/thirdwebAccount\"\nimport { setPublishWallet, clearPublishWallet } from \"../helpers/publishWalletRegistry\"\nimport { usePublishConfig } from \"./PublishConfigContext\"\nimport { getPublishConfig } from \"../config\"\nimport { optimismSepolia } from \"thirdweb/chains\"\nimport type { Account, Wallet } from \"thirdweb/wallets\"\nimport type { PublishConfig } from \"../config\"\nimport { ensureExecutorModuleInstalled } from \"../helpers/ensureExecutorModule\"\nimport { PublishManager } from \"../services/publishManager\"\n\n/** Session flag so we do not force autoConnect after an explicit UI disconnect (survives reload). */\nconst USER_DISCONNECTED_SESSION_KEY = \"seedProtocol:publish:userChoseWalletDisconnect\"\n\nfunction reportWalletSetupWarning(err: unknown) {\n // Expected when managed-wallet autoConnect is still catching up; publish prep retries.\n console.warn(\"[ConnectButton] Wallet setup / module install skipped:\", err)\n getPublishConfig().onWalletSetupWarning?.(err)\n}\n\n/** Resolves after `ClientManager.init()` has finished; `setAddresses` requires this. */\nfunction waitUntilSeedInitialized(): Promise<void> {\n if (seedClient.isInitialized()) return Promise.resolve()\n return new Promise((resolve) => {\n seedClient.onReady(() => resolve())\n })\n}\n\n/**\n * Executor module (ModularCore) must be installed on the **ManagedAccount** (EIP-4337) contract.\n * The EIP-7702 modular wallet contract does not expose Thirdweb's installModule / Router API;\n * calling it there reverts with \"Router: function does not exist.\"\n */\nasync function ensureExecutorModulesForConnect(\n modularAccount: Account,\n managedAddress: string | undefined,\n config: PublishConfig,\n): Promise<void> {\n if (!config.modularAccountModuleContract) {\n return\n }\n\n if (config.useModularExecutor) {\n if (!managedAddress) {\n return\n }\n try {\n syncPublishInAppAuthToken()\n const mw = getManagedAccountWallet()\n await mw.autoConnect({ client: getClient(), chain: optimismSepolia })\n const ma = mw.getAccount()\n if (!ma) {\n return\n }\n await ensureExecutorModuleInstalled(managedAddress, ma, config)\n } catch {\n /* managed wallet session may lag modular connect; publish prep retries module install */\n }\n return\n }\n\n try {\n await ensureExecutorModuleInstalled(modularAccount.address, modularAccount, config)\n } catch (err) {\n reportWalletSetupWarning(err)\n }\n}\n\nconst ConnectButton: FC = () => {\n const config = usePublishConfig()\n const wallet = useActiveWallet()\n const activeAccount = useActiveAccount()\n const connectionStatus = useActiveWalletConnectionStatus()\n const isAutoConnecting = useIsAutoConnecting()\n /** Avoid duplicate setAddresses when onConnect and the reconcile effect both run. */\n const lastSyncedOwnedKey = useRef<string | null>(null)\n const prevIsAutoConnecting = useRef(false)\n const reloadAutoConnectRetried = useRef(false)\n\n /**\n * Thirdweb sometimes finishes autoConnect on full reload with `disconnected` and no wallet\n * (see debug: isAutoConnecting true→false then disconnected). One explicit in-app autoConnect\n * retry recovers without affecting users who chose Disconnect (sessionStorage gate).\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return\n const prev = prevIsAutoConnecting.current\n prevIsAutoConnecting.current = isAutoConnecting\n\n let navType: string | undefined\n try {\n navType = (\n performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined\n )?.type\n } catch {\n navType = undefined\n }\n if (navType !== \"reload\") return\n\n let userChoseDisconnect = false\n try {\n userChoseDisconnect =\n sessionStorage.getItem(USER_DISCONNECTED_SESSION_KEY) === \"1\"\n } catch {\n userChoseDisconnect = false\n }\n if (userChoseDisconnect) return\n\n if (!prev || isAutoConnecting || connectionStatus !== \"disconnected\") return\n if (reloadAutoConnectRetried.current) return\n reloadAutoConnectRetried.current = true\n\n void (config.useModularExecutor ? getModularAccountWallet() : getManagedAccountWallet())\n .autoConnect({ client: getClient(), chain: optimismSepolia })\n .catch(() => {\n /* no session or iframe not ready; Connect UI can still sign in */\n })\n }, [connectionStatus, isAutoConnecting, config.useModularExecutor])\n\n const syncActiveWalletToSeed = useCallback(\n async (activeWallet: Wallet) => {\n const account = activeWallet.getAccount()\n if (!account) {\n return\n }\n await waitUntilSeedInitialized()\n PublishManager.stopAll()\n const owned = new Set<string>([account.address.toLowerCase()])\n let managedAddress: string | undefined\n if (config.useModularExecutor) {\n syncPublishInAppAuthToken()\n const adminAddress =\n activeWallet.getAdminAccount?.()?.address ?? account.address\n const tryManaged = async () => {\n try {\n return await getConnectedManagedAccountAddress(optimismSepolia)\n } catch {\n try {\n return await getSmartWalletAddressForAdmin(adminAddress)\n } catch {\n return undefined\n }\n }\n }\n managedAddress = await tryManaged()\n if (!managedAddress) {\n await new Promise<void>((r) => queueMicrotask(() => r()))\n managedAddress = await tryManaged()\n }\n if (managedAddress) {\n owned.add(managedAddress.toLowerCase())\n }\n }\n const ownedKey = [...owned].sort().join(\",\")\n if (lastSyncedOwnedKey.current === ownedKey) {\n return\n }\n lastSyncedOwnedKey.current = ownedKey\n try {\n const publishWallet = fromThirdwebAccount(account)\n await setPublishWallet({\n ...publishWallet,\n ownedAddresses: [...owned],\n publisherAddress: managedAddress ?? account.address,\n })\n } catch (err) {\n lastSyncedOwnedKey.current = null\n console.warn(\"[ConnectButton] Failed to set seed client addresses:\", err)\n throw err\n }\n await ensureExecutorModulesForConnect(account, managedAddress, config)\n },\n [config],\n )\n\n /**\n * Thirdweb autoConnect restores the wallet without calling onConnect. Seed addresses live in\n * SQLite (OPFS); after a wipe there is no app_state row until setAddresses runs again.\n */\n useEffect(() => {\n if (isAutoConnecting) {\n return\n }\n if (connectionStatus !== \"connected\") {\n lastSyncedOwnedKey.current = null\n return\n }\n if (!wallet) {\n return\n }\n let cancelled = false\n void (async () => {\n try {\n if (cancelled) return\n await syncActiveWalletToSeed(wallet)\n } catch {\n /* logged in syncActiveWalletToSeed */\n }\n })()\n return () => {\n cancelled = true\n }\n }, [\n wallet,\n activeAccount?.address,\n connectionStatus,\n isAutoConnecting,\n syncActiveWalletToSeed,\n ])\n\n const handleDisconnect = () => {\n try {\n sessionStorage.setItem(USER_DISCONNECTED_SESSION_KEY, \"1\")\n } catch {\n /* private mode / SSR */\n }\n clearPublishWallet()\n PublishManager.stopAll()\n }\n\n const handleConnect = async (activeWallet: Wallet, _allConnectedWallets: Wallet[]) => {\n const account = activeWallet.getAccount()\n if (!account) return\n try {\n sessionStorage.removeItem(USER_DISCONNECTED_SESSION_KEY)\n } catch {\n /* ignore */\n }\n console.log('[ConnectButton] Connected', account.address)\n try {\n await syncActiveWalletToSeed(activeWallet)\n } catch {\n /* syncActiveWalletToSeed logs */\n }\n }\n\n return (\n <ConnectButtonThirdweb\n client={getClient()}\n wallets={getWalletsForConnectButton()}\n autoConnect={true}\n chain={optimismSepolia}\n chains={[ optimismSepolia, ]}\n onConnect={handleConnect}\n onDisconnect={handleDisconnect}\n theme={darkTheme({\n colors: {\n primaryButtonBg: '#1D2939',\n primaryButtonText: '#FFFFFF',\n secondaryButtonHoverBg: '#1D2939',\n connectedButtonBg: '#101828',\n connectedButtonBgHover: '#1D2939',\n borderColor: '#344054',\n },\n })}\n />\n )\n}\n\nexport default ConnectButton\n","import React, { FC, useEffect } from \"react\"\nimport type { MutableRefObject } from \"react\"\nimport type { QueryClient } from \"@tanstack/react-query\"\nimport { ThirdwebProvider } from \"thirdweb/react\"\nimport { SeedProvider } from '@seedprotocol/react'\nimport { initPublish, getConfigRef, type PublishConfig } from \"../config\"\nimport { PublishConfigContext, usePublishConfig } from \"./PublishConfigContext\"\nimport type { PublishProviderProps } from \"./PublishProvider\"\n\nexport { usePublishConfig }\nexport type { PublishProviderProps }\n\n/**\n * Thirdweb-backed PublishProvider (includes ThirdwebProvider).\n */\nconst PublishProviderThirdweb: FC<PublishProviderProps> = ({\n children,\n config,\n queryClient,\n queryClientRef,\n}) => {\n useEffect(() => {\n if (config) {\n initPublish(config)\n }\n }, [config])\n\n return (\n <PublishConfigContext.Provider value={config ?? getConfigRef()}>\n <ThirdwebProvider>\n <SeedProvider queryClient={queryClient} queryClientRef={queryClientRef}>\n {children}\n </SeedProvider>\n </ThirdwebProvider>\n </PublishConfigContext.Provider>\n )\n}\n\nexport default PublishProviderThirdweb\n","import type { Account } from 'thirdweb/wallets'\nimport { getContract } from 'thirdweb'\nimport { getInstalledModules } from 'thirdweb/modules'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport type { PublishWallet } from './seedSigner'\nimport { fromThirdwebAccount } from './adapters/thirdwebAccount'\nimport { getPublishConfig } from '../config'\nimport { isRouterNonModularCoreAccountError, ManagedAccountPublishError } from '../errors'\nimport { ensureExecutorModuleInstalled } from './ensureExecutorModule'\nimport {\n ensureAutomationSessionKey,\n removeAutomationSessionKey,\n} from './ensureAutomationSessionKey'\nimport {\n attestPublishAuthorization,\n revokePublishAuthorization,\n type AttestPublishAuthorizationResult,\n} from '../services/publishAuthorization'\nimport { getClient, getManagedAccountWallet } from './thirdweb'\n\nexport type EnrollPublishAutomationParams = {\n managedAddress: string\n sessionKeyAddress: string\n /** Optional app label stored in the sidecar (defaults to zero address). */\n appAddress?: string\n /** Unix seconds session / grant end (optional). */\n expiresAt?: number\n /**\n * User-controlled ManagedAccount wallet used to add the session key and attest the sidecar.\n * When omitted, uses the connected managed in-app wallet.\n */\n userWallet?: PublishWallet\n}\n\nexport type EnrollPublishAutomationResult = {\n managedAddress: string\n sessionKeyAddress: string\n authorization: AttestPublishAuthorizationResult\n}\n\nexport type RevokePublishAutomationParams = {\n managedAddress: string\n sessionKeyAddress: string\n authorizationUid: string\n userWallet?: PublishWallet\n}\n\nasync function connectManagedAccount(managedAddress: string): Promise<Account> {\n const managedWallet = getManagedAccountWallet()\n await managedWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const account = managedWallet.getAccount()\n if (!account) {\n throw new ManagedAccountPublishError(\n 'Could not connect the managed publishing account to enroll or revoke publish automation.',\n 'MANAGED_ACCOUNT_UNAVAILABLE',\n managedAddress,\n )\n }\n return account\n}\n\nasync function resolveUserWallet(\n managedAddress: string,\n userWallet?: PublishWallet,\n): Promise<PublishWallet> {\n if (userWallet) return userWallet\n return fromThirdwebAccount(await connectManagedAccount(managedAddress))\n}\n\nasync function assertExecutorModuleInstalled(managedAddress: string): Promise<void> {\n const config = getPublishConfig()\n const moduleAddr = config.modularAccountModuleContract?.trim()\n if (!moduleAddr) {\n throw new Error(\n '@seedprotocol/publish: enrollPublishAutomation requires PublishConfig.modularAccountModuleContract',\n )\n }\n\n const twAccount = await connectManagedAccount(managedAddress)\n try {\n await ensureExecutorModuleInstalled(managedAddress, twAccount, config)\n } catch (cause) {\n if (cause instanceof ManagedAccountPublishError) throw cause\n throw new ManagedAccountPublishError(\n 'Executor module setup failed for publish automation.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n cause,\n )\n }\n\n try {\n const accountContract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: managedAddress,\n })\n const installed = await getInstalledModules({ contract: accountContract })\n const want = moduleAddr.toLowerCase()\n const ok = installed.some(\n (m: { implementation: string }) => m.implementation?.toLowerCase() === want,\n )\n if (!ok) {\n throw new ManagedAccountPublishError(\n 'Executor module is not installed on the ManagedAccount (ModularCore required for automation grants).',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n )\n }\n } catch (cause) {\n if (cause instanceof ManagedAccountPublishError) throw cause\n if (isRouterNonModularCoreAccountError(cause)) {\n throw new ManagedAccountPublishError(\n 'ManagedAccount is not ModularCore; cannot install the executor module required for automation grants.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n cause,\n )\n }\n throw new ManagedAccountPublishError(\n 'Could not verify executor module installation for publish automation.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n managedAddress,\n cause,\n )\n }\n}\n\n/**\n * Enroll an app automation key: install executor module → add module-only session key →\n * attest PublishAuthorization sidecar (ManagedAccount attester).\n */\nexport async function enrollPublishAutomation(\n params: EnrollPublishAutomationParams,\n): Promise<EnrollPublishAutomationResult> {\n const { managedAddress, sessionKeyAddress, appAddress, expiresAt } = params\n\n await assertExecutorModuleInstalled(managedAddress)\n await ensureAutomationSessionKey({\n managedAddress,\n sessionKeyAddress,\n expiresAt,\n })\n\n const userWallet = await resolveUserWallet(managedAddress, params.userWallet)\n const authorization = await attestPublishAuthorization({\n wallet: userWallet,\n identity: managedAddress,\n sessionKey: sessionKeyAddress,\n app: appAddress,\n expiresAt,\n })\n\n return {\n managedAddress,\n sessionKeyAddress,\n authorization,\n }\n}\n\n/**\n * Disconnect automation: remove session key, then revoke PublishAuthorization sidecar.\n */\nexport async function revokePublishAutomation(\n params: RevokePublishAutomationParams,\n): Promise<void> {\n const { managedAddress, sessionKeyAddress, authorizationUid } = params\n const userWallet = await resolveUserWallet(managedAddress, params.userWallet)\n\n await removeAutomationSessionKey({\n managedAddress,\n sessionKeyAddress,\n })\n\n await revokePublishAuthorization({\n wallet: userWallet,\n uid: authorizationUid,\n })\n}\n","import {\n assessPublishAuthorization,\n decodePublishAuthorizationData,\n getPublishAuthorizationFromEas,\n} from '@seedprotocol/eas'\nimport { isAutomationSessionActive } from './ensureAutomationSessionKey'\n\nexport type AssertStorageBoundToIdentityParams = {\n managedAddress: string\n /** Recovered ANS-104 DataItem owner (Ethereum address). */\n dataItemOwner: string\n /**\n * Unix seconds for historical binding checks against PublishAuthorization expiry.\n * Defaults to now. Session-key live check always uses current `isActiveSigner`.\n */\n atTime?: number\n /**\n * When true (default), accept a live active session key on the ManagedAccount.\n */\n allowActiveSessionKey?: boolean\n /**\n * When true (default), accept a non-revoked PublishAuthorization sidecar valid at `atTime`.\n */\n allowSidecar?: boolean\n}\n\nexport type AssertStorageBoundToIdentityResult = {\n bound: boolean\n via: 'active_session_key' | 'publish_authorization' | null\n warnings: string[]\n}\n\n/**\n * Whether an Arweave DataItem owner is bound to a ManagedAccount identity for authorship.\n * Prefer live `isActiveSigner` for current publishes; use the PublishAuthorization sidecar\n * for discoverability / historical grants (revoking the session key stops new binds via\n * active check; sidecar validity is assessed at `atTime`).\n */\nexport async function assertStorageBoundToIdentity(\n params: AssertStorageBoundToIdentityParams,\n): Promise<AssertStorageBoundToIdentityResult> {\n const {\n managedAddress,\n dataItemOwner,\n atTime,\n allowActiveSessionKey = true,\n allowSidecar = true,\n } = params\n const warnings: string[] = []\n const owner = dataItemOwner.trim().toLowerCase()\n const identity = managedAddress.trim().toLowerCase()\n\n if (!/^0x[0-9a-fA-F]{40}$/.test(owner) || !/^0x[0-9a-fA-F]{40}$/.test(identity)) {\n return { bound: false, via: null, warnings: ['Invalid managedAddress or dataItemOwner'] }\n }\n\n if (allowActiveSessionKey) {\n try {\n const active = await isAutomationSessionActive(managedAddress, dataItemOwner)\n if (active) {\n return { bound: true, via: 'active_session_key', warnings }\n }\n } catch (e) {\n warnings.push(\n e instanceof Error ? e.message : 'isActiveSigner check failed',\n )\n }\n }\n\n if (allowSidecar) {\n try {\n const rows = await getPublishAuthorizationFromEas({\n identities: [managedAddress],\n sessionKeys: [dataItemOwner],\n excludeRevoked: true,\n })\n const nowMs = atTime != null ? atTime * 1000 : Date.now()\n for (const row of rows) {\n try {\n const decoded = decodePublishAuthorizationData(row.decodedDataJson ?? '[]')\n if (decoded.identity.toLowerCase() !== identity) continue\n if (decoded.sessionKey.toLowerCase() !== owner) continue\n const expirationTime =\n typeof row.expirationTime === 'number' ? row.expirationTime : null\n const assess = assessPublishAuthorization({\n decoded,\n expirationTime,\n now: nowMs,\n })\n if (assess.status === 'valid') {\n return {\n bound: true,\n via: 'publish_authorization',\n warnings: [...warnings, ...assess.warnings],\n }\n }\n warnings.push(...assess.warnings)\n } catch {\n // skip undecodable row\n }\n }\n } catch (e) {\n warnings.push(\n e instanceof Error ? e.message : 'PublishAuthorization query failed',\n )\n }\n }\n\n return { bound: false, via: null, warnings }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA8BA,IAAM,IAAgC;AAEtC,SAAS,GAAyB,GAAc;CAG9C,AADA,QAAQ,KAAK,0DAA0D,CAAG,GAC1E,EAAiB,CAAC,CAAC,uBAAuB,CAAG;AAC/C;AAGA,SAAS,KAA0C;CAEjD,OADI,EAAW,cAAc,IAAU,QAAQ,QAAQ,IAChD,IAAI,SAAS,MAAY;EAC9B,EAAW,cAAc,EAAQ,CAAC;CACpC,CAAC;AACH;AAOA,eAAe,EACb,GACA,GACA,GACe;CACV,MAAO,8BAIZ;MAAI,EAAO,oBAAoB;GAC7B,IAAI,CAAC,GACH;GAEF,IAAI;IACF,EAA0B;IAC1B,IAAM,IAAK,EAAwB;IACnC,MAAM,EAAG,YAAY;KAAE,QAAQ,EAAU;KAAG,OAAO;IAAgB,CAAC;IACpE,IAAM,IAAK,EAAG,WAAW;IACzB,IAAI,CAAC,GACH;IAEF,MAAM,EAA8B,GAAgB,GAAI,CAAM;GAChE,QAAQ,CAER;GACA;EACF;EAEA,IAAI;GACF,MAAM,EAA8B,EAAe,SAAS,GAAgB,CAAM;EACpF,SAAS,GAAK;GACZ,GAAyB,CAAG;EAC9B;CANA;AAOF;AAEA,IAAM,WAA0B;CAC9B,IAAM,IAAS,EAAiB,GAC1B,IAAS,GAAgB,GACzB,IAAgB,GAAiB,GACjC,IAAmB,GAAgC,GACnD,IAAmB,GAAoB,GAEvC,IAAqB,EAAsB,IAAI,GAC/C,IAAuB,EAAO,EAAK,GACnC,IAA2B,EAAO,EAAK;CAO7C,QAAgB;EACd,IAAI,OAAO,SAAW,KAAa;EACnC,IAAM,IAAO,EAAqB;EAClC,EAAqB,UAAU;EAE/B,IAAI;EACJ,IAAI;GACF,IACE,YAAY,iBAAiB,YAAY,CAAC,CAAC,EAAE,EAG5C;EACL,QAAQ;GACN,IAAU,KAAA;EACZ;EACA,IAAI,MAAY,UAAU;EAE1B,IAAI,IAAsB;EAC1B,IAAI;GACF,IACE,eAAe,QAAQ,CAA6B,MAAM;EAC9D,QAAQ;GACN,IAAsB;EACxB;EACI,KAEC,KAAQ,MAAoB,MAAqB,mBAClD,EAAyB,YAC7B,EAAyB,UAAU,KAE7B,EAAO,qBAAqB,EAAwB,IAAI,EAAwB,EAAA,CACnF,YAAY;GAAE,QAAQ,EAAU;GAAG,OAAO;EAAgB,CAAC,CAAC,CAC5D,YAAY,CAEb,CAAC;CACL,GAAG;EAAC;EAAkB;EAAkB,EAAO;CAAkB,CAAC;CAElE,IAAM,IAAyB,GAC7B,OAAO,MAAyB;EAC9B,IAAM,IAAU,EAAa,WAAW;EACxC,IAAI,CAAC,GACH;EAGF,AADA,MAAM,GAAyB,GAC/B,EAAe,QAAQ;EACvB,IAAM,oBAAQ,IAAI,IAAY,CAAC,EAAQ,QAAQ,YAAY,CAAC,CAAC,GACzD;EACJ,IAAI,EAAO,oBAAoB;GAC7B,EAA0B;GAC1B,IAAM,IACJ,EAAa,kBAAkB,CAAC,EAAE,WAAW,EAAQ,SACjD,IAAa,YAAY;IAC7B,IAAI;KACF,OAAO,MAAM,EAAkC,CAAe;IAChE,QAAQ;KACN,IAAI;MACF,OAAO,MAAM,EAA8B,CAAY;KACzD,QAAQ;MACN;KACF;IACF;GACF;GAMA,AALA,IAAiB,MAAM,EAAW,GAClC,AAEE,OADA,MAAM,IAAI,SAAe,MAAM,qBAAqB,EAAE,CAAC,CAAC,GACvC,MAAM,EAAW,IAEhC,KACF,EAAM,IAAI,EAAe,YAAY,CAAC;EAE1C;EACA,IAAM,IAAW,CAAC,GAAG,CAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG;EACvC,MAAmB,YAAY,GAGnC;KAAmB,UAAU;GAC7B,IAAI;IACF,IAAM,IAAgB,EAAoB,CAAO;IACjD,MAAM,EAAiB;KACrB,GAAG;KACH,gBAAgB,CAAC,GAAG,CAAK;KACzB,kBAAkB,KAAkB,EAAQ;IAC9C,CAAC;GACH,SAAS,GAAK;IAGZ,MAFA,EAAmB,UAAU,MAC7B,QAAQ,KAAK,wDAAwD,CAAG,GAClE;GACR;GACA,MAAM,EAAgC,GAAS,GAAgB,CAAM;EAbxC;CAc/B,GACA,CAAC,CAAM,CACT;CA+DA,OAzDA,QAAgB;EACd,IAAI,GACF;EAEF,IAAI,MAAqB,aAAa;GACpC,EAAmB,UAAU;GAC7B;EACF;EACA,IAAI,CAAC,GACH;EAEF,IAAI,IAAY;EAShB,QARM,YAAY;GAChB,IAAI;IACF,IAAI,GAAW;IACf,MAAM,EAAuB,CAAM;GACrC,QAAQ,CAER;EACF,EAAA,CAAG,SACU;GACX,IAAY;EACd;CACF,GAAG;EACD;EACA,GAAe;EACf;EACA;EACA;CACF,CAAC,GA6BC,kBAAC,IAAD;EACE,QAAQ,EAAU;EAClB,SAAS,EAA2B;EACpC,aAAa;EACb,OAAO;EACP,QAAQ,CAAE,CAAiB;EAC3B,WAAW,OAvBc,GAAsB,MAAmC;GACpF,IAAM,IAAU,EAAa,WAAW;GACnC,OACL;QAAI;KACF,eAAe,WAAW,CAA6B;IACzD,QAAQ,CAER;IACA,QAAQ,IAAI,6BAA6B,EAAQ,OAAO;IACxD,IAAI;KACF,MAAM,EAAuB,CAAY;IAC3C,QAAQ,CAER;GANA;EAOF;EAUI,oBAlC2B;GAC7B,IAAI;IACF,eAAe,QAAQ,GAA+B,GAAG;GAC3D,QAAQ,CAER;GAEA,AADA,EAAmB,GACnB,EAAe,QAAQ;EACzB;EA2BI,OAAO,GAAU,EACf,QAAQ;GACN,iBAAiB;GACjB,mBAAmB;GACnB,wBAAwB;GACxB,mBAAmB;GACnB,wBAAwB;GACxB,aAAa;EACf,EACF,CAAC;CACF,CAAA;AAEL,GCtQM,MAAqD,EACzD,aACA,WACA,gBACA,yBAEA,QAAgB;CACd,AAAI,KACF,EAAY,CAAM;AAEtB,GAAG,CAAC,CAAM,CAAC,GAGT,kBAAC,GAAqB,UAAtB;CAA+B,OAAO,KAAU,EAAa;CAC3D,UAAA,kBAAC,IAAD,EAAA,UACE,kBAAC,IAAD;EAA2B;EAA6B;EACrD;CACW,CAAA,EACE,CAAA;AACW,CAAA;;;ACanC,eAAe,EAAsB,GAA0C;CAC7E,IAAM,IAAgB,EAAwB;CAC9C,MAAM,EAAc,YAAY;EAAE,QAAQ,EAAU;EAAG,OAAO;CAAgB,CAAC;CAC/E,IAAM,IAAU,EAAc,WAAW;CACzC,IAAI,CAAC,GACH,MAAM,IAAI,EACR,4FACA,+BACA,CACF;CAEF,OAAO;AACT;AAEA,eAAe,EACb,GACA,GACwB;CAExB,OADI,KACG,EAAoB,MAAM,EAAsB,CAAc,CAAC;AACxE;AAEA,eAAe,GAA8B,GAAuC;CAClF,IAAM,IAAS,EAAiB,GAC1B,IAAa,EAAO,8BAA8B,KAAK;CAC7D,IAAI,CAAC,GACH,MAAU,MACR,oGACF;CAGF,IAAM,IAAY,MAAM,EAAsB,CAAc;CAC5D,IAAI;EACF,MAAM,EAA8B,GAAgB,GAAW,CAAM;CACvE,SAAS,GAAO;EAEd,MADI,aAAiB,IAAkC,IACjD,IAAI,EACR,wDACA,iCACA,GACA,CACF;CACF;CAEA,IAAI;EACF,IAAM,IAAkB,EAAY;GAClC,QAAQ,EAAU;GAClB,OAAO;GACP,SAAS;EACX,CAAC,GACK,IAAY,MAAM,GAAoB,EAAE,UAAU,EAAgB,CAAC,GACnE,IAAO,EAAW,YAAY;EAIpC,IAAI,CAHO,EAAU,MAClB,MAAkC,EAAE,gBAAgB,YAAY,MAAM,CAEpE,GACH,MAAM,IAAI,EACR,wGACA,iCACA,CACF;CAEJ,SAAS,GAAO;EAUd,MATI,aAAiB,IAAkC,IACnD,EAAmC,CAAK,IACpC,IAAI,EACR,yGACA,iCACA,GACA,CACF,IAEI,IAAI,EACR,yEACA,iCACA,GACA,CACF;CACF;AACF;AAMA,eAAsB,GACpB,GACwC;CACxC,IAAM,EAAE,mBAAgB,sBAAmB,eAAY,iBAAc;CAGrE,AADA,MAAM,GAA8B,CAAc,GAClD,MAAM,EAA2B;EAC/B;EACA;EACA;CACF,CAAC;CAED,IAAM,IAAa,MAAM,EAAkB,GAAgB,EAAO,UAAU;CAS5E,OAAO;EACL;EACA;EACA,eAAA,MAX0B,GAA2B;GACrD,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,KAAK;GACL;EACF,CAAC;CAMD;AACF;AAKA,eAAsB,GACpB,GACe;CACf,IAAM,EAAE,mBAAgB,sBAAmB,wBAAqB,GAC1D,IAAa,MAAM,EAAkB,GAAgB,EAAO,UAAU;CAO5E,AALA,MAAM,EAA2B;EAC/B;EACA;CACF,CAAC,GAED,MAAM,EAA2B;EAC/B,QAAQ;EACR,KAAK;CACP,CAAC;AACH;;;AC5IA,eAAsB,GACpB,GAC6C;CAC7C,IAAM,EACJ,mBACA,kBACA,WACA,2BAAwB,IACxB,kBAAe,OACb,GACE,IAAqB,CAAC,GACtB,IAAQ,EAAc,KAAK,CAAC,CAAC,YAAY,GACzC,IAAW,EAAe,KAAK,CAAC,CAAC,YAAY;CAEnD,IAAI,CAAC,sBAAsB,KAAK,CAAK,KAAK,CAAC,sBAAsB,KAAK,CAAQ,GAC5E,OAAO;EAAE,OAAO;EAAO,KAAK;EAAM,UAAU,CAAC,yCAAyC;CAAE;CAG1F,IAAI,GACF,IAAI;EAEF,IAAI,MADiB,EAA0B,GAAgB,CAAa,GAE1E,OAAO;GAAE,OAAO;GAAM,KAAK;GAAsB;EAAS;CAE9D,SAAS,GAAG;EACV,EAAS,KACP,aAAa,QAAQ,EAAE,UAAU,6BACnC;CACF;CAGF,IAAI,GACF,IAAI;EACF,IAAM,IAAO,MAAM,GAA+B;GAChD,YAAY,CAAC,CAAc;GAC3B,aAAa,CAAC,CAAa;GAC3B,gBAAgB;EAClB,CAAC,GACK,IAAQ,KAAU,OAAuB,KAAK,IAAI,IAAzB,IAAS;EACxC,KAAK,IAAM,KAAO,GAChB,IAAI;GACF,IAAM,IAAU,GAA+B,EAAI,mBAAmB,IAAI;GAE1E,IADI,EAAQ,SAAS,YAAY,MAAM,KACnC,EAAQ,WAAW,YAAY,MAAM,GAAO;GAChD,IAAM,IACJ,OAAO,EAAI,kBAAmB,WAAW,EAAI,iBAAiB,MAC1D,IAAS,GAA2B;IACxC;IACA;IACA,KAAK;GACP,CAAC;GACD,IAAI,EAAO,WAAW,SACpB,OAAO;IACL,OAAO;IACP,KAAK;IACL,UAAU,CAAC,GAAG,GAAU,GAAG,EAAO,QAAQ;GAC5C;GAEF,EAAS,KAAK,GAAG,EAAO,QAAQ;EAClC,QAAQ,CAER;CAEJ,SAAS,GAAG;EACV,EAAS,KACP,aAAa,QAAQ,EAAE,UAAU,mCACnC;CACF;CAGF,OAAO;EAAE,OAAO;EAAO,KAAK;EAAM;CAAS;AAC7C"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { r as e } from "./config-DLoMtwmG.js";
|
|
2
|
+
import { BaseDb as t, applyArweaveL1TransactionIdLocal as n, arweaveL1FinalizeJobs as r, getArweaveUploadStatus as i, isArweaveL1AnchoringComplete as a, queryArweaveGatewayTransactionWithFallback as o } from "@seedprotocol/sdk";
|
|
3
|
+
import s from "debug";
|
|
4
|
+
import { eq as c } from "drizzle-orm";
|
|
5
|
+
//#region src/services/arweaveL1Finalize/worker.ts
|
|
6
|
+
var l = s("seedProtocol:arweaveL1Finalize:worker"), u = 45e3, d = null;
|
|
7
|
+
function f() {
|
|
8
|
+
d ?? (d = setInterval(() => {
|
|
9
|
+
p();
|
|
10
|
+
}, u), p());
|
|
11
|
+
}
|
|
12
|
+
async function p() {
|
|
13
|
+
let s;
|
|
14
|
+
try {
|
|
15
|
+
s = e();
|
|
16
|
+
} catch {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!s.useArweaveBundler || !t.isAppDbReady()) return;
|
|
20
|
+
let u = t.getAppDb();
|
|
21
|
+
if (!u) return;
|
|
22
|
+
let d = await u.select().from(r).where(c(r.phase, "pending_l1")).limit(25);
|
|
23
|
+
if (d.length === 0) return;
|
|
24
|
+
let f = s.arweaveUploadVerificationBaseUrl, p = s.arweaveGraphqlUrl;
|
|
25
|
+
for (let e of d) {
|
|
26
|
+
let t = e.dataItemId;
|
|
27
|
+
try {
|
|
28
|
+
let s = e.l1TransactionId;
|
|
29
|
+
if (!s) {
|
|
30
|
+
let n = (await o(p, t))?.bundledInId ?? null;
|
|
31
|
+
n && (s = n, await u.update(r).set({
|
|
32
|
+
l1TransactionId: n,
|
|
33
|
+
bundleId: n,
|
|
34
|
+
updatedAt: Date.now()
|
|
35
|
+
}).where(c(r.id, e.id)));
|
|
36
|
+
}
|
|
37
|
+
let l = await i(f, t), d = l ? JSON.stringify(l) : null;
|
|
38
|
+
if (l && a(l)) {
|
|
39
|
+
let i = s ?? l.bundleId ?? l.turbo?.bundleId ?? e.l1TransactionId ?? null;
|
|
40
|
+
i && await n({
|
|
41
|
+
seedLocalId: e.seedLocalId,
|
|
42
|
+
versionLocalId: e.versionLocalId,
|
|
43
|
+
dataItemId: t,
|
|
44
|
+
l1TransactionId: i
|
|
45
|
+
}), await u.update(r).set({
|
|
46
|
+
phase: "confirmed",
|
|
47
|
+
statusJson: d,
|
|
48
|
+
l1TransactionId: i ?? e.l1TransactionId,
|
|
49
|
+
bundleId: l.bundleId ?? e.bundleId,
|
|
50
|
+
updatedAt: Date.now()
|
|
51
|
+
}).where(c(r.id, e.id));
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
await u.update(r).set({
|
|
55
|
+
statusJson: d,
|
|
56
|
+
updatedAt: Date.now()
|
|
57
|
+
}).where(c(r.id, e.id));
|
|
58
|
+
} catch (t) {
|
|
59
|
+
l("tick error for job", e.id, t), await u.update(r).set({
|
|
60
|
+
errorMessage: t instanceof Error ? t.message : String(t),
|
|
61
|
+
updatedAt: Date.now()
|
|
62
|
+
}).where(c(r.id, e.id));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { f as startArweaveL1FinalizeWorker };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=worker-BaZK7VaR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-BaZK7VaR.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"}
|