@seedprotocol/publish 0.4.26 → 0.4.28

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/helpers/constants.ts","../src/helpers/thirdweb/11155420/0x76f47d88bfaf670f5208911181fcdc0e160cb16d.ts","../src/helpers/thirdweb.ts","../src/helpers/easDirect.ts","../src/helpers/resolveRevokeAccount.ts","../src/services/revoke/revokeAttestations.ts","../src/config.ts","../src/errors.ts","../src/react/PublishProvider.tsx","../src/helpers/ensureExecutorModule.ts","../src/services/publishManager/actions/assignRestoreFromDb.ts","../src/helpers/blockchain.ts","../src/services/publish/actors/utils.ts","../src/services/publish/actors/createArweaveTransactions.ts","../src/services/publish/actors/createArweaveTransactionsPhase2.ts","../src/services/publish/actors/preparingHtmlEmbedded.ts","../src/services/publish/actors/rewritingHtmlEmbedded.ts","../src/services/publish/helpers/getPublishUploadData.ts","../src/helpers/arweave.ts","../src/services/publish/actors/createArweaveDataItems.ts","../src/services/publish/actors/createArweaveDataItemsPhase2.ts","../src/helpers/uploadApi.ts","../src/services/publish/actors/sendReimbursementRequest.ts","../src/services/publish/actors/pollForConfirmation.ts","../src/services/publish/actors/uploadData.ts","../src/services/publish/actors/uploadViaBundler.ts","../src/helpers/ensureManagedAccountReady.ts","../src/helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148.ts","../src/services/publish/actors/persistSeedUid.ts","../src/helpers/thirdweb/11155420/schemaRegistry.ts","../src/helpers/thirdweb/11155420/nameSchemaAttestation.ts","../src/services/publish/helpers/ensureEasSchemas.ts","../src/services/publish/helpers/verifyArweaveTransactionsExist.ts","../src/helpers/thirdweb/11155420/0x043462304114da543add6b693c686b7d98865f3e.ts","../src/services/publish/actors/seedUidHelpers.ts","../src/services/publish/helpers/receiptAttestationMs.ts","../src/services/publish/actors/publishRequestNormalize.ts","../src/services/arweaveL1Finalize/enqueue.ts","../src/helpers/ensureEip7702ModularAccountReady.ts","../src/helpers/ensureManagedAccountEasConfigured.ts","../src/services/publish/actors/createAttestations.ts","../src/services/publish/helpers/verifyAttestations.ts","../src/services/publish/actors/createAttestationsDirectToEas.ts","../src/services/publish/helpers/itemNeedsArweave.ts","../src/services/publish/actors/checking.ts","../src/services/publish/index.ts","../src/services/publishManager/publishManagerRef.ts","../src/services/publishManager/actors/subscribe.ts","../src/services/publishManager/actions/createPublish.ts","../src/services/publishManager/actions/retryAttestations.ts","../src/services/publishManager/actions/stopScopedOrStandaloneChild.ts","../src/services/publishManager/actors/savePublish.ts","../src/services/publishManager/actions/stopPublish.ts","../src/services/publishManager/actions/stopAll.ts","../src/services/publishManager/actions/query.ts","../src/services/publishManager/actions/addSubscription.ts","../src/services/publishManager/actions/requestSavePublish.ts","../src/services/publishManager/actions/publishDone.ts","../src/services/publishManager/actions/removeSubscription.ts","../src/services/publishManager/actors/restoreFromDb.ts","../src/services/publishManager/index.ts","../src/react/ConnectButton.tsx","../src/react/PublishModeButtons.tsx","../src/helpers/publishDisplayHelpers.ts","../src/hooks/usePublishProcess.ts","../src/hooks/useCanPublishItem.ts","../src/hooks/useArweaveL1Finalize.ts","../src/hooks/useItemPublishStatus.ts","../src/hooks/usePublishProcesses.ts","../src/hooks/clearCompletedPublishProcesses.ts","../src/hooks/publishProcessHelpers.ts","../src/helpers/transformPayloadToIntegerIds.ts","../src/helpers/ensureSmartWalletThenPublish.ts","../src/helpers/defaultApprovedTargetsForModularPublish.ts"],"sourcesContent":["/**\n * Constants for the publish package.\n */\n/** EAS Schema Registry on Optimism Sepolia (chain 11155420) */\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/** Thirdweb ManagedAccount factory on Optimism Sepolia (chain 11155420) */\nexport const THIRDWEB_ACCOUNT_FACTORY_ADDRESS =\n '0x76f47d88bfaf670f5208911181fcdc0e160cb16d' as const\n\n/** EAS contract address on Optimism Sepolia (chain 11155420) */\nexport const EAS_CONTRACT_ADDRESS =\n '0x4200000000000000000000000000000000000021' as const\n\n/**\n * Optimism Sepolia address of the deployment the **`multiPublish` Thirdweb ABI** was generated from\n * (`helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148`).\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 {\n prepareEvent,\n prepareContractCall,\n readContract,\n type BaseTransactionOptions,\n type AbiParameterToPrimitiveType,\n} from \"thirdweb\";\n\n/**\n* Contract events\n*/\n\n/**\n * Represents the filters for the \"AccountCreated\" event.\n */\nexport type AccountCreatedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\naccountAdmin: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"accountAdmin\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the AccountCreated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { accountCreatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * accountCreatedEvent({\n * account: ...,\n * accountAdmin: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function accountCreatedEvent(filters: AccountCreatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event AccountCreated(address indexed account, address indexed accountAdmin)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the ContractURIUpdated event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { contractURIUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * contractURIUpdatedEvent()\n * ],\n * });\n * ```\n */ \nexport function contractURIUpdatedEvent() {\n return prepareEvent({\n signature: \"event ContractURIUpdated(string prevURI, string newURI)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"ExtensionAdded\" event.\n */\nexport type ExtensionAddedEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nimplementation: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the ExtensionAdded event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { extensionAddedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * extensionAddedEvent({\n * name: ...,\n * implementation: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function extensionAddedEvent(filters: ExtensionAddedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ExtensionAdded(string indexed name, address indexed implementation, ((string name, string metadataURI, address implementation) metadata, (bytes4 functionSelector, string functionSignature)[] functions) extension)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"ExtensionRemoved\" event.\n */\nexport type ExtensionRemovedEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the ExtensionRemoved event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { extensionRemovedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * extensionRemovedEvent({\n * name: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function extensionRemovedEvent(filters: ExtensionRemovedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ExtensionRemoved(string indexed name, ((string name, string metadataURI, address implementation) metadata, (bytes4 functionSelector, string functionSignature)[] functions) extension)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"ExtensionReplaced\" event.\n */\nexport type ExtensionReplacedEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nimplementation: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the ExtensionReplaced event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { extensionReplacedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * extensionReplacedEvent({\n * name: ...,\n * implementation: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function extensionReplacedEvent(filters: ExtensionReplacedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ExtensionReplaced(string indexed name, address indexed implementation, ((string name, string metadataURI, address implementation) metadata, (bytes4 functionSelector, string functionSignature)[] functions) extension)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"FunctionDisabled\" event.\n */\nexport type FunctionDisabledEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"functionSelector\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the FunctionDisabled event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { functionDisabledEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * functionDisabledEvent({\n * name: ...,\n * functionSelector: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function functionDisabledEvent(filters: FunctionDisabledEventFilters = {}) {\n return prepareEvent({\n signature: \"event FunctionDisabled(string indexed name, bytes4 indexed functionSelector, (string name, string metadataURI, address implementation) extMetadata)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"FunctionEnabled\" event.\n */\nexport type FunctionEnabledEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"functionSelector\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the FunctionEnabled event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { functionEnabledEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * functionEnabledEvent({\n * name: ...,\n * functionSelector: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function functionEnabledEvent(filters: FunctionEnabledEventFilters = {}) {\n return prepareEvent({\n signature: \"event FunctionEnabled(string indexed name, bytes4 indexed functionSelector, (bytes4 functionSelector, string functionSignature) extFunction, (string name, string metadataURI, address implementation) extMetadata)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"RoleAdminChanged\" event.\n */\nexport type RoleAdminChangedEventFilters = Partial<{\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\",\"indexed\":true}>\npreviousAdminRole: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"previousAdminRole\",\"indexed\":true}>\nnewAdminRole: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"newAdminRole\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the RoleAdminChanged event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { roleAdminChangedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * roleAdminChangedEvent({\n * role: ...,\n * previousAdminRole: ...,\n * newAdminRole: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function roleAdminChangedEvent(filters: RoleAdminChangedEventFilters = {}) {\n return prepareEvent({\n signature: \"event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"RoleGranted\" event.\n */\nexport type RoleGrantedEventFilters = Partial<{\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\",\"indexed\":true}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsender: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"sender\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the RoleGranted event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { roleGrantedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * roleGrantedEvent({\n * role: ...,\n * account: ...,\n * sender: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function roleGrantedEvent(filters: RoleGrantedEventFilters = {}) {\n return prepareEvent({\n signature: \"event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"RoleRevoked\" event.\n */\nexport type RoleRevokedEventFilters = Partial<{\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\",\"indexed\":true}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsender: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"sender\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the RoleRevoked event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { roleRevokedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * roleRevokedEvent({\n * role: ...,\n * account: ...,\n * sender: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function roleRevokedEvent(filters: RoleRevokedEventFilters = {}) {\n return prepareEvent({\n signature: \"event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerAdded\" event.\n */\nexport type SignerAddedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerAdded event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerAddedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerAddedEvent({\n * account: ...,\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerAddedEvent(filters: SignerAddedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerAdded(address indexed account, address indexed signer)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerRemoved\" event.\n */\nexport type SignerRemovedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerRemoved event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerRemovedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerRemovedEvent({\n * account: ...,\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerRemovedEvent(filters: SignerRemovedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerRemoved(address indexed account, address indexed signer)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"AdminUpdated\" event.\n */\nexport type AdminUpdatedEventFilters = Partial<{\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the AdminUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { adminUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * adminUpdatedEvent({\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function adminUpdatedEvent(filters: AdminUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event AdminUpdated(address indexed signer, bool isAdmin)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerPermissionsUpdated\" event.\n */\nexport type SignerPermissionsUpdatedEventFilters = Partial<{\n authorizingSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"authorizingSigner\",\"indexed\":true}>\ntargetSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"targetSigner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerPermissionsUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerPermissionsUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerPermissionsUpdatedEvent({\n * authorizingSigner: ...,\n * targetSigner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerPermissionsUpdatedEvent(filters: SignerPermissionsUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerPermissionsUpdated(address indexed authorizingSigner, address indexed targetSigner, (address signer, uint8 isAdmin, address[] approvedTargets, uint256 nativeTokenLimitPerTransaction, uint128 permissionStartTimestamp, uint128 permissionEndTimestamp, uint128 reqValidityStartTimestamp, uint128 reqValidityEndTimestamp, bytes32 uid) permissions)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the CreatedAttestation event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { createdAttestationEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * createdAttestationEvent()\n * ],\n * });\n * ```\n */ \nexport function createdAttestationEvent() {\n return prepareEvent({\n signature: \"event CreatedAttestation((bytes32 schemaUid, bytes32 attestationUid) result)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the EIP712DomainChanged event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { eIP712DomainChangedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * eIP712DomainChangedEvent()\n * ],\n * });\n * ```\n */ \nexport function eIP712DomainChangedEvent() {\n return prepareEvent({\n signature: \"event EIP712DomainChanged()\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Initialized event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { initializedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * initializedEvent()\n * ],\n * });\n * ```\n */ \nexport function initializedEvent() {\n return prepareEvent({\n signature: \"event Initialized(uint8 version)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Log event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { logEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * logEvent()\n * ],\n * });\n * ```\n */ \nexport function logEvent() {\n return prepareEvent({\n signature: \"event Log(string message)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"OwnershipTransferred\" event.\n */\nexport type OwnershipTransferredEventFilters = Partial<{\n previousOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true}>\nnewOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the OwnershipTransferred event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { ownershipTransferredEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * ownershipTransferredEvent({\n * previousOwner: ...,\n * newOwner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function ownershipTransferredEvent(filters: OwnershipTransferredEventFilters = {}) {\n return prepareEvent({\n signature: \"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the SeedPublished event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { seedPublishedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * seedPublishedEvent()\n * ],\n * });\n * ```\n */ \nexport function seedPublishedEvent() {\n return prepareEvent({\n signature: \"event SeedPublished(bytes returnedDataFromEAS)\",\n });\n};\n \n\n/**\n* Contract read functions\n*/\n\n\n\n/**\n * Calls the \"DEFAULT_ADMIN_ROLE\" function on the contract.\n * @param options - The options for the DEFAULT_ADMIN_ROLE function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { DEFAULT_ADMIN_ROLE } from \"TODO\";\n * \n * const result = await DEFAULT_ADMIN_ROLE();\n * \n * ```\n */\nexport async function DEFAULT_ADMIN_ROLE(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa217fddf\",\n [],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"accountImplementation\" function on the contract.\n * @param options - The options for the accountImplementation function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { accountImplementation } from \"TODO\";\n * \n * const result = await accountImplementation();\n * \n * ```\n */\nexport async function accountImplementation(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x11464fbe\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"contractURI\" function on the contract.\n * @param options - The options for the contractURI function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { contractURI } from \"TODO\";\n * \n * const result = await contractURI();\n * \n * ```\n */\nexport async function contractURI(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe8a3d485\",\n [],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"defaultExtensions\" function on the contract.\n * @param options - The options for the defaultExtensions function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { defaultExtensions } from \"TODO\";\n * \n * const result = await defaultExtensions();\n * \n * ```\n */\nexport async function defaultExtensions(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x463c4864\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"entrypoint\" function on the contract.\n * @param options - The options for the entrypoint function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { entrypoint } from \"TODO\";\n * \n * const result = await entrypoint();\n * \n * ```\n */\nexport async function entrypoint(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa65d69d4\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getAccounts\" function.\n */\nexport type GetAccountsParams = {\n start: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_start\"}>\nend: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_end\"}>\n};\n\n/**\n * Calls the \"getAccounts\" function on the contract.\n * @param options - The options for the getAccounts function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAccounts } from \"TODO\";\n * \n * const result = await getAccounts({\n * start: ...,\n * end: ...,\n * });\n * \n * ```\n */\nexport async function getAccounts(\n options: BaseTransactionOptions<GetAccountsParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe68a7c3b\",\n [\n {\n \"type\": \"uint256\",\n \"name\": \"_start\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"_end\"\n }\n ],\n [\n {\n \"type\": \"address[]\",\n \"name\": \"accounts\"\n }\n ]\n],\n params: [options.start, options.end]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getAccountsOfSigner\" function.\n */\nexport type GetAccountsOfSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"getAccountsOfSigner\" function on the contract.\n * @param options - The options for the getAccountsOfSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAccountsOfSigner } from \"TODO\";\n * \n * const result = await getAccountsOfSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function getAccountsOfSigner(\n options: BaseTransactionOptions<GetAccountsOfSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x0e6254fd\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"address[]\",\n \"name\": \"accounts\"\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getAddress\" function.\n */\nexport type GetAddressParams = {\n adminSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_adminSigner\"}>\ndata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_data\"}>\n};\n\n/**\n * Calls the \"getAddress\" function on the contract.\n * @param options - The options for the getAddress function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAddress } from \"TODO\";\n * \n * const result = await getAddress({\n * adminSigner: ...,\n * data: ...,\n * });\n * \n * ```\n */\nexport async function getAddress(\n options: BaseTransactionOptions<GetAddressParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8878ed33\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_adminSigner\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_data\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.adminSigner, options.data]\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllAccounts\" function on the contract.\n * @param options - The options for the getAllAccounts function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllAccounts } from \"TODO\";\n * \n * const result = await getAllAccounts();\n * \n * ```\n */\nexport async function getAllAccounts(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x08e93d0a\",\n [],\n [\n {\n \"type\": \"address[]\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllExtensions\" function on the contract.\n * @param options - The options for the getAllExtensions function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllExtensions } from \"TODO\";\n * \n * const result = await getAllExtensions();\n * \n * ```\n */\nexport async function getAllExtensions(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x4a00cc48\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"allExtensions\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getExtension\" function.\n */\nexport type GetExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"extensionName\"}>\n};\n\n/**\n * Calls the \"getExtension\" function on the contract.\n * @param options - The options for the getExtension function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getExtension } from \"TODO\";\n * \n * const result = await getExtension({\n * extensionName: ...,\n * });\n * \n * ```\n */\nexport async function getExtension(\n options: BaseTransactionOptions<GetExtensionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xc22707ee\",\n [\n {\n \"type\": \"string\",\n \"name\": \"extensionName\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ]\n],\n params: [options.extensionName]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getImplementationForFunction\" function.\n */\nexport type GetImplementationForFunctionParams = {\n functionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"getImplementationForFunction\" function on the contract.\n * @param options - The options for the getImplementationForFunction function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getImplementationForFunction } from \"TODO\";\n * \n * const result = await getImplementationForFunction({\n * functionSelector: ...,\n * });\n * \n * ```\n */\nexport async function getImplementationForFunction(\n options: BaseTransactionOptions<GetImplementationForFunctionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xce0b6013\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getMetadataForFunction\" function.\n */\nexport type GetMetadataForFunctionParams = {\n functionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"functionSelector\"}>\n};\n\n/**\n * Calls the \"getMetadataForFunction\" function on the contract.\n * @param options - The options for the getMetadataForFunction function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getMetadataForFunction } from \"TODO\";\n * \n * const result = await getMetadataForFunction({\n * functionSelector: ...,\n * });\n * \n * ```\n */\nexport async function getMetadataForFunction(\n options: BaseTransactionOptions<GetMetadataForFunctionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa0dbaefd\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n }\n ]\n],\n params: [options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getRoleAdmin\" function.\n */\nexport type GetRoleAdminParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\n};\n\n/**\n * Calls the \"getRoleAdmin\" function on the contract.\n * @param options - The options for the getRoleAdmin function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getRoleAdmin } from \"TODO\";\n * \n * const result = await getRoleAdmin({\n * role: ...,\n * });\n * \n * ```\n */\nexport async function getRoleAdmin(\n options: BaseTransactionOptions<GetRoleAdminParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x248a9ca3\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.role]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getRoleMember\" function.\n */\nexport type GetRoleMemberParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\nindex: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"index\"}>\n};\n\n/**\n * Calls the \"getRoleMember\" function on the contract.\n * @param options - The options for the getRoleMember function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getRoleMember } from \"TODO\";\n * \n * const result = await getRoleMember({\n * role: ...,\n * index: ...,\n * });\n * \n * ```\n */\nexport async function getRoleMember(\n options: BaseTransactionOptions<GetRoleMemberParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x9010d07c\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"index\"\n }\n ],\n [\n {\n \"type\": \"address\",\n \"name\": \"member\"\n }\n ]\n],\n params: [options.role, options.index]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getRoleMemberCount\" function.\n */\nexport type GetRoleMemberCountParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\n};\n\n/**\n * Calls the \"getRoleMemberCount\" function on the contract.\n * @param options - The options for the getRoleMemberCount function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getRoleMemberCount } from \"TODO\";\n * \n * const result = await getRoleMemberCount({\n * role: ...,\n * });\n * \n * ```\n */\nexport async function getRoleMemberCount(\n options: BaseTransactionOptions<GetRoleMemberCountParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xca15c873\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n }\n ],\n [\n {\n \"type\": \"uint256\",\n \"name\": \"count\"\n }\n ]\n],\n params: [options.role]\n });\n};\n\n\n/**\n * Represents the parameters for the \"hasRole\" function.\n */\nexport type HasRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"hasRole\" function on the contract.\n * @param options - The options for the hasRole function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { hasRole } from \"TODO\";\n * \n * const result = await hasRole({\n * role: ...,\n * account: ...,\n * });\n * \n * ```\n */\nexport async function hasRole(\n options: BaseTransactionOptions<HasRoleParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x91d14854\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"hasRoleWithSwitch\" function.\n */\nexport type HasRoleWithSwitchParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"hasRoleWithSwitch\" function on the contract.\n * @param options - The options for the hasRoleWithSwitch function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { hasRoleWithSwitch } from \"TODO\";\n * \n * const result = await hasRoleWithSwitch({\n * role: ...,\n * account: ...,\n * });\n * \n * ```\n */\nexport async function hasRoleWithSwitch(\n options: BaseTransactionOptions<HasRoleWithSwitchParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa32fa5b3\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isRegistered\" function.\n */\nexport type IsRegisteredParams = {\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_account\"}>\n};\n\n/**\n * Calls the \"isRegistered\" function on the contract.\n * @param options - The options for the isRegistered function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isRegistered } from \"TODO\";\n * \n * const result = await isRegistered({\n * account: ...,\n * });\n * \n * ```\n */\nexport async function isRegistered(\n options: BaseTransactionOptions<IsRegisteredParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xc3c5a547\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n\n\n/**\n * Calls the \"totalAccounts\" function on the contract.\n * @param options - The options for the totalAccounts function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { totalAccounts } from \"TODO\";\n * \n * const result = await totalAccounts();\n * \n * ```\n */\nexport async function totalAccounts(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x58451f97\",\n [],\n [\n {\n \"type\": \"uint256\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllActiveSigners\" function on the contract.\n * @param options - The options for the getAllActiveSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllActiveSigners } from \"TODO\";\n * \n * const result = await getAllActiveSigners();\n * \n * ```\n */\nexport async function getAllActiveSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8b52d723\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllAdmins\" function on the contract.\n * @param options - The options for the getAllAdmins function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllAdmins } from \"TODO\";\n * \n * const result = await getAllAdmins();\n * \n * ```\n */\nexport async function getAllAdmins(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe9523c97\",\n [],\n [\n {\n \"type\": \"address[]\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllSigners\" function on the contract.\n * @param options - The options for the getAllSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllSigners } from \"TODO\";\n * \n * const result = await getAllSigners();\n * \n * ```\n */\nexport async function getAllSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd42f2f35\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getMessageHash\" function.\n */\nexport type GetMessageHashParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\n};\n\n/**\n * Calls the \"getMessageHash\" function on the contract.\n * @param options - The options for the getMessageHash function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getMessageHash } from \"TODO\";\n * \n * const result = await getMessageHash({\n * hash: ...,\n * });\n * \n * ```\n */\nexport async function getMessageHash(\n options: BaseTransactionOptions<GetMessageHashParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x399b77da\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.hash]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getPermissionsForSigner\" function.\n */\nexport type GetPermissionsForSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"getPermissionsForSigner\" function on the contract.\n * @param options - The options for the getPermissionsForSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getPermissionsForSigner } from \"TODO\";\n * \n * const result = await getPermissionsForSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function getPermissionsForSigner(\n options: BaseTransactionOptions<GetPermissionsForSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xf15d424e\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isActiveSigner\" function.\n */\nexport type IsActiveSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"isActiveSigner\" function on the contract.\n * @param options - The options for the isActiveSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isActiveSigner } from \"TODO\";\n * \n * const result = await isActiveSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function isActiveSigner(\n options: BaseTransactionOptions<IsActiveSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x7dff5a79\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isAdmin\" function.\n */\nexport type IsAdminParams = {\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_account\"}>\n};\n\n/**\n * Calls the \"isAdmin\" function on the contract.\n * @param options - The options for the isAdmin function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isAdmin } from \"TODO\";\n * \n * const result = await isAdmin({\n * account: ...,\n * });\n * \n * ```\n */\nexport async function isAdmin(\n options: BaseTransactionOptions<IsAdminParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x24d7806c\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isValidSignature\" function.\n */\nexport type IsValidSignatureParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"isValidSignature\" function on the contract.\n * @param options - The options for the isValidSignature function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isValidSignature } from \"TODO\";\n * \n * const result = await isValidSignature({\n * hash: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function isValidSignature(\n options: BaseTransactionOptions<IsValidSignatureParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x1626ba7e\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"magicValue\"\n }\n ]\n],\n params: [options.hash, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"supportsInterface\" function.\n */\nexport type SupportsInterfaceParams = {\n interfaceId: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"interfaceId\"}>\n};\n\n/**\n * Calls the \"supportsInterface\" function on the contract.\n * @param options - The options for the supportsInterface function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { supportsInterface } from \"TODO\";\n * \n * const result = await supportsInterface({\n * interfaceId: ...,\n * });\n * \n * ```\n */\nexport async function supportsInterface(\n options: BaseTransactionOptions<SupportsInterfaceParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x01ffc9a7\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"interfaceId\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.interfaceId]\n });\n};\n\n\n/**\n * Represents the parameters for the \"verifySignerPermissionRequest\" function.\n */\nexport type VerifySignerPermissionRequestParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"signature\"}>\n};\n\n/**\n * Calls the \"verifySignerPermissionRequest\" function on the contract.\n * @param options - The options for the verifySignerPermissionRequest function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { verifySignerPermissionRequest } from \"TODO\";\n * \n * const result = await verifySignerPermissionRequest({\n * req: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function verifySignerPermissionRequest(\n options: BaseTransactionOptions<VerifySignerPermissionRequestParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa9082d84\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ],\n [\n {\n \"type\": \"bool\",\n \"name\": \"success\"\n },\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ]\n],\n params: [options.req, options.signature]\n });\n};\n\n\n\n\n/**\n * Calls the \"eip712Domain\" function on the contract.\n * @param options - The options for the eip712Domain function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { eip712Domain } from \"TODO\";\n * \n * const result = await eip712Domain();\n * \n * ```\n */\nexport async function eip712Domain(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x84b0196e\",\n [],\n [\n {\n \"type\": \"bytes1\",\n \"name\": \"fields\"\n },\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"version\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"chainId\"\n },\n {\n \"type\": \"address\",\n \"name\": \"verifyingContract\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"salt\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"extensions\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getEas\" function on the contract.\n * @param options - The options for the getEas function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getEas } from \"TODO\";\n * \n * const result = await getEas();\n * \n * ```\n */\nexport async function getEas(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd5f5127d\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"owner\" function on the contract.\n * @param options - The options for the owner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { owner } from \"TODO\";\n * \n * const result = await owner();\n * \n * ```\n */\nexport async function owner(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8da5cb5b\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n* Contract write functions\n*/\n\n/**\n * Represents the parameters for the \"_disableFunctionInExtension\" function.\n */\nexport type _disableFunctionInExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"_disableFunctionInExtension\" function on the contract.\n * @param options - The options for the \"_disableFunctionInExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { _disableFunctionInExtension } from \"TODO\";\n * \n * const transaction = _disableFunctionInExtension({\n * extensionName: ...,\n * functionSelector: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function _disableFunctionInExtension(\n options: BaseTransactionOptions<_disableFunctionInExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x429eed80\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n },\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n []\n],\n params: [options.extensionName, options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"addExtension\" function.\n */\nexport type AddExtensionParams = {\n extension: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_extension\",\"components\":[{\"type\":\"tuple\",\"name\":\"metadata\",\"components\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"metadataURI\"},{\"type\":\"address\",\"name\":\"implementation\"}]},{\"type\":\"tuple[]\",\"name\":\"functions\",\"components\":[{\"type\":\"bytes4\",\"name\":\"functionSelector\"},{\"type\":\"string\",\"name\":\"functionSignature\"}]}]}>\n};\n\n/**\n * Calls the \"addExtension\" function on the contract.\n * @param options - The options for the \"addExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { addExtension } from \"TODO\";\n * \n * const transaction = addExtension({\n * extension: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function addExtension(\n options: BaseTransactionOptions<AddExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xe05688fe\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_extension\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ],\n []\n],\n params: [options.extension]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createAccount\" function.\n */\nexport type CreateAccountParams = {\n admin: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_admin\"}>\ndata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_data\"}>\n};\n\n/**\n * Calls the \"createAccount\" function on the contract.\n * @param options - The options for the \"createAccount\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createAccount } from \"TODO\";\n * \n * const transaction = createAccount({\n * admin: ...,\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createAccount(\n options: BaseTransactionOptions<CreateAccountParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd8fd8f44\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_admin\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_data\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.admin, options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"disableFunctionInExtension\" function.\n */\nexport type DisableFunctionInExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"disableFunctionInExtension\" function on the contract.\n * @param options - The options for the \"disableFunctionInExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { disableFunctionInExtension } from \"TODO\";\n * \n * const transaction = disableFunctionInExtension({\n * extensionName: ...,\n * functionSelector: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function disableFunctionInExtension(\n options: BaseTransactionOptions<DisableFunctionInExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x512cf914\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n },\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n []\n],\n params: [options.extensionName, options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"enableFunctionInExtension\" function.\n */\nexport type EnableFunctionInExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\nfunction: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_function\",\"components\":[{\"type\":\"bytes4\",\"name\":\"functionSelector\"},{\"type\":\"string\",\"name\":\"functionSignature\"}]}>\n};\n\n/**\n * Calls the \"enableFunctionInExtension\" function on the contract.\n * @param options - The options for the \"enableFunctionInExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { enableFunctionInExtension } from \"TODO\";\n * \n * const transaction = enableFunctionInExtension({\n * extensionName: ...,\n * function: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function enableFunctionInExtension(\n options: BaseTransactionOptions<EnableFunctionInExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x8856a113\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n },\n {\n \"type\": \"tuple\",\n \"name\": \"_function\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ],\n []\n],\n params: [options.extensionName, options.function]\n });\n};\n\n\n/**\n * Represents the parameters for the \"grantRole\" function.\n */\nexport type GrantRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"grantRole\" function on the contract.\n * @param options - The options for the \"grantRole\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { grantRole } from \"TODO\";\n * \n * const transaction = grantRole({\n * role: ...,\n * account: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function grantRole(\n options: BaseTransactionOptions<GrantRoleParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x2f2ff15d\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n []\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multicall\" function.\n */\nexport type MulticallParams = {\n data: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"data\"}>\n};\n\n/**\n * Calls the \"multicall\" function on the contract.\n * @param options - The options for the \"multicall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multicall } from \"TODO\";\n * \n * const transaction = multicall({\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multicall(\n options: BaseTransactionOptions<MulticallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xac9650d8\",\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"data\"\n }\n ],\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"results\"\n }\n ]\n],\n params: [options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onRegister\" function.\n */\nexport type OnRegisterParams = {\n salt: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_salt\"}>\n};\n\n/**\n * Calls the \"onRegister\" function on the contract.\n * @param options - The options for the \"onRegister\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onRegister } from \"TODO\";\n * \n * const transaction = onRegister({\n * salt: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onRegister(\n options: BaseTransactionOptions<OnRegisterParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x83a03f8c\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_salt\"\n }\n ],\n []\n],\n params: [options.salt]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onSignerAdded\" function.\n */\nexport type OnSignerAddedParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_signer\"}>\nsalt: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_salt\"}>\n};\n\n/**\n * Calls the \"onSignerAdded\" function on the contract.\n * @param options - The options for the \"onSignerAdded\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onSignerAdded } from \"TODO\";\n * \n * const transaction = onSignerAdded({\n * signer: ...,\n * salt: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onSignerAdded(\n options: BaseTransactionOptions<OnSignerAddedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x0b61e12b\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_signer\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"_salt\"\n }\n ],\n []\n],\n params: [options.signer, options.salt]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onSignerRemoved\" function.\n */\nexport type OnSignerRemovedParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_signer\"}>\nsalt: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_salt\"}>\n};\n\n/**\n * Calls the \"onSignerRemoved\" function on the contract.\n * @param options - The options for the \"onSignerRemoved\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onSignerRemoved } from \"TODO\";\n * \n * const transaction = onSignerRemoved({\n * signer: ...,\n * salt: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onSignerRemoved(\n options: BaseTransactionOptions<OnSignerRemovedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x9387a380\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_signer\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"_salt\"\n }\n ],\n []\n],\n params: [options.signer, options.salt]\n });\n};\n\n\n/**\n * Represents the parameters for the \"removeExtension\" function.\n */\nexport type RemoveExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\n};\n\n/**\n * Calls the \"removeExtension\" function on the contract.\n * @param options - The options for the \"removeExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { removeExtension } from \"TODO\";\n * \n * const transaction = removeExtension({\n * extensionName: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function removeExtension(\n options: BaseTransactionOptions<RemoveExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xee7d2adf\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n }\n ],\n []\n],\n params: [options.extensionName]\n });\n};\n\n\n/**\n * Represents the parameters for the \"renounceRole\" function.\n */\nexport type RenounceRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"renounceRole\" function on the contract.\n * @param options - The options for the \"renounceRole\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { renounceRole } from \"TODO\";\n * \n * const transaction = renounceRole({\n * role: ...,\n * account: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function renounceRole(\n options: BaseTransactionOptions<RenounceRoleParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x36568abe\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n []\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"replaceExtension\" function.\n */\nexport type ReplaceExtensionParams = {\n extension: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_extension\",\"components\":[{\"type\":\"tuple\",\"name\":\"metadata\",\"components\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"metadataURI\"},{\"type\":\"address\",\"name\":\"implementation\"}]},{\"type\":\"tuple[]\",\"name\":\"functions\",\"components\":[{\"type\":\"bytes4\",\"name\":\"functionSelector\"},{\"type\":\"string\",\"name\":\"functionSignature\"}]}]}>\n};\n\n/**\n * Calls the \"replaceExtension\" function on the contract.\n * @param options - The options for the \"replaceExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { replaceExtension } from \"TODO\";\n * \n * const transaction = replaceExtension({\n * extension: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function replaceExtension(\n options: BaseTransactionOptions<ReplaceExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xc0562f6d\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_extension\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ],\n []\n],\n params: [options.extension]\n });\n};\n\n\n/**\n * Represents the parameters for the \"revokeRole\" function.\n */\nexport type RevokeRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"revokeRole\" function on the contract.\n * @param options - The options for the \"revokeRole\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { revokeRole } from \"TODO\";\n * \n * const transaction = revokeRole({\n * role: ...,\n * account: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function revokeRole(\n options: BaseTransactionOptions<RevokeRoleParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd547741f\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n []\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setContractURI\" function.\n */\nexport type SetContractURIParams = {\n uri: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_uri\"}>\n};\n\n/**\n * Calls the \"setContractURI\" function on the contract.\n * @param options - The options for the \"setContractURI\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setContractURI } from \"TODO\";\n * \n * const transaction = setContractURI({\n * uri: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setContractURI(\n options: BaseTransactionOptions<SetContractURIParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x938e3d7b\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_uri\"\n }\n ],\n []\n],\n params: [options.uri]\n });\n};\n\n\n\n\n/**\n * Calls the \"addDeposit\" function on the contract.\n * @param options - The options for the \"addDeposit\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { addDeposit } from \"TODO\";\n * \n * const transaction = addDeposit();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function addDeposit(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4a58db19\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"execute\" function.\n */\nexport type ExecuteParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"execute\" function on the contract.\n * @param options - The options for the \"execute\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { execute } from \"TODO\";\n * \n * const transaction = execute({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function execute(\n options: BaseTransactionOptions<ExecuteParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb61d27f6\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"executeBatch\" function.\n */\nexport type ExecuteBatchParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address[]\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"executeBatch\" function on the contract.\n * @param options - The options for the \"executeBatch\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { executeBatch } from \"TODO\";\n * \n * const transaction = executeBatch({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function executeBatch(\n options: BaseTransactionOptions<ExecuteBatchParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x47e1da2a\",\n [\n {\n \"type\": \"address[]\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes[]\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155BatchReceived\" function.\n */\nexport type OnERC1155BatchReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155BatchReceived\" function on the contract.\n * @param options - The options for the \"onERC1155BatchReceived\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155BatchReceived } from \"TODO\";\n * \n * const transaction = onERC1155BatchReceived({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155BatchReceived(\n options: BaseTransactionOptions<OnERC1155BatchReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xbc197c81\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155Received\" function.\n */\nexport type OnERC1155ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155Received\" function on the contract.\n * @param options - The options for the \"onERC1155Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155Received } from \"TODO\";\n * \n * const transaction = onERC1155Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155Received(\n options: BaseTransactionOptions<OnERC1155ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf23a6e61\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC721Received\" function.\n */\nexport type OnERC721ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC721Received\" function on the contract.\n * @param options - The options for the \"onERC721Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC721Received } from \"TODO\";\n * \n * const transaction = onERC721Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC721Received(\n options: BaseTransactionOptions<OnERC721ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x150b7a02\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setPermissionsForSigner\" function.\n */\nexport type SetPermissionsForSignerParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"setPermissionsForSigner\" function on the contract.\n * @param options - The options for the \"setPermissionsForSigner\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setPermissionsForSigner } from \"TODO\";\n * \n * const transaction = setPermissionsForSigner({\n * req: ...,\n * signature: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setPermissionsForSigner(\n options: BaseTransactionOptions<SetPermissionsForSignerParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x5892e236\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n []\n],\n params: [options.req, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"withdrawDepositTo\" function.\n */\nexport type WithdrawDepositToParams = {\n withdrawAddress: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"withdrawAddress\"}>\namount: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"amount\"}>\n};\n\n/**\n * Calls the \"withdrawDepositTo\" function on the contract.\n * @param options - The options for the \"withdrawDepositTo\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { withdrawDepositTo } from \"TODO\";\n * \n * const transaction = withdrawDepositTo({\n * withdrawAddress: ...,\n * amount: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function withdrawDepositTo(\n options: BaseTransactionOptions<WithdrawDepositToParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4d44560d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"withdrawAddress\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"amount\"\n }\n ],\n []\n],\n params: [options.withdrawAddress, options.amount]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createSeed\" function.\n */\nexport type CreateSeedParams = {\n schemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"schemaUid\"}>\nrevocable: AbiParameterToPrimitiveType<{\"type\":\"bool\",\"name\":\"revocable\"}>\n};\n\n/**\n * Calls the \"createSeed\" function on the contract.\n * @param options - The options for the \"createSeed\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createSeed } from \"TODO\";\n * \n * const transaction = createSeed({\n * schemaUid: ...,\n * revocable: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createSeed(\n options: BaseTransactionOptions<CreateSeedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6240d6d9\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"schemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.schemaUid, options.revocable]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createVersion\" function.\n */\nexport type CreateVersionParams = {\n seedUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"seedUid\"}>\nversionSchemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"}>\n};\n\n/**\n * Calls the \"createVersion\" function on the contract.\n * @param options - The options for the \"createVersion\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createVersion } from \"TODO\";\n * \n * const transaction = createVersion({\n * seedUid: ...,\n * versionSchemaUid: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createVersion(\n options: BaseTransactionOptions<CreateVersionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x13e0c263\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.seedUid, options.versionSchemaUid]\n });\n};\n\n\n/**\n * Represents the parameters for the \"initialize\" function.\n */\nexport type InitializeParams = {\n eas: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_eas\"}>\n};\n\n/**\n * Calls the \"initialize\" function on the contract.\n * @param options - The options for the \"initialize\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { initialize } from \"TODO\";\n * \n * const transaction = initialize({\n * eas: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function initialize(\n options: BaseTransactionOptions<InitializeParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xc4d66de8\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_eas\"\n }\n ],\n []\n],\n params: [options.eas]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multiPublish\" function.\n */\nexport type MultiPublishParams = {\n requests: AbiParameterToPrimitiveType<{\"type\":\"tuple[]\",\"name\":\"requests\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"multiPublish\" function on the contract.\n * @param options - The options for the \"multiPublish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multiPublish } from \"TODO\";\n * \n * const transaction = multiPublish({\n * requests: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multiPublish(\n options: BaseTransactionOptions<MultiPublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x31e19cb8\",\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"requests\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32[]\"\n }\n ]\n],\n params: [options.requests]\n });\n};\n\n\n/**\n * Represents the parameters for the \"publish\" function.\n */\nexport type PublishParams = {\n request: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"request\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"publish\" function on the contract.\n * @param options - The options for the \"publish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { publish } from \"TODO\";\n * \n * const transaction = publish({\n * request: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function publish(\n options: BaseTransactionOptions<PublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb71308c5\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"request\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n },\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.request]\n });\n};\n\n\n\n\n/**\n * Calls the \"renounceOwnership\" function on the contract.\n * @param options - The options for the \"renounceOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { renounceOwnership } from \"TODO\";\n * \n * const transaction = renounceOwnership();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function renounceOwnership(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x715018a6\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"setEas\" function.\n */\nexport type SetEasParams = {\n eas: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_eas\"}>\n};\n\n/**\n * Calls the \"setEas\" function on the contract.\n * @param options - The options for the \"setEas\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setEas } from \"TODO\";\n * \n * const transaction = setEas({\n * eas: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setEas(\n options: BaseTransactionOptions<SetEasParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb90b6e0d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_eas\"\n }\n ],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: [options.eas]\n });\n};\n\n\n/**\n * Represents the parameters for the \"transferOwnership\" function.\n */\nexport type TransferOwnershipParams = {\n newOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\"}>\n};\n\n/**\n * Calls the \"transferOwnership\" function on the contract.\n * @param options - The options for the \"transferOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { transferOwnership } from \"TODO\";\n * \n * const transaction = transferOwnership({\n * newOwner: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function transferOwnership(\n options: BaseTransactionOptions<TransferOwnershipParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf2fde38b\",\n [\n {\n \"type\": \"address\",\n \"name\": \"newOwner\"\n }\n ],\n []\n],\n params: [options.newOwner]\n });\n};\n\n\n","import { createThirdwebClient, getContract, sendTransaction, waitForReceipt, } from 'thirdweb'\nimport { createWallet, Account, inAppWallet, type Wallet, } from 'thirdweb/wallets'\nimport { useActiveAccount } from 'thirdweb/react'\nimport { ThirdwebContract, } from 'thirdweb/contract'\nimport { isContractDeployed } from 'thirdweb/utils'\nimport { useEffect, useRef, useState, } from 'react'\nimport type { Chain } from 'thirdweb/chains'\nimport { optimismSepolia, } from 'thirdweb/chains'\nimport {\n createAccount,\n getAddress as getFactoryAddress,\n} from './thirdweb/11155420/0x76f47d88bfaf670f5208911181fcdc0e160cb16d'\nimport debug from 'debug'\nimport { getPublishConfig } from '../config'\nimport { THIRDWEB_ACCOUNT_FACTORY_ADDRESS } from './constants'\n\nconst logger = debug('permaPress:helpers:thirdweb')\n\n/**\n * Custom storage for publish in-app wallets: same prefix for modular (EIP-7702) and managed (EIP-4337).\n * Uses `localStorage` so embedded-wallet session material survives app/tab restarts.\n */\nconst SEED_IN_APP_SESSION_PREFIX = 'seedProtocol:inAppPublish:'\n\nlet _publishInAppWalletStorage: {\n getItem: (key: string) => Promise<string | null>\n setItem: (key: string, value: string) => Promise<void>\n removeItem: (key: string) => Promise<void>\n} | null = null\n\nexport function getSharedPublishInAppWalletStorage() {\n if (!_publishInAppWalletStorage) {\n _publishInAppWalletStorage = {\n getItem: async (key) => {\n if (typeof window === 'undefined') return null\n return localStorage.getItem(SEED_IN_APP_SESSION_PREFIX + key)\n },\n setItem: async (key, value) => {\n if (typeof window === 'undefined') return\n localStorage.setItem(SEED_IN_APP_SESSION_PREFIX + key, value)\n },\n removeItem: async (key) => {\n if (typeof window === 'undefined') return\n localStorage.removeItem(SEED_IN_APP_SESSION_PREFIX + key)\n },\n }\n }\n return _publishInAppWalletStorage\n}\n\nlet _client: ReturnType<typeof createThirdwebClient> | null = null\n\nexport function getClient() {\n if (!_client) {\n const { thirdwebClientId } = getPublishConfig()\n _client = createThirdwebClient({ clientId: thirdwebClientId })\n }\n return _client\n}\n\nexport const wallets = [\n // embeddedWallet(),\n createWallet('io.metamask',),\n // createWallet(\"com.coinbase.wallet\"),\n // createWallet(\"me.rainbow\"),\n]\n\nexport const useLocalWalletAccount = () => {\n\n const [ localWalletAccount, setLocalWalletAccount, ] = useState<Account | null>(null,)\n const personalWallet = createWallet('io.metamask',)\n\n const isConnecting = useRef(false)\n\n useEffect(() => {\n const _getAccount = async (): Promise<void> => {\n // if ( isConnecting.current ) {\n // return\n // }\n // isConnecting.current = true\n\n // const personalAccount = await personalWallet.connect({ client, },)\n // if ( !personalAccount ) {\n // throw new Error('Failed to connect to personal account',)\n // }\n\n // setLocalWalletAccount(personalAccount,)\n // isConnecting.current = false\n }\n\n _getAccount()\n\n }, [],)\n\n return localWalletAccount\n\n}\n\nexport const useActiveSmartWalletContract = () => {\n const account = useActiveAccount()\n\n const [ contract, setContract, ] = useState<ThirdwebContract | null>(null,)\n\n useEffect(() => {\n if ( !account || !account.address ) {\n return\n }\n\n setContract(getContract({\n client: getClient(),\n chain : optimismSepolia,\n address : account.address,\n },),)\n\n }, [ account, ],)\n\n return contract\n}\n\nexport const getManagedAccountFactoryContract = () => {\n const { thirdwebAccountFactoryAddress } = getPublishConfig()\n const contract = getContract({\n client: getClient(),\n chain : optimismSepolia,\n address : thirdwebAccountFactoryAddress,\n },)\n\n return contract\n}\n\n/**\n * Returns the deterministic smart wallet address for an admin signer and optional data.\n */\nexport async function getSmartWalletAddressForAdmin (\n adminAddress: string,\n data: string = '0x',\n): Promise<string> {\n const factory = getManagedAccountFactoryContract()\n return getFactoryAddress({\n contract : factory,\n adminSigner : adminAddress,\n data : data as `0x${string}`,\n },) as Promise<string>\n}\n\n/**\n * Returns true if the given address has contract bytecode deployed (e.g. a ManagedAccount).\n */\nexport async function isSmartWalletDeployed ( smartWalletAddress: string, ): Promise<boolean> {\n const contract = getContract({\n client: getClient(),\n chain : optimismSepolia,\n address : smartWalletAddress,\n },)\n return isContractDeployed(contract,)\n}\n\n/**\n * Resolves the smart wallet address and account to use for publish.\n * If the user has no connected account or no deployed ManagedAccount, returns needsDeploy.\n *\n * When using EIP4337 (in-app wallet with account abstraction), account.address is already\n * the smart wallet address. We detect that case and use it directly instead of deriving\n * via getSmartWalletAddressForAdmin (which assumes account.address is the EOA admin).\n */\nexport async function resolveSmartWalletForPublish (\n account: Account | null,\n): Promise<{ address: string; account: Account } | { needsDeploy: true }> {\n if ( !account ) {\n return { needsDeploy: true }\n }\n // If account.address is already a deployed smart wallet (e.g. from EIP4337), use it directly\n const accountIsDeployedSmartWallet = await isSmartWalletDeployed(account.address,)\n if ( accountIsDeployedSmartWallet ) {\n return { address: account.address, account }\n }\n // Otherwise derive smart wallet from EOA admin (e.g. MetaMask)\n const smartWalletAddress = await getSmartWalletAddressForAdmin(account.address,)\n const deployed = await isSmartWalletDeployed(smartWalletAddress,)\n if ( deployed ) {\n return { address: smartWalletAddress, account }\n }\n return { needsDeploy: true }\n}\n\n/** External wallets (MetaMask, Rainbow) for the deploy flow only; no account abstraction. */\nexport const ExternalWalletsForDeploy = [\n createWallet('io.metamask',),\n createWallet('me.rainbow',),\n]\n\nexport const deploySmartWalletContract = async ( localAccount: Account, ) => {\n const managedAccountFactoryContract = getManagedAccountFactoryContract()\n const createAccountTx = createAccount({\n contract : managedAccountFactoryContract,\n admin : localAccount.address,\n data : '0x',\n },)\n\n const result = await sendTransaction({\n account : localAccount,\n transaction : createAccountTx,\n },)\n\n logger('createAccountTx result:', result,)\n\n const receipt = await waitForReceipt({\n client: getClient(),\n transactionHash : result.transactionHash,\n chain : optimismSepolia,\n },)\n\n if ( !receipt ) {\n throw new Error('Failed to deploy smart wallet',)\n }\n\n return receipt\n}\n\nexport const appMetadata = {\n name: \"Seed Protocol\",\n description: \"Seed Protocol\",\n url: \"https://seedprotocol.io\",\n}\n\n/**\n * Connects the managed account wallet (EIP4337 in-app wallet) and returns its address.\n * Use this when you need the connected managed account address for publish flows.\n *\n * @param chain - The chain to connect to (defaults to optimismSepolia)\n * @returns The connected managed account's address\n * @throws Error if the managed account cannot be connected or retrieved\n */\nexport async function getConnectedManagedAccountAddress(\n chain: Chain = optimismSepolia\n): Promise<string> {\n const managedAccountWallet = getManagedAccountWallet()\n await managedAccountWallet.autoConnect({ client: getClient(), chain })\n const managedAccount = managedAccountWallet.getAccount()\n if (!managedAccount) {\n throw new Error('Failed to get managed account')\n }\n return managedAccount.address\n}\n\n/**\n * Returns the connected account for transaction signing (e.g. revoke).\n * Uses the modular account wallet. Returns null if not connected.\n */\nexport async function getConnectedAccount(): Promise<Account | null> {\n try {\n const wallet = getModularAccountWallet()\n await wallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const account = wallet.getAccount()\n return account ?? null\n } catch {\n return null\n }\n}\n\n/**\n * Same as {@link getConnectedAccount}: the in-app modular wallet (EIP-7702) on Optimism Sepolia.\n * Prefer this name at modular publish entry points for clarity.\n */\nexport async function getConnectedModularAccount(): Promise<Account | null> {\n return getConnectedAccount()\n}\n\n/** Single instance so Thirdweb session, Connect UI, and `autoConnect` share one wallet object. */\nlet _managedInAppWallet: Wallet | null = null\n\nexport const getManagedAccountWallet = () => {\n if (!_managedInAppWallet) {\n _managedInAppWallet = inAppWallet({\n storage: getSharedPublishInAppWalletStorage(),\n auth: {\n options: [\n \"farcaster\",\n \"email\",\n \"passkey\",\n \"phone\",\n ],\n },\n executionMode: {\n mode: 'EIP4337',\n smartAccount: {\n chain: optimismSepolia,\n factoryAddress: THIRDWEB_ACCOUNT_FACTORY_ADDRESS,\n gasless: true,\n },\n },\n // executionMode: {\n // mode: 'EIP4337',\n // smartAccount: {\n // chain: optimismSepolia,\n // factoryAddress: thirdwebAccountFactoryAddress,\n // gasless: true,\n // overrides: {\n // // Custom paymaster that passes through but lets you modify the UserOp\n // paymaster: async (userOp) => {\n\n // const hexifyBigInts: any = (obj: any) => {\n // if (typeof obj === \"bigint\") return `0x${obj.toString(16)}`;\n // if (Array.isArray(obj)) return obj.map(hexifyBigInts);\n // if (obj && typeof obj === \"object\") {\n // return Object.fromEntries(\n // Object.entries(obj).map(([k, v]) => [k, hexifyBigInts(v)])\n // );\n // }\n // return obj;\n // };\n\n // const chainIdHex = `0x${optimismSepolia.id.toString(16)}`;\n\n // // Increase callGasLimit before sending to paymaster\n // const modifiedUserOp = hexifyBigInts({\n // ...userOp,\n // callGasLimit: BigInt(8000000), // Double it, or set a fixed value\n // });\n\n // console.log(\"[SmartWallet Paymaster]\", getPublishConfig().thirdwebClientId);\n \n // // Call thirdweb's default paymaster endpoint\n // const response = await fetch(\n // `https://${optimismSepolia.id}.bundler.thirdweb.com/v2`,\n // {\n // method: \"POST\",\n // headers: { \n // \"Content-Type\": \"application/json\",\n // \"X-Client-Id\": getPublishConfig().thirdwebClientId,\n // },\n // body: JSON.stringify({\n // id: 1,\n // jsonrpc: \"2.0\",\n // method: \"pm_sponsorUserOperation\",\n // params: [modifiedUserOp, '0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789', chainIdHex],\n // }),\n // }\n // );\n \n // const data = await response.json();\n // console.log(\"[SmartWallet Paymaster Response]\", data);\n // return {\n // paymasterAndData: data.result.paymasterAndData,\n // preVerificationGas: data.result.preVerificationGas,\n // verificationGasLimit: data.result.verificationGasLimit,\n // callGasLimit: data.result.callGasLimit,\n // };\n // },\n // execute: (accountContract, transaction) => {\n // // Log the gas that was set on the transaction\n // console.log(\"[SmartWallet Execute]\", {\n // gas: transaction.gas,\n // to: transaction.to,\n // dataLength: transaction.data?.length,\n // });\n \n // // Return the default execute call — don't change behavior,\n // // just observe what's being passed through\n // return prepareContractCall({\n // contract: accountContract,\n // method: \"function execute(address, uint256, bytes)\",\n // params: [\n // transaction.to ?? \"\",\n // transaction.value ?? 0n,\n // transaction.data ?? \"0x\",\n // ],\n // gas: transaction.gas, // Pass through whatever was set\n // });\n // },\n // },\n // }\n // }\n })\n }\n return _managedInAppWallet\n}\n\n/** Single instance (pairs with {@link getManagedAccountWallet} for two execution modes, same Thirdweb client). */\nlet _modularInAppWallet: Wallet | null = null\n\nexport const getModularAccountWallet = () => {\n if (!_modularInAppWallet) {\n _modularInAppWallet = inAppWallet({\n storage: getSharedPublishInAppWalletStorage(),\n auth: {\n options: [\n \"farcaster\",\n \"email\",\n \"passkey\",\n \"phone\",\n ],\n },\n executionMode: {\n mode: 'EIP7702',\n sponsorGas: true,\n \n },\n })\n }\n return _modularInAppWallet\n}\n\nlet _walletsForConnectButton: Wallet[] | null = null\n\nexport const getWalletsForConnectButton = () => {\n if (!_walletsForConnectButton) {\n _walletsForConnectButton = [getModularAccountWallet()]\n }\n return _walletsForConnectButton\n}","import { getContract, prepareContractCall, prepareEvent, parseEventLogs } from 'thirdweb'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { encodeAbiParameters } from 'viem'\nimport { getPublishConfig } from '~/config'\n\n/**\n * EAS contract custom errors. Included so viem can decode revert data instead of\n * throwing AbiErrorSignatureNotFoundError (e.g. for AccessDenied 0x4ca88867).\n */\nconst 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 attestedEvent = () =>\n prepareEvent({\n signature:\n 'event Attested(address indexed recipient, address indexed attester, bytes32 uid, bytes32 indexed schemaUID)',\n })\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const\nconst ZERO_BYTES32 = ('0x' + '0'.repeat(64)) as `0x${string}`\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\n/**\n * Prepares a single EAS attest call.\n * Used for Seed and Version attestations in the direct-to-EAS publish path.\n */\nexport function prepareEasAttest(\n client: ThirdwebClient,\n chain: Chain,\n params: EasAttestParams,\n) {\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function attest((bytes32 schema,(address recipient,uint64 expirationTime,bool revocable,bytes32 refUID,bytes data,uint256 value) data) request) payable returns (bytes32)' as const,\n params: [\n {\n schema: params.schema,\n data: {\n recipient: (params.data.recipient ?? ZERO_ADDRESS) as `0x${string}`,\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\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\n/**\n * Prepares an EAS multiAttest call for batch attestations.\n * Used for property attestations in the direct-to-EAS publish path.\n */\nexport function prepareEasMultiAttest(\n client: ThirdwebClient,\n chain: Chain,\n requests: MultiAttestationRequest[],\n) {\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function multiAttest((bytes32 schema,(address recipient,uint64 expirationTime,bool revocable,bytes32 refUID,bytes data,uint256 value)[] data)[] requests) payable returns (bytes32[])' as const,\n params: [requests],\n } as Parameters<typeof prepareContractCall>[0])\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 * Parses the Attested event from the receipt logs.\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 * Used after `multiAttest` to persist per-property attestation UIDs to SQLite.\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 logs: logs as import('viem').Log[],\n events: [attestedEvent()],\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\nexport type MultiRevocationRequest = {\n schema: `0x${string}`\n data: Array<{\n uid: `0x${string}`\n value?: bigint\n }>\n}\n\n/**\n * Prepares an EAS multiRevoke call for batch revocation.\n */\nexport function prepareEasMultiRevoke(\n client: ThirdwebClient,\n chain: Chain,\n requests: MultiRevocationRequest[],\n) {\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n abi: [...EAS_ERRORS_ABI],\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function multiRevoke((bytes32 schema,(bytes32 uid,uint256 value)[] data)[] multiRequests) payable' as const,\n params: [\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 } as Parameters<typeof prepareContractCall>[0])\n}\n\nexport { ZERO_ADDRESS, ZERO_BYTES32 }\n","import type { Account } from 'thirdweb/wallets'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getGetAdditionalSyncAddresses } from '@seedprotocol/sdk'\nimport {\n getClient,\n getSmartWalletAddressForAdmin,\n isSmartWalletDeployed,\n getManagedAccountWallet,\n} from '~/helpers/thirdweb'\n\n/**\n * Resolves which account to use for revoking attestations.\n * When the attester is the user's ManagedAccount (EIP4337) but they're connected\n * with a different wallet (e.g. EOA or modular account), attempts to use the\n * ManagedAccount wallet for the revoke.\n *\n * @param account - The currently connected account\n * @param attester - The attester address from the seed (publisher or attestationRaw.attester)\n * @returns The account to use for revoke\n * @throws If `attester` equals any address from {@link getGetAdditionalSyncAddresses}\n * (e.g. `modularAccountModuleContract` when `initPublish` registers it). Those addresses\n * cannot revoke via the app wallet’s EAS `multiRevoke` path today.\n */\nexport async function resolveRevokeAccount(params: {\n account: Account\n attester: string | null\n}): Promise<Account> {\n const { account, attester } = params\n\n if (!attester || account.address.toLowerCase() === attester.toLowerCase()) {\n return account\n }\n\n const additionalGetter = getGetAdditionalSyncAddresses()\n if (additionalGetter) {\n const additional = await additionalGetter()\n const attesterLower = attester.toLowerCase()\n if (additional?.some((a: string | undefined) => a?.toLowerCase() === attesterLower)) {\n throw new Error(\n 'Revocation not supported for items published via the modular executor.',\n )\n }\n }\n\n try {\n const derivedManagedAccount = await getSmartWalletAddressForAdmin(account.address)\n const attesterLower = attester.toLowerCase()\n const derivedLower = derivedManagedAccount.toLowerCase()\n\n if (attesterLower === derivedLower) {\n const deployed = await isSmartWalletDeployed(derivedManagedAccount)\n if (deployed) {\n const managedAccountWallet = getManagedAccountWallet()\n await managedAccountWallet.autoConnect({\n client: getClient(),\n chain: optimismSepolia,\n })\n const managedAccount = managedAccountWallet.getAccount()\n if (managedAccount) {\n return managedAccount\n }\n }\n }\n } catch {\n // Fall through to return account; revoke attempt may fail with AccessDenied\n }\n\n return account\n}\n","import { getClient } from '~/helpers/thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { sendTransaction, waitForReceipt } from 'thirdweb'\nimport { getConnectedAccount } from '~/helpers/thirdweb'\nimport { prepareEasMultiRevoke } from '~/helpers/easDirect'\nimport { resolveRevokeAccount } from '~/helpers/resolveRevokeAccount'\nimport {\n getVersionsForSeedUid,\n getMetadataAttestationUidsForSeedUid,\n getAttesterForSeed,\n updateSeedRevokedAt,\n VERSION_SCHEMA_UID_OPTIMISM_SEPOLIA,\n isValidEasAttestationUid,\n} from '@seedprotocol/sdk'\n\n/**\n * Revokes the Seed attestation and all Version and metadata attestations on EAS.\n * Updates local DB with revokedAt timestamp.\n *\n * Order: metadata first, then versions, then seed (children before parents).\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\n const account = await getConnectedAccount()\n if (!account) {\n throw new Error('No wallet connected. Connect a wallet to revoke attestations.')\n }\n\n const attester = await getAttesterForSeed({ seedLocalId, seedUid })\n const revokeAccount = await resolveRevokeAccount({ account, attester })\n\n const client = getClient()\n\n // Collect attestation UIDs to revoke\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 // Metadata attestations (group by schema)\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 // Version attestations\n if (versionUids.length > 0) {\n requests.push({\n schema: VERSION_SCHEMA_UID_OPTIMISM_SEPOLIA as `0x${string}`,\n data: versionUids.map((uid: string) => ({ uid: uid as `0x${string}` })),\n })\n }\n\n // Seed attestation\n requests.push({\n schema: seedSchemaUid as `0x${string}`,\n data: [{ uid: seedUid as `0x${string}` }],\n })\n\n // Execute multiRevoke in batches if needed (EAS may have limits)\n for (const req of requests) {\n if (req.data.length === 0) continue\n const multiRevokeTx = prepareEasMultiRevoke(client, optimismSepolia, [req])\n try {\n const result = await sendTransaction({ account: revokeAccount, transaction: multiRevokeTx })\n await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err)\n // EAS AccessDenied: only the original attester can revoke (selector 0x4ca88867)\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 // AlreadyRevoked: attestation was already revoked (e.g. double-click, stale UI)\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 { getConnectedManagedAccountAddress } from './helpers/thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { revokeAttestations } from './services/revoke/revokeAttestations'\nimport {\n THIRDWEB_ACCOUNT_FACTORY_ADDRESS,\n EAS_CONTRACT_ADDRESS,\n} from './helpers/constants'\nimport { ethers } from 'ethers'\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 interface PublishConfig {\n thirdwebClientId: string\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 * 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 Optimism Sepolia 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 Optimism Sepolia. Default: false (surface `managed_not_ready` instead).\n */\n autoDeployManagedAccount?: boolean\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('thirdweb/wallets').Account\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\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('thirdweb/wallets').Account\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\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 setConfigRef(c)\n setGetPublisherForNewSeeds(async () => {\n try {\n return await getConnectedManagedAccountAddress(optimismSepolia)\n } catch {\n return undefined\n }\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 thirdwebAccountFactoryAddress: string\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 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}\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 return {\n ...config,\n thirdwebAccountFactoryAddress: THIRDWEB_ACCOUNT_FACTORY_ADDRESS,\n easContractAddress: EAS_CONTRACT_ADDRESS,\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 }\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","export class AttestationVerificationError extends Error {\n constructor(\n message: string,\n public readonly seedLocalId: string,\n public readonly expectedSchemas: string[],\n public readonly foundSchemas: string[],\n public readonly code: 'METADATA_PROPERTIES_MISSING' = 'METADATA_PROPERTIES_MISSING',\n ) {\n super(message)\n this.name = 'AttestationVerificationError'\n }\n}\n\nexport type ManagedAccountPublishErrorCode =\n | 'MANAGED_ACCOUNT_NOT_DEPLOYED'\n | 'MANAGED_ACCOUNT_UNAVAILABLE'\n | 'EXECUTOR_MODULE_NOT_INSTALLED'\n | 'MANAGED_ACCOUNT_SET_EAS_FAILED'\n\n/**\n * Best-effort string for RPC / thirdweb / viem failures that are not plain `Error`\n * (so logs and UIs can show the real revert or RPC reason).\n */\nexport function stringifyUnderlyingCause(u: unknown, maxLen = 700): string {\n if (u == null) return ''\n if (u instanceof Error) {\n const nested = u.cause instanceof Error ? ` | cause: ${u.cause.message}` : ''\n return (u.message + nested).slice(0, maxLen)\n }\n if (typeof u === 'object') {\n const o = u as Record<string, unknown>\n const parts: string[] = []\n if (typeof o.message === 'string') parts.push(o.message)\n if (typeof o.shortMessage === 'string') parts.push(o.shortMessage)\n if (typeof o.details === 'string') parts.push(o.details)\n if (typeof o.reason === 'string') parts.push(o.reason)\n if (parts.length) return parts.join(' | ').slice(0, maxLen)\n try {\n return JSON.stringify(u).slice(0, maxLen)\n } catch {\n return String(u).slice(0, maxLen)\n }\n }\n return String(u).slice(0, maxLen)\n}\n\n/**\n * Thrown or returned when the managed publishing account (Optimism Sepolia) is missing,\n * unreachable, missing the executor module for the modular executor path, or EAS\n * pointer setup (`getEas` / `setEas`) fails.\n */\nexport class ManagedAccountPublishError extends Error {\n /** Original error when connection or deployment failed (avoids shadowing `Error.cause`). */\n public readonly underlyingCause?: unknown\n\n constructor(\n message: string,\n public readonly code: ManagedAccountPublishErrorCode,\n public readonly managedAddress?: string,\n underlyingCause?: unknown,\n ) {\n const extra =\n underlyingCause != null && underlyingCause !== ''\n ? ` (${stringifyUnderlyingCause(underlyingCause)})`\n : ''\n super(message + extra)\n this.name = 'ManagedAccountPublishError'\n this.underlyingCause = underlyingCause\n }\n}\n\n/**\n * True when `e` is a managed-account publish error. Uses `name` + `code` as a fallback\n * when `instanceof` fails across duplicate bundled class identities.\n */\nexport function isManagedAccountPublishError(e: unknown): e is ManagedAccountPublishError {\n if (e instanceof ManagedAccountPublishError) return true\n if (typeof e !== 'object' || e === null) return false\n const o = e as { name?: string; code?: unknown }\n return o.name === 'ManagedAccountPublishError' && typeof o.code === 'string'\n}\n\nexport type Eip7702ModularAccountPublishErrorCode =\n | 'EIP7702_MODULAR_ACCOUNT_UNAVAILABLE'\n | 'EIP7702_MODULAR_NOT_UPGRADED'\n | 'EIP7702_MODULAR_DEPLOY_FAILED'\n | 'EIP7702_MODULAR_NOT_CONFIRMED'\n\n/**\n * Thrown when the in-app modular (EIP-7702) wallet is missing, not upgraded on-chain, or deploy/bootstrap failed.\n */\nexport class Eip7702ModularAccountPublishError extends Error {\n public readonly underlyingCause?: unknown\n\n constructor(\n message: string,\n public readonly code: Eip7702ModularAccountPublishErrorCode,\n public readonly modularAddress?: string,\n underlyingCause?: unknown,\n ) {\n const extra =\n underlyingCause != null && underlyingCause !== ''\n ? ` (${stringifyUnderlyingCause(underlyingCause)})`\n : ''\n super(message + extra)\n this.name = 'Eip7702ModularAccountPublishError'\n this.underlyingCause = underlyingCause\n }\n}\n\nconst eip7702ModularCodes: Eip7702ModularAccountPublishErrorCode[] = [\n 'EIP7702_MODULAR_ACCOUNT_UNAVAILABLE',\n 'EIP7702_MODULAR_NOT_UPGRADED',\n 'EIP7702_MODULAR_DEPLOY_FAILED',\n 'EIP7702_MODULAR_NOT_CONFIRMED',\n]\n\nexport function isEip7702ModularAccountPublishError(e: unknown): e is Eip7702ModularAccountPublishError {\n if (e instanceof Eip7702ModularAccountPublishError) return true\n if (typeof e !== 'object' || e === null) return false\n const o = e as { name?: string; code?: unknown }\n return (\n o.name === 'Eip7702ModularAccountPublishError' &&\n typeof o.code === 'string' &&\n (eip7702ModularCodes as string[]).includes(o.code)\n )\n}\n\n/**\n * True when the RPC/contract error indicates the account is **not** Thirdweb ModularCore\n * (no Router / `getInstalledModules`), e.g. default EIP-4337 smart accounts.\n */\nexport function isRouterNonModularCoreAccountError(cause: unknown): boolean {\n return /Router:\\s*function does not exist/i.test(stringifyUnderlyingCause(cause))\n}\n","import React, { createContext, FC, useContext, 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\"\n\nconst PublishConfigContext = createContext<PublishConfig | null>(null)\n\nexport function usePublishConfig(): PublishConfig {\n const config = useContext(PublishConfigContext)\n if (!config) {\n throw new Error('usePublishConfig must be used within PublishProvider')\n }\n return config\n}\n\nexport interface PublishProviderProps {\n children: React.ReactNode\n /**\n * If provided, calls initPublish with this config.\n * Otherwise, assumes initPublish was already called elsewhere.\n */\n config?: PublishConfig\n /** Optional: use your own QueryClient for Seed hooks. If not provided, SeedProvider creates one. */\n queryClient?: QueryClient\n /** Optional: ref to receive the QueryClient instance (e.g. for tests). */\n queryClientRef?: MutableRefObject<QueryClient | null>\n}\n\nconst PublishProvider: 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 PublishProvider\n","import { getContract, sendTransaction, waitForReceipt } from 'thirdweb'\nimport { getInstalledModules, installModule } from 'thirdweb/modules'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport type { Account } from 'thirdweb/wallets'\nimport { encodeAbiParameters } from 'viem'\nimport { getClient } from './thirdweb'\nimport { EAS_CONTRACT_ADDRESS } from './constants'\nimport type { PublishConfig } from '../config'\nimport { isRouterNonModularCoreAccountError, ManagedAccountPublishError } from '../errors'\n\nconst MODULE_INSTALL_MSG =\n 'The executor module could not be installed on your publishing account on Optimism Sepolia. Reconnect and try again, or contact support if this persists.'\n\n/**\n * Ensures `modularAccountModuleContract` is installed on `contractAddress` when that contract\n * implements Thirdweb ModularCore (`getInstalledModules` / Router). If the account does not\n * support ModularCore (RPC error `Router: function does not exist`), this is a **no-op** — many\n * EIP-4337 managed accounts embed `multiPublish` without pluggable modules.\n *\n * No-op if `modularAccountModuleContract` is unset.\n *\n * @param contractAddress - Account contract to inspect (typically the managed smart account)\n * @param account - Account that can sign `installModule` for that contract\n */\nexport async function ensureExecutorModuleInstalled(\n contractAddress: string,\n account: Account,\n config: Pick<PublishConfig, 'modularAccountModuleContract'>,\n): Promise<void> {\n const { modularAccountModuleContract } = config\n if (!modularAccountModuleContract) return\n\n const accountContract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: contractAddress,\n })\n\n try {\n const installed = await getInstalledModules({ contract: accountContract })\n const moduleAddr = modularAccountModuleContract.toLowerCase()\n const isInstalled = installed.some(\n (m: { implementation: string }) => m.implementation?.toLowerCase() === moduleAddr,\n )\n if (isInstalled) return\n\n const tx = installModule({\n contract: accountContract,\n moduleContract: modularAccountModuleContract,\n data: encodeAbiParameters([{ type: 'address' }], [EAS_CONTRACT_ADDRESS]),\n })\n const result = await sendTransaction({ transaction: tx, account })\n await waitForReceipt({\n client: getClient(),\n transactionHash: result.transactionHash,\n chain: optimismSepolia,\n })\n } catch (cause) {\n if (isRouterNonModularCoreAccountError(cause)) {\n return\n }\n throw new ManagedAccountPublishError(\n MODULE_INSTALL_MSG,\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n contractAddress,\n cause,\n )\n }\n}\n","import { assign } from 'xstate'\n\nexport const assignRestoreFromDb = assign(({ context, event }) => {\n const ev = event as {\n publishProcesses?: Map<string, unknown>\n subscriptions?: Map<string, unknown>\n }\n const incomingProcesses = ev.publishProcesses ?? new Map()\n const incomingSubscriptions = ev.subscriptions ?? new Map()\n return {\n publishProcesses: new Map(incomingProcesses as Map<string, import('xstate').ActorRef<any, any>>),\n subscriptions: new Map(\n incomingSubscriptions as Map<string, import('xstate').ActorRef<any, import('xstate').EventObject>>\n ),\n }\n})\n","import Arweave from 'arweave'\nimport { BaseArweaveClient } from '@seedprotocol/sdk'\n\nexport const getArweave = (): Arweave => {\n const host = BaseArweaveClient.getHost()\n\n const ArweaveModule = Arweave as typeof Arweave & { default?: typeof Arweave }\n if (Object.keys(ArweaveModule).includes('default') && ArweaveModule.default) {\n return ArweaveModule.default.init({\n host,\n protocol: 'https',\n })\n }\n\n return ArweaveModule.init({\n host,\n protocol: 'https',\n })\n}\n\n","import { Item, type IItem } from '@seedprotocol/sdk'\n\nexport const ZERO_BYTES32 = '0x' + '0'.repeat(64)\nexport const BYTES32_LEN = 64\n\nexport const waitForItem = async (seedLocalId: string): Promise<IItem<any>> => {\n let item: IItem<any> | undefined\n\n try {\n item = await Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n } catch {\n // No-op: Error is intentionally ignored\n }\n\n if (item) {\n return item\n }\n\n return new Promise<IItem<any>>((resolve) => {\n const interval = setInterval(() => {\n try {\n Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n .then((found: IItem<any> | undefined) => {\n if (found) {\n clearInterval(interval)\n resolve(found)\n }\n })\n } catch {\n // No-op: Error is intentionally ignored\n }\n }, 200)\n })\n}\n\nexport function deserializeChunks(\n serialized: unknown\n): {\n data_root: Uint8Array\n chunks: Array<{ dataHash: Uint8Array; minByteRange: number; maxByteRange: number }>\n proofs: Array<{ offset: number; proof: Uint8Array }>\n} | undefined {\n if (!serialized || typeof serialized !== 'object') return undefined\n const s = serialized as {\n data_root?: number[]\n chunks?: Array<{ dataHash: number[]; minByteRange: number; maxByteRange: number }>\n proofs?: Array<{ offset: number; proof: number[] }>\n }\n if (!Array.isArray(s.data_root)) return undefined\n return {\n data_root: new Uint8Array(s.data_root),\n chunks: (s.chunks ?? []).map((c) => ({ ...c, dataHash: new Uint8Array(c.dataHash ?? []) })),\n proofs: (s.proofs ?? []).map((p) => ({ ...p, proof: new Uint8Array(p.proof ?? []) })),\n }\n}\n\nexport function serializeChunks(chunks: {\n data_root: Uint8Array\n chunks: Array<{ dataHash: Uint8Array; minByteRange: number; maxByteRange: number }>\n proofs: Array<{ offset: number; proof: Uint8Array }>\n}): unknown {\n return {\n data_root: Array.from(chunks.data_root),\n chunks: chunks.chunks.map((c) => ({ ...c, dataHash: Array.from(c.dataHash) })),\n proofs: chunks.proofs.map((p) => ({ ...p, proof: Array.from(p.proof) })),\n }\n}\n","import type { GetPublishUploadsOptions } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport Transaction from 'arweave/web/lib/transaction'\nimport { getArweave } from '~/helpers/blockchain'\nimport { getPublishConfig } from '~/config'\nimport { waitForItem, deserializeChunks, serializeChunks } from './utils'\n\nexport type CreateArweaveTransactionsResult = {\n arweaveTransactions: ArweaveTransactionInfo[]\n publishUploads: PublishUpload[]\n}\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\nexport const createArweaveTransactions = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveTransactionsResult> => {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const publishOpts: GetPublishUploadsOptions = {}\n if (context.arweaveUploadTags?.length) {\n publishOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n publishOpts.deferHtmlStorageSeedLocalIds = def\n }\n const publishUploads = await item.getPublishUploads(\n Object.keys(publishOpts).length ? publishOpts : undefined,\n )\n\n const config = getPublishConfig()\n const signArweaveTransactions = context.signArweaveTransactions ?? config.signArweaveTransactions\n const arweaveJwk = context.arweaveJwk ?? config.arweaveJwk\n const uploads = publishUploads.map((u: PublishUpload) => ({\n versionLocalId: u.versionLocalId,\n itemPropertyName: u.itemPropertyName,\n transactionJson: (u.transactionToSign as Transaction).toJSON(),\n }))\n\n let results: Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n if (signArweaveTransactions) {\n results = await signArweaveTransactions(uploads)\n } else if (arweaveJwk) {\n const arweave = getArweave()\n const jwk = arweaveJwk\n results = []\n for (const upload of uploads) {\n const tx = arweave.transactions.fromRaw(upload.transactionJson)\n if (tx.data && tx.data.byteLength > 0 && !tx.chunks) {\n await tx.prepareChunks(tx.data)\n }\n await arweave.transactions.sign(tx, jwk)\n const json = tx.toJSON() as Record<string, unknown>\n results.push({\n transaction: {\n ...json,\n chunks: tx.chunks ? serializeChunks(tx.chunks) : undefined,\n },\n versionId: upload.versionLocalId,\n modelName: upload.itemPropertyName,\n })\n }\n } else {\n throw new Error(\n 'Arweave signing not configured. Provide signArweaveTransactions or arweaveJwk at createPublish or in PublishProvider config.'\n )\n }\n\n const arweave = getArweave()\n const arweaveTransactions: ArweaveTransactionInfo[] = (\n results as Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n ).map((r) => {\n const { chunks: serializedChunks, ...rest } = r.transaction as Record<string, unknown>\n const attrs = { ...rest }\n const chunks = deserializeChunks(serializedChunks)\n if (chunks) (attrs as Record<string, unknown>).chunks = chunks\n const tx = arweave.transactions.fromRaw(attrs)\n return {\n transaction: tx,\n versionId: r.versionId,\n modelName: r.modelName,\n }\n })\n\n return {\n arweaveTransactions,\n publishUploads,\n }\n }\n)\n","import type { GetPublishUploadsOptions } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport Transaction from 'arweave/web/lib/transaction'\nimport { getArweave } from '~/helpers/blockchain'\nimport { getPublishConfig } from '~/config'\nimport { waitForItem, deserializeChunks, serializeChunks } from './utils'\nimport type { CreateArweaveTransactionsResult } from './createArweaveTransactions'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\n/** Phase 2: deferred Html storage files only (after embedded images uploaded + Html rewritten). */\nexport const createArweaveTransactionsPhase2 = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveTransactionsResult> => {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const publishOpts: GetPublishUploadsOptions = {}\n if (context.arweaveUploadTags?.length) {\n publishOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n publishOpts.onlyHtmlStorageSeedLocalIds = def\n publishOpts.skipRelationRecursion = true\n }\n\n const publishUploads = await item.getPublishUploads(\n Object.keys(publishOpts).length ? publishOpts : undefined,\n )\n\n const config = getPublishConfig()\n const signArweaveTransactions = context.signArweaveTransactions ?? config.signArweaveTransactions\n const arweaveJwk = context.arweaveJwk ?? config.arweaveJwk\n const uploads = publishUploads.map((u: PublishUpload) => ({\n versionLocalId: u.versionLocalId,\n itemPropertyName: u.itemPropertyName,\n transactionJson: (u.transactionToSign as Transaction).toJSON(),\n }))\n\n let results: Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n if (signArweaveTransactions) {\n results = await signArweaveTransactions(uploads)\n } else if (arweaveJwk) {\n const arweave = getArweave()\n const jwk = arweaveJwk\n results = []\n for (const upload of uploads) {\n const tx = arweave.transactions.fromRaw(upload.transactionJson)\n if (tx.data && tx.data.byteLength > 0 && !tx.chunks) {\n await tx.prepareChunks(tx.data)\n }\n await arweave.transactions.sign(tx, jwk)\n const json = tx.toJSON() as Record<string, unknown>\n results.push({\n transaction: {\n ...json,\n chunks: tx.chunks ? serializeChunks(tx.chunks) : undefined,\n },\n versionId: upload.versionLocalId,\n modelName: upload.itemPropertyName,\n })\n }\n } else {\n throw new Error(\n 'Arweave signing not configured. Provide signArweaveTransactions or arweaveJwk at createPublish or in PublishProvider config.'\n )\n }\n\n const arweave = getArweave()\n const arweaveTransactions: ArweaveTransactionInfo[] = (\n results as Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n ).map((r) => {\n const { chunks: serializedChunks, ...rest } = r.transaction as Record<string, unknown>\n const attrs = { ...rest }\n const chunks = deserializeChunks(serializedChunks)\n if (chunks) (attrs as Record<string, unknown>).chunks = chunks\n const tx = arweave.transactions.fromRaw(attrs)\n return {\n transaction: tx,\n versionId: r.versionId,\n modelName: r.modelName,\n }\n })\n\n return {\n arweaveTransactions,\n publishUploads,\n }\n },\n)\n","import { prepareHtmlEmbeddedImagesForPublish } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\n\ntype Input = { input: { context: PublishMachineContext } }\n\n/**\n * Creates Image items + co-publish rows for Html `data:image/*` URIs before Arweave/DataItem build.\n * Runs for both L1 and bundler; deferred Html ids drive two-phase upload + rewrite in the machine.\n */\nexport const preparingHtmlEmbedded = fromPromise(\n async ({ input: { context } }: Input): Promise<{ deferredHtmlSeedLocalIds: string[] }> => {\n const policy = context.htmlEmbeddedDataUriPolicy ?? 'materialize'\n const r = await prepareHtmlEmbeddedImagesForPublish(context.item, policy)\n return { deferredHtmlSeedLocalIds: r.deferredHtmlSeedLocalIds }\n },\n)\n","import { rewriteHtmlEmbeddedImagesOnDisk } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\n\ntype Input = { input: { context: PublishMachineContext } }\n\nfunction toUploadedPairs(\n txs: ArweaveTransactionInfo[] | undefined,\n ups: PublishUpload[] | undefined,\n): { txId: string; seedLocalId?: string; versionLocalId?: string }[] {\n const out: { txId: string; seedLocalId?: string; versionLocalId?: string }[] = []\n const n = Math.min(txs?.length ?? 0, ups?.length ?? 0)\n for (let i = 0; i < n; i++) {\n const t = txs![i]!\n const u = ups![i]!\n const id = t.transaction?.id\n if (typeof id === 'string' && id.length > 0) {\n out.push({ txId: id, seedLocalId: u.seedLocalId, versionLocalId: u.versionLocalId })\n }\n }\n return out\n}\n\nexport const rewritingHtmlEmbedded = fromPromise(\n async ({ input: { context } }: Input): Promise<void> => {\n const pairs = toUploadedPairs(\n context.htmlEmbeddedPhase1ArweaveTransactions,\n context.htmlEmbeddedPhase1PublishUploads as PublishUpload[] | undefined,\n )\n await rewriteHtmlEmbeddedImagesOnDisk(context.item.seedLocalId, pairs)\n },\n)\n","/**\n * Option B: Extract raw file data from Item properties for DataItem creation.\n * Duplicates logic from getPublishUploads but returns raw data instead of transactions.\n * TODO: Replace with shared getPublishUploadData on Item/SDK once experimental path is verified.\n */\nimport {\n BaseDb,\n BaseFileManager,\n getCorrectId,\n getSegmentedItemProperties,\n htmlEmbeddedImageCoPublish,\n Item,\n ModelPropertyDataTypes,\n} from '@seedprotocol/sdk'\nimport type { IItem, IItemProperty, TransactionTag } from '@seedprotocol/sdk'\nimport { eq } from 'drizzle-orm'\n\n/** Optional extra tags appended after Content-SHA-256 / Content-Type (mirrors SDK getPublishUploads). */\nexport type GetPublishUploadDataOptions = {\n arweaveUploadTags?: TransactionTag[]\n deferHtmlStorageSeedLocalIds?: string[]\n onlyHtmlStorageSeedLocalIds?: string[]\n skipRelationRecursion?: boolean\n}\n\nconst buildPublishUploadDataTags = (\n contentHash: string | undefined,\n contentType: string | undefined,\n extra?: TransactionTag[],\n): TransactionTag[] => {\n const tags: TransactionTag[] = []\n if (contentHash) tags.push({ name: 'Content-SHA-256', value: contentHash })\n if (contentType) tags.push({ name: 'Content-Type', value: contentType })\n if (extra?.length) tags.push(...extra)\n return tags\n}\n\nconst getContentHash = async (data: Uint8Array | ArrayBuffer): Promise<string> => {\n const bytes = data instanceof Uint8Array ? new Uint8Array(data) : new Uint8Array(data)\n const hashBuffer = await crypto.subtle.digest('SHA-256', bytes)\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n html: 'text/html',\n htm: 'text/html',\n json: 'application/json',\n txt: 'text/plain',\n}\n\nconst getMimeTypeFromPath = (filePathOrName: string): string | undefined => {\n const ext = filePathOrName.split('.').pop()?.toLowerCase()\n return ext ? EXTENSION_TO_MIME[ext] : undefined\n}\n\nconst toUint8Array = async (data: Buffer | Blob): Promise<Uint8Array> => {\n if (typeof Blob !== 'undefined' && data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer())\n }\n return new Uint8Array(data as Buffer)\n}\n\nconst getStorageDirForDataType = (dataType: string): string => {\n switch (dataType) {\n case 'Image':\n return BaseFileManager.getFilesPath('images')\n case 'File':\n return BaseFileManager.getFilesPath('files')\n case 'Html':\n return BaseFileManager.getFilesPath('html')\n case 'Json':\n return BaseFileManager.getFilesPath('json')\n default:\n return BaseFileManager.getFilesPath('images')\n }\n}\n\nexport type PublishUploadData = {\n data: Uint8Array\n contentHash?: string\n contentType?: string\n /** Full tag list for DataItem / bundler: content tags then configured arweaveUploadTags. */\n tags: TransactionTag[]\n itemPropertyName: string\n itemPropertyLocalId: string\n seedLocalId: string\n versionLocalId: string\n}\n\ntype UploadProperty = {\n itemProperty: IItemProperty<any>\n childProperties: IItemProperty<any>[]\n}\n\ntype ChildUploadData = {\n propertyName: string\n localStoragePath: string\n}\n\nconst DATA_URI_IMAGE = /^data:(image\\/[a-zA-Z0-9.+-]+);base64,([\\s\\S]*)$/i\n\nfunction decodeDataUriImage(dataUri: string): { mimeType: string; bytes: Uint8Array } | null {\n const m = DATA_URI_IMAGE.exec((dataUri ?? '').trim())\n if (!m) return null\n try {\n const mimeType = m[1]!.toLowerCase().trim()\n const base64 = m[2]!.replace(/\\s/g, '')\n const binary = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0))\n return { mimeType, bytes: binary }\n } catch {\n return null\n }\n}\n\nconst processUploadPropertyData = async (\n uploadProperty: UploadProperty,\n uploads: PublishUploadData[],\n relatedItemProperty?: IItemProperty<any>,\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> => {\n const extra = options?.arweaveUploadTags\n const itemProperty = uploadProperty.itemProperty\n const childUploads: ChildUploadData[] = []\n\n for (const childProperty of uploadProperty.childProperties) {\n const filePath = childProperty.localStoragePath\n if (!filePath || filePath.endsWith('undefined')) continue\n const exists = await BaseFileManager.pathExists(filePath)\n if (!exists) continue\n childUploads.push({\n propertyName: childProperty.propertyName,\n localStoragePath: filePath,\n })\n }\n\n let fileContents: Uint8Array | undefined\n\n if (!childUploads || childUploads.length === 0) {\n if (relatedItemProperty?.localStoragePath) {\n const filePath = relatedItemProperty.localStoragePath\n if (filePath && !filePath.endsWith('undefined')) {\n const exists = await BaseFileManager.pathExists(filePath)\n if (exists) {\n try {\n const fileBuffer = await BaseFileManager.readFileAsBuffer(filePath)\n fileContents = await toUint8Array(fileBuffer)\n } catch {\n const fs = await BaseFileManager.getFs()\n fileContents = await toUint8Array(fs.readFileSync(filePath))\n }\n }\n }\n }\n }\n\n if (childUploads.length > 0) {\n const separator = '===FILE_SEPARATOR==='\n let compositeFileContents = ''\n const fs = await BaseFileManager.getFs()\n for (const childUpload of childUploads) {\n let childUploadContents: Buffer\n try {\n childUploadContents = await fs.promises.readFile(childUpload.localStoragePath)\n } catch {\n childUploadContents = fs.readFileSync(childUpload.localStoragePath)\n }\n compositeFileContents += `${separator}${childUpload.propertyName}${separator}${childUploadContents}`\n }\n fileContents =\n typeof document !== 'undefined'\n ? new TextEncoder().encode(compositeFileContents)\n : new Uint8Array(Buffer.from(compositeFileContents))\n }\n\n if (!fileContents) return uploads\n\n const uint8Array = new Uint8Array(fileContents)\n const contentHash = await getContentHash(uint8Array)\n let contentType: string | undefined\n if (childUploads.length === 0 && relatedItemProperty?.localStoragePath) {\n contentType = getMimeTypeFromPath(relatedItemProperty.localStoragePath)\n } else if (childUploads.length > 0) {\n contentType = 'application/octet-stream'\n }\n\n const itemPropertyLocalId = relatedItemProperty ? relatedItemProperty.localId : itemProperty.localId\n const itemPropertyName = relatedItemProperty ? relatedItemProperty.propertyName : itemProperty.propertyName\n\n uploads.push({\n data: uint8Array,\n contentHash,\n contentType,\n tags: buildPublishUploadDataTags(contentHash, contentType, extra),\n itemPropertyName,\n itemPropertyLocalId,\n seedLocalId: itemProperty.seedLocalId!,\n versionLocalId: itemProperty.versionLocalId!,\n })\n return uploads\n}\n\nconst getStorageSeedUploadData = async (\n itemStorageSeedProperties: IItemProperty<any>[],\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> => {\n const uploads: PublishUploadData[] = []\n const extra = options?.arweaveUploadTags\n\n for (const itemProperty of itemStorageSeedProperties) {\n const snapshot = itemProperty.getService().getSnapshot()\n const context = 'context' in snapshot ? snapshot.context : null\n if (!context) continue\n\n const propertyValue = (context as { propertyValue?: string }).propertyValue\n const refResolvedValue = (context as { refResolvedValue?: string }).refResolvedValue\n if (!refResolvedValue) continue\n\n const { localId: seedLocalId } = getCorrectId(propertyValue ?? '')\n if (!seedLocalId) continue\n\n const dataType =\n itemProperty.propertyDef?.refValueType ??\n itemProperty.propertyDef?.dataType ??\n 'Image'\n\n if (dataType === ModelPropertyDataTypes.Html) {\n if (options?.deferHtmlStorageSeedLocalIds?.includes(seedLocalId)) {\n continue\n }\n if (\n options?.onlyHtmlStorageSeedLocalIds?.length &&\n !options.onlyHtmlStorageSeedLocalIds.includes(seedLocalId)\n ) {\n continue\n }\n } else if (options?.onlyHtmlStorageSeedLocalIds?.length) {\n continue\n }\n\n const baseDir = getStorageDirForDataType(dataType)\n const filePath = `${baseDir}/${refResolvedValue}`\n\n const exists = await BaseFileManager.pathExists(filePath)\n if (!exists) continue\n\n const fileBuffer = await BaseFileManager.readFileAsBuffer(filePath)\n const fileContents = await toUint8Array(fileBuffer)\n const contentHash = await getContentHash(fileContents)\n const contentType = getMimeTypeFromPath(refResolvedValue)\n\n uploads.push({\n data: fileContents,\n contentHash,\n contentType,\n tags: buildPublishUploadDataTags(contentHash, contentType, extra),\n itemPropertyName: itemProperty.propertyName,\n itemPropertyLocalId: itemProperty.localId,\n seedLocalId,\n versionLocalId: itemProperty.versionLocalId!,\n })\n }\n return uploads\n}\n\nasync function appendCoPublishedImageUploadData(\n item: IItem<any>,\n uploads: PublishUploadData[],\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> {\n const appDb = BaseDb.getAppDb()\n if (!appDb || options?.onlyHtmlStorageSeedLocalIds?.length) return uploads\n\n const rows = await appDb\n .select()\n .from(htmlEmbeddedImageCoPublish)\n .where(eq(htmlEmbeddedImageCoPublish.parentSeedLocalId, item.seedLocalId))\n\n const seen = new Set(uploads.map((u) => u.seedLocalId))\n\n for (const row of rows) {\n if (seen.has(row.imageSeedLocalId)) continue\n const imageItem = await Item.find({ seedLocalId: row.imageSeedLocalId, modelName: 'Image' })\n if (!imageItem) continue\n\n const st =\n imageItem.internalProperties['storageTransactionId'] ??\n imageItem.allProperties['storageTransactionId']\n const stSnap = st?.getService().getSnapshot()\n const stCtx = stSnap && 'context' in stSnap ? stSnap.context : undefined\n const stValue = typeof (stCtx as { propertyValue?: unknown } | undefined)?.propertyValue === 'string'\n ? ((stCtx as { propertyValue?: string }).propertyValue ?? '')\n : ''\n const decoded = decodeDataUriImage(stValue)\n\n let more: PublishUploadData[] = []\n if (decoded && st && st.localId && st.versionLocalId) {\n const contentHash = await getContentHash(decoded.bytes)\n more = [{\n data: decoded.bytes,\n contentHash,\n contentType: decoded.mimeType,\n tags: buildPublishUploadDataTags(contentHash, decoded.mimeType, options?.arweaveUploadTags),\n itemPropertyName: st.propertyName,\n itemPropertyLocalId: st.localId,\n seedLocalId: imageItem.seedLocalId,\n versionLocalId: st.versionLocalId,\n }]\n }\n for (const u of more) {\n if (!seen.has(u.seedLocalId)) {\n uploads.push(u)\n seen.add(u.seedLocalId)\n }\n }\n }\n return uploads\n}\n\nexport const getPublishUploadData = async (\n item: IItem<any>,\n uploads: PublishUploadData[] = [],\n relatedItemProperty?: IItemProperty<any>,\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> => {\n const { itemUploadProperties, itemRelationProperties, itemImageProperties } =\n await getSegmentedItemProperties(item)\n\n if (!relatedItemProperty && options?.onlyHtmlStorageSeedLocalIds?.length) {\n const storageSeedUploads = await getStorageSeedUploadData(itemImageProperties, options)\n uploads.push(...storageSeedUploads)\n return uploads\n }\n\n for (const uploadProperty of itemUploadProperties) {\n uploads = await processUploadPropertyData(\n uploadProperty,\n uploads,\n relatedItemProperty,\n options,\n )\n }\n\n const storageSeedUploads = await getStorageSeedUploadData(itemImageProperties, options)\n uploads.push(...storageSeedUploads)\n\n if (!relatedItemProperty && !options?.onlyHtmlStorageSeedLocalIds?.length) {\n uploads = await appendCoPublishedImageUploadData(item, uploads, options)\n }\n\n if (options?.skipRelationRecursion) {\n return uploads\n }\n\n for (const relationProperty of itemRelationProperties) {\n const snapshot = relationProperty.getService().getSnapshot()\n const context = 'context' in snapshot ? snapshot.context : null\n if (!context) continue\n\n const propertyValue = (context as { propertyValue?: string }).propertyValue\n if (!propertyValue || relationProperty.uid) continue\n\n const { localId: seedLocalId, uid: seedUid } = getCorrectId(propertyValue)\n const relatedItem = await Item.find({ seedLocalId, seedUid } as Parameters<typeof Item.find>[0])\n if (!relatedItem) {\n throw new Error(`No relatedItem found for ${relationProperty.propertyName}`)\n }\n uploads = await getPublishUploadData(relatedItem, uploads, relationProperty, options)\n }\n\n return uploads\n}\n","import { ethers } from 'ethers'\nimport type { Account } from 'thirdweb/wallets'\n\n// ============================================================================\n// ANS-104 Data Item construction — zero Node.js dependencies\n//\n// A data item is a binary structure:\n// [signature type (2 bytes)]\n// [signature (65 bytes for Ethereum)]\n// [owner/public key (65 bytes for Ethereum)]\n// [target flag (1 byte) + optional target (32 bytes)]\n// [anchor flag (1 byte) + optional anchor (32 bytes)]\n// [number of tags (8 bytes, little-endian)]\n// [number of tag bytes (8 bytes, little-endian)]\n// [serialized tags (Avro ZigZag VInt format per ANS-104)]\n// [data]\n// ============================================================================\n\nconst SIG_TYPE_ETHEREUM = 3\nconst SIG_LENGTH = 65\n\nconst PLACEHOLDER_MESSAGE = new TextEncoder().encode('seed-recovery')\n\ninterface Tag {\n name: string\n value: string\n}\n\nconst ANCHOR_LENGTH = 32\n\n/**\n * 32-byte ANS-104 anchor for publish uniqueness (timestamp + signer + nonce).\n * Matches arbundles: presence flag + exactly 32 bytes when set.\n */\nconst UINT64_MASK = 0xffffffffffffffffn\n\nexport function buildPublishAnchorBytes(\n walletAddress: string,\n timestampMs: number,\n uniqueness: bigint,\n): Uint8Array {\n const hash = ethers.solidityPackedKeccak256(\n ['uint256', 'address', 'uint64'],\n [BigInt(timestampMs), walletAddress, uniqueness & UINT64_MASK],\n )\n return ethers.getBytes(hash)\n}\n\nfunction encodeTargetOrAnchorSection(raw: Uint8Array): Uint8Array {\n if (raw.length === 0) return new Uint8Array([0])\n if (raw.length !== ANCHOR_LENGTH) {\n throw new Error(`ANS-104 target/anchor must be empty or ${ANCHOR_LENGTH} bytes, got ${raw.length}`)\n }\n const out = new Uint8Array(1 + ANCHOR_LENGTH)\n out[0] = 1\n out.set(raw, 1)\n return out\n}\n\n/**\n * Type guard: true if signer is ethers.Wallet (has privateKey). Thirdweb Account does not.\n */\nexport function isEthersWallet(signer: unknown): signer is ethers.Wallet {\n return (\n signer != null &&\n typeof signer === 'object' &&\n 'privateKey' in signer &&\n typeof (signer as ethers.Wallet).privateKey === 'string'\n )\n}\n\n/**\n * Write ZigZag-encoded variable-length integer (Avro long format).\n * Used for tag array and per-tag name/value lengths per ANS-104.\n */\nfunction writeZigZagVInt(n: number, out: Uint8Array, offset: number): number {\n const zigzag = n >= 0 ? n << 1 : (~n << 1) | 1\n let m = zigzag\n let pos = offset\n do {\n const byte = m & 0x7f\n m >>>= 7\n out[pos++] = m ? byte | 0x80 : byte\n } while (m)\n return pos - offset\n}\n\n/**\n * Serialize tags into ANS-104 Avro format (matches arbundles/Irys).\n * Format: [block count VInt][for each tag: name_len VInt][name][value_len VInt][value]][0 VInt]\n */\nexport const serializeTags = (tags: Tag[]): Uint8Array => {\n if (!tags?.length) return new Uint8Array(0)\n\n const encoder = new TextEncoder()\n const temp = new Uint8Array(16)\n const chunks: Uint8Array[] = []\n\n const appendLong = (n: number) => {\n const len = writeZigZagVInt(n, temp, 0)\n chunks.push(temp.slice(0, len))\n }\n\n appendLong(tags.length)\n for (const tag of tags) {\n const nameBytes = encoder.encode(tag.name)\n const valueBytes = encoder.encode(tag.value)\n appendLong(nameBytes.length)\n chunks.push(nameBytes)\n appendLong(valueBytes.length)\n chunks.push(valueBytes)\n }\n appendLong(0)\n\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0)\n const result = new Uint8Array(totalLength)\n let pos = 0\n for (const chunk of chunks) {\n result.set(chunk, pos)\n pos += chunk.length\n }\n return result\n}\n\n/**\n * Write a 64-bit little-endian unsigned integer into a Uint8Array.\n * (Tag counts and byte lengths use 8-byte LE in ANS-104)\n */\nexport const writeUint64LE = (value: number): Uint8Array => {\n const buf = new Uint8Array(8)\n const view = new DataView(buf.buffer)\n // Safe for values up to Number.MAX_SAFE_INTEGER\n view.setUint32(0, value & 0xffffffff, true)\n view.setUint32(4, Math.floor(value / 0x100000000), true)\n return buf\n}\n\n/**\n * Arweave deep-hash (SHA-384 based). Used for ANS-104 DataItem signing.\n * Matches arbundles/Irys getSignatureData flow.\n */\nasync function sha384(data: Uint8Array): Promise<Uint8Array> {\n // TS 5.9+: Uint8Array<ArrayBufferLike> is not assignable to BufferSource without narrowing\n return new Uint8Array(\n await crypto.subtle.digest('SHA-384', data as BufferSource),\n )\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length)\n out.set(a, 0)\n out.set(b, a.length)\n return out\n}\n\nasync function deepHash(data: Uint8Array | Uint8Array[]): Promise<Uint8Array> {\n const enc = new TextEncoder()\n if (Array.isArray(data)) {\n const tag = concat(enc.encode('list'), enc.encode(data.length.toString()))\n let acc = await sha384(tag)\n for (const chunk of data) {\n const chunkHash = await deepHash(chunk)\n acc = await sha384(concat(acc, chunkHash))\n }\n return acc\n }\n const tag = concat(enc.encode('blob'), enc.encode(data.byteLength.toString()))\n const tagHash = await sha384(tag)\n const dataHash = await sha384(data)\n return sha384(concat(tagHash, dataHash))\n}\n\n/**\n * Build the message to sign per ANS-104 / arbundles: deep-hash of DataItem components.\n */\nasync function getSignatureData(\n ownerBytes: Uint8Array,\n rawTarget: Uint8Array,\n rawAnchor: Uint8Array,\n rawTags: Uint8Array,\n rawData: Uint8Array,\n): Promise<Uint8Array> {\n const enc = new TextEncoder()\n return deepHash([\n enc.encode('dataitem'),\n enc.encode('1'),\n enc.encode(SIG_TYPE_ETHEREUM.toString()),\n ownerBytes,\n rawTarget,\n rawAnchor,\n rawTags,\n rawData,\n ])\n}\n\n/**\n * Build the ANS-104 message bytes (everything from owner onward) for the raw DataItem.\n */\nfunction buildMessageBytes(\n ownerBytes: Uint8Array,\n tags: Tag[],\n data: Uint8Array,\n rawTarget: Uint8Array,\n rawAnchor: Uint8Array,\n): Uint8Array {\n const serializedTags = serializeTags(tags)\n const numTagsBytes = writeUint64LE(tags.length)\n const numTagBytesBytes = writeUint64LE(serializedTags.length)\n const targetSection = encodeTargetOrAnchorSection(rawTarget)\n const anchorSection = encodeTargetOrAnchorSection(rawAnchor)\n const messageparts = [\n ownerBytes,\n targetSection,\n anchorSection,\n numTagsBytes,\n numTagBytesBytes,\n serializedTags,\n data,\n ]\n const messageLength = messageparts.reduce((s, p) => s + p.length, 0)\n const message = new Uint8Array(messageLength)\n let offset = 0\n for (const part of messageparts) {\n message.set(part, offset)\n offset += part.length\n }\n return message\n}\n\n/**\n * Assemble the full ANS-104 data item binary and compute its ID.\n * [sig type 2B][signature 65B][owner 65B][...rest of message]\n */\nasync function assembleDataItemAndId(\n signature: Uint8Array,\n message: Uint8Array,\n): Promise<{ id: string; raw: Uint8Array }> {\n const sigTypeBytes = new Uint8Array(2)\n new DataView(sigTypeBytes.buffer).setUint16(0, SIG_TYPE_ETHEREUM, true)\n const fullLength = 2 + SIG_LENGTH + message.length\n const raw = new Uint8Array(fullLength)\n raw.set(sigTypeBytes, 0)\n raw.set(signature, 2)\n raw.set(message, 2 + SIG_LENGTH)\n const hashBuffer = await crypto.subtle.digest('SHA-256', new Uint8Array(signature))\n const id = base64url(new Uint8Array(hashBuffer))\n return { id, raw }\n}\n\n/**\n * Create a signed ANS-104 DataItem. Uses deep-hash for the message to sign (per arbundles/Irys).\n */\nexport const createSignedDataItem = async (\n data: Uint8Array,\n signer: ethers.Wallet,\n tags: Tag[],\n rawAnchor: Uint8Array = new Uint8Array(0),\n): Promise<{ id: string; raw: Uint8Array }> => {\n const pubKeyHex = ethers.SigningKey.computePublicKey(signer.privateKey, false)\n const ownerBytes = ethers.getBytes(pubKeyHex)\n const serializedTags = serializeTags(tags)\n const rawTarget = new Uint8Array(0)\n\n const signatureData = await getSignatureData(\n ownerBytes,\n rawTarget,\n rawAnchor,\n serializedTags,\n data,\n )\n const signature = ethers.getBytes(await signer.signMessage(signatureData))\n\n const message = buildMessageBytes(ownerBytes, tags, data, rawTarget, rawAnchor)\n return assembleDataItemAndId(signature, message)\n}\n\n/**\n * Create a signed ANS-104 DataItem using a Thirdweb Account (EOA, ManagedAccount, Modular Account).\n * Uses deep-hash for the message to sign (per arbundles/Irys).\n */\nexport const createSignedDataItemWithAccount = async (\n data: Uint8Array,\n account: Account,\n tags: Tag[],\n rawAnchor: Uint8Array = new Uint8Array(0),\n): Promise<{ id: string; raw: Uint8Array }> => {\n // 1. Recover public key via placeholder sign (Account has no privateKey)\n const placeholderHex = ethers.hexlify(PLACEHOLDER_MESSAGE) as `0x${string}`\n const placeholderSig = await account.signMessage({\n message: { raw: placeholderHex },\n })\n const digest = ethers.hashMessage(PLACEHOLDER_MESSAGE)\n const pubKeyHex = ethers.SigningKey.recoverPublicKey(digest, placeholderSig)\n const ownerBytes = ethers.getBytes(pubKeyHex)\n\n // 2. Build signature data (deep-hash) and sign it\n const serializedTags = serializeTags(tags)\n const rawTarget = new Uint8Array(0)\n const signatureData = await getSignatureData(\n ownerBytes,\n rawTarget,\n rawAnchor,\n serializedTags,\n data,\n )\n const signatureDataHex = ethers.hexlify(signatureData) as `0x${string}`\n const sigHex = await account.signMessage({\n message: { raw: signatureDataHex },\n })\n const signature = ethers.getBytes(sigHex)\n\n // 3. Assemble and return\n const message = buildMessageBytes(ownerBytes, tags, data, rawTarget, rawAnchor)\n return assembleDataItemAndId(signature, message)\n}\n\nconst OWNER_LENGTH_ETHEREUM = 65\n\n/**\n * Byte offset of the tags section (8-byte tag count + 8-byte tag bytes length + tags + data).\n * Mirrors arbundles DataItem.getTagsStart / getAnchorStart.\n */\nfunction getTagsStartOffset(raw: Uint8Array): number | null {\n const targetStart = 2 + SIG_LENGTH + OWNER_LENGTH_ETHEREUM\n if (raw.length < targetStart + 1) return null\n const targetFlag = raw[targetStart]!\n if (targetFlag !== 0 && targetFlag !== 1) return null\n const targetPresent = targetFlag === 1\n if (targetPresent && raw.length < targetStart + 33) return null\n let pos = targetStart + (targetPresent ? 33 : 1)\n if (raw.length < pos + 1) return null\n const anchorFlag = raw[pos]!\n if (anchorFlag !== 0 && anchorFlag !== 1) return null\n const anchorPresent = anchorFlag === 1\n if (anchorPresent && raw.length < pos + 33) return null\n return pos + (anchorPresent ? 33 : 1)\n}\n\nfunction sliceTargetAndAnchor(\n raw: Uint8Array,\n): { rawTarget: Uint8Array; rawAnchor: Uint8Array; tagsStart: number } | null {\n const tagsStart = getTagsStartOffset(raw)\n if (tagsStart == null) return null\n const targetStart = 2 + SIG_LENGTH + OWNER_LENGTH_ETHEREUM\n const targetPresent = raw[targetStart] === 1\n const rawTarget = targetPresent ? raw.slice(targetStart + 1, targetStart + 33) : new Uint8Array(0)\n const anchorStart = targetStart + (targetPresent ? 33 : 1)\n const anchorPresent = raw[anchorStart] === 1\n const rawAnchor = anchorPresent ? raw.slice(anchorStart + 1, anchorStart + 33) : new Uint8Array(0)\n return { rawTarget, rawAnchor, tagsStart }\n}\n\n/**\n * Verify an ANS-104 DataItem (Ethereum sig type 3) before upload.\n * Uses deep-hash for the expected message (per arbundles/Irys).\n */\nexport async function verifyDataItem(raw: Uint8Array): Promise<boolean> {\n const parsed = sliceTargetAndAnchor(raw)\n if (parsed == null) return false\n const { rawTarget, rawAnchor, tagsStart } = parsed\n const minLength = tagsStart + 16\n if (raw.length < minLength) return false\n\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength)\n const sigType = view.getUint16(0, true)\n if (sigType !== SIG_TYPE_ETHEREUM) return false\n\n const signature = raw.slice(2, 2 + SIG_LENGTH)\n const ownerBytes = raw.slice(2 + SIG_LENGTH, 2 + SIG_LENGTH + OWNER_LENGTH_ETHEREUM)\n\n const numTagBytes = Number(\n view.getUint32(tagsStart + 8, true) + view.getUint32(tagsStart + 12, true) * 0x100000000\n )\n const tagsEnd = tagsStart + 16 + numTagBytes\n if (raw.length < tagsEnd) return false\n\n const rawTags = raw.slice(tagsStart + 16, tagsEnd)\n const rawData = raw.slice(tagsEnd)\n\n try {\n const signatureData = await getSignatureData(\n ownerBytes,\n rawTarget,\n rawAnchor,\n rawTags,\n rawData,\n )\n const digest = ethers.hashMessage(signatureData)\n const sigHex = ethers.hexlify(signature)\n const recoveredPubKey = ethers.SigningKey.recoverPublicKey(digest, sigHex)\n const recoveredBytes = ethers.getBytes(recoveredPubKey)\n return (\n recoveredBytes.length === ownerBytes.length &&\n recoveredBytes.every((b, i) => b === ownerBytes[i])\n )\n } catch {\n return false\n }\n}\n\n/**\n * Base64url encode (no padding) — used for data item IDs\n */\nexport const base64url = (bytes: Uint8Array): string => {\n let binary = ''\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}","import type { GetPublishUploadDataOptions, PublishUploadData } from '../helpers/getPublishUploadData'\nimport debug from 'debug'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport { waitForItem } from './utils'\nimport { getPublishUploadData } from '../helpers/getPublishUploadData'\nimport { getPublishConfig } from '~/config'\nimport {\n buildPublishAnchorBytes,\n createSignedDataItem,\n createSignedDataItemWithAccount,\n isEthersWallet,\n verifyDataItem,\n} from '~/helpers/arweave'\n\nconst logger = debug('seedProtocol:createArweaveDataItems')\n\n\n\nexport type CreateArweaveDataItemsResult = {\n arweaveTransactions: ArweaveTransactionInfo[]\n publishUploads: PublishUpload[]\n /** Signed DataItems for uploadViaBundler (dataItemSigner path only). */\n signedDataItems?: unknown[]\n}\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\ntype Signers = {\n signDataItems: PublishMachineContext['signDataItems']\n dataItemSigner: PublishMachineContext['dataItemSigner']\n}\n\n/**\n * Sign raw upload payloads as DataItems (phase 1 or phase 2). Shared by createArweaveDataItems and phase-2 actor.\n */\nexport async function signBundlerUploadDataList(\n uploadDataList: PublishUploadData[],\n signDataItems: Signers['signDataItems'],\n dataItemSigner: Signers['dataItemSigner'],\n): Promise<CreateArweaveDataItemsResult> {\n let arweaveTransactions: ArweaveTransactionInfo[]\n let signedDataItems: unknown[] | undefined\n\n if (signDataItems) {\n const result = await signDataItems(uploadDataList)\n arweaveTransactions = result.map((r) => ({\n transaction: { id: r.transaction.id },\n versionId: r.versionId,\n modelName: r.modelName,\n }))\n } else if (dataItemSigner) {\n const signer = dataItemSigner\n const items: Awaited<ReturnType<typeof createSignedDataItem>>[] = []\n const timestampMs = Date.now()\n const walletAddress = signer.address\n for (let i = 0; i < uploadDataList.length; i++) {\n const upload = uploadDataList[i]!\n const tags = upload.tags\n const randomUniq = new Uint8Array(8)\n crypto.getRandomValues(randomUniq)\n const uniqueness =\n (new DataView(randomUniq.buffer).getBigUint64(0, false) ^ BigInt(i)) &\n 0xffffffffffffffffn\n const rawAnchor = buildPublishAnchorBytes(walletAddress, timestampMs, uniqueness)\n const dataItem = isEthersWallet(signer)\n ? await createSignedDataItem(upload.data, signer, tags, rawAnchor)\n : await createSignedDataItemWithAccount(upload.data, signer, tags, rawAnchor)\n\n const isValid = await verifyDataItem(dataItem.raw)\n if (!isValid) {\n logger('DataItem verification failed: id=%s modelName=%s', dataItem.id, upload.itemPropertyName)\n throw new Error(\n `DataItem signature verification failed for ${upload.itemPropertyName}. ` +\n 'The signing key may not match the owner, or the payload may have been modified.'\n )\n }\n items.push(dataItem)\n }\n signedDataItems = items\n arweaveTransactions = items.map((dataItem, i) => ({\n transaction: { id: dataItem.id },\n versionId: uploadDataList[i]?.versionLocalId,\n modelName: uploadDataList[i]?.itemPropertyName,\n }))\n } else {\n throw new Error(\n '@seedprotocol/publish: useArweaveBundler requires signDataItems or dataItemSigner (pass at createPublish or in PublishProvider config)'\n )\n }\n\n const publishUploads: PublishUpload[] = uploadDataList.map((u) => ({\n itemPropertyName: u.itemPropertyName,\n itemPropertyLocalId: u.itemPropertyLocalId,\n seedLocalId: u.seedLocalId,\n versionLocalId: u.versionLocalId,\n transactionToSign: null,\n }))\n\n return {\n arweaveTransactions,\n publishUploads,\n signedDataItems,\n }\n}\n\n/**\n * Creates DataItems from raw upload data, signs them via signDataItems or dataItemSigner,\n * and returns arweaveTransactions for createAttestations compatibility.\n */\nexport const createArweaveDataItems = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveDataItemsResult> => {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const uploadDataOpts: GetPublishUploadDataOptions = {}\n if (context.arweaveUploadTags?.length) {\n uploadDataOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n uploadDataOpts.deferHtmlStorageSeedLocalIds = def\n }\n const uploadDataList = await getPublishUploadData(\n item,\n [],\n undefined,\n Object.keys(uploadDataOpts).length ? uploadDataOpts : undefined,\n )\n const config = getPublishConfig()\n const signDataItems = context.signDataItems ?? config.signDataItems\n const dataItemSigner = context.dataItemSigner ?? config.dataItemSigner\n\n return signBundlerUploadDataList(uploadDataList, signDataItems, dataItemSigner)\n }\n)\n","import type { GetPublishUploadDataOptions } from '../helpers/getPublishUploadData'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport { waitForItem } from './utils'\nimport { getPublishUploadData } from '../helpers/getPublishUploadData'\nimport { getPublishConfig } from '~/config'\nimport { signBundlerUploadDataList, type CreateArweaveDataItemsResult } from './createArweaveDataItems'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\n/**\n * Phase 2 (bundler): Html storage DataItems only, after embedded images uploaded and Html rewritten on disk.\n * Exported for unit tests; the XState actor wraps this.\n */\nexport async function executeCreateArweaveDataItemsPhase2(\n context: PublishMachineContext,\n): Promise<CreateArweaveDataItemsResult> {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const uploadDataOpts: GetPublishUploadDataOptions = {}\n if (context.arweaveUploadTags?.length) {\n uploadDataOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n uploadDataOpts.onlyHtmlStorageSeedLocalIds = def\n uploadDataOpts.skipRelationRecursion = true\n }\n const uploadDataList = await getPublishUploadData(\n item,\n [],\n undefined,\n Object.keys(uploadDataOpts).length ? uploadDataOpts : undefined,\n )\n\n const config = getPublishConfig()\n const signDataItems = context.signDataItems ?? config.signDataItems\n const dataItemSigner = context.dataItemSigner ?? config.dataItemSigner\n\n if (uploadDataList.length === 0) {\n return {\n arweaveTransactions: [],\n publishUploads: [],\n signedDataItems: undefined,\n }\n }\n\n return signBundlerUploadDataList(uploadDataList, signDataItems, dataItemSigner)\n}\n\nexport const createArweaveDataItemsPhase2 = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveDataItemsResult> =>\n executeCreateArweaveDataItemsPhase2(context),\n)\n","/**\n * Serialized form part for IPC to main process (avoids CORS by proxying uploads).\n */\nexport type UploadFormPart = {\n name: string\n value: string\n encoding?: 'base64'\n filename?: string\n}\n\n/** Chunk size for base64 encoding; spreading large arrays blows the call stack. */\nconst BASE64_CHUNK_SIZE = 8192\n\nfunction arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i += BASE64_CHUNK_SIZE) {\n const chunk = bytes.subarray(i, Math.min(i + BASE64_CHUNK_SIZE, bytes.length))\n binary += String.fromCharCode.apply(null, chunk as unknown as number[])\n }\n return btoa(binary)\n}\n\n/**\n * Convert FormData to a serializable array for IPC. Blobs are base64-encoded.\n */\nexport async function formDataToSerializableParts(\n formData: FormData\n): Promise<UploadFormPart[]> {\n const parts: UploadFormPart[] = []\n for (const [name, value] of formData.entries()) {\n const entry = value as string | Blob\n if (typeof entry === 'object' && entry !== null && 'arrayBuffer' in entry) {\n const buf = await entry.arrayBuffer()\n const base64 = arrayBufferToBase64(buf)\n const file = entry as File\n parts.push({\n name,\n value: base64,\n encoding: 'base64',\n filename: file.name || undefined,\n })\n } else {\n parts.push({ name, value: String(value) })\n }\n }\n return parts\n}\n\n/** Result from upload POST (status 0 = network/proxy error). */\nexport type PostUploadResult = {\n status: number\n body: unknown\n error?: string\n message?: string\n}\n\n/** Build a user-facing message when the upload API returns a non-2xx status. */\nexport function uploadServerErrorMessage(\n status: number,\n body: unknown,\n transactionKeys?: string | null\n): string {\n const parts: string[] = ['Upload server returned ', String(status)]\n const msg =\n body && typeof body === 'object' && 'message' in body\n ? String((body as { message: unknown }).message)\n : body && typeof body === 'object' && 'error' in body\n ? String((body as { error: unknown }).error)\n : null\n if (msg) parts.push(`: ${msg}`)\n else if (transactionKeys) parts.push(` (${transactionKeys})`)\n return parts.join('')\n}\n\n/** Map technical network error messages to a short, user-facing message. */\nexport function uploadNetworkErrorMessage(technicalMessage?: string | null): string {\n if (!technicalMessage) {\n return 'Upload server unavailable. Please try again or check your connection.'\n }\n const t = technicalMessage.toLowerCase()\n if (/other side closed|econnreset|socket hang up|connection closed/i.test(t)) {\n return 'Upload server closed the connection. It may be busy or the request may be too large—try again.'\n }\n if (/etimedout|timeout/i.test(t)) {\n return 'Upload request timed out. Please try again.'\n }\n if (/enotfound|getaddrinfo|dns/i.test(t)) {\n return 'Upload server could not be reached. Check the upload URL and your network.'\n }\n return 'Upload failed. Please try again or check the upload server.'\n}\n\n/**\n * POST to the upload API. Uses main-process proxy in Electron to avoid CORS;\n * falls back to fetch when not in Electron (e.g. browser tests).\n */\nexport async function postUploadArweaveStart(\n url: string,\n formData: FormData,\n uploadApiBaseUrl: string\n): Promise<PostUploadResult> {\n const api = typeof window !== 'undefined' ? (window as Window & { Main?: { uploadArweaveStart?: (url: string, parts: UploadFormPart[]) => Promise<PostUploadResult> } }).Main : undefined\n if (api?.uploadArweaveStart) {\n const parts = await formDataToSerializableParts(formData)\n return api.uploadArweaveStart(url, parts)\n }\n const res = await fetch(url, {\n method: 'POST',\n body: formData,\n })\n const body = await res.json().catch(() => ({}))\n return { status: res.status, body }\n}\n\n/**\n * POST to Arweave bundler for instant uploads. Same FormData format as upload API.\n * Uses main-process proxy in Electron to avoid CORS.\n */\nexport async function postUploadBundler(\n url: string,\n formData: FormData\n): Promise<PostUploadResult> {\n const api = typeof window !== 'undefined' ? (window as Window & { Main?: { uploadArweaveStart?: (url: string, parts: UploadFormPart[]) => Promise<PostUploadResult> } }).Main : undefined\n if (api?.uploadArweaveStart) {\n const parts = await formDataToSerializableParts(formData)\n return api.uploadArweaveStart(url, parts)\n }\n const res = await fetch(url, {\n method: 'POST',\n body: formData,\n })\n const body = await res.json().catch(() => ({}))\n return { status: res.status, body }\n}\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { ReimbursementResponse } from '../../../types'\nimport { getPublishConfig } from '~/config'\nimport {\n postUploadArweaveStart,\n uploadNetworkErrorMessage,\n uploadServerErrorMessage,\n} from '~/helpers/uploadApi'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\nexport const sendReimbursementRequest = fromPromise(\n async ({ input: { context, event } }: PublishInput): Promise<ReimbursementResponse> => {\n const { arweaveTransactions = [], transactionKeys, reimbursementTransactionId } = context\n\n if (reimbursementTransactionId) {\n return {\n transactionId: reimbursementTransactionId,\n }\n }\n\n const transactions = arweaveTransactions.map(({ transaction }: ArweaveTransactionInfo) => transaction)\n\n const formData = new FormData()\n\n type ArweaveTx = { id: string; data?: unknown; chunks?: unknown; [key: string]: unknown }\n for (const transaction of transactions as ArweaveTx[]) {\n let { data, chunks, ...json } = transaction\n const dataBlob = data instanceof Blob ? data : new Blob([data as BlobPart])\n formData.append(`${transaction.id}-data`, dataBlob, `${transaction.id}-data`)\n const chunksBlob = new Blob([JSON.stringify(chunks)], { type: 'application/json' })\n formData.append(`${transaction.id}-chunks`, chunksBlob, `${transaction.id}-chunks`)\n const jsonBlob = new Blob([JSON.stringify(json)], { type: 'application/json' })\n formData.append(`${transaction.id}-json`, jsonBlob, `${transaction.id}-json`)\n }\n\n const { uploadApiBaseUrl } = getPublishConfig()\n const url = `${uploadApiBaseUrl}/api/upload/arweave/start`\n const { status, body, message: serverMessage } = await postUploadArweaveStart(\n url,\n formData,\n uploadApiBaseUrl\n )\n\n if (status >= 300 || status < 200) {\n const technicalMsg = status === 0 ? serverMessage : null\n if (technicalMsg) console.error('[upload]', technicalMsg)\n const errMsg =\n status === 0\n ? uploadNetworkErrorMessage(technicalMsg as string | undefined)\n : uploadServerErrorMessage(status, body, transactionKeys)\n throw new Error(errMsg)\n }\n\n return body as ReimbursementResponse\n }\n)\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport { getArweave } from '~/helpers/blockchain'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\nexport const pollForConfirmation = fromPromise(async ({ input: { context, event } }: PublishInput): Promise<void> => {\n const { requestResponse, reimbursementTransactionId } = context\n\n if (!requestResponse) {\n throw new Error('No request response')\n }\n\n if (!reimbursementTransactionId) {\n throw new Error('No reimbursement transaction id')\n }\n\n const arweave = getArweave()\n\n const _pollForConfirmation = new Promise<void>((resolve, reject) => {\n const interval = setInterval(async () => {\n let response\n try {\n response = await arweave.transactions.getStatus(reimbursementTransactionId)\n } catch (error) {\n return\n }\n if (response && response.confirmed) {\n clearInterval(interval)\n resolve()\n }\n }, 5000)\n })\n\n await _pollForConfirmation\n})\n","import { EventObject, fromCallback } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport { getArweave } from '~/helpers/blockchain'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:actors')\n\nfunction ensureUint8Array(data: unknown): Uint8Array {\n if (data instanceof Uint8Array) return data\n if (data instanceof ArrayBuffer) return new Uint8Array(data)\n throw new Error('Transaction data must be Uint8Array or ArrayBuffer for upload resume')\n}\n\nexport const uploadData = fromCallback<EventObject, { context: PublishMachineContext }>(\n ({ sendBack, input }) => {\n const ctx = input.context\n const arweaveTransactions = ctx.arweaveTransactions ?? []\n const transactions = arweaveTransactions.map(({ transaction }: ArweaveTransactionInfo) => transaction)\n const arweave = getArweave()\n\n const resumeState = ctx.uploaderState && typeof ctx.currentTransactionIndex === 'number'\n const startIndex = resumeState ? ctx.currentTransactionIndex! : 0\n\n const processTransactions = async (): Promise<string> => {\n const total = transactions.length\n for (let i = startIndex; i < total; i++) {\n const rawTransaction = transactions[i]\n if (!rawTransaction) continue\n const transaction = arweave.transactions.fromRaw(rawTransaction as object)\n\n const verified = await arweave.transactions.verify(transaction)\n if (!verified) {\n throw new Error('Transaction verification failed')\n }\n\n let uploader: Awaited<ReturnType<typeof arweave.transactions.getUploader>>\n const uploaderState = ctx.uploaderState\n if (resumeState && i === startIndex && uploaderState) {\n const data = transaction.data\n const dataBytes = data instanceof Uint8Array ? data : ensureUint8Array(data)\n uploader = await arweave.transactions.getUploader(uploaderState as unknown as Parameters<typeof arweave.transactions.getUploader>[0], dataBytes)\n } else {\n uploader = await arweave.transactions.getUploader(transaction, transaction.data)\n }\n\n while (!uploader.isComplete) {\n logger('uploading chunk')\n logger(`uploader.pctComplete: ${uploader.pctComplete}`)\n logger(`uploader.uploadedChunks: ${uploader.uploadedChunks}`)\n logger(`uploader.totalChunks: ${uploader.totalChunks}`)\n logger(uploader.lastResponseError)\n logger(uploader.lastResponseStatus)\n try {\n await uploader.uploadChunk()\n const pct = Math.trunc(((i + uploader.pctComplete / 100) / total) * 100)\n sendBack({\n type: 'updatePercentage',\n completionPercentage: pct,\n uploaderState: uploader.toJSON(),\n currentTransactionIndex: i,\n })\n logger(`${uploader.pctComplete}% complete, ${uploader.uploadedChunks}/${uploader.totalChunks}`)\n } catch (error) {\n logger(error)\n }\n }\n }\n\n return 'done'\n }\n\n processTransactions()\n .then((result) => {\n sendBack({ type: 'uploadComplete', result })\n })\n .catch((error) => {\n sendBack({ type: 'uploadError', error })\n })\n }\n)\n","import { EventObject, fromCallback } from 'xstate'\nimport { readFile, stat } from 'node:fs/promises'\nimport type { PublishMachineContext } from '../../../types'\nimport { getPublishConfig } from '~/config'\n\nconst BATCH_UPLOAD_TIMEOUT_MS = 120_000\n\ntype DataItemLike = {\n raw?: Uint8Array\n filename?: string\n getRaw?: () => Buffer | Promise<Buffer>\n}\n\n/**\n * Bundler batch upload reads from context.signedDataItems (dataItemSigner path only).\n * arweaveTransactions / publishUploads hold ids and metadata for later attestations.\n * When signDataItems is used, the callback handles upload (e.g. ArConnect) so signedDataItems\n * is undefined — we skip the upload step and send uploadComplete immediately.\n */\nexport const uploadViaBundler = fromCallback<EventObject, { context: PublishMachineContext }>(\n ({ sendBack, input: { context } }) => {\n const { signedDataItems } = context\n\n const { uploadApiBaseUrl, useArweaveBundler } = getPublishConfig()\n\n if (!useArweaveBundler || !uploadApiBaseUrl) {\n sendBack({\n type: 'uploadError',\n error: new Error(\n 'Arweave bundler not configured. Set useArweaveBundler and uploadApiBaseUrl.'\n ),\n })\n return\n }\n\n const bundlerUrl = `${uploadApiBaseUrl.replace(/\\/$/, '')}/api/upload/arweave/batch`\n\n if (!signedDataItems || signedDataItems.length === 0) {\n // signDataItems path: external signer (e.g. ArConnect) already uploaded; skip and proceed\n sendBack({ type: 'uploadComplete', result: 'done' })\n return\n }\n\n const _uploadViaBundler = async () => {\n const items = signedDataItems as unknown[]\n const itemCount = items.length\n const getRawCache: (Buffer | null)[] = new Array(itemCount).fill(null)\n\n /** Length only (pass 1). Caches buffer for getRaw() items to avoid a second read. */\n const rawByteLength = async (item: unknown, i: number): Promise<number> => {\n const o = item as DataItemLike\n if (o.raw != null && (o.raw instanceof Uint8Array || Buffer.isBuffer(o.raw))) {\n return o.raw.byteLength\n }\n if (typeof o.getRaw === 'function') {\n const r = o.getRaw()\n const resolved = r instanceof Promise ? await r : r\n const buf = Buffer.isBuffer(resolved) ? resolved : Buffer.from(resolved)\n getRawCache[i] = buf\n return buf.length\n }\n if (o.filename != null) {\n const st = await stat(o.filename)\n return st.size\n }\n throw new Error('Cannot get raw bytes from DataItem')\n }\n\n let totalSize = 4\n const lengths: number[] = []\n for (let i = 0; i < itemCount; i++) {\n const len = await rawByteLength(items[i], i)\n lengths.push(len)\n totalSize += 4 + len\n }\n\n const payload = Buffer.alloc(totalSize)\n let offset = 0\n payload.writeUInt32BE(itemCount, offset)\n offset += 4\n\n for (let i = 0; i < itemCount; i++) {\n const len = lengths[i]!\n const cached = getRawCache[i]\n if (cached) {\n payload.writeUInt32BE(len, offset)\n offset += 4\n cached.copy(payload, offset)\n offset += len\n continue\n }\n\n const o = items[i] as DataItemLike\n if (o.raw != null && (o.raw instanceof Uint8Array || Buffer.isBuffer(o.raw))) {\n payload.writeUInt32BE(len, offset)\n offset += 4\n payload.set(o.raw, offset)\n offset += len\n continue\n }\n if (o.filename != null) {\n const buf = await readFile(o.filename)\n payload.writeUInt32BE(buf.length, offset)\n offset += 4\n buf.copy(payload, offset)\n offset += buf.length\n continue\n }\n throw new Error('Cannot get raw bytes from DataItem')\n }\n\n const controller = new AbortController()\n const uploadTimeoutId = setTimeout(() => controller.abort(), BATCH_UPLOAD_TIMEOUT_MS)\n\n let response: Response\n try {\n response = await fetch(bundlerUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/octet-stream' },\n body: payload,\n signal: controller.signal,\n })\n } catch (err) {\n clearTimeout(uploadTimeoutId)\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error(\n `Arweave batch upload timed out after ${BATCH_UPLOAD_TIMEOUT_MS / 1000}s (upload API did not respond). Check uploadApiBaseUrl and network.`,\n )\n }\n throw err\n }\n clearTimeout(uploadTimeoutId)\n\n if (!response.ok) {\n throw new Error(`Batch upload failed: ${response.status}`)\n }\n\n const body = (await response.json().catch(() => ({}))) as { failed?: number; total?: number; succeeded?: number }\n const failed = typeof body.failed === 'number' ? body.failed : 0\n if (failed > 0) {\n const total = body.total ?? '?'\n const succeeded = body.succeeded ?? 0\n throw new Error(\n `Arweave batch upload failed: ${failed} of ${total} item(s) failed (${succeeded} succeeded)`\n )\n }\n }\n\n _uploadViaBundler()\n .then(() => sendBack({ type: 'uploadComplete', result: 'done' }))\n .catch((error) => sendBack({ type: 'uploadError', error }))\n }\n)\n","import { optimismSepolia } from 'thirdweb/chains'\nimport {\n deploySmartWalletContract,\n getClient,\n getConnectedManagedAccountAddress,\n getManagedAccountWallet,\n isSmartWalletDeployed,\n} from './thirdweb'\nimport { getPublishConfig } from '../config'\nimport { isManagedAccountPublishError, ManagedAccountPublishError } from '../errors'\nimport { ensureExecutorModuleInstalled } from './ensureExecutorModule'\n\nconst MSG_UNAVAILABLE =\n 'Could not connect the managed publishing account on Optimism Sepolia. Reconnect with the same sign-in method and try again.'\n\nconst MSG_NOT_DEPLOYED =\n 'Your publishing smart account is not deployed on Optimism Sepolia yet. Complete wallet setup, enable autoDeployManagedAccount in config if appropriate, then try again.'\n\nconst MSG_NOT_DEPLOYED_AFTER_ATTEMPT =\n 'The managed account could not be confirmed on Optimism Sepolia after deployment. Wait a moment and retry, or check your network connection.'\n\nconst MSG_FAILED_DEPLOY =\n 'Automatic deployment of the managed publishing account failed on Optimism Sepolia. Retry or deploy the account through your wallet provider.'\n\nexport type EnsureManagedAccountReadyResult =\n | { kind: 'skip' }\n | { kind: 'unavailable'; cause: unknown }\n | { kind: 'not_deployed'; managedAddress: string }\n | { kind: 'ready'; managedAddress: string }\n\n/**\n * Checks managed account deployment for the modular executor path.\n * Returns `{ kind: 'skip' }` when `useModularExecutor` is false.\n */\nexport async function ensureManagedAccountReady(): Promise<EnsureManagedAccountReadyResult> {\n const { useModularExecutor } = getPublishConfig()\n if (!useModularExecutor) {\n return { kind: 'skip' }\n }\n\n let managedAddress: string\n try {\n managedAddress = await getConnectedManagedAccountAddress(optimismSepolia)\n } catch (cause) {\n return { kind: 'unavailable', cause }\n }\n\n const deployed = await isSmartWalletDeployed(managedAddress)\n if (deployed) {\n return { kind: 'ready', managedAddress }\n }\n return { kind: 'not_deployed', managedAddress }\n}\n\nasync function getManagedAccountSigningAccount() {\n const managedWallet = getManagedAccountWallet()\n await managedWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const acc = managedWallet.getAccount()\n if (!acc) {\n throw new ManagedAccountPublishError(MSG_UNAVAILABLE, 'MANAGED_ACCOUNT_UNAVAILABLE')\n }\n return acc\n}\n\n/**\n * Deploys the ManagedAccount via the factory using the managed in-app wallet signer.\n * @throws ManagedAccountPublishError on missing account or deploy failure\n */\nexport async function tryDeployManagedAccount(): Promise<void> {\n const account = await getManagedAccountSigningAccount()\n try {\n await deploySmartWalletContract(account)\n } catch (cause) {\n throw new ManagedAccountPublishError(MSG_FAILED_DEPLOY, 'MANAGED_ACCOUNT_NOT_DEPLOYED', account.address, cause)\n }\n}\n\nexport type ModularExecutorPublishPrepResult =\n | { ok: true; managedAddress: string }\n | { ok: false; error: ManagedAccountPublishError }\n\n/**\n * Full gate for modular executor publish: managed-account deployment check, optional factory deploy,\n * optional executor module on the managed contract. EIP-7702 modular wallet readiness is handled separately\n * in {@link ensureEip7702ModularAccountReady}.\n * Call only when `useModularExecutor` is true.\n */\nexport async function runModularExecutorPublishPrep(): Promise<ModularExecutorPublishPrepResult> {\n const config = getPublishConfig()\n if (!config.useModularExecutor) {\n throw new Error('runModularExecutorPublishPrep: useModularExecutor is false')\n }\n\n let state = await ensureManagedAccountReady()\n\n if (state.kind === 'unavailable') {\n return {\n ok: false,\n error: new ManagedAccountPublishError(MSG_UNAVAILABLE, 'MANAGED_ACCOUNT_UNAVAILABLE', undefined, state.cause),\n }\n }\n\n if (state.kind === 'not_deployed') {\n if (config.autoDeployManagedAccount) {\n try {\n await tryDeployManagedAccount()\n } catch (e) {\n const err =\n isManagedAccountPublishError(e)\n ? e\n : new ManagedAccountPublishError(MSG_FAILED_DEPLOY, 'MANAGED_ACCOUNT_NOT_DEPLOYED', state.managedAddress, e)\n return { ok: false, error: err }\n }\n state = await ensureManagedAccountReady()\n if (state.kind !== 'ready') {\n return {\n ok: false,\n error: new ManagedAccountPublishError(\n MSG_NOT_DEPLOYED_AFTER_ATTEMPT,\n 'MANAGED_ACCOUNT_NOT_DEPLOYED',\n state.kind === 'not_deployed' ? state.managedAddress : undefined,\n ),\n }\n }\n } else {\n return {\n ok: false,\n error: new ManagedAccountPublishError(MSG_NOT_DEPLOYED, 'MANAGED_ACCOUNT_NOT_DEPLOYED', state.managedAddress),\n }\n }\n }\n\n if (state.kind === 'ready') {\n if (config.modularAccountModuleContract) {\n try {\n const signingAccount = await getManagedAccountSigningAccount()\n await ensureExecutorModuleInstalled(state.managedAddress, signingAccount, config)\n } catch (e) {\n if (isManagedAccountPublishError(e)) {\n return { ok: false, error: e }\n }\n return {\n ok: false,\n error: new ManagedAccountPublishError(\n 'Executor module setup failed on Optimism Sepolia.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n state.managedAddress,\n e,\n ),\n }\n }\n }\n\n return { ok: true, managedAddress: state.managedAddress }\n }\n\n throw new Error('runModularExecutorPublishPrep: unexpected readiness state')\n}\n","import {\n prepareEvent,\n prepareContractCall,\n readContract,\n type BaseTransactionOptions,\n type AbiParameterToPrimitiveType,\n} from \"thirdweb\";\n\n/**\n* Contract events\n*/\n\n/**\n * Represents the filters for the \"AdminUpdated\" event.\n */\nexport type AdminUpdatedEventFilters = Partial<{\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the AdminUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { adminUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * adminUpdatedEvent({\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function adminUpdatedEvent(filters: AdminUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event AdminUpdated(address indexed signer, bool isAdmin)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Initialized event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { initializedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * initializedEvent()\n * ],\n * });\n * ```\n */ \nexport function initializedEvent() {\n return prepareEvent({\n signature: \"event Initialized(uint8 version)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerPermissionsUpdated\" event.\n */\nexport type SignerPermissionsUpdatedEventFilters = Partial<{\n authorizingSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"authorizingSigner\",\"indexed\":true}>\ntargetSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"targetSigner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerPermissionsUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerPermissionsUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerPermissionsUpdatedEvent({\n * authorizingSigner: ...,\n * targetSigner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerPermissionsUpdatedEvent(filters: SignerPermissionsUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerPermissionsUpdated(address indexed authorizingSigner, address indexed targetSigner, (address signer, uint8 isAdmin, address[] approvedTargets, uint256 nativeTokenLimitPerTransaction, uint128 permissionStartTimestamp, uint128 permissionEndTimestamp, uint128 reqValidityStartTimestamp, uint128 reqValidityEndTimestamp, bytes32 uid) permissions)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the ContractURIUpdated event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { contractURIUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * contractURIUpdatedEvent()\n * ],\n * });\n * ```\n */ \nexport function contractURIUpdatedEvent() {\n return prepareEvent({\n signature: \"event ContractURIUpdated(string prevURI, string newURI)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the CreatedAttestation event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { createdAttestationEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * createdAttestationEvent()\n * ],\n * });\n * ```\n */ \nexport function createdAttestationEvent() {\n return prepareEvent({\n signature: \"event CreatedAttestation((bytes32 schemaUid, bytes32 attestationUid) result)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the EIP712DomainChanged event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { eIP712DomainChangedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * eIP712DomainChangedEvent()\n * ],\n * });\n * ```\n */ \nexport function eIP712DomainChangedEvent() {\n return prepareEvent({\n signature: \"event EIP712DomainChanged()\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Log event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { logEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * logEvent()\n * ],\n * });\n * ```\n */ \nexport function logEvent() {\n return prepareEvent({\n signature: \"event Log(string message)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"OwnershipTransferred\" event.\n */\nexport type OwnershipTransferredEventFilters = Partial<{\n previousOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true}>\nnewOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the OwnershipTransferred event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { ownershipTransferredEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * ownershipTransferredEvent({\n * previousOwner: ...,\n * newOwner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function ownershipTransferredEvent(filters: OwnershipTransferredEventFilters = {}) {\n return prepareEvent({\n signature: \"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the SeedPublished event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { seedPublishedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * seedPublishedEvent()\n * ],\n * });\n * ```\n */ \nexport function seedPublishedEvent() {\n return prepareEvent({\n signature: \"event SeedPublished(bytes returnedDataFromEAS)\",\n });\n};\n \n\n/**\n* Contract read functions\n*/\n\n\n\n/**\n * Calls the \"entryPoint\" function on the contract.\n * @param options - The options for the entryPoint function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { entryPoint } from \"TODO\";\n * \n * const result = await entryPoint();\n * \n * ```\n */\nexport async function entryPoint(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xb0d691fe\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"factory\" function on the contract.\n * @param options - The options for the factory function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { factory } from \"TODO\";\n * \n * const result = await factory();\n * \n * ```\n */\nexport async function factory(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xc45a0155\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllActiveSigners\" function on the contract.\n * @param options - The options for the getAllActiveSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllActiveSigners } from \"TODO\";\n * \n * const result = await getAllActiveSigners();\n * \n * ```\n */\nexport async function getAllActiveSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8b52d723\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllAdmins\" function on the contract.\n * @param options - The options for the getAllAdmins function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllAdmins } from \"TODO\";\n * \n * const result = await getAllAdmins();\n * \n * ```\n */\nexport async function getAllAdmins(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe9523c97\",\n [],\n [\n {\n \"type\": \"address[]\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllExtensions\" function on the contract.\n * @param options - The options for the getAllExtensions function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllExtensions } from \"TODO\";\n * \n * const result = await getAllExtensions();\n * \n * ```\n */\nexport async function getAllExtensions(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x4a00cc48\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllSigners\" function on the contract.\n * @param options - The options for the getAllSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllSigners } from \"TODO\";\n * \n * const result = await getAllSigners();\n * \n * ```\n */\nexport async function getAllSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd42f2f35\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getImplementationForFunction\" function.\n */\nexport type GetImplementationForFunctionParams = {\n functionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"getImplementationForFunction\" function on the contract.\n * @param options - The options for the getImplementationForFunction function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getImplementationForFunction } from \"TODO\";\n * \n * const result = await getImplementationForFunction({\n * functionSelector: ...,\n * });\n * \n * ```\n */\nexport async function getImplementationForFunction(\n options: BaseTransactionOptions<GetImplementationForFunctionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xce0b6013\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.functionSelector]\n });\n};\n\n\n\n\n/**\n * Calls the \"getNonce\" function on the contract.\n * @param options - The options for the getNonce function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getNonce } from \"TODO\";\n * \n * const result = await getNonce();\n * \n * ```\n */\nexport async function getNonce(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd087d288\",\n [],\n [\n {\n \"type\": \"uint256\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getPermissionsForSigner\" function.\n */\nexport type GetPermissionsForSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"getPermissionsForSigner\" function on the contract.\n * @param options - The options for the getPermissionsForSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getPermissionsForSigner } from \"TODO\";\n * \n * const result = await getPermissionsForSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function getPermissionsForSigner(\n options: BaseTransactionOptions<GetPermissionsForSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xf15d424e\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isActiveSigner\" function.\n */\nexport type IsActiveSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"isActiveSigner\" function on the contract.\n * @param options - The options for the isActiveSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isActiveSigner } from \"TODO\";\n * \n * const result = await isActiveSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function isActiveSigner(\n options: BaseTransactionOptions<IsActiveSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x7dff5a79\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isAdmin\" function.\n */\nexport type IsAdminParams = {\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_account\"}>\n};\n\n/**\n * Calls the \"isAdmin\" function on the contract.\n * @param options - The options for the isAdmin function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isAdmin } from \"TODO\";\n * \n * const result = await isAdmin({\n * account: ...,\n * });\n * \n * ```\n */\nexport async function isAdmin(\n options: BaseTransactionOptions<IsAdminParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x24d7806c\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isValidSigner\" function.\n */\nexport type IsValidSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_signer\"}>\nuserOp: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_userOp\",\"components\":[{\"type\":\"address\",\"name\":\"sender\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"bytes\",\"name\":\"initCode\"},{\"type\":\"bytes\",\"name\":\"callData\"},{\"type\":\"uint256\",\"name\":\"callGasLimit\"},{\"type\":\"uint256\",\"name\":\"verificationGasLimit\"},{\"type\":\"uint256\",\"name\":\"preVerificationGas\"},{\"type\":\"uint256\",\"name\":\"maxFeePerGas\"},{\"type\":\"uint256\",\"name\":\"maxPriorityFeePerGas\"},{\"type\":\"bytes\",\"name\":\"paymasterAndData\"},{\"type\":\"bytes\",\"name\":\"signature\"}]}>\n};\n\n/**\n * Calls the \"isValidSigner\" function on the contract.\n * @param options - The options for the isValidSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isValidSigner } from \"TODO\";\n * \n * const result = await isValidSigner({\n * signer: ...,\n * userOp: ...,\n * });\n * \n * ```\n */\nexport async function isValidSigner(\n options: BaseTransactionOptions<IsValidSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x1dd756c5\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_signer\"\n },\n {\n \"type\": \"tuple\",\n \"name\": \"_userOp\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"sender\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nonce\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"initCode\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"callData\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"callGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"verificationGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"preVerificationGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxFeePerGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxPriorityFeePerGas\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"paymasterAndData\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.signer, options.userOp]\n });\n};\n\n\n/**\n * Represents the parameters for the \"verifySignerPermissionRequest\" function.\n */\nexport type VerifySignerPermissionRequestParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"signature\"}>\n};\n\n/**\n * Calls the \"verifySignerPermissionRequest\" function on the contract.\n * @param options - The options for the verifySignerPermissionRequest function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { verifySignerPermissionRequest } from \"TODO\";\n * \n * const result = await verifySignerPermissionRequest({\n * req: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function verifySignerPermissionRequest(\n options: BaseTransactionOptions<VerifySignerPermissionRequestParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa9082d84\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ],\n [\n {\n \"type\": \"bool\",\n \"name\": \"success\"\n },\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ]\n],\n params: [options.req, options.signature]\n });\n};\n\n\n\n\n/**\n * Calls the \"contractURI\" function on the contract.\n * @param options - The options for the contractURI function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { contractURI } from \"TODO\";\n * \n * const result = await contractURI();\n * \n * ```\n */\nexport async function contractURI(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe8a3d485\",\n [],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getMessageHash\" function.\n */\nexport type GetMessageHashParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\n};\n\n/**\n * Calls the \"getMessageHash\" function on the contract.\n * @param options - The options for the getMessageHash function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getMessageHash } from \"TODO\";\n * \n * const result = await getMessageHash({\n * hash: ...,\n * });\n * \n * ```\n */\nexport async function getMessageHash(\n options: BaseTransactionOptions<GetMessageHashParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x399b77da\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.hash]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isValidSignature\" function.\n */\nexport type IsValidSignatureParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"isValidSignature\" function on the contract.\n * @param options - The options for the isValidSignature function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isValidSignature } from \"TODO\";\n * \n * const result = await isValidSignature({\n * hash: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function isValidSignature(\n options: BaseTransactionOptions<IsValidSignatureParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x1626ba7e\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"magicValue\"\n }\n ]\n],\n params: [options.hash, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"supportsInterface\" function.\n */\nexport type SupportsInterfaceParams = {\n interfaceId: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"interfaceId\"}>\n};\n\n/**\n * Calls the \"supportsInterface\" function on the contract.\n * @param options - The options for the supportsInterface function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { supportsInterface } from \"TODO\";\n * \n * const result = await supportsInterface({\n * interfaceId: ...,\n * });\n * \n * ```\n */\nexport async function supportsInterface(\n options: BaseTransactionOptions<SupportsInterfaceParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x01ffc9a7\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"interfaceId\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.interfaceId]\n });\n};\n\n\n\n\n/**\n * Calls the \"eip712Domain\" function on the contract.\n * @param options - The options for the eip712Domain function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { eip712Domain } from \"TODO\";\n * \n * const result = await eip712Domain();\n * \n * ```\n */\nexport async function eip712Domain(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x84b0196e\",\n [],\n [\n {\n \"type\": \"bytes1\",\n \"name\": \"fields\"\n },\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"version\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"chainId\"\n },\n {\n \"type\": \"address\",\n \"name\": \"verifyingContract\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"salt\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"extensions\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getEas\" function on the contract.\n * @param options - The options for the getEas function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getEas } from \"TODO\";\n * \n * const result = await getEas();\n * \n * ```\n */\nexport async function getEas(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd5f5127d\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"owner\" function on the contract.\n * @param options - The options for the owner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { owner } from \"TODO\";\n * \n * const result = await owner();\n * \n * ```\n */\nexport async function owner(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8da5cb5b\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n* Contract write functions\n*/\n\n/**\n * Represents the parameters for the \"initialize\" function.\n */\nexport type InitializeParams = {\n defaultAdmin: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_defaultAdmin\"}>\ndata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_data\"}>\n};\n\n/**\n * Calls the \"initialize\" function on the contract.\n * @param options - The options for the \"initialize\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { initialize } from \"TODO\";\n * \n * const transaction = initialize({\n * defaultAdmin: ...,\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function initialize(\n options: BaseTransactionOptions<InitializeParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd1f57894\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_defaultAdmin\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_data\"\n }\n ],\n []\n],\n params: [options.defaultAdmin, options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multicall\" function.\n */\nexport type MulticallParams = {\n data: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"data\"}>\n};\n\n/**\n * Calls the \"multicall\" function on the contract.\n * @param options - The options for the \"multicall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multicall } from \"TODO\";\n * \n * const transaction = multicall({\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multicall(\n options: BaseTransactionOptions<MulticallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xac9650d8\",\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"data\"\n }\n ],\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"results\"\n }\n ]\n],\n params: [options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setEntrypointOverride\" function.\n */\nexport type SetEntrypointOverrideParams = {\n entrypointOverride: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_entrypointOverride\"}>\n};\n\n/**\n * Calls the \"setEntrypointOverride\" function on the contract.\n * @param options - The options for the \"setEntrypointOverride\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setEntrypointOverride } from \"TODO\";\n * \n * const transaction = setEntrypointOverride({\n * entrypointOverride: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setEntrypointOverride(\n options: BaseTransactionOptions<SetEntrypointOverrideParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb76464d5\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_entrypointOverride\"\n }\n ],\n []\n],\n params: [options.entrypointOverride]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setPermissionsForSigner\" function.\n */\nexport type SetPermissionsForSignerParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"setPermissionsForSigner\" function on the contract.\n * @param options - The options for the \"setPermissionsForSigner\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setPermissionsForSigner } from \"TODO\";\n * \n * const transaction = setPermissionsForSigner({\n * req: ...,\n * signature: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setPermissionsForSigner(\n options: BaseTransactionOptions<SetPermissionsForSignerParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x5892e236\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n []\n],\n params: [options.req, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"validateUserOp\" function.\n */\nexport type ValidateUserOpParams = {\n userOp: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"userOp\",\"components\":[{\"type\":\"address\",\"name\":\"sender\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"bytes\",\"name\":\"initCode\"},{\"type\":\"bytes\",\"name\":\"callData\"},{\"type\":\"uint256\",\"name\":\"callGasLimit\"},{\"type\":\"uint256\",\"name\":\"verificationGasLimit\"},{\"type\":\"uint256\",\"name\":\"preVerificationGas\"},{\"type\":\"uint256\",\"name\":\"maxFeePerGas\"},{\"type\":\"uint256\",\"name\":\"maxPriorityFeePerGas\"},{\"type\":\"bytes\",\"name\":\"paymasterAndData\"},{\"type\":\"bytes\",\"name\":\"signature\"}]}>\nuserOpHash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"userOpHash\"}>\nmissingAccountFunds: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"missingAccountFunds\"}>\n};\n\n/**\n * Calls the \"validateUserOp\" function on the contract.\n * @param options - The options for the \"validateUserOp\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { validateUserOp } from \"TODO\";\n * \n * const transaction = validateUserOp({\n * userOp: ...,\n * userOpHash: ...,\n * missingAccountFunds: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function validateUserOp(\n options: BaseTransactionOptions<ValidateUserOpParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x3a871cdd\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"userOp\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"sender\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nonce\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"initCode\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"callData\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"callGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"verificationGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"preVerificationGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxFeePerGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxPriorityFeePerGas\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"paymasterAndData\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ]\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"userOpHash\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"missingAccountFunds\"\n }\n ],\n [\n {\n \"type\": \"uint256\",\n \"name\": \"validationData\"\n }\n ]\n],\n params: [options.userOp, options.userOpHash, options.missingAccountFunds]\n });\n};\n\n\n\n\n/**\n * Calls the \"addDeposit\" function on the contract.\n * @param options - The options for the \"addDeposit\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { addDeposit } from \"TODO\";\n * \n * const transaction = addDeposit();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function addDeposit(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4a58db19\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"execute\" function.\n */\nexport type ExecuteParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"execute\" function on the contract.\n * @param options - The options for the \"execute\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { execute } from \"TODO\";\n * \n * const transaction = execute({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function execute(\n options: BaseTransactionOptions<ExecuteParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb61d27f6\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"executeBatch\" function.\n */\nexport type ExecuteBatchParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address[]\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"executeBatch\" function on the contract.\n * @param options - The options for the \"executeBatch\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { executeBatch } from \"TODO\";\n * \n * const transaction = executeBatch({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function executeBatch(\n options: BaseTransactionOptions<ExecuteBatchParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x47e1da2a\",\n [\n {\n \"type\": \"address[]\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes[]\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155BatchReceived\" function.\n */\nexport type OnERC1155BatchReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155BatchReceived\" function on the contract.\n * @param options - The options for the \"onERC1155BatchReceived\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155BatchReceived } from \"TODO\";\n * \n * const transaction = onERC1155BatchReceived({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155BatchReceived(\n options: BaseTransactionOptions<OnERC1155BatchReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xbc197c81\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155Received\" function.\n */\nexport type OnERC1155ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155Received\" function on the contract.\n * @param options - The options for the \"onERC1155Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155Received } from \"TODO\";\n * \n * const transaction = onERC1155Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155Received(\n options: BaseTransactionOptions<OnERC1155ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf23a6e61\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC721Received\" function.\n */\nexport type OnERC721ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC721Received\" function on the contract.\n * @param options - The options for the \"onERC721Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC721Received } from \"TODO\";\n * \n * const transaction = onERC721Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC721Received(\n options: BaseTransactionOptions<OnERC721ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x150b7a02\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setContractURI\" function.\n */\nexport type SetContractURIParams = {\n uri: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_uri\"}>\n};\n\n/**\n * Calls the \"setContractURI\" function on the contract.\n * @param options - The options for the \"setContractURI\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setContractURI } from \"TODO\";\n * \n * const transaction = setContractURI({\n * uri: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setContractURI(\n options: BaseTransactionOptions<SetContractURIParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x938e3d7b\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_uri\"\n }\n ],\n []\n],\n params: [options.uri]\n });\n};\n\n\n/**\n * Represents the parameters for the \"withdrawDepositTo\" function.\n */\nexport type WithdrawDepositToParams = {\n withdrawAddress: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"withdrawAddress\"}>\namount: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"amount\"}>\n};\n\n/**\n * Calls the \"withdrawDepositTo\" function on the contract.\n * @param options - The options for the \"withdrawDepositTo\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { withdrawDepositTo } from \"TODO\";\n * \n * const transaction = withdrawDepositTo({\n * withdrawAddress: ...,\n * amount: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function withdrawDepositTo(\n options: BaseTransactionOptions<WithdrawDepositToParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4d44560d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"withdrawAddress\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"amount\"\n }\n ],\n []\n],\n params: [options.withdrawAddress, options.amount]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createSeed\" function.\n */\nexport type CreateSeedParams = {\n schemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"schemaUid\"}>\nrevocable: AbiParameterToPrimitiveType<{\"type\":\"bool\",\"name\":\"revocable\"}>\n};\n\n/**\n * Calls the \"createSeed\" function on the contract.\n * @param options - The options for the \"createSeed\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createSeed } from \"TODO\";\n * \n * const transaction = createSeed({\n * schemaUid: ...,\n * revocable: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createSeed(\n options: BaseTransactionOptions<CreateSeedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6240d6d9\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"schemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.schemaUid, options.revocable]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createVersion\" function.\n */\nexport type CreateVersionParams = {\n seedUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"seedUid\"}>\nversionSchemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"}>\n};\n\n/**\n * Calls the \"createVersion\" function on the contract.\n * @param options - The options for the \"createVersion\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createVersion } from \"TODO\";\n * \n * const transaction = createVersion({\n * seedUid: ...,\n * versionSchemaUid: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createVersion(\n options: BaseTransactionOptions<CreateVersionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x13e0c263\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.seedUid, options.versionSchemaUid]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multiPublish\" function.\n */\nexport type MultiPublishParams = {\n requests: AbiParameterToPrimitiveType<{\"type\":\"tuple[]\",\"name\":\"requests\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"multiPublish\" function on the contract.\n * @param options - The options for the \"multiPublish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multiPublish } from \"TODO\";\n * \n * const transaction = multiPublish({\n * requests: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multiPublish(\n options: BaseTransactionOptions<MultiPublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x31e19cb8\",\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"requests\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32[]\"\n }\n ]\n],\n params: [options.requests],\n });\n};\n\n/**\n * multiPublish variant that uses uint256 localIdIndex and publishLocalIdIndex instead of strings.\n * Use when the contract expects integer-based IDs (gas-efficient).\n * Selector: keccak256(\"multiPublish((uint256,bytes32,...)[])[]\") -> 0xd688e801\n */\nexport type MultiPublishWithIntegerIdsParams = {\n requests: Array<{\n localIdIndex: bigint\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 publishLocalIdIndex: bigint\n propertySchemaUid: `0x${string}`\n }>\n }>\n}\n\nexport function multiPublishWithIntegerIds(\n options: BaseTransactionOptions<MultiPublishWithIntegerIdsParams>,\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd688e801\",\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"requests\",\n \"components\": [\n { \"type\": \"uint256\", \"name\": \"localIdIndex\" },\n { \"type\": \"bytes32\", \"name\": \"seedUid\" },\n { \"type\": \"bytes32\", \"name\": \"seedSchemaUid\" },\n { \"type\": \"bytes32\", \"name\": \"versionUid\" },\n { \"type\": \"bytes32\", \"name\": \"versionSchemaUid\" },\n { \"type\": \"bool\", \"name\": \"seedIsRevocable\" },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n { \"type\": \"bytes32\", \"name\": \"schema\" },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n { \"type\": \"address\", \"name\": \"recipient\" },\n { \"type\": \"uint64\", \"name\": \"expirationTime\" },\n { \"type\": \"bool\", \"name\": \"revocable\" },\n { \"type\": \"bytes32\", \"name\": \"refUID\" },\n { \"type\": \"bytes\", \"name\": \"data\" },\n { \"type\": \"uint256\", \"name\": \"value\" },\n ],\n },\n ],\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n { \"type\": \"uint256\", \"name\": \"publishLocalIdIndex\" },\n { \"type\": \"bytes32\", \"name\": \"propertySchemaUid\" },\n ],\n },\n ],\n },\n ],\n [{ \"type\": \"bytes32[]\" }],\n ],\n params: [options.requests],\n });\n}\n\n/**\n * Represents the parameters for the \"publish\" function.\n */\nexport type PublishParams = {\n request: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"request\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"publish\" function on the contract.\n * @param options - The options for the \"publish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { publish } from \"TODO\";\n * \n * const transaction = publish({\n * request: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function publish(\n options: BaseTransactionOptions<PublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb71308c5\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"request\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n },\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.request]\n });\n};\n\n\n\n\n/**\n * Calls the \"renounceOwnership\" function on the contract.\n * @param options - The options for the \"renounceOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { renounceOwnership } from \"TODO\";\n * \n * const transaction = renounceOwnership();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function renounceOwnership(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x715018a6\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"setEas\" function.\n */\nexport type SetEasParams = {\n eas: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_eas\"}>\n};\n\n/**\n * Calls the \"setEas\" function on the contract.\n * @param options - The options for the \"setEas\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setEas } from \"TODO\";\n * \n * const transaction = setEas({\n * eas: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setEas(\n options: BaseTransactionOptions<SetEasParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb90b6e0d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_eas\"\n }\n ],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: [options.eas]\n });\n};\n\n\n/**\n * Represents the parameters for the \"transferOwnership\" function.\n */\nexport type TransferOwnershipParams = {\n newOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\"}>\n};\n\n/**\n * Calls the \"transferOwnership\" function on the contract.\n * @param options - The options for the \"transferOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { transferOwnership } from \"TODO\";\n * \n * const transaction = transferOwnership({\n * newOwner: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function transferOwnership(\n options: BaseTransactionOptions<TransferOwnershipParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf2fde38b\",\n [\n {\n \"type\": \"address\",\n \"name\": \"newOwner\"\n }\n ],\n []\n],\n params: [options.newOwner]\n });\n};\n\n\n","import debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:actors:persistSeedUid')\n\nconst ZERO_BYTES32 = '0x' + '0'.repeat(64)\n\n/** Timeout for persistSeedUid. Attestations are already on-chain; DB write is best-effort. */\nconst PERSIST_SEED_UID_TIMEOUT_MS = 15_000\n\nexport type RequestWithSeedUid = { seedUid?: string; localId?: string }\n\n/**\n * Assigns the published item's seedUid from the matching request (by item.seedLocalId).\n * Multi-publish payloads are ordered so the first request is not always the root item (e.g. Image before Post).\n */\nexport function persistSeedUidFromPublishResult(\n item: { seedUid?: string; seedLocalId?: string },\n normalizedRequests: RequestWithSeedUid[],\n): void {\n const seedLocalId = item.seedLocalId\n const match = seedLocalId\n ? normalizedRequests.find((r) => r?.localId === seedLocalId)\n : undefined\n const uid =\n match?.seedUid && match.seedUid !== ZERO_BYTES32\n ? match.seedUid\n : normalizedRequests[0]?.seedUid\n if (uid && uid !== ZERO_BYTES32) {\n item.seedUid = uid\n }\n}\n\n/**\n * Wraps item.persistSeedUid with timeout and error handling. Attestations are already\n * on-chain; if this fails or times out, we log and continue. Prevents the publish\n * flow from hanging when DB write is slow or fails.\n */\nexport async function persistSeedUidSafely(\n item: {\n persistSeedUid?: (publisher?: string, attestationCreatedAtMs?: number) => Promise<void>\n },\n address: string,\n attestationCreatedAtMs?: number,\n): Promise<void> {\n const persist = item.persistSeedUid\n if (typeof persist !== 'function') return\n\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('persistSeedUid timed out')), PERSIST_SEED_UID_TIMEOUT_MS),\n )\n\n try {\n await Promise.race([persist.call(item, address, attestationCreatedAtMs), timeout])\n } catch (err) {\n logger('persistSeedUid failed (attestations already on-chain):', err)\n // Don't throw - attestations are confirmed; DB write is best-effort\n }\n}\n","import { getContract, prepareContractCall, readContract } from 'thirdweb'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { SCHEMA_REGISTRY_ADDRESS } from '~/helpers/constants'\n\nconst SCHEMA_REGISTRY_ABI = [\n {\n inputs: [{ internalType: 'bytes32', name: 'uid', type: 'bytes32' }],\n name: 'getSchema',\n outputs: [\n {\n components: [\n { internalType: 'bytes32', name: 'uid', type: 'bytes32' },\n { internalType: 'contract ISchemaResolver', name: 'resolver', type: 'address' },\n { internalType: 'bool', name: 'revocable', type: 'bool' },\n { internalType: 'string', name: 'schema', type: 'string' },\n ],\n internalType: 'struct SchemaRecord',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'string', name: 'schema', type: 'string' },\n { internalType: 'contract ISchemaResolver', name: 'resolver', type: 'address' },\n { internalType: 'bool', name: 'revocable', type: 'bool' },\n ],\n name: 'register',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const\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 function getSchemaRegistryContract(client: ThirdwebClient, chain: Chain) {\n return getContract({\n client,\n chain,\n address: SCHEMA_REGISTRY_ADDRESS,\n abi: SCHEMA_REGISTRY_ABI,\n })\n}\n\n/** Use string signature for getSchema - the EAS SchemaRegistry expects this exact selector.\n * The ABI-based method resolution can produce a different selector (e.g. from internalType\n * or tuple encoding) causing \"Router: function does not exist\" on proxy/router contracts. */\nconst GET_SCHEMA_SIGNATURE =\n 'function getSchema(bytes32 uid) view returns ((bytes32 uid, address resolver, bool revocable, string schema))' as const\n\nexport async function getSchemaRecord(\n client: ThirdwebClient,\n chain: Chain,\n uid: string,\n): Promise<SchemaRecord | null> {\n const contract = getContract({\n client,\n chain,\n address: SCHEMA_REGISTRY_ADDRESS,\n // No ABI - use string method so thirdweb parses the exact signature and produces correct selector\n })\n const result = await readContract({\n contract,\n method: GET_SCHEMA_SIGNATURE,\n params: [uid as `0x${string}`],\n })\n if (!result || (result as SchemaRecord).uid === ZERO_BYTES32) {\n return null\n }\n return result as SchemaRecord\n}\n\nexport type RegisterSchemaParams = {\n schema: string\n resolverAddress: string\n revocable: boolean\n}\n\nexport function registerSchema(\n client: ThirdwebClient,\n chain: Chain,\n params: RegisterSchemaParams,\n) {\n const contract = getSchemaRegistryContract(client, chain)\n return prepareContractCall({\n contract,\n method: 'register',\n params: [params.schema, params.resolverAddress as `0x${string}`, params.revocable],\n })\n}\n","import { getContract, prepareContractCall } from 'thirdweb'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { SchemaEncoder, NO_EXPIRATION, ZERO_BYTES32 } from '@ethereum-attestation-service/eas-sdk'\nimport { getPublishConfig } from '~/config'\nimport { EAS_SCHEMA_NAME_ATTESTATION_UID } from '~/helpers/constants'\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n\nexport type NameSchemaAttestationParams = {\n schemaUid: string\n schemaName: string\n}\n\nexport function prepareNameSchemaAttestation(\n client: ThirdwebClient,\n chain: Chain,\n params: NameSchemaAttestationParams,\n) {\n const schemaEncoder = new SchemaEncoder('bytes32 schemaId,string name')\n const encodedData = schemaEncoder.encodeData([\n { name: 'schemaId', value: params.schemaUid as `0x${string}`, type: 'bytes32' },\n { name: 'name', value: params.schemaName, type: 'string' },\n ])\n\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n // No ABI - use string method so thirdweb parses the exact signature\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function attest((bytes32 schema,(address recipient,uint64 expirationTime,bool revocable,bytes32 refUID,bytes data,uint256 value) data) request) payable returns (bytes32)' as const,\n params: [\n {\n schema: EAS_SCHEMA_NAME_ATTESTATION_UID as `0x${string}`,\n data: {\n recipient: ZERO_ADDRESS as `0x${string}`,\n expirationTime: BigInt(NO_EXPIRATION),\n revocable: true,\n refUID: ZERO_BYTES32 as `0x${string}`,\n data: encodedData as `0x${string}`,\n value: 0n,\n },\n },\n ],\n })\n}\n","import {\n getSegmentedItemProperties,\n getRelatedItemsForPublish,\n INTERNAL_DATA_TYPES,\n getEasSchemaForItemProperty,\n setSchemaUidForSchemaDefinition,\n setSchemaUidForModel,\n} from '@seedprotocol/sdk'\nimport type { IItem } from '@seedprotocol/sdk'\nimport { SchemaRegistry } from '@ethereum-attestation-service/eas-sdk'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { sendTransaction, waitForReceipt } from 'thirdweb'\nimport type { Account } from 'thirdweb/wallets'\nimport { getSchemaRecord, registerSchema } from '~/helpers/thirdweb/11155420/schemaRegistry'\nimport { prepareNameSchemaAttestation } from '~/helpers/thirdweb/11155420/nameSchemaAttestation'\n\nconst RESOLVER_ADDRESS = '0x0000000000000000000000000000000000000000'\nconst REVOCABLE = true\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase()\n}\n\n/**\n * Collects all model names used by the item (item's model + relation refs + list refs + Image).\n */\nasync function getModelNamesForItem(item: IItem<any>): Promise<Set<string>> {\n const { itemRelationProperties, itemImageProperties, itemListProperties } =\n await getSegmentedItemProperties(item)\n const modelNames = new Set<string>()\n\n if (item.modelName) {\n modelNames.add(item.modelName)\n }\n\n for (const prop of itemRelationProperties) {\n const ref = prop.propertyDef?.ref as string | undefined\n if (ref) modelNames.add(ref)\n }\n\n for (const prop of itemImageProperties) {\n const dataType = prop.propertyDef?.dataType\n if (dataType === 'File') modelNames.add('File')\n else if (dataType === 'Html') modelNames.add('Html')\n else modelNames.add('Image')\n }\n\n for (const prop of itemListProperties) {\n const ref = prop.propertyDef?.ref as string | undefined\n if (ref) modelNames.add(ref)\n }\n\n return modelNames\n}\n\n/**\n * Ensures EAS schemas exist for each item property and each model used by the item.\n * If a schema is not found on-chain or in the indexer, registers it via SchemaRegistry\n * and creates a name attestation (Schema #1) so EASSCAN displays it.\n * Populates the SDK's schema map so getPublishPayload can resolve schema UIDs.\n */\nexport async function ensureEasSchemasForItem(\n item: IItem<any>,\n account: Account,\n client: ThirdwebClient,\n chain: Chain,\n): Promise<void> {\n const { itemBasicProperties, itemRelationProperties, itemImageProperties, itemListProperties } =\n await getSegmentedItemProperties(item)\n\n const allProperties = [\n ...itemBasicProperties,\n ...itemRelationProperties,\n ...itemImageProperties,\n ...itemListProperties,\n ]\n\n const registeredSchemaUids = new Set<string>()\n\n // Ensure model schemas (bytes32 <model_name>) so getPublishPayload can resolve seedSchemaUid\n const modelNames = await getModelNamesForItem(item)\n const registeredModelSchemaUids = new Set<string>()\n\n for (const modelName of modelNames) {\n const schemaDef = `bytes32 ${toSnakeCase(modelName)}`\n const schemaUid = SchemaRegistry.getSchemaUID(\n schemaDef,\n RESOLVER_ADDRESS as `0x${string}`,\n REVOCABLE,\n )\n\n const onChainRecord = await getSchemaRecord(client, chain, schemaUid)\n if (onChainRecord) {\n setSchemaUidForModel({ modelName, schemaUid })\n continue\n }\n\n if (registeredModelSchemaUids.has(schemaUid)) {\n setSchemaUidForModel({ modelName, schemaUid })\n continue\n }\n\n try {\n const registerTx = registerSchema(client, chain, {\n schema: schemaDef,\n resolverAddress: RESOLVER_ADDRESS,\n revocable: REVOCABLE,\n })\n\n const registerResult = await sendTransaction({\n account,\n transaction: registerTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: registerResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to register EAS schema for model ${modelName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n try {\n const attestTx = prepareNameSchemaAttestation(client, chain, {\n schemaUid,\n schemaName: toSnakeCase(modelName),\n })\n\n const attestResult = await sendTransaction({\n account,\n transaction: attestTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: attestResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to name EAS schema for model ${modelName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n registeredModelSchemaUids.add(schemaUid)\n setSchemaUidForModel({ modelName, schemaUid })\n }\n\n // Ensure storage seed property schemas (Image/File/Html models have storageTransactionId).\n // The top-level item doesn't have these properties, but nested storage seeds do.\n const storageSchemaDef = 'string storage_transaction_id'\n const storageSchemaUid = SchemaRegistry.getSchemaUID(\n storageSchemaDef,\n RESOLVER_ADDRESS as `0x${string}`,\n REVOCABLE,\n )\n const storageOnChain = await getSchemaRecord(client, chain, storageSchemaUid)\n if (storageOnChain) {\n setSchemaUidForSchemaDefinition({ text: storageSchemaDef, schemaUid: storageSchemaUid })\n } else if (!registeredSchemaUids.has(storageSchemaUid) && (modelNames.has('Image') || modelNames.has('File') || modelNames.has('Html'))) {\n try {\n const registerTx = registerSchema(client, chain, {\n schema: storageSchemaDef,\n resolverAddress: RESOLVER_ADDRESS,\n revocable: REVOCABLE,\n })\n const registerResult = await sendTransaction({ account, transaction: registerTx })\n await waitForReceipt({ client, chain, transactionHash: registerResult.transactionHash })\n const attestTx = prepareNameSchemaAttestation(client, chain, {\n schemaUid: storageSchemaUid,\n schemaName: 'storage_transaction_id',\n })\n const attestResult = await sendTransaction({ account, transaction: attestTx })\n await waitForReceipt({ client, chain, transactionHash: attestResult.transactionHash })\n } catch (err) {\n throw new Error(\n `Failed to register EAS schema for storageTransactionId: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n registeredSchemaUids.add(storageSchemaUid)\n setSchemaUidForSchemaDefinition({ text: storageSchemaDef, schemaUid: storageSchemaUid })\n }\n\n for (const property of allProperties) {\n if (!property.propertyDef) continue\n\n const easDataTypeRaw =\n (INTERNAL_DATA_TYPES as Record<string, { eas?: string }>)[property.propertyDef.dataType]?.eas ?? 'string'\n const prop = property as { storagePropertyName?: string; propertyName: string }\n const nameForEas =\n prop.storagePropertyName && prop.storagePropertyName.length > 0\n ? prop.storagePropertyName\n : property.propertyName\n const propertyNameSnakeCase = toSnakeCase(nameForEas)\n const schemaDef = `${easDataTypeRaw} ${propertyNameSnakeCase}`\n\n // getEasSchemaForItemProperty expects TypedData['type'] which excludes 'bytes32[]'\n const validEasTypes = [\n 'string', 'address', 'bool', 'bytes', 'bytes32',\n 'uint8', 'uint16', 'uint32', 'uint64', 'uint128', 'uint256',\n ] as const\n const easDataTypeForLookup =\n validEasTypes.includes(easDataTypeRaw as (typeof validEasTypes)[number])\n ? (easDataTypeRaw as (typeof validEasTypes)[number])\n : undefined\n\n let schema = await getEasSchemaForItemProperty({\n schemaUid: property.schemaUid,\n propertyName: nameForEas,\n easDataType: easDataTypeForLookup,\n })\n\n if (schema) {\n // Verify SDK schema matches our schemaDef on-chain before trusting it.\n // The SDK may return a cached schema from a different chain/definition.\n const onChainRecord = await getSchemaRecord(client, chain, schema.id)\n const matches = onChainRecord && onChainRecord.schema === schemaDef\n if (matches) {\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid: schema.id })\n continue\n }\n // Schema mismatch or not found: fall through to register/use our schemaDef\n }\n\n const schemaUid = SchemaRegistry.getSchemaUID(schemaDef, RESOLVER_ADDRESS as `0x${string}`, REVOCABLE)\n const onChainRecord = await getSchemaRecord(client, chain, schemaUid)\n\n if (onChainRecord) {\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid })\n continue\n }\n\n if (registeredSchemaUids.has(schemaUid)) {\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid })\n continue\n }\n\n try {\n const registerTx = registerSchema(client, chain, {\n schema: schemaDef,\n resolverAddress: RESOLVER_ADDRESS,\n revocable: REVOCABLE,\n })\n\n const registerResult = await sendTransaction({\n account,\n transaction: registerTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: registerResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to register EAS schema for property ${property.propertyName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n try {\n const attestTx = prepareNameSchemaAttestation(client, chain, {\n schemaUid,\n schemaName: propertyNameSnakeCase,\n })\n\n const attestResult = await sendTransaction({\n account,\n transaction: attestTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: attestResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to name EAS schema for property ${property.propertyName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n registeredSchemaUids.add(schemaUid)\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid })\n }\n\n // Ensure schemas for related/list items that will be in the multiPublish payload.\n // Without this, schemas for nested items (e.g. Image's properties) are never registered,\n // causing EAS multiAttest to revert with InvalidSchema.\n const relatedItems = await getRelatedItemsForPublish(item)\n for (const relatedItem of relatedItems) {\n await ensureEasSchemasForItem(relatedItem as IItem<any>, account, client, chain)\n }\n}\n","import { getUploadPipelineTransactionStatus } from '@seedprotocol/sdk'\nimport { getPublishConfig } from '~/config'\n\n/**\n * Verifies each id is available via the upload API (`/api/upload/arweave/data/:id`)\n * before creating storageTransactionId attestations. Prevents attestations when\n * the upload pipeline has not indexed the transaction or data item yet.\n *\n * @param txIds - Arweave L1 transaction ids and/or bundler data item ids\n * @throws Error if any id is not found (404) or not yet available\n */\nexport async function verifyArweaveTransactionsExist(txIds: string[]): Promise<void> {\n if (txIds.length === 0) return\n\n const { arweaveUploadVerificationBaseUrl } = getPublishConfig()\n\n const results = await Promise.all(\n txIds.map((txId) =>\n getUploadPipelineTransactionStatus(arweaveUploadVerificationBaseUrl, txId),\n ),\n )\n\n for (let i = 0; i < txIds.length; i++) {\n const txId = txIds[i]\n const status = results[i]\n if (!status) continue\n\n if (status.status === 404) {\n throw new Error(\n `Arweave transaction ${txId} not found. Upload may have failed. Delete this publish record and try again.`\n )\n }\n\n if (status.status !== 200) {\n const detail =\n status.status === 504\n ? 'request timed out (upload service did not respond in time)'\n : `status: ${status.status}`\n throw new Error(\n `Arweave transaction ${txId} is not yet available from the upload service (${detail}). Wait and retry.`\n )\n }\n }\n}\n","import {\n prepareEvent,\n prepareContractCall,\n readContract,\n type BaseTransactionOptions,\n type AbiParameterToPrimitiveType,\n} from \"thirdweb\";\n\n/**\n* Contract events\n*/\n\n\n\n/**\n * Creates an event object for the CreatedAttestation event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { createdAttestationEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * createdAttestationEvent()\n * ],\n * });\n * ```\n */\nexport function createdAttestationEvent() {\n return prepareEvent({\n signature: \"event CreatedAttestation((bytes32 schemaUid, bytes32 attestationUid) result)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"ModuleInitialized\" event.\n */\nexport type ModuleInitializedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\neas: AbiParameterToPrimitiveType<{\"indexed\":true,\"internalType\":\"address\",\"name\":\"eas\",\"type\":\"address\"}>\n}>;\n\n/**\n * Creates an event object for the ModuleInitialized event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { moduleInitializedEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * moduleInitializedEvent({\n * account: ...,\n * eas: ...,\n * })\n * ],\n * });\n * ```\n */\nexport function moduleInitializedEvent(filters: ModuleInitializedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ModuleInitialized(address indexed account, address indexed eas)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"ModuleUninitialized\" event.\n */\nexport type ModuleUninitializedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\n}>;\n\n/**\n * Creates an event object for the ModuleUninitialized event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { moduleUninitializedEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * moduleUninitializedEvent({\n * account: ...,\n * })\n * ],\n * });\n * ```\n */\nexport function moduleUninitializedEvent(filters: ModuleUninitializedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ModuleUninitialized(address indexed account)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the SeedPublished event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { seedPublishedEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * seedPublishedEvent()\n * ],\n * });\n * ```\n */\nexport function seedPublishedEvent() {\n return prepareEvent({\n signature: \"event SeedPublished(bytes32 seedUid, bytes32 versionUid)\",\n });\n};\n \n\n/**\n* Contract read functions\n*/\n\n/**\n * Represents the parameters for the \"getEAS\" function.\n */\nexport type GetEASParams = {\n account: AbiParameterToPrimitiveType<{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\n};\n\n/**\n * Calls the \"getEAS\" function on the contract.\n * @param options - The options for the getEAS function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getEAS } from \"TODO\";\n *\n * const result = await getEAS({\n * account: ...,\n * });\n *\n * ```\n */\nexport async function getEAS(\n options: BaseTransactionOptions<GetEASParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x7dda06c4\",\n [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isInitialized\" function.\n */\nexport type IsInitializedParams = {\n account: AbiParameterToPrimitiveType<{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\n};\n\n/**\n * Calls the \"isInitialized\" function on the contract.\n * @param options - The options for the isInitialized function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isInitialized } from \"TODO\";\n *\n * const result = await isInitialized({\n * account: ...,\n * });\n *\n * ```\n */\nexport async function isInitialized(\n options: BaseTransactionOptions<IsInitializedParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd60b347f\",\n [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isModuleType\" function.\n */\nexport type IsModuleTypeParams = {\n moduleTypeId: AbiParameterToPrimitiveType<{\"internalType\":\"uint256\",\"name\":\"moduleTypeId\",\"type\":\"uint256\"}>\n};\n\n/**\n * Calls the \"isModuleType\" function on the contract.\n * @param options - The options for the isModuleType function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isModuleType } from \"TODO\";\n *\n * const result = await isModuleType({\n * moduleTypeId: ...,\n * });\n *\n * ```\n */\nexport async function isModuleType(\n options: BaseTransactionOptions<IsModuleTypeParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xecd05961\",\n [\n {\n \"internalType\": \"uint256\",\n \"name\": \"moduleTypeId\",\n \"type\": \"uint256\"\n }\n ],\n [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.moduleTypeId]\n });\n};\n\n\n/**\n* Contract write functions\n*/\n\n/**\n * Represents the parameters for the \"createSeed\" function.\n */\nexport type CreateSeedParams = {\n schemaUid: AbiParameterToPrimitiveType<{\"internalType\":\"bytes32\",\"name\":\"schemaUid\",\"type\":\"bytes32\"}>\nrevocable: AbiParameterToPrimitiveType<{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"}>\n};\n\n/**\n * Calls the \"createSeed\" function on the contract.\n * @param options - The options for the \"createSeed\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createSeed } from \"TODO\";\n *\n * const transaction = createSeed({\n * schemaUid: ...,\n * revocable: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function createSeed(\n options: BaseTransactionOptions<CreateSeedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6240d6d9\",\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"schemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"revocable\",\n \"type\": \"bool\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.schemaUid, options.revocable]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createVersion\" function.\n */\nexport type CreateVersionParams = {\n seedUid: AbiParameterToPrimitiveType<{\"internalType\":\"bytes32\",\"name\":\"seedUid\",\"type\":\"bytes32\"}>\nversionSchemaUid: AbiParameterToPrimitiveType<{\"internalType\":\"bytes32\",\"name\":\"versionSchemaUid\",\"type\":\"bytes32\"}>\n};\n\n/**\n * Calls the \"createVersion\" function on the contract.\n * @param options - The options for the \"createVersion\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createVersion } from \"TODO\";\n *\n * const transaction = createVersion({\n * seedUid: ...,\n * versionSchemaUid: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function createVersion(\n options: BaseTransactionOptions<CreateVersionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x13e0c263\",\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionSchemaUid\",\n \"type\": \"bytes32\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.seedUid, options.versionSchemaUid]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multiPublish\" function.\n */\nexport type MultiPublishParams = {\n requests: AbiParameterToPrimitiveType<{\"components\":[{\"internalType\":\"string\",\"name\":\"localId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"seedUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"seedSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"seedIsRevocable\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiAttestationRequest[]\",\"name\":\"listOfAttestations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"publishIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"propertySchemaUid\",\"type\":\"bytes32\"}],\"internalType\":\"struct PropertyToUpdateWithSeed[]\",\"name\":\"propertiesToUpdate\",\"type\":\"tuple[]\"}],\"internalType\":\"struct PublishRequestData[]\",\"name\":\"requests\",\"type\":\"tuple[]\"}>\n};\n\n/**\n * Calls the \"multiPublish\" function on the contract.\n * @param options - The options for the \"multiPublish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multiPublish } from \"TODO\";\n *\n * const transaction = multiPublish({\n * requests: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function multiPublish(\n options: BaseTransactionOptions<MultiPublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x2a29fadc\",\n [\n {\n \"components\": [\n {\n \"internalType\": \"string\",\n \"name\": \"localId\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"seedIsRevocable\",\n \"type\": \"bool\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"schema\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"expirationTime\",\n \"type\": \"uint64\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"revocable\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"refUID\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct AttestationRequestData[]\",\n \"name\": \"data\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct MultiAttestationRequest[]\",\n \"name\": \"listOfAttestations\",\n \"type\": \"tuple[]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"publishIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"propertySchemaUid\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct PropertyToUpdateWithSeed[]\",\n \"name\": \"propertiesToUpdate\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct PublishRequestData[]\",\n \"name\": \"requests\",\n \"type\": \"tuple[]\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"\",\n \"type\": \"bytes32[]\"\n }\n ]\n],\n params: [options.requests]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onInstall\" function.\n */\nexport type OnInstallParams = {\n data: AbiParameterToPrimitiveType<{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onInstall\" function on the contract.\n * @param options - The options for the \"onInstall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onInstall } from \"TODO\";\n *\n * const transaction = onInstall({\n * data: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function onInstall(\n options: BaseTransactionOptions<OnInstallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6d61fe70\",\n [\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n []\n],\n params: [options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onUninstall\" function.\n */\nexport type OnUninstallParams = {\n arg_0: AbiParameterToPrimitiveType<{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onUninstall\" function on the contract.\n * @param options - The options for the \"onUninstall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onUninstall } from \"TODO\";\n *\n * const transaction = onUninstall({\n * arg_0: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function onUninstall(\n options: BaseTransactionOptions<OnUninstallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x8a91b0e3\",\n [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n []\n],\n params: [options.arg_0]\n });\n};\n\n\n/**\n * Represents the parameters for the \"publish\" function.\n */\nexport type PublishParams = {\n request: AbiParameterToPrimitiveType<{\"components\":[{\"internalType\":\"string\",\"name\":\"localId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"seedUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"seedSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"seedIsRevocable\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiAttestationRequest[]\",\"name\":\"listOfAttestations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"publishIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"propertySchemaUid\",\"type\":\"bytes32\"}],\"internalType\":\"struct PropertyToUpdateWithSeed[]\",\"name\":\"propertiesToUpdate\",\"type\":\"tuple[]\"}],\"internalType\":\"struct PublishRequestData\",\"name\":\"request\",\"type\":\"tuple\"}>\n};\n\n/**\n * Calls the \"publish\" function on the contract.\n * @param options - The options for the \"publish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { publish } from \"TODO\";\n *\n * const transaction = publish({\n * request: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function publish(\n options: BaseTransactionOptions<PublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x801d5ac9\",\n [\n {\n \"components\": [\n {\n \"internalType\": \"string\",\n \"name\": \"localId\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"seedIsRevocable\",\n \"type\": \"bool\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"schema\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"expirationTime\",\n \"type\": \"uint64\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"revocable\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"refUID\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct AttestationRequestData[]\",\n \"name\": \"data\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct MultiAttestationRequest[]\",\n \"name\": \"listOfAttestations\",\n \"type\": \"tuple[]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"publishIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"propertySchemaUid\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct PropertyToUpdateWithSeed[]\",\n \"name\": \"propertiesToUpdate\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct PublishRequestData\",\n \"name\": \"request\",\n \"type\": \"tuple\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.request]\n });\n};\n\n\n","import { parseEventLogs } from 'thirdweb'\nimport { decodeAbiParameters } from 'viem'\nimport {\n createdAttestationEvent,\n seedPublishedEvent,\n} from '~/helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148'\nimport {\n createdAttestationEvent as executorCreatedAttestationEvent,\n seedPublishedEvent as executorSeedPublishedEvent,\n} from '~/helpers/thirdweb/11155420/0x043462304114da543add6b693c686b7d98865f3e'\nimport { ZERO_BYTES32 } from './utils'\n\nexport function toHex32Normalized(v: string | undefined): string {\n if (v == null || v === '') return ZERO_BYTES32\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(64, '0').slice(-64)\n return ('0x' + hex).toLowerCase()\n}\n\n/**\n * Extract the seed attestation UID by matching the request's seedSchemaUid to a CreatedAttestation\n * event. The payload links each request to a schema (seedSchemaUid); the contract emits\n * CreatedAttestation(schemaUid, attestationUid) for each attestation, so we find the event whose\n * schemaUid matches and use its attestationUid. No index guessing.\n */\nexport function seedUidFromCreatedAttestationEvents(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n seedSchemaUid: string | undefined,\n useModularExecutor: boolean\n): string | undefined {\n if (!seedSchemaUid || !receipt.logs?.length) return undefined\n const wantSchema = toHex32Normalized(seedSchemaUid)\n if (wantSchema === ZERO_BYTES32) return undefined\n const createdAttestationEvt = useModularExecutor ? executorCreatedAttestationEvent : createdAttestationEvent\n try {\n const parsed = parseEventLogs({\n logs: receipt.logs as import('viem').Log[],\n events: [createdAttestationEvt()],\n strict: false,\n })\n for (const ev of parsed) {\n const result = ev?.args?.result as { schemaUid?: string; attestationUid?: string } | undefined\n if (!result?.attestationUid) continue\n if (toHex32Normalized(result.schemaUid) === wantSchema) {\n const uid = result.attestationUid\n if (uid && toHex32Normalized(uid) !== ZERO_BYTES32) return uid\n return undefined\n }\n }\n } catch {\n // ignore\n }\n return undefined\n}\n\nexport type SeedPublishedPair = {\n seedUid?: string\n versionUid?: string\n}\n\n/**\n * Seed + Version UIDs from SeedPublished (executor: typed args; extension: bytes32[] layout).\n * Extension layout: seed at index listOfAttestationsCount, version at listOfAttestationsCount + 1 when present.\n */\nexport function uidsFromSeedPublished(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n contractAddress: string,\n listOfAttestationsCount: number,\n useModularExecutor: boolean,\n): SeedPublishedPair {\n const want = contractAddress.toLowerCase()\n const logs = receipt.logs?.filter((l) => l.address && l.address.toLowerCase() === want)\n if (!logs?.length) return {}\n try {\n const seedPublishedEvt = useModularExecutor ? executorSeedPublishedEvent : seedPublishedEvent\n const parsed = parseEventLogs({\n logs: logs as import('viem').Log[],\n events: [seedPublishedEvt()],\n strict: false,\n })\n const first = parsed[0]\n if (!first) return {}\n if (useModularExecutor) {\n const args = first.args as { seedUid?: string; versionUid?: string }\n const seedUid =\n args?.seedUid && toHex32Normalized(args.seedUid) !== ZERO_BYTES32 ? args.seedUid : undefined\n const versionUid =\n args?.versionUid && toHex32Normalized(args.versionUid) !== ZERO_BYTES32\n ? args.versionUid\n : undefined\n return { seedUid, versionUid }\n }\n const args = first.args as { returnedDataFromEAS?: `0x${string}` }\n const data = args?.returnedDataFromEAS\n if (!data || data === '0x') return {}\n const decoded = decodeAbiParameters([{ type: 'bytes32[]' }], data)\n const uids = decoded[0] as readonly `0x${string}`[]\n if (!uids?.length) return {}\n const seedIndex = listOfAttestationsCount\n const atSeed = uids[seedIndex]\n const atVersion = uids[seedIndex + 1]\n const seedUid =\n atSeed && atSeed !== ZERO_BYTES32\n ? (atSeed as string)\n : uids.length === 1 && uids[0] && uids[0] !== ZERO_BYTES32\n ? (uids[0] as string)\n : undefined\n const versionUid =\n atVersion && atVersion !== ZERO_BYTES32 ? (atVersion as string) : undefined\n return { seedUid, versionUid }\n } catch {\n return {}\n }\n}\n\n/**\n * Fallback: extract seed UID from SeedPublished when CreatedAttestation events are not\n * available or don't match.\n * Extension: SeedPublished(bytes returnedDataFromEAS) - decode bytes as bytes32[], use index.\n * Executor: SeedPublished(bytes32 seedUid, bytes32 versionUid) - read args.seedUid directly.\n */\nexport function seedUidFromSeedPublished(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n contractAddress: string,\n listOfAttestationsCount: number,\n useModularExecutor: boolean,\n): string | undefined {\n return uidsFromSeedPublished(\n receipt,\n contractAddress,\n listOfAttestationsCount,\n useModularExecutor,\n ).seedUid\n}\n\n/**\n * Version attestation UID from CreatedAttestation logs (schema matches request versionSchemaUid).\n */\nexport function versionUidFromCreatedAttestationEvents(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n versionSchemaUid: string | undefined,\n useModularExecutor: boolean,\n): string | undefined {\n if (!versionSchemaUid || !receipt.logs?.length) return undefined\n const wantSchema = toHex32Normalized(versionSchemaUid)\n if (wantSchema === ZERO_BYTES32) return undefined\n const createdAttestationEvt = useModularExecutor ? executorCreatedAttestationEvent : createdAttestationEvent\n try {\n const parsed = parseEventLogs({\n logs: receipt.logs as import('viem').Log[],\n events: [createdAttestationEvt()],\n strict: false,\n })\n for (const ev of parsed) {\n const result = ev?.args?.result as { schemaUid?: string; attestationUid?: string } | undefined\n if (!result?.attestationUid) continue\n if (toHex32Normalized(result.schemaUid) === wantSchema) {\n const uid = result.attestationUid\n if (uid && toHex32Normalized(uid) !== ZERO_BYTES32) return uid\n return undefined\n }\n }\n } catch {\n // ignore\n }\n return undefined\n}\n\nexport type CreatedAttestationPair = { schemaUid: string; attestationUid: string }\n\n/**\n * All `CreatedAttestation` (schemaUid, attestationUid) pairs from the receipt, in parse order.\n * Includes seed, version, and property attestations emitted by the Seed Protocol publish flow.\n */\nexport function listCreatedAttestationPairsFromReceipt(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n useModularExecutor: boolean,\n): CreatedAttestationPair[] {\n if (!receipt.logs?.length) return []\n const createdAttestationEvt = useModularExecutor\n ? executorCreatedAttestationEvent\n : createdAttestationEvent\n try {\n const parsed = parseEventLogs({\n logs: receipt.logs as import('viem').Log[],\n events: [createdAttestationEvt()],\n strict: false,\n })\n const out: CreatedAttestationPair[] = []\n for (const ev of parsed) {\n const result = ev?.args?.result as\n | { schemaUid?: string; attestationUid?: string }\n | undefined\n if (!result?.attestationUid) continue\n const uid = result.attestationUid\n if (!uid || toHex32Normalized(uid) === ZERO_BYTES32) continue\n const su = result.schemaUid\n if (!su) continue\n out.push({ schemaUid: su, attestationUid: uid })\n }\n return out\n } catch {\n return []\n }\n}\n","import type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { eth_getBlockByNumber, getRpcClient } from 'thirdweb/rpc'\n\n/**\n * Block time in milliseconds for the receipt's block, or `Date.now()` if unavailable.\n */\nexport async function attestationMsFromReceipt(\n client: ThirdwebClient,\n chain: Chain,\n receipt: { blockNumber?: bigint },\n): Promise<number> {\n const bn = receipt?.blockNumber\n if (bn == null) return Date.now()\n try {\n const rpc = getRpcClient({ client, chain })\n const block = await eth_getBlockByNumber(rpc, { blockNumber: bn })\n const ts = block?.timestamp\n if (ts != null) return Number(ts) * 1000\n } catch {\n // ignore\n }\n return Date.now()\n}\n","import { ZERO_ADDRESS } from '@ethereum-attestation-service/eas-sdk'\nimport { ZERO_BYTES32 } from './utils'\n\nconst BYTES32_LEN = 64\n\nexport const toHex32 = (v: unknown): string => {\n if (v == null) return '0x' + '0'.repeat(BYTES32_LEN)\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n return '0x' + hex\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n const hex = Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n return '0x' + hex.padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n }\n return '0x' + '0'.repeat(BYTES32_LEN)\n}\n\nexport const toBytesHex = (v: unknown): string => {\n if (v == null || (typeof v === 'string' && (v === '' || v === '0x'))) return '0x'\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0')\n return '0x' + (hex.length % 2 === 1 ? '0' + hex : hex)\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n return '0x' + Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n return '0x'\n}\n\n/** True when an attestation still references another seed in this batch by localId (needs client-side resolution between txs). */\nexport function hasCrossPayloadUnresolved(reqs: unknown[]): boolean {\n const localIds = new Set(\n reqs.map((r) => (r as { localId?: string })?.localId).filter((id): id is string => !!id),\n )\n return reqs.some((req) =>\n ((req as { listOfAttestations?: unknown[] })?.listOfAttestations ?? []).some((a) => {\n const att = a as { _unresolvedValue?: string; _rawListIdsForResolve?: string[] }\n if (att._unresolvedValue && localIds.has(att._unresolvedValue)) return true\n if (Array.isArray(att._rawListIdsForResolve)) {\n return att._rawListIdsForResolve.some((id) => id && localIds.has(String(id).trim()))\n }\n return false\n }),\n )\n}\n\n/** Keep only propertiesToUpdate whose target is in the same multiPublish batch (same tx). */\nexport function filterPropertiesToUpdateForBatch<T extends { publishLocalId?: string }>(\n propertiesToUpdate: T[] | undefined,\n batchLocalIds: Set<string>,\n): T[] {\n return (propertiesToUpdate ?? []).filter(\n (pu) => pu.publishLocalId && batchLocalIds.has(pu.publishLocalId),\n )\n}\n\nconst placeholderData = {\n recipient: ZERO_ADDRESS,\n expirationTime: BigInt(0),\n revocable: true,\n refUID: ZERO_BYTES32,\n data: ZERO_BYTES32 as `0x${string}`,\n value: BigInt(0),\n}\n\n/** Normalize one publish request for SeedProtocol multiPublish (same rules as createAttestations). */\nexport function normalizePublishRequest(req: any): any {\n const listOfAttestations = (req?.listOfAttestations ?? []).map((att: any) => {\n const dataArr = Array.isArray(att?.data) ? att.data : []\n return {\n schema: toHex32(att?.schema),\n data: dataArr.map((d: any) => ({\n ...d,\n refUID: toHex32(d?.refUID),\n data: toBytesHex(d?.data),\n expirationTime: d?.expirationTime != null ? BigInt(d.expirationTime) : BigInt(0),\n value: d?.value != null ? BigInt(d.value) : BigInt(0),\n })),\n ...(typeof att?._propertyName === 'string' && att._propertyName !== ''\n ? { _propertyName: att._propertyName }\n : {}),\n ...(typeof att?._propertyNameForSchema === 'string' && att._propertyNameForSchema !== ''\n ? { _propertyNameForSchema: att._propertyNameForSchema }\n : {}),\n }\n })\n const propertiesToUpdate = (req?.propertiesToUpdate ?? []).map((p: any) => ({\n ...p,\n propertySchemaUid: toHex32(p?.propertySchemaUid),\n }))\n return {\n ...req,\n seedUid: toHex32(req?.seedUid),\n seedSchemaUid: toHex32(req?.seedSchemaUid),\n versionUid: toHex32(req?.versionUid),\n versionSchemaUid: toHex32(req?.versionSchemaUid),\n listOfAttestations,\n propertiesToUpdate,\n }\n}\n\n/** Ensure placeholder attestation data for contract injection targets (full batch). */\nexport function applyPropertiesToUpdatePlaceholders(\n normalizedRequests: any[],\n byLocalId: Map<string, any>,\n): void {\n for (const req of normalizedRequests) {\n for (const pu of req?.propertiesToUpdate ?? []) {\n const targetId = pu?.publishLocalId\n const schemaUid = toHex32(pu?.propertySchemaUid)\n if (!targetId || !schemaUid) continue\n const targetReq = byLocalId.get(targetId)\n if (!targetReq?.listOfAttestations) continue\n const att = targetReq.listOfAttestations.find(\n (a: any) => toHex32(a?.schema)?.toLowerCase() === schemaUid?.toLowerCase(),\n )\n if (!att) continue\n if (!Array.isArray(att.data) || att.data.length === 0) {\n att.data = [{ ...placeholderData, refUID: ZERO_BYTES32 }]\n }\n }\n }\n}\n","import { arweaveL1FinalizeJobs, BaseDb } from '@seedprotocol/sdk'\nimport type { ArweaveTransactionInfo, PublishMachineContext, PublishUpload } from '../../types'\nimport { getPublishConfig } from '~/config'\n\nconst PHASE_PENDING = 'pending_l1' as const\n\n/**\n * Inserts one row per bundler DataItem id so the L1 finalize worker can resolve the L1 tx\n * and wait for anchoring. Idempotent on `data_item_id`.\n */\nexport async function enqueueArweaveL1FinalizeJobsFromPublishContext(\n context: PublishMachineContext,\n): Promise<void> {\n const { useArweaveBundler } = getPublishConfig()\n if (!useArweaveBundler) return\n\n const txs = context.arweaveTransactions ?? []\n const uploads = (context.publishUploads ?? []) as PublishUpload[]\n if (txs.length === 0 || txs.length !== uploads.length) return\n\n const db = BaseDb.getAppDb()\n if (!db) return\n\n const now = Date.now()\n\n for (let i = 0; i < txs.length; i++) {\n const ar = txs[i] as ArweaveTransactionInfo\n const up = uploads[i]\n if (!up) continue\n const dataItemId = (ar.transaction as { id?: string })?.id\n if (!dataItemId || typeof dataItemId !== 'string') continue\n\n try {\n await db\n .insert(arweaveL1FinalizeJobs)\n .values({\n seedLocalId: up.seedLocalId,\n dataItemId,\n versionLocalId: up.versionLocalId ?? null,\n itemPropertyName: up.itemPropertyName ?? null,\n phase: PHASE_PENDING,\n createdAt: now,\n updatedAt: now,\n })\n .onConflictDoNothing()\n } catch {\n /* ignore duplicate or DB errors */\n }\n }\n}\n","import { deploySmartAccount, getContract } from 'thirdweb'\nimport { isContractDeployed } from 'thirdweb/utils'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getPublishConfig } from '../config'\nimport { Eip7702ModularAccountPublishError } from '../errors'\nimport { getClient, getModularAccountWallet } from './thirdweb'\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 Optimism Sepolia 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 Optimism Sepolia. 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\n/**\n * Ensures the Thirdweb in-app modular wallet (EIP-7702) has non-empty bytecode at its address\n * on Optimism Sepolia (delegation / minimal account). If not, optionally runs Thirdweb's\n * {@link deploySmartAccount} bootstrap (dummy tx) when {@link ResolvedPublishConfig.autoDeployEip7702ModularAccount} is true.\n *\n * Call only when `useModularExecutor` is true and before sending `multiPublish` with the modular account.\n */\nexport async function ensureEip7702ModularAccountReady(): Promise<void> {\n const { autoDeployEip7702ModularAccount } = getPublishConfig()\n const modularAccountWallet = getModularAccountWallet()\n await modularAccountWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\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: optimismSepolia,\n address: modularAccount.address,\n })\n\n if (await isContractDeployed(accountContract)) {\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: optimismSepolia,\n client,\n accountContract,\n })\n } catch (cause) {\n throw new Eip7702ModularAccountPublishError(\n MSG_DEPLOY_FAILED,\n 'EIP7702_MODULAR_DEPLOY_FAILED',\n modularAccount.address,\n cause,\n )\n }\n\n if (!(await isContractDeployed(accountContract))) {\n throw new Eip7702ModularAccountPublishError(\n MSG_NOT_CONFIRMED,\n 'EIP7702_MODULAR_NOT_CONFIRMED',\n modularAccount.address,\n )\n }\n}\n","import { getContract, sendTransaction, waitForReceipt } from 'thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport type { Account } from 'thirdweb/wallets'\nimport { zeroAddress } from 'viem'\nimport { getPublishConfig } from '../config'\nimport { ManagedAccountPublishError } from '../errors'\nimport { getClient } from './thirdweb'\nimport {\n getEas,\n setEas,\n} from './thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148'\n\nconst MSG_SET_EAS =\n 'Could not verify or set the EAS contract address on your publishing account on Optimism Sepolia.'\n\nfunction normAddr(a: string): string {\n return a.toLowerCase()\n}\n\n/**\n * Ensures the ManagedAccount contract’s on-chain EAS address matches {@link getPublishConfig}.easContractAddress.\n * If `getEas` is zero or differs, sends `setEas` signed by `account` (same signer as modular `multiPublish`).\n *\n * Call only on the modular executor path, after {@link ensureEip7702ModularAccountReady}.\n */\nexport async function ensureManagedAccountEasConfigured(\n managedAddress: string,\n account: Account,\n): Promise<void> {\n const { easContractAddress } = getPublishConfig()\n const expected = normAddr(easContractAddress)\n if (!expected || expected === normAddr(zeroAddress)) {\n throw new ManagedAccountPublishError(\n 'Publish config is missing a valid easContractAddress.',\n 'MANAGED_ACCOUNT_SET_EAS_FAILED',\n managedAddress,\n )\n }\n\n const contract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: managedAddress,\n })\n\n let current: string\n try {\n const raw = await getEas({ contract })\n current = normAddr(typeof raw === 'string' ? raw : String(raw))\n } catch (cause) {\n throw new ManagedAccountPublishError(MSG_SET_EAS, 'MANAGED_ACCOUNT_SET_EAS_FAILED', managedAddress, cause)\n }\n\n if (current === expected) {\n return\n }\n\n try {\n const tx = setEas({\n contract,\n eas: easContractAddress as `0x${string}`,\n })\n const result = await sendTransaction({ transaction: tx, account })\n await waitForReceipt({\n client: getClient(),\n transactionHash: result.transactionHash,\n chain: optimismSepolia,\n })\n } catch (cause) {\n throw new ManagedAccountPublishError(MSG_SET_EAS, 'MANAGED_ACCOUNT_SET_EAS_FAILED', managedAddress, cause)\n }\n}\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport {\n applyPropertyAttestationUidsFromPublish,\n resolvePublishPayloadValues,\n updateVersionUid,\n} from '@seedprotocol/sdk'\nimport { getContract, sendTransaction, waitForReceipt } from 'thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getClient, getModularAccountWallet, isSmartWalletDeployed } from '~/helpers/thirdweb'\nimport { runModularExecutorPublishPrep } from '~/helpers/ensureManagedAccountReady'\nimport {\n multiPublish,\n} from '~/helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148'\nimport { persistSeedUidFromPublishResult, persistSeedUidSafely } from './persistSeedUid'\nimport { ensureEasSchemasForItem } from '../helpers/ensureEasSchemas'\nimport { verifyArweaveTransactionsExist } from '../helpers/verifyArweaveTransactionsExist'\nimport { getPublishConfig } from '~/config'\nimport { waitForItem } from './utils'\nimport { ZERO_BYTES32 } from './utils'\nimport {\n seedUidFromCreatedAttestationEvents,\n seedUidFromSeedPublished,\n versionUidFromCreatedAttestationEvents,\n uidsFromSeedPublished,\n listCreatedAttestationPairsFromReceipt,\n type CreatedAttestationPair,\n} from './seedUidHelpers'\nimport { attestationMsFromReceipt } from '../helpers/receiptAttestationMs'\nimport {\n normalizePublishRequest,\n applyPropertiesToUpdatePlaceholders,\n hasCrossPayloadUnresolved,\n filterPropertiesToUpdateForBatch,\n toHex32,\n} from './publishRequestNormalize'\nimport { enqueueArweaveL1FinalizeJobsFromPublishContext } from '../../arweaveL1Finalize/enqueue'\nimport { ensureEip7702ModularAccountReady } from '~/helpers/ensureEip7702ModularAccountReady'\nimport { ensureManagedAccountEasConfigured } from '~/helpers/ensureManagedAccountEasConfigured'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:actors')\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\ntype ReceiptLike = {\n blockNumber?: bigint\n logs?: Array<{ address?: string; data?: string; topics?: unknown[] }>\n}\n\ntype PublishRoutingInput = {\n useModularExecutor: boolean\n publisherAddress: string\n modularAccountModuleContract?: string\n managedAddress?: string\n}\n\ntype PublishRouting = {\n txTargetAddress: string\n contractAddressForEvents: string\n}\n\nexport function resolvePublishRouting(input: PublishRoutingInput): PublishRouting {\n const {\n useModularExecutor,\n publisherAddress,\n modularAccountModuleContract,\n managedAddress,\n } = input\n if (useModularExecutor) {\n if (!managedAddress) {\n throw new Error('resolvePublishRouting: managedAddress is required when useModularExecutor is true')\n }\n return {\n txTargetAddress: managedAddress,\n contractAddressForEvents: modularAccountModuleContract || managedAddress,\n }\n }\n return {\n txTargetAddress: publisherAddress,\n contractAddressForEvents: publisherAddress,\n }\n}\n\nasync function persistVersionUidFromPublishReceipt(params: {\n receipt: ReceiptLike\n seedLocalId: string | undefined\n versionSchemaUid: string | undefined\n contractAddressForEvents: string\n listOfAttestationsCount: number\n useModularExecutor: boolean\n publisherAddress: string\n}): Promise<void> {\n const {\n receipt,\n seedLocalId,\n versionSchemaUid,\n contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n publisherAddress,\n } = params\n if (!seedLocalId) return\n const raw =\n versionUidFromCreatedAttestationEvents(\n receipt,\n versionSchemaUid,\n useModularExecutor,\n ) ??\n uidsFromSeedPublished(\n receipt,\n contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n ).versionUid\n const versionUid = raw ? toHex32(raw) : undefined\n if (!versionUid || versionUid === ZERO_BYTES32) return\n const attMs = await attestationMsFromReceipt(getClient(), optimismSepolia, receipt)\n await updateVersionUid({\n seedLocalId,\n versionUid,\n publisher: publisherAddress,\n attestationCreatedAt: attMs,\n })\n}\n\nfunction schemaMatchesAttestationPair(\n pairSchema: string | undefined,\n requestSchema: string | undefined,\n): boolean {\n if (!pairSchema || !requestSchema) return false\n return toHex32(pairSchema).toLowerCase() === toHex32(requestSchema).toLowerCase()\n}\n\nfunction consumeIfSchemaMatches(\n all: CreatedAttestationPair[],\n offset: number,\n schemaUid: string | undefined,\n): number {\n if (!schemaUid || offset >= all.length) return offset\n if (schemaMatchesAttestationPair(all[offset]?.schemaUid, schemaUid)) return offset + 1\n return offset\n}\n\n/**\n * Walk CreatedAttestation event order (per request: optional seed, version, then property schemas)\n * and persist property attestation UIDs onto metadata rows.\n */\nasync function persistPropertyMetadataUidsFromContractReceipt(params: {\n receipt: ReceiptLike\n normalizedRequests: any[]\n useModularExecutor: boolean\n}): Promise<void> {\n const { receipt, normalizedRequests, useModularExecutor } = params\n const allPairs = listCreatedAttestationPairsFromReceipt(receipt, useModularExecutor)\n if (!allPairs.length) return\n const attMs = await attestationMsFromReceipt(getClient(), optimismSepolia, receipt)\n let offset = 0\n for (const req of normalizedRequests) {\n const list = req.listOfAttestations ?? []\n if (!list.length) continue\n const hadNewSeed = !req.seedUid || toHex32(req.seedUid) === ZERO_BYTES32\n if (hadNewSeed) {\n offset = consumeIfSchemaMatches(allPairs, offset, req.seedSchemaUid)\n }\n offset = consumeIfSchemaMatches(allPairs, offset, req.versionSchemaUid)\n const n = list.length\n const slice = allPairs.slice(offset, offset + n)\n offset += n\n if (!slice.length) continue\n const nApply = Math.min(slice.length, n)\n let versionUidRow =\n req.versionUid && toHex32(req.versionUid) !== ZERO_BYTES32\n ? toHex32(req.versionUid)\n : undefined\n if (!versionUidRow) {\n versionUidRow = versionUidFromCreatedAttestationEvents(\n receipt,\n req.versionSchemaUid,\n useModularExecutor,\n )\n }\n await applyPropertyAttestationUidsFromPublish({\n seedLocalId: req.localId,\n attestationCreatedAtMs: attMs ?? null,\n versionUid:\n versionUidRow && toHex32(versionUidRow) !== ZERO_BYTES32 ? toHex32(versionUidRow) : null,\n pairs: slice.slice(0, nApply).map((p, j) => ({\n schemaUid: p.schemaUid,\n attestationUid: p.attestationUid,\n propertyName:\n typeof list[j]?._propertyName === 'string' && list[j]._propertyName !== ''\n ? list[j]._propertyName\n : undefined,\n })),\n })\n }\n}\n\nexport const createAttestations = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<{ easPayload: unknown }> => {\n const { address, account } = context\n const arweaveTransactions = context.arweaveTransactions ?? []\n const publishUploads = context.publishUploads ?? []\n let { item } = context\n\n const { modularAccountModuleContract, useModularExecutor } = getPublishConfig()\n\n if (!address || typeof address !== 'string' || !address.trim()) {\n throw new Error('No wallet address for publish. Connect a wallet and try again.')\n }\n\n if (!account) {\n throw new Error('Wallet session is missing. Reconnect your wallet and retry the publish.')\n }\n\n if (!useModularExecutor && !(await isSmartWalletDeployed(address))) {\n throw new Error(\n 'EOA publishing must use the direct EAS path (multiPublish requires a deployed publisher contract). If you see this, attestation routing is misconfigured.',\n )\n }\n\n if (!item?.seedLocalId) {\n throw new Error(\n 'Attestation recovery failed: Item data is missing. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const waitForItemUsed = typeof item.getPublishUploads !== 'function'\n if (waitForItemUsed) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const txCount = arweaveTransactions.length\n const uploadCount = publishUploads.length\n if (txCount !== uploadCount) {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data is missing or incomplete. Delete this publish record and try a full publish from the beginning.',\n )\n }\n\n let routing = resolvePublishRouting({\n useModularExecutor: false,\n publisherAddress: address,\n })\n let activeAccount = account\n\n await ensureEasSchemasForItem(item, account, getClient(), optimismSepolia)\n\n const uploadDataWithTxIds: Array<PublishUpload & { txId: string }> = arweaveTransactions.map(\n (arweaveTransaction: ArweaveTransactionInfo, i: number) => {\n const tx = arweaveTransaction.transaction as { id?: string }\n const txId = tx?.id\n if (!txId || typeof txId !== 'string') {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data did not survive restore. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const upload = publishUploads[i] as PublishUpload | undefined\n if (!upload) throw new Error('Publish upload index mismatch')\n return { ...upload, txId }\n },\n )\n\n await verifyArweaveTransactionsExist(uploadDataWithTxIds.map((u) => u.txId))\n\n const requestData = await (\n item.getPublishPayload as (\n uploads: typeof uploadDataWithTxIds,\n opts?: { publishMode?: 'patch' | 'new_version' },\n ) => ReturnType<typeof item.getPublishPayload>\n )(uploadDataWithTxIds, { publishMode: context.publishMode ?? 'patch' })\n\n const reqs = Array.isArray(requestData) ? requestData : [requestData]\n\n if (useModularExecutor) {\n const prep = await runModularExecutorPublishPrep()\n if (!prep.ok) {\n throw prep.error\n }\n routing = resolvePublishRouting({\n useModularExecutor,\n publisherAddress: address,\n modularAccountModuleContract,\n managedAddress: prep.managedAddress,\n })\n const modularAccountWallet = getModularAccountWallet()\n await modularAccountWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const modularAccount = modularAccountWallet.getAccount()\n if (!modularAccount) {\n throw new Error('Failed to get modular account')\n }\n activeAccount = modularAccount\n await ensureEip7702ModularAccountReady()\n await ensureManagedAccountEasConfigured(prep.managedAddress, modularAccount)\n }\n const targetContract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: routing.txTargetAddress,\n })\n\n const needsSequential = reqs.length > 1 && hasCrossPayloadUnresolved(reqs)\n\n let effectiveRequests: any[]\n let lastAttestationReceipt: ReceiptLike | null = null\n\n if (needsSequential) {\n let workingPayload = structuredClone(reqs) as any[]\n const resolvedUids: Record<string, string> = {}\n\n for (let i = 0; i < workingPayload.length; i++) {\n workingPayload = await resolvePublishPayloadValues(workingPayload as any, resolvedUids)\n const rawReq = workingPayload[i]\n const batchLocalIds = new Set([rawReq.localId])\n const reqForPublish = {\n ...rawReq,\n propertiesToUpdate: filterPropertiesToUpdateForBatch(rawReq.propertiesToUpdate, batchLocalIds),\n }\n const normalizedOne = normalizePublishRequest(reqForPublish)\n const byLocalIdSingle = new Map([[normalizedOne.localId, normalizedOne]])\n applyPropertiesToUpdatePlaceholders([normalizedOne], byLocalIdSingle)\n\n const tx = {\n ...multiPublish({\n contract: targetContract,\n requests: [normalizedOne],\n }),\n gas: 5_000_000n,\n }\n\n const result = await sendTransaction({\n account: activeAccount,\n transaction: await Promise.resolve(tx),\n })\n\n const receipt = await waitForReceipt({\n client: getClient(),\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) {\n throw new Error('Failed to send transaction')\n }\n\n lastAttestationReceipt = receipt\n const listOfAttestationsCount = normalizedOne?.listOfAttestations?.length ?? 0\n await persistVersionUidFromPublishReceipt({\n receipt,\n seedLocalId: rawReq.localId,\n versionSchemaUid: normalizedOne.versionSchemaUid,\n contractAddressForEvents: routing.contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n publisherAddress: address,\n })\n\n const hadZeroSeedUid =\n !normalizedOne.seedUid || toHex32(normalizedOne.seedUid) === ZERO_BYTES32\n const seedSchemaUid = normalizedOne?.seedSchemaUid\n if (hadZeroSeedUid) {\n const seedUidFromTx =\n seedUidFromCreatedAttestationEvents(receipt, seedSchemaUid, useModularExecutor) ??\n seedUidFromSeedPublished(\n receipt,\n routing.contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n )\n if (seedUidFromTx) {\n resolvedUids[rawReq.localId] = seedUidFromTx\n workingPayload[i] = { ...workingPayload[i], seedUid: seedUidFromTx }\n }\n }\n\n await persistPropertyMetadataUidsFromContractReceipt({\n receipt,\n normalizedRequests: [normalizedOne],\n useModularExecutor,\n })\n }\n\n for (const p of workingPayload) {\n const id = p?.localId\n const su = p?.seedUid\n if (id && su && toHex32(su) !== ZERO_BYTES32) {\n resolvedUids[id] = toHex32(su)\n }\n }\n\n const fullyResolved = await resolvePublishPayloadValues(structuredClone(reqs), resolvedUids)\n effectiveRequests = fullyResolved.map((r: any) =>\n normalizePublishRequest({\n ...r,\n seedUid: resolvedUids[r.localId] ?? r.seedUid,\n }),\n )\n } else {\n const normalizedRequests = reqs.map((req: any) => normalizePublishRequest(req))\n\n const byLocalId = new Map(normalizedRequests.map((r: any) => [r?.localId, r]))\n applyPropertiesToUpdatePlaceholders(normalizedRequests, byLocalId)\n\n const payloadForContract = Array.isArray(requestData) ? normalizedRequests : [normalizedRequests[0]]\n const tx = {\n ...multiPublish({\n contract: targetContract,\n requests: payloadForContract,\n }),\n gas: 5_000_000n,\n }\n\n let result: Awaited<ReturnType<typeof sendTransaction>>\n try {\n result = await sendTransaction({\n account: activeAccount,\n transaction: await Promise.resolve(tx),\n })\n } catch (e) {\n logger('sendTransaction failed in non-sequential publish %O', e)\n throw e\n }\n\n const receipt = await waitForReceipt({\n client: getClient(),\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) {\n throw new Error('Failed to send transaction')\n }\n\n lastAttestationReceipt = receipt\n const rootReqSingle =\n normalizedRequests.find((r: any) => r?.localId === item.seedLocalId) ?? normalizedRequests[0]\n await persistVersionUidFromPublishReceipt({\n receipt,\n seedLocalId: rootReqSingle?.localId,\n versionSchemaUid: rootReqSingle?.versionSchemaUid,\n contractAddressForEvents: routing.contractAddressForEvents,\n listOfAttestationsCount: rootReqSingle?.listOfAttestations?.length ?? 0,\n useModularExecutor,\n publisherAddress: address,\n })\n\n await persistPropertyMetadataUidsFromContractReceipt({\n receipt,\n normalizedRequests: payloadForContract,\n useModularExecutor,\n })\n\n const firstRequest = normalizedRequests[0]\n const firstRequestSeedUid = firstRequest?.seedUid\n const hadZeroSeedUid = firstRequestSeedUid === ZERO_BYTES32 || !firstRequestSeedUid\n const listOfAttestationsCount = firstRequest?.listOfAttestations?.length ?? 0\n const seedSchemaUid = firstRequest?.seedSchemaUid\n const seedUidFromTx = hadZeroSeedUid\n ? (seedUidFromCreatedAttestationEvents(receipt, seedSchemaUid, useModularExecutor) ??\n seedUidFromSeedPublished(\n receipt,\n routing.contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n ))\n : undefined\n effectiveRequests =\n seedUidFromTx && normalizedRequests.length > 0\n ? [{ ...normalizedRequests[0], seedUid: seedUidFromTx }, ...normalizedRequests.slice(1)]\n : normalizedRequests\n }\n\n persistSeedUidFromPublishResult(item as { seedUid?: string; seedLocalId?: string }, effectiveRequests)\n const itemWithPersist = item as {\n persistSeedUid?: (publisher?: string, attestationCreatedAtMs?: number) => Promise<void>\n }\n const rootRequest = effectiveRequests.find((r) => r?.localId === item.seedLocalId)\n const rootSeedUid = rootRequest?.seedUid\n if (rootSeedUid && rootSeedUid !== ZERO_BYTES32) {\n const seedAttMs = lastAttestationReceipt\n ? await attestationMsFromReceipt(getClient(), optimismSepolia, lastAttestationReceipt)\n : undefined\n await persistSeedUidSafely(itemWithPersist, address, seedAttMs)\n }\n\n logger('requestData', requestData)\n\n void enqueueArweaveL1FinalizeJobsFromPublishContext(context)\n\n try {\n const { clearHtmlEmbeddedImageCoPublishRows } = await import('@seedprotocol/sdk')\n await clearHtmlEmbeddedImageCoPublishRows(item.seedLocalId)\n } catch {\n /* best-effort cleanup */\n }\n\n return { easPayload: requestData }\n },\n)\n","import { getItemPropertiesFromEas } from '@seedprotocol/sdk'\nimport { AttestationVerificationError } from '../../../errors'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:verifyAttestations')\n\nconst ZERO_BYTES32 = '0x' + '0'.repeat(64)\n\nconst BYTES32_LEN = 64\nconst toHex32 = (v: unknown): string => {\n if (v == null) return '0x' + '0'.repeat(BYTES32_LEN)\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n return '0x' + hex\n }\n return '0x' + '0'.repeat(BYTES32_LEN)\n}\n\n/** Delay between verification retries. EAS indexing can lag; longer delay improves success rate. */\nconst VERIFY_DELAY_MS = 5000\n/** Max retries before giving up. EAS indexing can take 10–30+ seconds in high load. */\nconst VERIFY_MAX_ATTEMPTS = 6\n\ntype NormalizedRequest = {\n localId: string\n versionUid: string\n listOfAttestations: Array<{ schema: string }>\n}\n\ntype VerifyAttestationsInput = {\n normalizedRequests: NormalizedRequest[]\n item: { seedLocalId: string }\n}\n\n/**\n * Verifies that property/metadata attestations created during publish exist on EAS.\n * Throws AttestationVerificationError if any expected attestations are missing.\n */\nexport async function verifyAttestations({\n normalizedRequests,\n item,\n}: VerifyAttestationsInput): Promise<void> {\n const seedLocalId = item.seedLocalId\n\n for (const request of normalizedRequests) {\n if (request.listOfAttestations.length === 0) continue\n if (request.versionUid === ZERO_BYTES32) continue\n\n const expectedSchemas = request.listOfAttestations.map((a) =>\n toHex32(a.schema).toLowerCase(),\n )\n\n let easProperties: { schemaId?: string }[] = []\n let lastError: unknown\n\n for (let attempt = 1; attempt <= VERIFY_MAX_ATTEMPTS; attempt++) {\n try {\n if (attempt > 1) {\n await new Promise((r) => setTimeout(r, VERIFY_DELAY_MS))\n }\n easProperties = await getItemPropertiesFromEas({\n versionUids: [request.versionUid],\n })\n break\n } catch (err) {\n lastError = err\n logger('verifyAttestations attempt %d failed:', attempt, err)\n if (attempt === VERIFY_MAX_ATTEMPTS) {\n logger('verifyAttestations: giving up after %d attempts', VERIFY_MAX_ATTEMPTS)\n throw lastError\n }\n }\n }\n\n const foundSchemas = easProperties\n .map((p) => (p.schemaId ? toHex32(p.schemaId).toLowerCase() : ''))\n .filter(Boolean)\n const foundSet = new Set(foundSchemas)\n\n const missing = expectedSchemas.filter((s) => !foundSet.has(s))\n if (missing.length > 0) {\n throw new AttestationVerificationError(\n `Publish verification failed: Seed and Version attestations were created, but ` +\n `property/metadata attestations are missing or incomplete. ` +\n `Expected ${expectedSchemas.length} property attestations for schema(s) ${expectedSchemas.join(', ')}; ` +\n `found ${foundSchemas.length}. ` +\n `Use PublishManager.retryAttestations('${seedLocalId}') to retry.`,\n seedLocalId,\n expectedSchemas,\n foundSchemas,\n 'METADATA_PROPERTIES_MISSING',\n )\n }\n }\n}\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport { ZERO_ADDRESS } from '@ethereum-attestation-service/eas-sdk'\nimport { sendTransaction, waitForReceipt } from 'thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getClient } from '~/helpers/thirdweb'\nimport {\n Item,\n updateVersionUid,\n applyPropertyAttestationUidsFromPublish,\n type IItem,\n} from '@seedprotocol/sdk'\nimport type { PublishUpload } from '../../../types'\nimport { persistSeedUidFromPublishResult, persistSeedUidSafely } from './persistSeedUid'\nimport { verifyAttestations } from '../helpers/verifyAttestations'\nimport { AttestationVerificationError } from '../../../errors'\nimport { ensureEasSchemasForItem } from '../helpers/ensureEasSchemas'\nimport { verifyArweaveTransactionsExist } from '../helpers/verifyArweaveTransactionsExist'\nimport { enqueueArweaveL1FinalizeJobsFromPublishContext } from '../../arweaveL1Finalize/enqueue'\nimport { getPublishConfig } from '~/config'\nimport { attestationMsFromReceipt } from '../helpers/receiptAttestationMs'\nimport {\n prepareEasAttest,\n prepareEasMultiAttest,\n encodeBytes32,\n ZERO_BYTES32,\n getAttestationUidFromReceipt,\n getAttestedUidsFromReceipt,\n type MultiAttestationRequest,\n} from '~/helpers/easDirect'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:createAttestationsDirectToEas')\n\nconst BYTES32_LEN = 64\nconst toHex32 = (v: unknown): string => {\n if (v == null) return '0x' + '0'.repeat(BYTES32_LEN)\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n return '0x' + hex\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n const hex = Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n return '0x' + hex.padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n }\n return '0x' + '0'.repeat(BYTES32_LEN)\n}\nconst toBytesHex = (v: unknown): string => {\n if (v == null || (typeof v === 'string' && (v === '' || v === '0x'))) return '0x'\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0')\n return '0x' + (hex.length % 2 === 1 ? '0' + hex : hex)\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n return '0x' + Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n return '0x'\n}\n\nconst waitForItem = async (seedLocalId: string): Promise<IItem<any>> => {\n let item: IItem<any> | undefined\n try {\n item = await Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n } catch {\n // No-op\n }\n if (item) return item\n return new Promise<IItem<any>>((resolve) => {\n const interval = setInterval(() => {\n try {\n Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n .then((found: IItem<any> | undefined) => {\n if (found) {\n clearInterval(interval)\n resolve(found)\n }\n })\n } catch {\n // No-op\n }\n }, 200)\n })\n}\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\ntype NormalizedRequest = {\n localId: string\n seedUid: string\n seedSchemaUid: string\n versionUid: string\n versionSchemaUid: string\n seedIsRevocable: boolean\n listOfAttestations: Array<{\n schema: string\n data: Array<{\n recipient: string\n expirationTime: bigint\n revocable: boolean\n refUID: string\n data: string\n value: bigint\n }>\n _propertyName?: string\n _propertyNameForSchema?: string\n }>\n propertiesToUpdate: Array<{ publishLocalId: string; propertySchemaUid: string }>\n}\n\nexport const createAttestationsDirectToEas = fromPromise(\n async ({ input: { context, event } }: PublishInput): Promise<{ easPayload: unknown }> => {\n const { address, account } = context\n const arweaveTransactions = context.arweaveTransactions ?? []\n const publishUploads = context.publishUploads ?? []\n let { item } = context\n\n if (!address || typeof address !== 'string' || !address.trim()) {\n throw new Error('No wallet address for publish. Connect a wallet and try again.')\n }\n\n if (!account) {\n throw new Error('Wallet session is missing. Reconnect your wallet and retry the publish.')\n }\n\n if (!item?.seedLocalId) {\n throw new Error(\n 'Attestation recovery failed: Item data is missing. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const waitForItemUsed = typeof item.getPublishUploads !== 'function'\n if (waitForItemUsed) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const txCount = arweaveTransactions.length\n const uploadCount = publishUploads.length\n if (txCount !== uploadCount) {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data is missing or incomplete. Delete this publish record and try a full publish from the beginning.',\n )\n }\n\n await ensureEasSchemasForItem(item, account, getClient(), optimismSepolia)\n\n const uploadDataWithTxIds: Array<PublishUpload & { txId: string }> = arweaveTransactions.map(\n (arweaveTransaction: ArweaveTransactionInfo, i: number) => {\n const tx = arweaveTransaction.transaction as { id?: string }\n const txId = tx?.id\n if (!txId || typeof txId !== 'string') {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data did not survive restore. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const upload = publishUploads[i] as PublishUpload | undefined\n if (!upload) throw new Error('Publish upload index mismatch')\n return { ...upload, txId }\n },\n )\n\n await verifyArweaveTransactionsExist(uploadDataWithTxIds.map((u) => u.txId))\n\n const requestData = await (\n item.getPublishPayload as (\n uploads: typeof uploadDataWithTxIds,\n opts?: { publishMode?: 'patch' | 'new_version' },\n ) => ReturnType<typeof item.getPublishPayload>\n )(uploadDataWithTxIds, { publishMode: context.publishMode ?? 'patch' })\n const reqs = Array.isArray(requestData) ? requestData : [requestData]\n\n const normalizedRequests: NormalizedRequest[] = reqs.map((req: any) => {\n const listOfAttestations = (req?.listOfAttestations ?? []).map((att: any) => {\n const dataArr = Array.isArray(att?.data) ? att.data : []\n return {\n schema: toHex32(att?.schema),\n data: dataArr.map((d: any) => ({\n ...d,\n refUID: toHex32(d?.refUID),\n data: toBytesHex(d?.data),\n })),\n ...(typeof att?._propertyName === 'string' && att._propertyName !== ''\n ? { _propertyName: att._propertyName }\n : {}),\n ...(typeof att?._propertyNameForSchema === 'string' && att._propertyNameForSchema !== ''\n ? { _propertyNameForSchema: att._propertyNameForSchema }\n : {}),\n }\n })\n const propertiesToUpdate = (req?.propertiesToUpdate ?? []).map((p: any) => ({\n ...p,\n propertySchemaUid: toHex32(p?.propertySchemaUid),\n }))\n return {\n ...req,\n seedUid: toHex32(req?.seedUid),\n seedSchemaUid: toHex32(req?.seedSchemaUid),\n versionUid: toHex32(req?.versionUid),\n versionSchemaUid: toHex32(req?.versionSchemaUid),\n listOfAttestations,\n propertiesToUpdate,\n }\n })\n\n const byLocalId = new Map(normalizedRequests.map((r) => [r.localId, r]))\n const placeholderData = {\n recipient: ZERO_ADDRESS,\n expirationTime: BigInt(0),\n revocable: true,\n refUID: ZERO_BYTES32,\n data: ZERO_BYTES32 as `0x${string}`,\n value: BigInt(0),\n }\n for (const req of normalizedRequests) {\n for (const pu of req.propertiesToUpdate ?? []) {\n const targetId = pu.publishLocalId\n const schemaUid = toHex32(pu.propertySchemaUid)\n if (!targetId || !schemaUid) continue\n const targetReq = byLocalId.get(targetId)\n if (!targetReq?.listOfAttestations) continue\n const att = targetReq.listOfAttestations.find(\n (a) => toHex32(a?.schema)?.toLowerCase() === schemaUid?.toLowerCase(),\n )\n if (!att) continue\n if (!Array.isArray(att.data) || att.data.length === 0) {\n att.data = [{ ...placeholderData, refUID: ZERO_BYTES32 }]\n }\n }\n }\n\n const client = getClient()\n let lastAttestationMs = Date.now()\n\n for (let i = 0; i < normalizedRequests.length; i++) {\n const request = normalizedRequests[i] as NormalizedRequest\n let newSeedUid = request.seedUid\n let newVersionUid = request.versionUid\n\n if (newSeedUid === ZERO_BYTES32) {\n const attestTx = prepareEasAttest(client, optimismSepolia, {\n schema: request.seedSchemaUid as `0x${string}`,\n data: {\n refUID: ZERO_BYTES32,\n data: encodeBytes32(request.seedSchemaUid as `0x${string}`),\n revocable: request.seedIsRevocable,\n },\n })\n const result = await sendTransaction({ account, transaction: attestTx })\n const receipt = await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) throw new Error('Failed to create Seed attestation')\n lastAttestationMs = await attestationMsFromReceipt(client, optimismSepolia, receipt)\n const { easContractAddress } = getPublishConfig()\n const seedUidFromReceipt = getAttestationUidFromReceipt(receipt, easContractAddress)\n if (!seedUidFromReceipt || seedUidFromReceipt === ZERO_BYTES32) {\n throw new Error('Failed to get Seed UID from attestation receipt')\n }\n newSeedUid = seedUidFromReceipt\n request.seedUid = seedUidFromReceipt\n logger('created Seed attestation', newSeedUid)\n }\n\n if (newSeedUid !== ZERO_BYTES32 && newVersionUid === ZERO_BYTES32) {\n const attestTx = prepareEasAttest(client, optimismSepolia, {\n schema: request.versionSchemaUid as `0x${string}`,\n data: {\n refUID: newSeedUid as `0x${string}`,\n data: encodeBytes32(request.versionSchemaUid as `0x${string}`),\n revocable: true,\n },\n })\n const result = await sendTransaction({ account, transaction: attestTx })\n const receipt = await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) throw new Error('Failed to create Version attestation')\n lastAttestationMs = await attestationMsFromReceipt(client, optimismSepolia, receipt)\n const { easContractAddress } = getPublishConfig()\n const versionUidFromReceipt = getAttestationUidFromReceipt(receipt, easContractAddress)\n if (!versionUidFromReceipt || versionUidFromReceipt === ZERO_BYTES32) {\n throw new Error('Failed to get Version UID from attestation receipt')\n }\n newVersionUid = versionUidFromReceipt\n request.versionUid = versionUidFromReceipt\n await updateVersionUid({\n seedLocalId: request.localId,\n versionUid: versionUidFromReceipt,\n publisher: address,\n attestationCreatedAt: lastAttestationMs,\n })\n logger('created Version attestation', newVersionUid)\n }\n\n for (const att of request.listOfAttestations) {\n for (const d of att.data) {\n d.refUID = newVersionUid\n }\n }\n\n for (const pu of request.propertiesToUpdate ?? []) {\n const targetReq = byLocalId.get(pu.publishLocalId)\n if (!targetReq?.listOfAttestations) continue\n const schemaUid = toHex32(pu.propertySchemaUid)\n const att = targetReq.listOfAttestations.find(\n (a) => toHex32(a?.schema)?.toLowerCase() === schemaUid?.toLowerCase(),\n )\n if (!att?.data?.[0]) continue\n att.data[0].data = encodeBytes32(newSeedUid as `0x${string}`)\n }\n\n const multiRequests: MultiAttestationRequest[] = request.listOfAttestations.map((att) => ({\n schema: att.schema as `0x${string}`,\n data: att.data.map((d) => ({\n recipient: (d.recipient ?? ZERO_ADDRESS) as `0x${string}`,\n expirationTime: d.expirationTime ?? 0n,\n revocable: d.revocable ?? true,\n refUID: (d.refUID ?? ZERO_BYTES32) as `0x${string}`,\n data: (d.data ?? '0x') as `0x${string}`,\n value: d.value ?? 0n,\n })),\n }))\n\n if (multiRequests.length > 0) {\n const multiTx = prepareEasMultiAttest(client, optimismSepolia, multiRequests)\n const result = await sendTransaction({ account, transaction: multiTx })\n const receipt = await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) throw new Error('Failed to create property attestations')\n lastAttestationMs = await attestationMsFromReceipt(client, optimismSepolia, receipt)\n logger('created property attestations for request', i)\n const { easContractAddress } = getPublishConfig()\n const attested = getAttestedUidsFromReceipt(receipt, easContractAddress)\n const list = request.listOfAttestations\n const sameLen = attested.length === list.length\n await applyPropertyAttestationUidsFromPublish({\n seedLocalId: request.localId,\n attestationCreatedAtMs: lastAttestationMs ?? null,\n versionUid: newVersionUid !== ZERO_BYTES32 ? newVersionUid : null,\n pairs: attested.map((a, j) => ({\n schemaUid: a.schemaUid,\n attestationUid: a.uid,\n propertyName:\n sameLen && typeof list[j]?._propertyName === 'string' && list[j]!._propertyName !== ''\n ? list[j]!._propertyName\n : undefined,\n })),\n })\n }\n }\n\n persistSeedUidFromPublishResult(item as { seedUid?: string }, normalizedRequests)\n const itemWithPersist = item as {\n persistSeedUid?: (publisher?: string, attestationCreatedAtMs?: number) => Promise<void>\n }\n if (normalizedRequests[0]?.seedUid && normalizedRequests[0].seedUid !== ZERO_BYTES32) {\n await persistSeedUidSafely(itemWithPersist, address, lastAttestationMs)\n }\n\n try {\n await verifyAttestations({ normalizedRequests, item })\n } catch (err) {\n if (err instanceof AttestationVerificationError) {\n throw err\n }\n logger('verifyAttestations failed (non-verification error):', err)\n throw err\n }\n\n logger('direct EAS publish complete')\n\n void enqueueArweaveL1FinalizeJobsFromPublishContext(context)\n\n try {\n const { clearHtmlEmbeddedImageCoPublishRows } = await import('@seedprotocol/sdk')\n await clearHtmlEmbeddedImageCoPublishRows(item.seedLocalId)\n } catch {\n /* best-effort cleanup */\n }\n\n return { easPayload: requestData }\n },\n)\n","import { Item, itemHasPublishUploadCandidates, type IItem } from '@seedprotocol/sdk'\n\n/**\n * Resolve a full Item (with getPublishUploads) by seedLocalId, polling until found.\n * Used when the input item might not have the data needed for the \"needs Arweave\" check.\n */\nconst resolveItem = async (seedLocalId: string): Promise<IItem<any>> => {\n let item: IItem<any> | undefined\n try {\n item = await Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n } catch {\n // No-op: Error is intentionally ignored\n }\n if (item) return item\n\n return new Promise<IItem<any>>((resolve) => {\n const interval = setInterval(() => {\n Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n .then((found: IItem<any> | undefined) => {\n if (found) {\n clearInterval(interval)\n resolve(found)\n }\n })\n .catch(() => {})\n }, 200)\n })\n}\n\n/**\n * Returns true if the item needs the Arweave upload path (reimbursement, poll, upload)\n * before creating attestations. Returns false when the item has no storage or no values\n * to upload, in which case the publish flow can skip straight to EAS.\n *\n * Uses {@link itemHasPublishUploadCandidates} (local paths / storage seeds only) so we do not\n * create Arweave transactions or call the network here — {@link getPublishUploads} builds txs\n * and can throw (e.g. gateway unreachable) even when uploads are required.\n */\nexport async function itemNeedsArweaveUpload(item: IItem<any>): Promise<boolean> {\n const usedPassedItem = typeof item.getPublishUploads === 'function'\n const resolved = usedPassedItem\n ? item\n : await resolveItem(item.seedLocalId)\n const needs = await itemHasPublishUploadCandidates(resolved)\n return needs\n}\n","import type { PublishMachineContext } from '../../../types'\n\ntype FromCallbackInput<T> = { context: T; event?: unknown }\nimport { EventObject, fromCallback } from 'xstate'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getClient, isSmartWalletDeployed } from '~/helpers/thirdweb'\nimport { itemNeedsArweaveUpload } from '../helpers/itemNeedsArweave'\nimport { ensureEasSchemasForItem } from '../helpers/ensureEasSchemas'\nimport { isItemOwned, validateItemForPublish } from '@seedprotocol/sdk'\nimport { getPublishConfig } from '~/config'\n\nconst activePublishProcesses = new Set<string>()\n\nasync function resolveAttestationStrategy(publisherAddress: string): Promise<'multiPublish' | 'directEas'> {\n const cfg = getPublishConfig()\n if (cfg.useDirectEas) return 'directEas'\n if (cfg.useModularExecutor) return 'multiPublish'\n const deployed = await isSmartWalletDeployed(publisherAddress)\n return deployed ? 'multiPublish' : 'directEas'\n}\n\nexport const checking = fromCallback<EventObject, FromCallbackInput<PublishMachineContext>>(\n ({ sendBack, input: { context } }) => {\n const { item, account, publishMode, address } = context\n\n const _check = async () => {\n const owned = await isItemOwned(item)\n if (!owned) {\n sendBack({ type: 'notOwner' })\n return\n }\n\n if (activePublishProcesses.has(item.seedLocalId)) {\n sendBack({\n type: 'redundantPublishProcess',\n })\n return\n }\n\n activePublishProcesses.add(item.seedLocalId)\n\n try {\n if (account) {\n await ensureEasSchemasForItem(item, account, getClient(), optimismSepolia)\n }\n\n const validation = await (validateItemForPublish as any)(item, [], {\n publishMode: publishMode ?? 'patch',\n })\n if (!validation.isValid) {\n activePublishProcesses.delete(item.seedLocalId)\n sendBack({ type: 'validationFailed', errors: validation.errors })\n return\n }\n\n if (!address || typeof address !== 'string' || !address.trim()) {\n activePublishProcesses.delete(item.seedLocalId)\n sendBack({\n type: 'validationFailed',\n errors: [{ message: 'No publisher address for publish. Connect a wallet and try again.' }],\n })\n return\n }\n\n let attestationStrategy: 'multiPublish' | 'directEas'\n try {\n attestationStrategy = await resolveAttestationStrategy(address.trim())\n } catch (cause) {\n activePublishProcesses.delete(item.seedLocalId)\n sendBack({\n type: 'checkingFailed',\n error: new Error(\n 'Could not verify whether the publisher is a deployed contract on Optimism Sepolia. Check your RPC connection and retry.',\n { cause },\n ),\n })\n return\n }\n\n const needsArweave = await itemNeedsArweaveUpload(item)\n const useBundler = getPublishConfig().useArweaveBundler\n const payload = { attestationStrategy } as const\n if (needsArweave) {\n if (useBundler) {\n sendBack({ type: 'validPublishProcessBundler', ...payload })\n } else {\n sendBack({ type: 'validPublishProcess', ...payload })\n }\n } else {\n sendBack({ type: 'skipArweave', ...payload })\n }\n } catch (err) {\n activePublishProcesses.delete(item.seedLocalId)\n console.error('[checking] failed', err)\n sendBack({\n type: 'checkingFailed',\n error: err instanceof Error ? err : new Error(String(err)),\n })\n }\n }\n\n _check().catch((err) => {\n activePublishProcesses.delete(item.seedLocalId)\n console.error('[checking] unhandled rejection', err)\n sendBack({\n type: 'checkingFailed',\n error: err instanceof Error ? err : new Error(String(err)),\n })\n })\n\n return () => {\n activePublishProcesses.delete(item.seedLocalId)\n }\n },\n)\n","import type { Account } from 'thirdweb/wallets'\nimport type { ActorRefFrom } from 'xstate'\nimport { setup, assign } from 'xstate'\nimport {\n ArweaveTransactionInfo,\n PublishMachineContext,\n ReimbursementResponse,\n PublishUpload,\n} from '../../types'\nimport {\n createArweaveTransactions,\n createArweaveTransactionsPhase2,\n createArweaveDataItems,\n createArweaveDataItemsPhase2,\n createAttestations,\n createAttestationsDirectToEas,\n sendReimbursementRequest,\n pollForConfirmation,\n uploadData,\n uploadViaBundler,\n checking,\n preparingHtmlEmbedded,\n rewritingHtmlEmbedded,\n} from './actors'\nimport {\n PublishMachineStates,\n} from '~/helpers/constants'\nimport { getPublishConfig } from '~/config'\n\n\nconst {\n SUCCESS,\n FAILURE,\n} = PublishMachineStates\n\n/** Prefer context from `checking`; fall back to `useDirectEas` for restored snapshots without `attestationStrategy`. */\nfunction attestationUsesDirectEas(context: Partial<PublishMachineContext>): boolean {\n const s = context.attestationStrategy\n if (s === 'directEas') return true\n if (s === 'multiPublish') return false\n return getPublishConfig().useDirectEas\n}\n\nfunction attestationUsesMultiPublish(context: Partial<PublishMachineContext>): boolean {\n const s = context.attestationStrategy\n if (s === 'multiPublish') return true\n if (s === 'directEas') return false\n return !getPublishConfig().useDirectEas\n}\n\n/** Extract error from event. Supports event.error (custom events like uploadError) and event.data (XState fromPromise invoke errors). */\nfunction getErrorFromEvent(event: unknown): unknown {\n const e = event as { error?: unknown; data?: unknown }\n return e.error ?? e.data\n}\n\nexport const publishMachine = setup({\n types : {\n context : {} as Partial<PublishMachineContext>,\n input : {} as Partial<PublishMachineContext> | undefined,\n },\n actors : {\n createArweaveTransactions,\n createArweaveTransactionsPhase2,\n createArweaveDataItems,\n createArweaveDataItemsPhase2,\n sendReimbursementRequest,\n pollForConfirmation,\n uploadData,\n uploadViaBundler,\n createAttestations,\n createAttestationsDirectToEas,\n checking,\n preparingHtmlEmbedded,\n rewritingHtmlEmbedded,\n },\n actions : {\n /** Log error; error/errorStep are assigned per transition. Supports both event.error (custom events) and event.data (XState fromPromise invoke errors). */\n handleError : ( { event, }, ) => {\n const err = getErrorFromEvent(event,)\n if (err != null) {\n console.error(err,)\n } else {\n console.error('Unknown error (full event):', event,)\n }\n },\n assignErrorCreatingArweaveTransactions : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveTransactions',\n },),\n assignErrorCreatingArweaveDataItems : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveDataItems',\n },),\n assignErrorSendingReimbursementRequest : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'sendingReimbursementRequest',\n },),\n assignErrorPollingForConfirmation : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'pollingForConfirmation',\n },),\n assignErrorUploadingData : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingData',\n },),\n assignErrorPreparingHtmlEmbedded : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'preparingHtmlEmbedded',\n },),\n assignErrorRewritingHtmlEmbedded : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'rewritingHtmlEmbedded',\n },),\n assignErrorCreatingArweaveTransactionsPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveTransactionsPhase2',\n },),\n assignErrorUploadingDataPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingDataPhase2',\n },),\n assignErrorUploadingViaBundler : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingViaBundler',\n },),\n assignErrorCreatingArweaveDataItemsPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveDataItemsPhase2',\n },),\n assignErrorUploadingViaBundlerPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingViaBundlerPhase2',\n },),\n assignErrorCreatingAttestations : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingAttestations',\n },),\n assignErrorCreatingAttestationsDirectToEas : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingAttestationsDirectToEas',\n },),\n assignAccountFromRetry : assign({\n account : ( { event, }, ) => (event as { account?: Account }).account,\n },),\n assignErrorNotOwner : assign({\n error : () => new Error('Item is read-only: you do not own this item. Only the publisher can publish.'),\n errorStep : () => 'checking',\n },),\n assignErrorValidationFailed : assign({\n error : ( { event, }, ) => {\n const ev = event as { errors?: Array<{ field?: string; message: string }> }\n const errors = ev.errors ?? []\n const message = errors.length > 0\n ? `Validation failed (${errors.length} error${errors.length === 1 ? '' : 's'}):\\n${errors.map((e) => e.message).join('\\n')}`\n : 'Validation failed'\n const err = new Error(message) as Error & { validationErrors?: typeof errors }\n err.validationErrors = errors\n return err\n },\n errorStep : () => 'checking',\n },),\n assignErrorCheckingFailed : assign({\n error : ({ event }) => {\n const ev = event as { error?: unknown }\n const e = ev.error\n return e instanceof Error ? e : new Error(String(e ?? 'Publish check failed'))\n },\n errorStep : () => 'checking',\n },),\n },\n\n},).createMachine({\n id : 'publish',\n initial : 'checking',\n context : ( { input, }, ) => input as PublishMachineContext,\n states : {\n checking : {\n on: {\n notOwner: {\n target: FAILURE,\n actions: ['assignErrorNotOwner', 'handleError'],\n },\n validationFailed: {\n target: FAILURE,\n actions: ['assignErrorValidationFailed', 'handleError'],\n },\n redundantPublishProcess: {\n target: 'stopping',\n },\n checkingFailed: {\n target: FAILURE,\n actions: ['assignErrorCheckingFailed', 'handleError'],\n },\n validPublishProcess: {\n target: 'preparingHtmlEmbedded',\n actions: assign({\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n validPublishProcessBundler: {\n target: 'preparingHtmlEmbedded',\n actions: assign({\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n skipArweave: [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n arweaveTransactions: () => [],\n publishUploads: () => [],\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n arweaveTransactions: () => [],\n publishUploads: () => [],\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n ],\n },\n invoke : {\n src : 'checking',\n input : ( { context } ) => ({ context } as { context: PublishMachineContext }),\n },\n },\n preparingHtmlEmbedded: {\n invoke: {\n src: 'preparingHtmlEmbedded',\n input: ({ context }) => ({ context } as { context: PublishMachineContext }),\n onDone: [\n {\n guard: () => getPublishConfig().useArweaveBundler,\n target: 'creatingArweaveDataItems',\n actions: assign({\n htmlEmbeddedDeferredHtmlSeedLocalIds: ({ event }) =>\n (event.output as { deferredHtmlSeedLocalIds: string[] }).deferredHtmlSeedLocalIds,\n }),\n },\n {\n target: 'creatingArweaveTransactions',\n actions: assign({\n htmlEmbeddedDeferredHtmlSeedLocalIds: ({ event }) =>\n (event.output as { deferredHtmlSeedLocalIds: string[] }).deferredHtmlSeedLocalIds,\n }),\n },\n ],\n onError: {\n target: FAILURE,\n actions: ['assignErrorPreparingHtmlEmbedded', 'handleError'],\n },\n },\n },\n creatingArweaveTransactions : {\n invoke : {\n src : 'createArweaveTransactions',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'sendingReimbursementRequest',\n actions : assign({\n arweaveTransactions : ( { event, }, ) => event.output.arweaveTransactions as ArweaveTransactionInfo[],\n publishUploads : ( { event, }, ) => event.output.publishUploads as PublishUpload[],\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorCreatingArweaveTransactions', 'handleError', ],\n },\n },\n },\n creatingArweaveDataItems : {\n invoke : {\n src : 'createArweaveDataItems',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'uploadingViaBundler',\n actions : assign({\n arweaveTransactions : ( { event, }, ) => event.output.arweaveTransactions as ArweaveTransactionInfo[],\n publishUploads : ( { event, }, ) => event.output.publishUploads as PublishUpload[],\n signedDataItems : ( { event, }, ) => (event.output as { signedDataItems?: { id: string; raw: Uint8Array }[] }).signedDataItems,\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorCreatingArweaveDataItems', 'handleError', ],\n },\n },\n },\n sendingReimbursementRequest : {\n invoke : {\n src : 'sendReimbursementRequest',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'pollingForConfirmation',\n actions : assign({\n requestResponse : ( { event, }, ) => event.output as ReimbursementResponse,\n reimbursementTransactionId : ( { event, }, ) => (event.output as ReimbursementResponse).transactionId as string,\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorSendingReimbursementRequest', 'handleError', ],\n },\n },\n },\n pollingForConfirmation : {\n invoke : {\n src : 'pollForConfirmation',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'uploadingData',\n actions : assign({\n reimbursementConfirmed : true,\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorPollingForConfirmation', 'handleError', ],\n },\n }\n },\n uploadingViaBundler : {\n on : {\n uploadComplete : [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n {\n guard: (args) =>\n ((args.context?.htmlEmbeddedDeferredHtmlSeedLocalIds?.length ?? 0) > 0),\n target: 'rewritingHtmlEmbedded',\n actions: assign({\n htmlEmbeddedPhase1PublishUploads: ({ context }) =>\n (context.publishUploads ?? []) as PublishUpload[],\n htmlEmbeddedPhase1ArweaveTransactions: ({ context }) =>\n (context.arweaveTransactions ?? []) as ArweaveTransactionInfo[],\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n ],\n uploadError : {\n target : 'failure',\n actions : [ 'assignErrorUploadingViaBundler', 'handleError', ],\n },\n },\n invoke : {\n src : 'uploadViaBundler',\n input : ( { context } ) => ({ context }) as { context: PublishMachineContext },\n },\n },\n creatingArweaveDataItemsPhase2: {\n invoke: {\n src: 'createArweaveDataItemsPhase2',\n input: ({ context, event }) =>\n ({ context, event }) as { context: PublishMachineContext; event: unknown },\n onDone: {\n target: 'uploadingViaBundlerPhase2',\n actions: assign({\n arweaveTransactions: ({ event }) =>\n (event.output as { arweaveTransactions: ArweaveTransactionInfo[] }).arweaveTransactions,\n publishUploads: ({ event }) =>\n (event.output as { publishUploads: PublishUpload[] }).publishUploads,\n signedDataItems: ({ event }) =>\n (event.output as { signedDataItems?: PublishMachineContext['signedDataItems'] })\n .signedDataItems,\n uploaderState: () => undefined,\n currentTransactionIndex: () => undefined,\n }),\n },\n onError: {\n target: FAILURE,\n actions: ['assignErrorCreatingArweaveDataItemsPhase2', 'handleError'],\n },\n },\n },\n uploadingViaBundlerPhase2: {\n on: {\n uploadComplete: [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n publishUploads: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1PublishUploads ?? []) as PublishUpload[]),\n ...((context.publishUploads ?? []) as PublishUpload[]),\n ],\n arweaveTransactions: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1ArweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ...((context.arweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ],\n }),\n },\n ],\n uploadError: {\n target: FAILURE,\n actions: ['assignErrorUploadingViaBundlerPhase2', 'handleError'],\n },\n },\n invoke: {\n src: 'uploadViaBundler',\n input: ({ context }) => ({ context }) as { context: PublishMachineContext },\n },\n },\n uploadingData : {\n on : {\n updatePercentage : {\n actions : assign({\n completionPercentage : ( { event, }, ) => {\n const ev = event as { completionPercentage?: number }\n return ev.completionPercentage as number\n },\n uploaderState : ( { event, }, ) =>\n (event as { uploaderState?: PublishMachineContext['uploaderState'] }).uploaderState,\n currentTransactionIndex : ( { event, }, ) =>\n (event as { currentTransactionIndex?: number }).currentTransactionIndex,\n },),\n },\n uploadComplete : [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n }),\n },\n {\n guard: (args) =>\n ((args.context?.htmlEmbeddedDeferredHtmlSeedLocalIds?.length ?? 0) > 0),\n target: 'rewritingHtmlEmbedded',\n actions: assign({\n htmlEmbeddedPhase1PublishUploads: ({ context }) =>\n (context.publishUploads ?? []) as PublishUpload[],\n htmlEmbeddedPhase1ArweaveTransactions: ({ context }) =>\n (context.arweaveTransactions ?? []) as ArweaveTransactionInfo[],\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n }),\n },\n ],\n uploadError : {\n target : 'failure',\n actions : [ 'assignErrorUploadingData', 'handleError', ],\n },\n },\n invoke : {\n src : 'uploadData',\n input : ( { context } ) => ({ context }) as { context: PublishMachineContext },\n },\n },\n rewritingHtmlEmbedded: {\n invoke: {\n src: 'rewritingHtmlEmbedded',\n input: ({ context }) => ({ context }) as { context: PublishMachineContext },\n onDone: [\n {\n guard: () => !getPublishConfig().useArweaveBundler,\n target: 'creatingArweaveTransactionsPhase2',\n },\n {\n guard: () => getPublishConfig().useArweaveBundler,\n target: 'creatingArweaveDataItemsPhase2',\n },\n ],\n onError: {\n target: FAILURE,\n actions: ['assignErrorRewritingHtmlEmbedded', 'handleError'],\n },\n },\n },\n creatingArweaveTransactionsPhase2: {\n invoke: {\n src: 'createArweaveTransactionsPhase2',\n input: ({ context, event }) =>\n ({ context, event }) as { context: PublishMachineContext; event: unknown },\n onDone: {\n target: 'uploadingDataPhase2',\n actions: assign({\n arweaveTransactions: ({ event }) =>\n (event.output as { arweaveTransactions: ArweaveTransactionInfo[] }).arweaveTransactions,\n publishUploads: ({ event }) =>\n (event.output as { publishUploads: PublishUpload[] }).publishUploads,\n uploaderState: () => undefined,\n currentTransactionIndex: () => undefined,\n }),\n },\n onError: {\n target: FAILURE,\n actions: ['assignErrorCreatingArweaveTransactionsPhase2', 'handleError'],\n },\n },\n },\n uploadingDataPhase2: {\n on: {\n updatePercentage: {\n actions: assign({\n completionPercentage: ({ event }) => {\n const ev = event as { completionPercentage?: number }\n return ev.completionPercentage as number\n },\n uploaderState: ({ event }) =>\n (event as { uploaderState?: PublishMachineContext['uploaderState'] }).uploaderState,\n currentTransactionIndex: ({ event }) =>\n (event as { currentTransactionIndex?: number }).currentTransactionIndex,\n }),\n },\n uploadComplete: [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n publishUploads: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1PublishUploads ?? []) as PublishUpload[]),\n ...((context.publishUploads ?? []) as PublishUpload[]),\n ],\n arweaveTransactions: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1ArweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ...((context.arweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ],\n }),\n },\n ],\n uploadError: {\n target: FAILURE,\n actions: ['assignErrorUploadingDataPhase2', 'handleError'],\n },\n },\n invoke: {\n src: 'uploadData',\n input: ({ context }) => ({ context }) as { context: PublishMachineContext },\n },\n },\n creatingAttestations : {\n invoke : {\n src : 'createAttestations',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : SUCCESS,\n actions : assign({\n easPayload : ( { event, }, ) => (event.output as { easPayload?: unknown })?.easPayload,\n },),\n },\n onError : {\n target : 'attestationFailureRecoverable',\n actions : [ 'assignErrorCreatingAttestations', 'handleError', ],\n },\n },\n },\n attestationFailureRecoverable : {\n on : {\n retry : {\n target : 'creatingAttestations',\n actions : [ 'assignAccountFromRetry', ],\n },\n },\n },\n creatingAttestationsDirectToEas : {\n invoke : {\n src : 'createAttestationsDirectToEas',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : SUCCESS,\n actions : assign({\n easPayload : ( { event, }, ) => (event.output as { easPayload?: unknown })?.easPayload,\n },),\n },\n onError : {\n target : 'attestationFailureRecoverableDirectToEas',\n actions : [ 'assignErrorCreatingAttestationsDirectToEas', 'handleError', ],\n },\n },\n },\n attestationFailureRecoverableDirectToEas : {\n on : {\n retry : {\n target : 'creatingAttestationsDirectToEas',\n actions : [ 'assignAccountFromRetry', ],\n },\n },\n },\n stopping: {\n entry: ( { context }: { context: Partial<PublishMachineContext> } ) => {\n console.log(`Actor for ${context.item?.seedLocalId} stopped`,)\n },\n type: 'final',\n },\n [SUCCESS] : {\n type : 'final',\n },\n [FAILURE] : {\n type : 'final',\n },\n },\n})\n\nexport type PublishActor = ActorRefFrom<typeof publishMachine>\n","/**\n * Holds a reference to the PublishManager service to avoid circular imports.\n * Subscribe actor uses this to call savePublish and onPublishDone.\n */\nexport type PublishManagerRef = {\n savePublish: (\n seedLocalId: string,\n publishProcess: { getPersistedSnapshot?: () => unknown; getSnapshot: () => unknown },\n options?: { triggerPublishDone?: boolean }\n ) => void\n onPublishDone: (seedLocalId: string) => void\n removeSubscription: (seedLocalId: string) => void\n}\n\nlet ref: PublishManagerRef | null = null\n\nexport function setPublishManagerRef(r: PublishManagerRef) {\n ref = r\n}\n\nexport function getPublishManagerRef(): PublishManagerRef | null {\n return ref\n}\n","import { fromCallback, EventObject } from 'xstate'\nimport { getPublishManagerRef } from '../publishManagerRef'\nimport {\n LONG_RUNNING_PUBLISH_STATES,\n PERIODIC_SAVE_INTERVAL_MS,\n} from '~/helpers/constants'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:PublishManager:actors:subscribe')\n\nfunction getStateValue(snapshot: { value?: unknown }): string {\n const v = snapshot.value\n if (typeof v === 'string') return v\n if (v && typeof v === 'object') {\n const keys = Object.keys(v)\n return (keys[0] ?? '') as string\n }\n return ''\n}\n\nfunction isLongRunningState(stateValue: string): boolean {\n return LONG_RUNNING_PUBLISH_STATES.includes(stateValue as (typeof LONG_RUNNING_PUBLISH_STATES)[number])\n}\n\nexport interface SubscribeInput {\n publishProcess: import('xstate').ActorRef<any, any>\n seedLocalId: string\n}\n\nexport const subscribe = fromCallback<EventObject, SubscribeInput>(\n ({ receive, input: { publishProcess, seedLocalId } }) => {\n const managerRef = getPublishManagerRef()\n let periodicSaveIntervalId: ReturnType<typeof setInterval> | null = null\n\n const clearPeriodicSave = () => {\n if (periodicSaveIntervalId != null) {\n clearInterval(periodicSaveIntervalId)\n periodicSaveIntervalId = null\n }\n }\n\n const startPeriodicSaveIfNeeded = (snapshot: { value?: unknown }) => {\n const stateValue = getStateValue(snapshot)\n if (isLongRunningState(stateValue) && periodicSaveIntervalId == null && managerRef) {\n periodicSaveIntervalId = setInterval(() => {\n // Timer callbacks can run after transition to a non-long-running state or after\n // completion (clearInterval does not remove an already-queued task). Never persist\n // in that case — matches ~30s regressions seen as \"Creating attestations\" again.\n try {\n const live = publishProcess.getSnapshot() as { status?: string; value?: unknown }\n if (live.status === 'done') {\n clearPeriodicSave()\n return\n }\n const liveValue = getStateValue(live)\n if (!isLongRunningState(liveValue)) {\n clearPeriodicSave()\n return\n }\n } catch {\n return\n }\n managerRef?.savePublish(seedLocalId, publishProcess)\n }, PERIODIC_SAVE_INTERVAL_MS)\n } else if (!isLongRunningState(stateValue)) {\n clearPeriodicSave()\n }\n }\n\n const subscription = publishProcess.subscribe(async (snapshot) => {\n logger('Publish state:', snapshot.value)\n if (managerRef) {\n if (snapshot.status === 'done') {\n clearPeriodicSave()\n // Save first, then onPublishDone is triggered only after save completes (via SAVE_PUBLISH_DONE)\n managerRef.savePublish(seedLocalId, publishProcess, { triggerPublishDone: true })\n } else {\n managerRef.savePublish(seedLocalId, publishProcess)\n startPeriodicSaveIfNeeded(snapshot)\n }\n }\n })\n\n receive(({ type }) => {\n if (type === 'UNSUBSCRIBE') {\n logger('Received UNSUBSCRIBE event')\n clearPeriodicSave()\n subscription.unsubscribe()\n managerRef?.removeSubscription(seedLocalId)\n }\n })\n }\n)\n","import type { Item } from '@seedprotocol/sdk'\nimport type { Account } from 'thirdweb/wallets'\nimport { enqueueActions } from 'xstate'\nimport { getPublishConfig } from '~/config'\nimport { publishMachine } from '../../publish'\nimport { subscribe } from '../actors/subscribe'\n\nexport const createPublish = enqueueActions(({ event, enqueue }) => {\n const ev = event as unknown as {\n item: Item<any>\n address?: string\n account?: unknown\n options?: import('~/config').CreatePublishOptions\n }\n const { item, address, account, options } = ev\n\n const hasAddress = address != null && typeof address === 'string' && address.trim().length > 0\n if (!hasAddress) {\n console.warn('[createPublish] No valid wallet address; skipping spawn.')\n return\n }\n\n enqueue.assign(({ context, spawn }) => {\n const { publishProcesses } = context\n if (publishProcesses && publishProcesses.has(item.seedLocalId)) {\n console.warn(`Publish process with seedLocalId \"${item.seedLocalId}\" already exists.`)\n return context\n }\n const publishRunId =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `run_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`\n\n const publishCfg = getPublishConfig()\n const arweaveUploadTags = [\n ...(publishCfg.arweaveUploadTags ?? []),\n ...(options?.arweaveUploadTags ?? []),\n ]\n\n const publishProcess = spawn(publishMachine, {\n input: {\n item,\n address: address as string,\n account: account as Account | undefined,\n modelName: item.modelName,\n schemaId: item.schemaUid,\n signDataItems: options?.signDataItems,\n dataItemSigner: options?.dataItemSigner,\n signArweaveTransactions: options?.signArweaveTransactions,\n arweaveJwk: options?.arweaveJwk,\n publishMode: options?.publishMode ?? 'patch',\n publishRunId,\n arweaveUploadTags: arweaveUploadTags.length ? arweaveUploadTags : undefined,\n htmlEmbeddedDataUriPolicy:\n options?.htmlEmbeddedDataUriPolicy ??\n publishCfg.htmlEmbeddedDataUriPolicy ??\n 'materialize',\n },\n })\n\n publishProcesses.set(item.seedLocalId, publishProcess)\n\n return {\n publishProcesses: new Map(publishProcesses),\n }\n })\n\n enqueue.assign(({ context, spawn }) => {\n const { subscriptions, publishProcesses } = context\n const publishProcess = publishProcesses.get(item.seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${item.seedLocalId}\" does not exist.`)\n return context\n }\n\n if (subscriptions && subscriptions.has(item.seedLocalId)) {\n console.warn(`Subscription with seedLocalId \"${item.seedLocalId}\" already exists.`)\n return context\n }\n\n const subscriptionProcess = spawn(subscribe, {\n input: { publishProcess, seedLocalId: item.seedLocalId },\n })\n\n subscriptions.set(item.seedLocalId, subscriptionProcess)\n\n return {\n subscriptions: new Map(subscriptions),\n }\n })\n})\n","import type { Account } from 'thirdweb/wallets'\n\nexport const retryAttestations = ({\n context,\n event,\n}: {\n context: { publishProcesses: Map<string, { send: (event: { type: string; account?: Account }) => void }> }\n event: unknown\n}) => {\n const ev = event as { seedLocalId: string; account?: Account }\n const { seedLocalId, account } = ev\n const publishProcess = context.publishProcesses.get(seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${seedLocalId}\" does not exist.`)\n return\n }\n publishProcess.send({ type: 'retry', account })\n}\n","import type { AnyActorRef } from 'xstate'\n\n/**\n * Spawned publish/subscription actors are children of the publish manager (`enqueue.stopChild`).\n * DB-restored actors are created with `createActor` and are not children — stop them with `.stop()`.\n */\nexport function stopScopedOrStandaloneChild(\n self: AnyActorRef,\n child: AnyActorRef,\n enqueue: { stopChild: (c: AnyActorRef) => void },\n): void {\n if (child._parent === self) {\n enqueue.stopChild(child)\n } else {\n child.stop()\n }\n}\n","import { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { EventObject, fromCallback } from 'xstate'\nimport { eq, and, desc } from 'drizzle-orm'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:PublishManager:actors:savePublish')\n\n/**\n * Multiple savePublish actors can be in flight per seed (subscribe + periodic + final).\n * SQLite writes complete in completion order, not invocation order — a slower stale write\n * can finish after the terminal save, miss the in_progress row (already completed), and\n * INSERT a new row with an intermediate snapshot. That makes UIs jump back to e.g.\n * creatingAttestations seconds after success. Serialize the actual DB work per seedLocalId.\n */\nconst saveWriteTailBySeed = new Map<string, Promise<void>>()\n\nfunction enqueueSaveWrite(seedLocalId: string, write: () => Promise<void>): Promise<void> {\n const prev = saveWriteTailBySeed.get(seedLocalId) ?? Promise.resolve()\n const next = prev.then(write)\n saveWriteTailBySeed.set(seedLocalId, next.catch(() => {}))\n return next\n}\n\nexport function isTerminalPublishRowStatus(\n status: string | null | undefined,\n): status is 'completed' | 'failed' | 'interrupted' {\n return status === 'completed' || status === 'failed' || status === 'interrupted'\n}\n\nfunction statusFromSnapshot(snapshot: { status?: string; value?: unknown }): 'in_progress' | 'completed' | 'failed' | 'interrupted' {\n if (snapshot.status === 'done') {\n if (snapshot.value === 'success') return 'completed'\n if (snapshot.value === 'failure') return 'failed'\n return 'completed'\n }\n return 'in_progress'\n}\n\nconst MAX_ERROR_MESSAGE_LENGTH = 500\nconst MAX_ERROR_DETAILS_LENGTH = 2000\n\n/** JSON.stringify cannot serialize BigInt; publish context (e.g. gas, tx fields) may contain bigint. */\nfunction jsonStringifyPersistedSnapshot(value: unknown): string {\n return JSON.stringify(value, (_key, v) => (typeof v === 'bigint' ? v.toString() : v))\n}\n\n/** XState persisted snapshots usually have `context` at the root; some shapes nest it. */\nfunction publishRunIdFromSnapshot(snapshot: unknown): string | undefined {\n if (snapshot == null || typeof snapshot !== 'object') return undefined\n const s = snapshot as Record<string, unknown>\n const nested = s.snapshot as { context?: { publishRunId?: string } } | undefined\n const ctx =\n (s.context as { publishRunId?: string } | undefined) ?? nested?.context\n const id = ctx?.publishRunId\n return typeof id === 'string' && id.length > 0 ? id : undefined\n}\n\nfunction errorFieldsFromContext(context: { error?: unknown; errorStep?: string } | undefined, status: 'in_progress' | 'completed' | 'failed' | 'interrupted') {\n if (!context?.error) return {}\n if (status !== 'failed' && status !== 'in_progress') return {}\n const err = context.error\n const errorMessage = err != null\n ? (err instanceof Error ? err.message : String(err)).slice(0, MAX_ERROR_MESSAGE_LENGTH)\n : undefined\n const errorStep = context.errorStep\n let errorDetails: string | undefined\n if (err instanceof Error && err.stack) {\n errorDetails = err.stack.slice(0, MAX_ERROR_DETAILS_LENGTH)\n } else if (err != null && typeof err === 'object') {\n try {\n errorDetails = JSON.stringify(err).slice(0, MAX_ERROR_DETAILS_LENGTH)\n } catch {\n errorDetails = String(err).slice(0, MAX_ERROR_DETAILS_LENGTH)\n }\n } else if (err != null) {\n errorDetails = String(err).slice(0, MAX_ERROR_DETAILS_LENGTH)\n }\n return { errorMessage: errorMessage ?? undefined, errorStep, errorDetails }\n}\n\nexport function markInProgressPublishInterrupted(seedLocalId: string): Promise<void> {\n return enqueueSaveWrite(seedLocalId, async () => {\n const db = BaseDb.getAppDb()\n if (!db) {\n logger('markInProgressPublishInterrupted: DB not ready, skipping')\n return\n }\n\n const existing = await db\n .select()\n .from(publishProcesses)\n .where(and(eq(publishProcesses.seedLocalId, seedLocalId), eq(publishProcesses.status, 'in_progress')))\n .orderBy(desc(publishProcesses.updatedAt))\n .limit(1)\n\n if (existing.length === 0) {\n return\n }\n\n const now = Date.now()\n await db\n .update(publishProcesses)\n .set({\n status: 'interrupted',\n completedAt: now,\n updatedAt: now,\n errorMessage: null,\n errorStep: null,\n errorDetails: null,\n })\n .where(eq(publishProcesses.id, existing[0].id!))\n })\n}\n\nexport const savePublish = fromCallback<\n EventObject & { seedLocalId?: string; triggerPublishDone?: boolean },\n { persistedSnapshot: unknown; seedLocalId: string; triggerPublishDone?: boolean }\n>(({ sendBack, input: { persistedSnapshot, seedLocalId, triggerPublishDone } }) => {\n logger('savePublish seedLocalId', seedLocalId)\n const snapshot = persistedSnapshot as {\n status?: string\n value?: unknown\n context?: {\n publishRunId?: string\n modelName?: string\n schemaId?: string\n item?: { seedLocalId: string; seedUid?: string; modelName?: string; schemaId?: string }\n error?: unknown\n errorStep?: string\n }\n }\n\n const _save = async () => {\n const db = BaseDb.getAppDb()\n if (!db) {\n logger('savePublish: DB not ready, skipping')\n sendBack({ type: 'SAVE_PUBLISH_DONE', seedLocalId, triggerPublishDone })\n return\n }\n\n const existing = await db\n .select()\n .from(publishProcesses)\n .where(and(eq(publishProcesses.seedLocalId, seedLocalId), eq(publishProcesses.status, 'in_progress')))\n .orderBy(desc(publishProcesses.updatedAt))\n .limit(1)\n\n const snapshotStr =\n typeof persistedSnapshot === 'string' ? persistedSnapshot : jsonStringifyPersistedSnapshot(persistedSnapshot)\n const status = statusFromSnapshot(snapshot)\n const now = Date.now()\n const errorFields = errorFieldsFromContext(snapshot.context, status)\n\n if (existing.length > 0) {\n const rec = existing[0]\n await db\n .update(publishProcesses)\n .set({\n persistedSnapshot: snapshotStr,\n status,\n updatedAt: now,\n ...(snapshot.status === 'done' && status !== 'in_progress' ? { completedAt: now } : {}),\n ...errorFields,\n })\n .where(eq(publishProcesses.id, rec.id!))\n } else {\n // No in_progress row: either first save of a new run, or a stale async save after the row\n // was already moved to completed (INSERT would create a duplicate with a newer startedAt).\n const incomingRunId = publishRunIdFromSnapshot(snapshot)\n if (incomingRunId != null && status === 'in_progress' && snapshot.status !== 'done') {\n const latestAny = await db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n .limit(1)\n const latest = latestAny[0]\n if (latest && isTerminalPublishRowStatus(latest.status)) {\n try {\n const prevParsed = JSON.parse(latest.persistedSnapshot) as unknown\n const terminalRunId = publishRunIdFromSnapshot(prevParsed)\n if (terminalRunId === incomingRunId) {\n logger(\n 'savePublish: skip stale insert — same publishRunId as latest terminal row',\n seedLocalId,\n incomingRunId,\n )\n return\n }\n } catch {\n /* ignore parse errors; proceed with insert */\n }\n }\n }\n\n const item = snapshot.context?.item\n const modelName = snapshot.context?.modelName ?? item?.modelName ?? ''\n const schemaId = snapshot.context?.schemaId ?? item?.schemaId\n await db.insert(publishProcesses).values({\n seedLocalId,\n modelName,\n schemaId: schemaId ?? null,\n status,\n startedAt: now,\n persistedSnapshot: snapshotStr,\n createdAt: now,\n updatedAt: now,\n ...errorFields,\n })\n }\n }\n\n enqueueSaveWrite(seedLocalId, _save)\n .then(() => {\n sendBack({ type: 'SAVE_PUBLISH_DONE', seedLocalId, triggerPublishDone })\n })\n .catch((err) => {\n logger('savePublish error', err)\n sendBack({ type: 'SAVE_PUBLISH_DONE', seedLocalId, triggerPublishDone })\n })\n})\n","import type { AnyActorRef } from 'xstate'\nimport { enqueueActions } from 'xstate'\nimport { stopScopedOrStandaloneChild } from './stopScopedOrStandaloneChild'\nimport { markInProgressPublishInterrupted } from '../actors/savePublish'\n\nexport const stopPublish = enqueueActions(({ context, event, enqueue, self }) => {\n const { publishProcesses, subscriptions } = context\n const { seedLocalId } = event as unknown as { seedLocalId: string }\n\n void markInProgressPublishInterrupted(seedLocalId).catch((error) => {\n console.warn(\n `[stopPublish] Failed to mark publish_processes row interrupted for \"${seedLocalId}\":`,\n error,\n )\n })\n\n const publishProcess = publishProcesses.get(seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${seedLocalId}\" does not exist.`)\n return\n }\n\n stopScopedOrStandaloneChild(self, publishProcess as AnyActorRef, enqueue)\n\n const subscriptionProcess = subscriptions.get(seedLocalId)\n if (subscriptionProcess) {\n stopScopedOrStandaloneChild(self, subscriptionProcess as AnyActorRef, enqueue)\n }\n\n const newPublishProcesses = new Map(publishProcesses)\n newPublishProcesses.delete(seedLocalId)\n const newSubscriptions = new Map(subscriptions)\n newSubscriptions.delete(seedLocalId)\n\n enqueue.assign({\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n })\n})\n","import type { ActorRef, AnyActorRef, EventObject } from 'xstate'\nimport { enqueueActions } from 'xstate'\nimport debug from 'debug'\nimport { stopScopedOrStandaloneChild } from './stopScopedOrStandaloneChild'\n\nconst logger = debug('seedProtocol:PublishManager:index')\n\nexport const stopAll = enqueueActions(({ context, enqueue, self }) => {\n logger('Stopping all actors...')\n\n context.publishProcesses.forEach((publishProcess: ActorRef<any, any>) => {\n stopScopedOrStandaloneChild(self, publishProcess as AnyActorRef, enqueue)\n })\n context.subscriptions.forEach((subscriptionProcess: ActorRef<any, EventObject>) => {\n stopScopedOrStandaloneChild(self, subscriptionProcess as AnyActorRef, enqueue)\n })\n\n enqueue.assign({\n publishProcesses: new Map(),\n subscriptions: new Map(),\n })\n})\n","import { enqueueActions } from 'xstate'\n\nexport const query = enqueueActions(({ context, event, enqueue }) => {\n const { seedLocalId } = event as unknown as { seedLocalId: string }\n const publishProcess = context.publishProcesses.get(seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${seedLocalId}\" does not exist.`)\n return\n }\n\n enqueue.stopChild(publishProcess)\n\n const subscriptionProcess = context.subscriptions.get(seedLocalId)\n if (subscriptionProcess) {\n enqueue.stopChild(subscriptionProcess)\n }\n\n const newPublishProcesses = new Map(context.publishProcesses)\n newPublishProcesses.delete(seedLocalId)\n const newSubscriptions = new Map(context.subscriptions)\n newSubscriptions.delete(seedLocalId)\n\n enqueue.assign({\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n })\n})\n","import { assign } from 'xstate'\n\nexport const addSubscription = assign(({ context, event }) => {\n const { subscriptions } = context\n const { seedLocalId, newSubscription } = event as unknown as {\n seedLocalId: string\n newSubscription?: import('xstate').ActorRef<any, import('xstate').EventObject>\n }\n\n if (newSubscription) {\n subscriptions.set(seedLocalId, newSubscription)\n }\n\n return {\n subscriptions: new Map(subscriptions),\n }\n})\n","import { assign } from 'xstate'\nimport { savePublish } from '../actors/savePublish'\n\ntype PublishProcessActor = {\n getPersistedSnapshot?: () => unknown\n getSnapshot: () => { status?: string; value?: unknown; context?: Record<string, unknown> }\n}\n\n/** Never persist multi-megabyte binary fields to SQLite (periodic saves during bundler upload). */\nconst HEAVY_PUBLISH_CONTEXT_KEYS = ['signedDataItems', 'arweaveUploadData'] as const\n\nfunction stripHeavyContextFields(\n ctx: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (ctx == null || typeof ctx !== 'object') return ctx\n const next = { ...ctx }\n for (const k of HEAVY_PUBLISH_CONTEXT_KEYS) {\n delete next[k]\n }\n return next\n}\n\nfunction stripHeavyPublishSnapshot(snapshot: unknown): unknown {\n if (snapshot == null || typeof snapshot !== 'object') return snapshot\n const s = snapshot as Record<string, unknown>\n const out: Record<string, unknown> = { ...s }\n if (s.context != null && typeof s.context === 'object') {\n out.context = stripHeavyContextFields(s.context as Record<string, unknown>)\n }\n const nested = s.snapshot\n if (nested != null && typeof nested === 'object') {\n const n = nested as Record<string, unknown>\n const nestedOut: Record<string, unknown> = { ...n }\n if (n.context != null && typeof n.context === 'object') {\n nestedOut.context = stripHeavyContextFields(n.context as Record<string, unknown>)\n }\n out.snapshot = nestedOut\n }\n return out\n}\n\nfunction getPersistableSnapshot(actor: PublishProcessActor): unknown {\n try {\n const snap = actor.getPersistedSnapshot?.() ?? actor.getSnapshot()\n return stripHeavyPublishSnapshot(snap)\n } catch {\n const snapshot = actor.getSnapshot()\n const ctx = snapshot.context\n if (!ctx?.item) return stripHeavyPublishSnapshot(snapshot)\n const item = ctx.item as { seedLocalId?: string; modelName?: string; schemaId?: string }\n return stripHeavyPublishSnapshot({\n ...snapshot,\n context: {\n ...ctx,\n item: {\n seedLocalId: item.seedLocalId,\n modelName: item.modelName,\n schemaId: item.schemaId,\n },\n },\n })\n }\n}\n\nexport const requestSavePublish = assign(({ context, event, spawn }) => {\n const { publishProcesses } = context\n const { seedLocalId, publishProcess, triggerPublishDone } = event as unknown as {\n seedLocalId: string\n publishProcess?: PublishProcessActor\n triggerPublishDone?: boolean\n }\n\n if (!publishProcess) {\n return context\n }\n\n const newPublishProcesses = new Map(publishProcesses)\n newPublishProcesses.set(seedLocalId, publishProcess)\n\n const persistedSnapshot = getPersistableSnapshot(publishProcess)\n\n spawn(savePublish, {\n id: `savePublish_${seedLocalId}_${Date.now()}`,\n input: { persistedSnapshot, seedLocalId, triggerPublishDone },\n })\n\n return { publishProcesses: newPublishProcesses }\n})\n","import { assign } from 'xstate'\n\nexport const publishDone = assign(({ context, event }) => {\n const { publishProcesses, subscriptions } = context\n const seedLocalId = (event as unknown as { seedLocalId: string }).seedLocalId\n const subscriptionProcess = subscriptions.get(seedLocalId)\n if (subscriptionProcess) {\n subscriptionProcess.send({ type: 'UNSUBSCRIBE' })\n }\n const newPublishProcesses = new Map(publishProcesses)\n newPublishProcesses.delete(seedLocalId)\n const newSubscriptions = new Map(subscriptions)\n newSubscriptions.delete(seedLocalId)\n return {\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n }\n})\n","import { assign } from 'xstate'\n\nexport const removeSubscription = assign(({ context, event }) => {\n const { subscriptions } = context\n const seedLocalId = (event as unknown as { seedLocalId: string }).seedLocalId\n const newSubscriptions = new Map(subscriptions)\n newSubscriptions.delete(seedLocalId)\n return {\n subscriptions: newSubscriptions,\n }\n})\n","import { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { createActor, EventObject, fromCallback } from 'xstate'\nimport { eq } from 'drizzle-orm'\nimport { publishMachine } from '../../publish'\nimport { subscribe } from './subscribe'\n\nconst RESTORE_DB_WAIT_MS = 60_000\nconst RESTORE_DB_POLL_MS = 2_000\n\nasync function waitForDb(maxWaitMs: number): Promise<boolean> {\n const deadline = Date.now() + maxWaitMs\n while (Date.now() < deadline) {\n if (BaseDb.PlatformClass && BaseDb.getAppDb()) return true\n await new Promise((r) => setTimeout(r, RESTORE_DB_POLL_MS))\n }\n return false\n}\n\n/** Minimal snapshot shape for restore; avoids excessive type recursion from SnapshotFrom<typeof publishMachine>.\n * Older rows may omit `context.attestationStrategy`; publish guards then fall back to `useDirectEas`. */\ninterface PersistedSnapshot {\n status?: string\n value?: string | Record<string, unknown>\n context?: {\n item?: { seedLocalId?: string; modelName?: string; schemaId?: string }\n modelName?: string\n schemaId?: string\n reimbursementTransactionId?: string\n requestResponse?: unknown\n arweaveTransactions?: unknown[]\n publishUploads?: unknown[]\n }\n}\n\nfunction getStateValue(parsed: PersistedSnapshot): string {\n const v = parsed.value\n if (typeof v === 'string') return v\n if (v && typeof v === 'object') {\n const keys = Object.keys(v)\n return (keys[0] ?? '') as string\n }\n return ''\n}\n\nfunction isRestorableSnapshot(parsed: PersistedSnapshot): boolean {\n const stateValue = getStateValue(parsed)\n if (stateValue === 'pollingForConfirmation') {\n if (!parsed.context?.reimbursementTransactionId || !parsed.context?.requestResponse) return false\n }\n if (stateValue === 'uploadingData') {\n const txs = parsed.context?.arweaveTransactions\n const uploads = parsed.context?.publishUploads\n if (!Array.isArray(txs) || txs.length === 0 || !Array.isArray(uploads)) return false\n }\n return true\n}\n\n/**\n * XState `persistContext` serializes actor refs as `{ xstate$$type: 1, id }`. `restoreSnapshot` swaps those\n * for live child actors; if the id is not in `snapshot.children`, `context.item` becomes `undefined` and\n * restored publishes throw on resume (e.g. createAttestations). Real item data is always a plain object.\n */\nfunction isPersistedActorRef(value: unknown): value is { xstate$$type: number; id: string } {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'xstate$$type' in value &&\n (value as { xstate$$type: number }).xstate$$type === 1 &&\n typeof (value as { id?: unknown }).id === 'string'\n )\n}\n\nfunction patchPublishContextItemForRestore(\n parsed: PersistedSnapshot,\n seedLocalId: string,\n record: { modelName?: string | null; schemaId?: string | null },\n) {\n parsed.context = parsed.context ?? {}\n const raw = parsed.context.item\n if (isPersistedActorRef(raw)) {\n parsed.context.item = {\n seedLocalId,\n modelName: parsed.context.modelName ?? record.modelName ?? '',\n schemaId: parsed.context.schemaId ?? record.schemaId ?? undefined,\n }\n return\n }\n parsed.context.item = {\n ...(typeof raw === 'object' && raw !== null && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {}),\n seedLocalId,\n modelName:\n (raw as { modelName?: string } | undefined)?.modelName ??\n parsed.context.modelName ??\n record.modelName ??\n '',\n schemaId:\n (raw as { schemaId?: string } | undefined)?.schemaId ??\n parsed.context.schemaId ??\n record.schemaId ??\n undefined,\n }\n}\n\nexport interface RestoreFromDbInput {\n context: {\n publishProcesses: Map<string, unknown>\n subscriptions: Map<string, unknown>\n }\n}\n\nexport const restoreFromDb = fromCallback<EventObject, RestoreFromDbInput>(\n ({ sendBack, input: { context } }) => {\n const _restoreFromDb = async () => {\n const newPublishProcesses = new Map<string, import('xstate').ActorRef<any, any>>()\n const newSubscriptions = new Map<string, import('xstate').ActorRef<any, EventObject>>()\n\n // BaseDb.PlatformClass is set by platformClassesInit when client.init() runs.\n // PublishManager starts on module load, which can happen before client.init().\n // Wait for DB to be ready before attempting restore (poll every 2s, up to 60s).\n const dbReady = await waitForDb(RESTORE_DB_WAIT_MS)\n if (!dbReady) {\n sendBack({ type: 'RESTORE_FROM_DB_DONE', publishProcesses: newPublishProcesses, subscriptions: newSubscriptions })\n return { newPublishProcesses, newSubscriptions }\n }\n\n const db = BaseDb.getAppDb()\n if (!db) {\n sendBack({ type: 'RESTORE_FROM_DB_DONE', publishProcesses: newPublishProcesses, subscriptions: newSubscriptions })\n return { newPublishProcesses, newSubscriptions }\n }\n\n const inProgress = await db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.status, 'in_progress'))\n\n // Dedupe by seedLocalId, keep latest per seedLocalId (by updatedAt then createdAt)\n const bySeed = new Map<string, (typeof inProgress)[0]>()\n const sorted = [...inProgress].sort(\n (a, b) => (b.updatedAt ?? b.createdAt ?? 0) - (a.updatedAt ?? a.createdAt ?? 0)\n )\n for (const rec of sorted) {\n if (!bySeed.has(rec.seedLocalId)) bySeed.set(rec.seedLocalId, rec)\n }\n const publishProcessRecords = Array.from(bySeed.values())\n\n for (const publishProcessRecord of publishProcessRecords) {\n let parsed: PersistedSnapshot\n try {\n parsed = JSON.parse(publishProcessRecord.persistedSnapshot) as PersistedSnapshot\n } catch {\n continue\n }\n if (parsed.status === 'done') continue\n const seedLocalId = parsed.context?.item?.seedLocalId ?? publishProcessRecord.seedLocalId\n if (!seedLocalId) continue\n if (!isRestorableSnapshot(parsed)) continue\n\n // Item is an SDK class instance; persistence loses getters. Also strip mistaken XState actor stubs on item.\n patchPublishContextItemForRestore(parsed, seedLocalId, publishProcessRecord)\n\n const publishProcess = createActor(publishMachine as unknown as import('xstate').AnyActorLogic, {\n snapshot: parsed as any,\n input: undefined,\n })\n\n const subscription = createActor(subscribe, {\n input: {\n publishProcess,\n seedLocalId,\n },\n })\n newPublishProcesses.set(seedLocalId, publishProcess)\n newSubscriptions.set(seedLocalId, subscription)\n\n publishProcess.start()\n subscription.start()\n }\n return { newPublishProcesses, newSubscriptions }\n }\n\n _restoreFromDb().then((result) => {\n if (!result) return\n const { newPublishProcesses, newSubscriptions } = result\n sendBack({\n type: 'RESTORE_FROM_DB_DONE',\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n })\n })\n }\n)\n","import { ActorRefFrom, createActor, setup } from 'xstate'\nimport { Item } from '@seedprotocol/sdk'\nimport { publishMachine } from '../publish'\nimport { assignRestoreFromDb } from './actions/assignRestoreFromDb'\nimport { createPublish } from './actions/createPublish'\nimport { retryAttestations } from './actions/retryAttestations'\nimport { stopPublish } from './actions/stopPublish'\nimport { stopAll } from './actions/stopAll'\nimport { query } from './actions/query'\nimport { addSubscription } from './actions/addSubscription'\nimport { requestSavePublish } from './actions/requestSavePublish'\nimport { publishDone } from './actions/publishDone'\nimport { removeSubscription } from './actions/removeSubscription'\nimport { restoreFromDb } from './actors/restoreFromDb'\nimport { setPublishManagerRef } from './publishManagerRef'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:PublishManager:index')\n\nexport interface PublishManagerMachineContext {\n publishProcesses: Map<string, import('xstate').ActorRef<any, any>>\n subscriptions: Map<string, import('xstate').ActorRef<any, import('xstate').EventObject>>\n}\n\ntype PublishManagerEvent =\n | { type: 'RESTORE_FROM_DB_DONE'; publishProcesses: PublishManagerMachineContext['publishProcesses']; subscriptions: PublishManagerMachineContext['subscriptions'] }\n | { type: 'CREATE_PUBLISH'; item: import('@seedprotocol/sdk').Item<any>; address: string; account?: unknown; options?: import('../../config').CreatePublishOptions }\n | { type: 'ADD_SUBSCRIPTION'; seedLocalId: string; newSubscription?: import('xstate').ActorRef<any, any> }\n | { type: 'REQUEST_SAVE_PUBLISH'; seedLocalId: string; publishProcess?: unknown; triggerPublishDone?: boolean }\n | { type: 'SAVE_PUBLISH_DONE'; seedLocalId: string; triggerPublishDone?: boolean }\n | { type: 'PUBLISH_DONE'; seedLocalId: string }\n | { type: 'REMOVE_SUBSCRIPTION'; seedLocalId: string }\n | { type: 'RETRY_ATTESTATIONS'; seedLocalId: string; account?: unknown }\n | { type: 'STOP_PUBLISH'; seedLocalId: string }\n | { type: 'QUERY'; seedLocalId: string }\n | { type: 'STOP_ALL' }\n\nexport const publishManagerMachine = setup({\n types: {\n context: {} as PublishManagerMachineContext,\n input: {} as PublishManagerMachineContext,\n events: {} as PublishManagerEvent,\n },\n actors: {\n restoreFromDb,\n },\n actions: {\n assignRestoreFromDb,\n createPublish,\n addSubscription,\n requestSavePublish,\n publishDone,\n removeSubscription,\n retryAttestations,\n stopPublish,\n stopAll,\n query,\n } as unknown as Record<string, (args: unknown) => void>,\n}).createMachine({\n id: 'publishManager',\n initial: 'restoreFromDb',\n context: {\n publishProcesses: new Map(),\n subscriptions: new Map(),\n },\n states: {\n restoreFromDb: {\n on: {\n RESTORE_FROM_DB_DONE: {\n target: 'active',\n actions: ['assignRestoreFromDb'],\n },\n },\n invoke: {\n src: 'restoreFromDb',\n input: ({ context }) => ({ context }),\n },\n },\n active: {\n on: {\n CREATE_PUBLISH: {\n actions: ['createPublish'],\n },\n ADD_SUBSCRIPTION: {\n actions: ['addSubscription'],\n },\n REQUEST_SAVE_PUBLISH: {\n actions: ['requestSavePublish'],\n },\n SAVE_PUBLISH_DONE: [\n {\n guard: ({ event }) => (event as { triggerPublishDone?: boolean }).triggerPublishDone === true,\n actions: ['publishDone'],\n },\n ],\n PUBLISH_DONE: {\n actions: ['publishDone'],\n },\n REMOVE_SUBSCRIPTION: {\n actions: ['removeSubscription'],\n },\n RETRY_ATTESTATIONS: {\n actions: ['retryAttestations'],\n },\n STOP_PUBLISH: {\n actions: ['stopPublish'],\n },\n QUERY: {\n actions: ['query'],\n },\n STOP_ALL: {\n actions: ['stopAll'],\n },\n },\n },\n },\n})\n\nconst publishManager = createActor(publishManagerMachine, {\n input: {\n publishProcesses: new Map(),\n subscriptions: new Map(),\n },\n})\n\n// Set ref for subscribe actor to call savePublish, onPublishDone, removeSubscription\nsetPublishManagerRef({\n savePublish: (seedLocalId, publishProcess, options) => {\n publishManager.send({\n type: 'REQUEST_SAVE_PUBLISH',\n seedLocalId,\n publishProcess,\n triggerPublishDone: options?.triggerPublishDone,\n })\n },\n onPublishDone: (seedLocalId) => {\n publishManager.send({ type: 'PUBLISH_DONE', seedLocalId })\n },\n removeSubscription: (seedLocalId) => {\n publishManager.send({ type: 'REMOVE_SUBSCRIPTION', seedLocalId })\n },\n})\n\nconst subscription = publishManager.subscribe((snapshot) => {\n logger('PublishManager snapshot:', snapshot)\n})\n\nif (typeof document !== 'undefined') {\n publishManager.start()\n\n window.addEventListener('load', () => {\n logger('PublishManager started')\n })\n\n window.addEventListener('beforeunload', () => {\n subscription.unsubscribe()\n publishManager.stop()\n })\n}\n\nexport const PublishManager = {\n getService: () => publishManager,\n createPublish: (\n item: InstanceType<typeof Item>,\n address: string,\n account?: import('thirdweb/wallets').Account,\n options?: import('../../config').CreatePublishOptions\n ) => publishManager.send({ type: 'CREATE_PUBLISH', item, address, account, options }),\n retryAttestations: (seedLocalId: string, account?: import('thirdweb/wallets').Account) =>\n publishManager.send({ type: 'RETRY_ATTESTATIONS', seedLocalId, account }),\n stopPublish: (seedLocalId: string) => publishManager.send({ type: 'STOP_PUBLISH', seedLocalId }),\n query: (seedLocalId: string) => publishManager.send({ type: 'QUERY', seedLocalId }),\n stopAll: () => publishManager.send({ type: 'STOP_ALL' }),\n getPublish: (seedLocalId: string) => publishManager.getSnapshot().context.publishProcesses.get(seedLocalId),\n savePublish: (seedLocalId: string, publishProcess: ActorRefFrom<typeof publishMachine>) =>\n publishManager.send({ type: 'REQUEST_SAVE_PUBLISH', seedLocalId, publishProcess }),\n addSubscription: (seedLocalId: string, subscriptionActor: import('xstate').ActorRef<any, any>) =>\n publishManager.send({ type: 'ADD_SUBSCRIPTION', seedLocalId, newSubscription: subscriptionActor }),\n removeSubscription: (seedLocalId: string) => publishManager.send({ type: 'REMOVE_SUBSCRIPTION', seedLocalId }),\n}\n","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 getWalletsForConnectButton,\n} from \"../helpers/thirdweb\"\nimport { usePublishConfig } from \"./PublishProvider\"\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 console.error(\"[ConnectButton] Wallet setup / module install failed:\", 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 reportWalletSetupWarning(\n new Error(\n 'Executor module: managed account address not available yet (managed wallet may still be syncing).',\n ),\n )\n return\n }\n try {\n const mw = getManagedAccountWallet()\n await mw.autoConnect({ client: getClient(), chain: optimismSepolia })\n const ma = mw.getAccount()\n if (!ma) {\n reportWalletSetupWarning(new Error('Executor module: managed wallet has no account'))\n return\n }\n await ensureExecutorModuleInstalled(managedAddress, ma, config)\n } catch (err) {\n reportWalletSetupWarning(err)\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 getModularAccountWallet()\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])\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 const tryManaged = async () => {\n try {\n return await getConnectedManagedAccountAddress(optimismSepolia)\n } catch {\n return undefined\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 await seedClient.setAddresses({ owned: [...owned] })\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 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, { type FC } from 'react'\nimport type { PublishMode } from '../types'\n\nexport type PublishModeButtonsProps = {\n value: PublishMode\n onChange: (mode: PublishMode) => void\n disabled?: boolean\n /** Accessible label for the group */\n 'aria-label'?: string\n}\n\n/**\n * Optional control to choose patch (same Version) vs new Version before calling\n * `ensureSmartWalletThenPublish(item, …, { publishMode })` or `PublishManager.createPublish(…, { publishMode })`.\n */\nexport const PublishModeButtons: FC<PublishModeButtonsProps> = ({\n value,\n onChange,\n disabled = false,\n 'aria-label': ariaLabel = 'Publish mode',\n}) => {\n const base: React.CSSProperties = {\n display: 'inline-flex',\n gap: 8,\n flexWrap: 'wrap',\n }\n const btn = (active: boolean): React.CSSProperties => ({\n padding: '8px 14px',\n fontSize: 13,\n borderRadius: 8,\n border: `1px solid ${active ? '#344054' : '#D0D5DD'}`,\n background: active ? '#101828' : '#fff',\n color: active ? '#fff' : '#344054',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n })\n\n return (\n <div role=\"group\" aria-label={ariaLabel} style={base}>\n <button\n type=\"button\"\n disabled={disabled}\n style={btn(value === 'patch')}\n onClick={() => onChange('patch')}\n >\n Publish updates\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n style={btn(value === 'new_version')}\n onClick={() => onChange('new_version')}\n >\n New version\n </button>\n </div>\n )\n}\n","import { PublishMachineStates } from '~/helpers/constants'\n\n/**\n * Maps internal publish machine state values to display step IDs for UI consistency.\n * The direct-EAS path uses `creatingAttestationsDirectToEas` internally, but UIs\n * typically show a single \"Creating attestations\" step. This helper normalizes the\n * machine value for display.\n */\nexport function getDisplayStepId(machineValue: string): string {\n if (machineValue === 'creatingAttestationsDirectToEas') {\n return 'creatingAttestations'\n }\n return machineValue\n}\n\ntype PublishRowStatus = 'in_progress' | 'completed' | 'failed' | 'interrupted'\n\n/**\n * Single source of truth for step UIs: the live machine while running; once the\n * actor is gone, prefer the DB row status so we never flash an intermediate\n * `persistedSnapshot` value (e.g. creatingAttestations) after a completed run.\n */\nexport function resolvePublishDisplayValue(\n publishProcess: unknown | null | undefined,\n record: { status: PublishRowStatus } | undefined,\n machineValue: string | undefined\n): string | undefined {\n if (publishProcess != null) return machineValue\n if (record?.status === 'completed') return PublishMachineStates.SUCCESS\n if (record?.status === 'failed') return PublishMachineStates.FAILURE\n if (record?.status === 'interrupted') return undefined\n return machineValue\n}\n\nexport type PublishRowForDisplay = {\n status: string\n persistedSnapshot: string\n completedAt?: number | null\n}\n\n/**\n * Derives the machine-state string for UI from the persisted DB row. Prefer\n * `status` / `completedAt` over raw `persistedSnapshot` JSON so a stale or\n * out-of-order snapshot write cannot force the UI back to an intermediate step\n * after a terminal save (common when consumers read `JSON.parse(persistedSnapshot).value`).\n */\nexport function getPublishMachineValueForUi(record: PublishRowForDisplay | undefined): string | undefined {\n if (!record) return undefined\n\n if (record.status === 'failed') return PublishMachineStates.FAILURE\n if (record.status === 'completed') return PublishMachineStates.SUCCESS\n if (record.status === 'interrupted') return undefined\n\n if (record.completedAt != null) {\n try {\n const p = JSON.parse(record.persistedSnapshot) as { value?: unknown; status?: string }\n if (p.status === 'done' && p.value === PublishMachineStates.FAILURE) {\n return PublishMachineStates.FAILURE\n }\n } catch {\n /* ignore */\n }\n return PublishMachineStates.SUCCESS\n }\n\n try {\n const p = JSON.parse(record.persistedSnapshot) as { value?: unknown; status?: string }\n if (p.status === 'done') {\n if (p.value === PublishMachineStates.SUCCESS) return PublishMachineStates.SUCCESS\n if (p.value === PublishMachineStates.FAILURE) return PublishMachineStates.FAILURE\n }\n if (typeof p.value === 'string') return p.value\n } catch {\n return undefined\n }\n return undefined\n}\n","import { useState, useEffect, useRef, useMemo } from 'react'\nimport { useSelector } from '@xstate/react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { eq, desc } from 'drizzle-orm'\nimport { PublishManager } from '../services/publishManager'\nimport { PublishMachineStates } from '~/helpers/constants'\nimport { getPublishMachineValueForUi, resolvePublishDisplayValue } from '~/helpers/publishDisplayHelpers'\n\nfunction isTerminalDoneSnapshot(snapshot: { value?: unknown; status?: string } | null): snapshot is { value: string; status: 'done' } {\n if (!snapshot || snapshot.status !== 'done') return false\n return snapshot.value === PublishMachineStates.SUCCESS || snapshot.value === PublishMachineStates.FAILURE\n}\n\nexport function usePublishProcess(seedLocalId: string) {\n const publishManager = PublishManager.getService()\n\n const publishProcess = useSelector(publishManager, (snapshot) => {\n return snapshot?.context?.publishProcesses?.get(seedLocalId) ?? null\n })\n\n /** Last snapshot from the publish actor; survives removal from the manager map so we can keep terminal `value`. */\n const lastPublishSnapshotRef = useRef<{ value?: unknown; status?: string } | null>(null)\n\n useEffect(() => {\n lastPublishSnapshotRef.current = null\n }, [seedLocalId])\n\n const [machineValue, setMachineValue] = useState<string | undefined>(undefined)\n /**\n * Once we have observed a terminal outcome for this seed (machine done or DB row), keep\n * showing success/failure until a new publish actor is spawned. Prevents the UI from\n * flipping back to an intermediate step when live-query or row ordering briefly reports\n * in_progress or a stale persistedSnapshot after completion.\n */\n const [terminalLatch, setTerminalLatch] = useState<'success' | 'failure' | null>(null)\n\n const db = BaseDb.getAppDb()\n const latestProcessRowQuery = useMemo(\n () =>\n seedLocalId && db\n ? db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n .limit(1)\n : null,\n [db, seedLocalId]\n )\n const latestRecords = useLiveQuery(latestProcessRowQuery)\n const latestRecord = latestRecords?.[0] as\n | { status: string; persistedSnapshot: string; completedAt?: number | null }\n | undefined\n const recordStatus = latestRecord?.status as\n | 'in_progress'\n | 'completed'\n | 'failed'\n | 'interrupted'\n | undefined\n\n const value = useMemo(() => {\n if (publishProcess != null) {\n return machineValue\n }\n if (terminalLatch === 'success' || terminalLatch === 'failure') {\n return terminalLatch\n }\n const fromRow = getPublishMachineValueForUi(latestRecord)\n if (fromRow === PublishMachineStates.SUCCESS || fromRow === PublishMachineStates.FAILURE) {\n return fromRow\n }\n return resolvePublishDisplayValue(\n publishProcess,\n recordStatus != null ? { status: recordStatus } : undefined,\n machineValue\n )\n }, [publishProcess, recordStatus, machineValue, terminalLatch, latestRecord])\n\n useEffect(() => {\n setTerminalLatch(null)\n }, [seedLocalId])\n\n useEffect(() => {\n if (publishProcess != null) {\n return\n }\n if (recordStatus === 'completed') {\n setTerminalLatch('success')\n } else if (recordStatus === 'failed') {\n setTerminalLatch('failure')\n }\n }, [recordStatus, publishProcess])\n\n useEffect(() => {\n if (publishProcess != null) {\n setTerminalLatch(null)\n }\n }, [publishProcess])\n\n useEffect(() => {\n if (!publishProcess) {\n const last = lastPublishSnapshotRef.current\n const preserve = isTerminalDoneSnapshot(last)\n if (preserve) {\n setMachineValue(last.value as string)\n if (last.value === PublishMachineStates.SUCCESS) {\n setTerminalLatch('success')\n } else if (last.value === PublishMachineStates.FAILURE) {\n setTerminalLatch('failure')\n }\n } else {\n setMachineValue(undefined)\n }\n return\n }\n const initial = publishProcess.getSnapshot()\n lastPublishSnapshotRef.current = { value: initial?.value, status: (initial as { status?: string }).status }\n setMachineValue(initial?.value as string | undefined)\n const sub = publishProcess.subscribe((snapshot: { value?: unknown; status?: string }) => {\n lastPublishSnapshotRef.current = { value: snapshot?.value, status: snapshot?.status }\n setMachineValue(snapshot?.value as string | undefined)\n })\n return () => {\n sub.unsubscribe()\n }\n }, [publishProcess, seedLocalId])\n\n return {\n publishProcess: publishProcess ?? null,\n value,\n }\n}\n","import { useState, useEffect } from 'react'\nimport { isItemOwned } from '@seedprotocol/sdk'\nimport type { Item } from '@seedprotocol/sdk'\n\nexport function useCanPublishItem(item: Item<any> | null | undefined): boolean {\n const [canPublish, setCanPublish] = useState(true)\n\n useEffect(() => {\n if (!item) {\n setCanPublish(false)\n return\n }\n isItemOwned(item)\n .then(setCanPublish)\n .catch(() => setCanPublish(false))\n }, [item?.seedLocalId])\n\n return canPublish\n}\n","import { useMemo } from 'react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { arweaveL1FinalizeJobs, BaseDb } from '@seedprotocol/sdk'\nimport { eq, desc } from 'drizzle-orm'\n\nexport type ArweaveL1FinalizeJobRow = {\n id: number\n seedLocalId: string\n dataItemId: string\n l1TransactionId: string | null\n bundleId: string | null\n phase: string\n statusJson: string | null\n errorMessage: string | null\n versionLocalId: string | null\n itemPropertyName: string | null\n updatedAt: number | null\n}\n\n/**\n * Live L1 finalization jobs for a seed (bundler path). Empty when not using bundler or no jobs.\n */\nexport function useArweaveL1Finalize(seedLocalId: string | undefined) {\n const db = BaseDb.getAppDb()\n const jobsQuery = useMemo(\n () =>\n seedLocalId && db\n ? db\n .select()\n .from(arweaveL1FinalizeJobs)\n .where(eq(arweaveL1FinalizeJobs.seedLocalId, seedLocalId))\n .orderBy(desc(arweaveL1FinalizeJobs.updatedAt))\n : null,\n [db, seedLocalId]\n )\n const rows = useLiveQuery(jobsQuery)\n\n const jobs = (rows ?? []) as ArweaveL1FinalizeJobRow[]\n\n const summary = useMemo(() => {\n const pending = jobs.filter((j) => j.phase === 'pending_l1').length\n const confirmed = jobs.filter((j) => j.phase === 'confirmed').length\n return {\n hasPendingL1: pending > 0,\n pendingCount: pending,\n confirmedCount: confirmed,\n jobs,\n }\n }, [jobs])\n\n return summary\n}\n","import { useMemo } from 'react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { eq, desc } from 'drizzle-orm'\nimport { usePublishProcess } from './usePublishProcess'\nimport { useArweaveL1Finalize } from './useArweaveL1Finalize'\n\nexport type PublishProcessStatus = 'in_progress' | 'completed' | 'failed' | 'interrupted'\n\nexport interface PublishProcessRecord {\n id: number\n seedLocalId: string\n modelName: string\n schemaId?: string\n status: PublishProcessStatus\n startedAt: number\n completedAt?: number\n errorMessage?: string\n errorStep?: string\n errorDetails?: string\n persistedSnapshot: string\n createdAt?: number\n updatedAt?: number\n}\n\nexport function useItemPublishStatus(seedLocalId: string | undefined) {\n const { publishProcess, value } = usePublishProcess(seedLocalId ?? '')\n const arweaveL1 = useArweaveL1Finalize(seedLocalId)\n\n const db = BaseDb.getAppDb()\n const latestProcessRowQuery = useMemo(\n () =>\n seedLocalId && db\n ? db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n .limit(1)\n : null,\n [db, seedLocalId]\n )\n const latestRecords = useLiveQuery(latestProcessRowQuery)\n\n const record = latestRecords?.[0] as PublishProcessRecord | undefined\n const isActive = !!publishProcess || record?.status === 'in_progress'\n\n return {\n latestRecord: record,\n publishProcess,\n isActive,\n publishValue: value,\n arweaveL1Pending: arweaveL1.hasPendingL1,\n arweaveL1Jobs: arweaveL1.jobs,\n arweaveL1Summary: arweaveL1,\n }\n}\n","import { useMemo } from 'react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { desc, eq } from 'drizzle-orm'\nimport type { PublishProcessRecord } from './useItemPublishStatus'\n\nfunction usePublishProcessesQuery() {\n const db = BaseDb.getAppDb()\n return useMemo(\n () => (db ? db.select().from(publishProcesses).orderBy(desc(publishProcesses.startedAt)) : null),\n [db]\n )\n}\n\nfunction usePublishProcessesQueryForSeed(seedLocalId: string | undefined) {\n const db = BaseDb.getAppDb()\n return useMemo(\n () =>\n db && seedLocalId\n ? db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n : null,\n [db, seedLocalId]\n )\n}\n\n/**\n * Single live subscription for the ordered publish_processes list plus a derived non-active count.\n * Prefer this when you need both values in one component so you do not combine\n * {@link usePublishProcesses} and {@link usePublishProcessesNonActiveCount} (which would subscribe twice).\n */\nexport function usePublishProcessesState(): {\n records: PublishProcessRecord[] | undefined\n nonActiveCount: number | undefined\n} {\n const query = usePublishProcessesQuery()\n const records = useLiveQuery(query) as PublishProcessRecord[] | undefined\n const nonActiveCount = useMemo(\n () => (records === undefined ? undefined : records.filter((r) => r.status !== 'in_progress').length),\n [records]\n )\n return { records, nonActiveCount }\n}\n\nexport function usePublishProcesses(): PublishProcessRecord[] | undefined {\n const query = usePublishProcessesQuery()\n return useLiveQuery(query) as PublishProcessRecord[] | undefined\n}\n\nexport function usePublishProcessesNonActiveCount(): number | undefined {\n return usePublishProcessesState().nonActiveCount\n}\n\n/**\n * Live query of `publish_processes` for one seed, ordered by `startedAt` descending.\n * Pass `undefined` to disable the query (returns `undefined`).\n */\nexport function usePublishProcessesForSeed(\n seedLocalId: string | undefined\n): PublishProcessRecord[] | undefined {\n const query = usePublishProcessesQueryForSeed(seedLocalId)\n return useLiveQuery(query) as PublishProcessRecord[] | undefined\n}\n\n/**\n * Same as {@link usePublishProcessesForSeed} plus a derived count of rows whose status is not\n * `in_progress`. Prefer this over combining {@link usePublishProcessesForSeed} and a separate\n * count hook so you only subscribe once.\n */\nexport function usePublishProcessesStateForSeed(seedLocalId: string | undefined): {\n records: PublishProcessRecord[] | undefined\n nonActiveCount: number | undefined\n} {\n const query = usePublishProcessesQueryForSeed(seedLocalId)\n const records = useLiveQuery(query) as PublishProcessRecord[] | undefined\n const nonActiveCount = useMemo(\n () => (records === undefined ? undefined : records.filter((r) => r.status !== 'in_progress').length),\n [records]\n )\n return { records, nonActiveCount }\n}\n\nexport function usePublishProcessesNonActiveCountForSeed(\n seedLocalId: string | undefined\n): number | undefined {\n return usePublishProcessesStateForSeed(seedLocalId).nonActiveCount\n}\n\nexport function usePublishProcessById(\n id: number | undefined\n): { record: PublishProcessRecord | null; isLoading: boolean } {\n const db = BaseDb.getAppDb()\n const query = useMemo(\n () =>\n id != null && db\n ? db.select().from(publishProcesses).where(eq(publishProcesses.id, id)).limit(1)\n : null,\n [db, id]\n )\n const records = useLiveQuery(query)\n const isLoading = records === undefined\n const record = records && records.length > 0 ? (records[0] as PublishProcessRecord) : null\n return { record, isLoading }\n}\n","import { BaseDb, publishProcesses, uploadProcesses } from '@seedprotocol/sdk'\nimport { and, notInArray, eq, inArray } from 'drizzle-orm'\n\n/** Remove every publish_processes row whose status is not `in_progress` (app-wide). */\nexport async function clearCompletedPublishProcesses(): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db\n .delete(publishProcesses)\n .where(notInArray(publishProcesses.status, ['in_progress']))\n}\n\n/**\n * Same semantics as {@link clearCompletedPublishProcesses}, but only for rows with the given\n * `seedLocalId`. Never deletes `in_progress` runs for that seed.\n */\nexport async function clearCompletedPublishProcessesForSeed(seedLocalId: string): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db\n .delete(publishProcesses)\n .where(\n and(eq(publishProcesses.seedLocalId, seedLocalId), notInArray(publishProcesses.status, ['in_progress']))\n )\n}\n\nexport async function clearAllPublishProcesses(): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db.delete(publishProcesses)\n}\n\nexport async function clearAllUploadProcesses(): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db.delete(uploadProcesses)\n}\n\n/**\n * Deletes **all** `publish_processes` rows for this seed (full history, including any\n * `in_progress` run). For removing individual runs, use {@link deletePublishProcessById} or\n * {@link deletePublishProcessesByIds}.\n */\nexport async function deletePublishProcessesForSeed(seedLocalId: string): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db.delete(publishProcesses).where(eq(publishProcesses.seedLocalId, seedLocalId))\n}\n\n/** Delete a single publish process record by id. */\nexport async function deletePublishProcessById(id: number): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n await db.delete(publishProcesses).where(eq(publishProcesses.id, id))\n}\n\n/** Delete multiple publish process records by ids. */\nexport async function deletePublishProcessesByIds(ids: number[]): Promise<void> {\n if (ids.length === 0) return\n const db = BaseDb.getAppDb()\n if (!db) return\n await db.delete(publishProcesses).where(inArray(publishProcesses.id, ids))\n}\n","/**\n * Extracts Arweave transaction IDs from a publish process record's persisted snapshot.\n * Returns an empty array on parse error or when no transactions exist.\n */\nexport function getArweaveTransactionIds(record: { persistedSnapshot: string }): string[] {\n try {\n const parsed = JSON.parse(record.persistedSnapshot) as {\n context?: { arweaveTransactions?: Array<{ transaction?: { id?: string } }> }\n }\n const txs = parsed.context?.arweaveTransactions ?? []\n return txs\n .map((at) => (at.transaction as { id?: string })?.id)\n .filter((id): id is string => typeof id === 'string')\n } catch {\n return []\n }\n}\n\n/**\n * Extracts the EAS attestation payload from a publish process record's persisted snapshot.\n * Returns undefined on parse error or when no payload was persisted.\n */\nexport function getEasPayload(record: { persistedSnapshot: string }): unknown {\n try {\n const parsed = JSON.parse(record.persistedSnapshot) as {\n context?: { easPayload?: unknown }\n }\n return parsed.context?.easPayload ?? undefined\n } catch {\n return undefined\n }\n}\n","/**\n * Transforms multiPublish payload from string-based localId/publishLocalId to integer indices\n * for gas-efficient contract comparison. Use when the contract expects uint256 localIdIndex\n * and publishLocalIdIndex instead of strings.\n */\n\nexport type RequestWithStringIds = {\n localId: string\n propertiesToUpdate?: Array<{ publishLocalId?: string; propertySchemaUid?: string; [k: string]: unknown }>\n [k: string]: unknown\n}\n\nexport type RequestWithIntegerIds = Omit<RequestWithStringIds, 'localId' | 'propertiesToUpdate'> & {\n localIdIndex: bigint\n propertiesToUpdate?: Array<{\n publishLocalIdIndex: bigint\n propertySchemaUid?: string\n [k: string]: unknown\n }>\n}\n\n/**\n * Converts localId/publishLocalId strings to uint256 indices.\n * Each request's index is its position in the array (0-based).\n * Throws if any publishLocalId does not exist in the payload.\n */\nexport function transformPayloadToIntegerIds(\n requests: RequestWithStringIds[],\n): RequestWithIntegerIds[] {\n const localIdToIndex = new Map<string, bigint>()\n for (let i = 0; i < requests.length; i++) {\n const localId = requests[i]?.localId\n if (localId != null) {\n localIdToIndex.set(localId, BigInt(i))\n }\n }\n\n return requests.map((req, i) => {\n const propertiesToUpdate = (req.propertiesToUpdate ?? []).map((pu) => {\n const publishLocalId = pu.publishLocalId\n const index = publishLocalId != null ? localIdToIndex.get(publishLocalId) : undefined\n if (publishLocalId != null && publishLocalId !== '' && index === undefined) {\n throw new Error(\n `publishLocalId \"${publishLocalId}\" not found in payload (valid localIds: ${Array.from(localIdToIndex.keys()).join(', ')})`,\n )\n }\n const { publishLocalId: _omit, ...rest } = pu\n return {\n ...rest,\n publishLocalIdIndex: index ?? BigInt(0),\n }\n })\n\n const { localId: _omitLocalId, ...rest } = req\n return {\n ...rest,\n localIdIndex: BigInt(i),\n propertiesToUpdate,\n } as RequestWithIntegerIds\n })\n}\n\n/**\n * Transforms propertiesToUpdate from publishLocalId (string) to publishIndex (uint256)\n * for the Executor contract, which expects publishIndex. Keeps localId as string.\n */\nexport function transformPayloadForExecutor<T extends RequestWithStringIds>(\n requests: T[],\n): T[] {\n const localIdToIndex = new Map<string, bigint>()\n for (let i = 0; i < requests.length; i++) {\n const localId = requests[i]?.localId\n if (localId != null) {\n localIdToIndex.set(localId, BigInt(i))\n }\n }\n\n return requests.map((req) => {\n const propertiesToUpdate = (req.propertiesToUpdate ?? []).map((pu) => {\n const publishLocalId = pu.publishLocalId\n const index = publishLocalId != null ? localIdToIndex.get(publishLocalId) : undefined\n if (publishLocalId != null && publishLocalId !== '' && index === undefined) {\n throw new Error(\n `publishLocalId \"${publishLocalId}\" not found in payload (valid localIds: ${Array.from(localIdToIndex.keys()).join(', ')})`,\n )\n }\n const { publishLocalId: _omit, ...rest } = pu\n return {\n ...rest,\n publishIndex: index ?? BigInt(0),\n }\n })\n return { ...req, propertiesToUpdate } as T\n })\n}\n","import type { Account } from 'thirdweb/wallets'\nimport type { Item } from '@seedprotocol/sdk'\nimport { getConnectedModularAccount, resolveSmartWalletForPublish } from './thirdweb'\nimport { PublishManager } from '../services/publishManager'\nimport type { CreatePublishOptions } from '../config'\nimport { getPublishConfig } from '../config'\nimport { runModularExecutorPublishPrep } from './ensureManagedAccountReady'\nimport { ManagedAccountPublishError } from '../errors'\nimport { ensureEip7702ModularAccountReady } from './ensureEip7702ModularAccountReady'\n\nexport type EnsureSmartWalletResult =\n | { outcome: 'started' }\n | { outcome: 'no_address' }\n | { outcome: 'needs_deploy' }\n | { outcome: 'managed_not_ready'; error: ManagedAccountPublishError }\n\nconst MSG_NO_ACCOUNT_MODULAR =\n 'A connected wallet is required for publishing with the modular executor. Connect your wallet and try again.'\n\n/**\n * Resolves the smart wallet for the current account; if deployed, starts publish.\n * If the user has no deployed ManagedAccount (non-modular path), returns needs_deploy so the caller can open the deploy modal.\n *\n * When **`useModularExecutor`** is true:\n * - Runs {@link runModularExecutorPublishPrep} first and uses the **ManagedAccount** address as the publish `address` (context for `multiPublish`).\n * - Resolves the signing account from the **modular EIP-7702** in-app wallet ({@link getConnectedModularAccount}), not from `activeAccount` or {@link resolveSmartWalletForPublish}.\n * - Runs {@link ensureEip7702ModularAccountReady} before spawning the publish machine (idempotent with `createAttestations`).\n * The **`activeAccount`** argument is ignored on this path (kept for API compatibility with call sites).\n *\n * Pass `options.publishMode`: `patch` (default) publishes only pending properties on the current Version;\n * `new_version` creates a new Version attestation and re-attests all properties (requires an existing Seed UID).\n */\nexport async function ensureSmartWalletThenPublish(\n item: Item<any>,\n activeAccount: Account | null | undefined,\n getAddress: () => Promise<string | null>,\n options?: CreatePublishOptions,\n): Promise<EnsureSmartWalletResult> {\n const config = getPublishConfig()\n const address = await getAddress()\n if (!address || !address.trim()) {\n return { outcome: 'no_address' }\n }\n\n if (config.useModularExecutor) {\n const prep = await runModularExecutorPublishPrep()\n if (!prep.ok) {\n return { outcome: 'managed_not_ready', error: prep.error }\n }\n\n const modularAccount = await getConnectedModularAccount()\n if (!modularAccount) {\n return {\n outcome: 'managed_not_ready',\n error: new ManagedAccountPublishError(MSG_NO_ACCOUNT_MODULAR, 'MANAGED_ACCOUNT_UNAVAILABLE'),\n }\n }\n\n await ensureEip7702ModularAccountReady()\n\n const managedAddress = prep.managedAddress\n PublishManager.createPublish(item, managedAddress, modularAccount, {\n dataItemSigner: modularAccount,\n ...options,\n })\n return { outcome: 'started' }\n }\n\n const resolved = await resolveSmartWalletForPublish(activeAccount ?? null)\n if ('address' in resolved) {\n PublishManager.createPublish(item, resolved.address, resolved.account, {\n dataItemSigner: resolved.account,\n ...options,\n })\n return { outcome: 'started' }\n }\n return { outcome: 'needs_deploy' }\n}\n","import { getPublishConfig } from '../config'\nimport { EAS_CONTRACT_ADDRESS } from './constants'\n\nfunction uniqueAddressesLower(addresses: string[]): `0x${string}`[] {\n const set = new Set<string>()\n for (const a of addresses) {\n const t = a.trim().toLowerCase()\n if (t.startsWith('0x') && t.length === 42) set.add(t)\n }\n return [...set].sort().map((x) => x as `0x${string}`)\n}\n\n/** Allowlisted call targets for modular session signers: managed account, EAS, optional executor module. */\nexport function defaultApprovedTargetsForModularPublish(managedAddress: string): `0x${string}`[] {\n const cfg = getPublishConfig()\n const extra: string[] = [managedAddress, EAS_CONTRACT_ADDRESS]\n if (cfg.modularAccountModuleContract?.trim()) {\n extra.push(cfg.modularAccountModuleContract.trim())\n }\n return uniqueAddressesLower(extra)\n}\n"],"names":["SCHEMA_REGISTRY_ADDRESS","EAS_SCHEMA_NAME_ATTESTATION_UID","THIRDWEB_ACCOUNT_FACTORY_ADDRESS","EAS_CONTRACT_ADDRESS","MULTI_PUBLISH_ABI_REFERENCE_ADDRESS_OP_SEPOLIA","SEED_PROTOCOL_CONTRACT_ADDRESS_OP_SEPOLIA","PublishMachineStates","LONG_RUNNING_PUBLISH_STATES","PERIODIC_SAVE_INTERVAL_MS","getAddress","options","readContract","createAccount","prepareContractCall","logger","debug","SEED_IN_APP_SESSION_PREFIX","_publishInAppWalletStorage","getSharedPublishInAppWalletStorage","key","value","_client","getClient","thirdwebClientId","getPublishConfig","createThirdwebClient","wallets","createWallet","useLocalWalletAccount","localWalletAccount","setLocalWalletAccount","useState","useRef","useEffect","useActiveSmartWalletContract","account","useActiveAccount","contract","setContract","getContract","optimismSepolia","getManagedAccountFactoryContract","thirdwebAccountFactoryAddress","getSmartWalletAddressForAdmin","adminAddress","data","factory","getFactoryAddress","isSmartWalletDeployed","smartWalletAddress","isContractDeployed","resolveSmartWalletForPublish","ExternalWalletsForDeploy","deploySmartWalletContract","localAccount","managedAccountFactoryContract","createAccountTx","result","sendTransaction","receipt","waitForReceipt","appMetadata","getConnectedManagedAccountAddress","chain","managedAccountWallet","getManagedAccountWallet","managedAccount","getConnectedAccount","wallet","getModularAccountWallet","getConnectedModularAccount","_managedInAppWallet","inAppWallet","_modularInAppWallet","_walletsForConnectButton","getWalletsForConnectButton","EAS_ERRORS_ABI","attestedEvent","prepareEvent","ZERO_ADDRESS","ZERO_BYTES32","prepareEasAttest","client","params","easContractAddress","prepareEasMultiAttest","requests","encodeBytes32","encodeAbiParameters","getAttestationUidFromReceipt","getAttestedUidsFromReceipt","want","logs","l","parsed","parseEventLogs","out","ev","uid","schemaUid","prepareEasMultiRevoke","r","d","resolveRevokeAccount","attester","additionalGetter","getGetAdditionalSyncAddresses","additional","attesterLower","a","derivedManagedAccount","derivedLower","revokeAttestations","seedLocalId","seedUid","seedSchemaUid","getAttesterForSeed","revokeAccount","versionRows","metadataRows","getVersionsForSeedUid","getMetadataAttestationUidsForSeedUid","versionUids","isValidEasAttestationUid","metadataBySchema","list","uids","VERSION_SCHEMA_UID_OPTIMISM_SEPOLIA","req","multiRevokeTx","err","msg","revokedAt","updateSeedRevokedAt","configRef","setConfigRef","c","getConfigRef","initPublish","setGetPublisherForNewSeeds","setRevokeExecutor","m","setAdditionalSyncAddresses","configurePublish","config","useArweaveBundler","arweaveUploadVerificationBaseUrl","arweaveGraphqlUrl","DEFAULT_ARWEAVE_GRAPHQL_URL","useModularExecutor","resolveAutoDeployEip7702ModularAccount","AttestationVerificationError","message","expectedSchemas","foundSchemas","code","stringifyUnderlyingCause","u","maxLen","nested","o","parts","ManagedAccountPublishError","managedAddress","underlyingCause","extra","isManagedAccountPublishError","Eip7702ModularAccountPublishError","modularAddress","eip7702ModularCodes","isEip7702ModularAccountPublishError","isRouterNonModularCoreAccountError","cause","PublishConfigContext","createContext","usePublishConfig","useContext","PublishProvider","children","queryClient","queryClientRef","jsx","ThirdwebProvider","SeedProvider","MODULE_INSTALL_MSG","ensureExecutorModuleInstalled","contractAddress","modularAccountModuleContract","accountContract","installed","getInstalledModules","moduleAddr","tx","installModule","assignRestoreFromDb","assign","context","event","incomingProcesses","incomingSubscriptions","getArweave","host","BaseArweaveClient","ArweaveModule","Arweave","waitForItem","item","Item","resolve","interval","found","deserializeChunks","serialized","s","p","serializeChunks","chunks","createArweaveTransactions","fromPromise","publishOpts","def","publishUploads","signArweaveTransactions","arweaveJwk","uploads","results","arweave","jwk","upload","json","serializedChunks","rest","attrs","createArweaveTransactionsPhase2","preparingHtmlEmbedded","policy","prepareHtmlEmbeddedImagesForPublish","toUploadedPairs","txs","ups","n","i","t","id","rewritingHtmlEmbedded","pairs","rewriteHtmlEmbeddedImagesOnDisk","buildPublishUploadDataTags","contentHash","contentType","tags","getContentHash","bytes","hashBuffer","b","EXTENSION_TO_MIME","getMimeTypeFromPath","filePathOrName","ext","toUint8Array","getStorageDirForDataType","dataType","BaseFileManager","DATA_URI_IMAGE","decodeDataUriImage","dataUri","mimeType","base64","binary","processUploadPropertyData","uploadProperty","relatedItemProperty","itemProperty","childUploads","childProperty","filePath","fileContents","fileBuffer","fs","separator","compositeFileContents","childUpload","childUploadContents","uint8Array","itemPropertyLocalId","itemPropertyName","getStorageSeedUploadData","itemStorageSeedProperties","snapshot","propertyValue","refResolvedValue","getCorrectId","ModelPropertyDataTypes","appendCoPublishedImageUploadData","appDb","BaseDb","rows","htmlEmbeddedImageCoPublish","eq","seen","row","imageItem","st","stSnap","stCtx","stValue","decoded","more","getPublishUploadData","itemUploadProperties","itemRelationProperties","itemImageProperties","getSegmentedItemProperties","storageSeedUploads","relationProperty","relatedItem","SIG_TYPE_ETHEREUM","SIG_LENGTH","PLACEHOLDER_MESSAGE","ANCHOR_LENGTH","UINT64_MASK","buildPublishAnchorBytes","walletAddress","timestampMs","uniqueness","hash","ethers","encodeTargetOrAnchorSection","raw","isEthersWallet","signer","writeZigZagVInt","offset","pos","byte","serializeTags","encoder","temp","appendLong","len","tag","nameBytes","valueBytes","totalLength","sum","chunk","writeUint64LE","buf","view","sha384","concat","deepHash","enc","acc","chunkHash","tagHash","dataHash","getSignatureData","ownerBytes","rawTarget","rawAnchor","rawTags","rawData","buildMessageBytes","serializedTags","numTagsBytes","numTagBytesBytes","targetSection","anchorSection","messageparts","messageLength","part","assembleDataItemAndId","signature","sigTypeBytes","fullLength","base64url","createSignedDataItem","pubKeyHex","signatureData","createSignedDataItemWithAccount","placeholderHex","placeholderSig","digest","signatureDataHex","sigHex","OWNER_LENGTH_ETHEREUM","getTagsStartOffset","targetStart","targetFlag","targetPresent","anchorFlag","anchorPresent","sliceTargetAndAnchor","tagsStart","anchorStart","verifyDataItem","minLength","numTagBytes","tagsEnd","recoveredPubKey","recoveredBytes","signBundlerUploadDataList","uploadDataList","signDataItems","dataItemSigner","arweaveTransactions","signedDataItems","items","randomUniq","dataItem","createArweaveDataItems","uploadDataOpts","executeCreateArweaveDataItemsPhase2","createArweaveDataItemsPhase2","BASE64_CHUNK_SIZE","arrayBufferToBase64","buffer","formDataToSerializableParts","formData","name","entry","file","uploadServerErrorMessage","status","body","transactionKeys","uploadNetworkErrorMessage","technicalMessage","postUploadArweaveStart","url","uploadApiBaseUrl","api","res","sendReimbursementRequest","reimbursementTransactionId","transactions","transaction","dataBlob","chunksBlob","jsonBlob","serverMessage","technicalMsg","errMsg","pollForConfirmation","requestResponse","reject","response","ensureUint8Array","uploadData","fromCallback","sendBack","input","ctx","resumeState","startIndex","total","rawTransaction","uploader","uploaderState","dataBytes","pct","error","BATCH_UPLOAD_TIMEOUT_MS","uploadViaBundler","bundlerUrl","itemCount","getRawCache","rawByteLength","resolved","stat","totalSize","lengths","payload","cached","readFile","controller","uploadTimeoutId","failed","succeeded","MSG_UNAVAILABLE","MSG_NOT_DEPLOYED","MSG_NOT_DEPLOYED_AFTER_ATTEMPT","MSG_FAILED_DEPLOY","ensureManagedAccountReady","getManagedAccountSigningAccount","managedWallet","tryDeployManagedAccount","runModularExecutorPublishPrep","state","e","signingAccount","adminUpdatedEvent","filters","initializedEvent","signerPermissionsUpdatedEvent","contractURIUpdatedEvent","createdAttestationEvent","eIP712DomainChangedEvent","logEvent","ownershipTransferredEvent","seedPublishedEvent","entryPoint","getAllActiveSigners","getAllAdmins","getAllExtensions","getAllSigners","getImplementationForFunction","getNonce","getPermissionsForSigner","isActiveSigner","isAdmin","isValidSigner","verifySignerPermissionRequest","contractURI","getMessageHash","isValidSignature","supportsInterface","eip712Domain","getEas","owner","initialize","multicall","setEntrypointOverride","setPermissionsForSigner","validateUserOp","addDeposit","execute","executeBatch","onERC1155BatchReceived","onERC1155Received","onERC721Received","setContractURI","withdrawDepositTo","createSeed","createVersion","multiPublish","multiPublishWithIntegerIds","publish","renounceOwnership","setEas","transferOwnership","PERSIST_SEED_UID_TIMEOUT_MS","persistSeedUidFromPublishResult","normalizedRequests","match","persistSeedUidSafely","address","attestationCreatedAtMs","persist","timeout","_","SCHEMA_REGISTRY_ABI","getSchemaRegistryContract","GET_SCHEMA_SIGNATURE","getSchemaRecord","registerSchema","prepareNameSchemaAttestation","encodedData","SchemaEncoder","NO_EXPIRATION","RESOLVER_ADDRESS","REVOCABLE","toSnakeCase","str","getModelNamesForItem","itemListProperties","modelNames","prop","ref","ensureEasSchemasForItem","itemBasicProperties","allProperties","registeredSchemaUids","registeredModelSchemaUids","modelName","schemaDef","SchemaRegistry","setSchemaUidForModel","registerTx","registerResult","attestTx","attestResult","storageSchemaDef","storageSchemaUid","setSchemaUidForSchemaDefinition","property","easDataTypeRaw","INTERNAL_DATA_TYPES","nameForEas","propertyNameSnakeCase","easDataTypeForLookup","schema","getEasSchemaForItemProperty","onChainRecord","relatedItems","getRelatedItemsForPublish","verifyArweaveTransactionsExist","txIds","txId","getUploadPipelineTransactionStatus","detail","toHex32Normalized","v","seedUidFromCreatedAttestationEvents","wantSchema","createdAttestationEvt","executorCreatedAttestationEvent","uidsFromSeedPublished","listOfAttestationsCount","first","executorSeedPublishedEvent","args","versionUid","decodeAbiParameters","seedIndex","atSeed","atVersion","seedUidFromSeedPublished","versionUidFromCreatedAttestationEvents","versionSchemaUid","listCreatedAttestationPairsFromReceipt","su","attestationMsFromReceipt","bn","rpc","getRpcClient","ts","eth_getBlockByNumber","BYTES32_LEN","toHex32","arr","toBytesHex","hex","hasCrossPayloadUnresolved","reqs","localIds","att","filterPropertiesToUpdateForBatch","propertiesToUpdate","batchLocalIds","pu","placeholderData","normalizePublishRequest","listOfAttestations","dataArr","applyPropertiesToUpdatePlaceholders","byLocalId","targetId","targetReq","PHASE_PENDING","enqueueArweaveL1FinalizeJobsFromPublishContext","db","now","ar","up","dataItemId","arweaveL1FinalizeJobs","MSG_NO_ACCOUNT","MSG_NOT_UPGRADED","MSG_DEPLOY_FAILED","MSG_NOT_CONFIRMED","ensureEip7702ModularAccountReady","autoDeployEip7702ModularAccount","modularAccountWallet","modularAccount","deploySmartAccount","MSG_SET_EAS","normAddr","ensureManagedAccountEasConfigured","expected","zeroAddress","current","resolvePublishRouting","publisherAddress","persistVersionUidFromPublishReceipt","contractAddressForEvents","attMs","updateVersionUid","schemaMatchesAttestationPair","pairSchema","requestSchema","consumeIfSchemaMatches","all","persistPropertyMetadataUidsFromContractReceipt","allPairs","slice","nApply","versionUidRow","applyPropertyAttestationUidsFromPublish","j","createAttestations","txCount","uploadCount","routing","activeAccount","uploadDataWithTxIds","arweaveTransaction","requestData","prep","targetContract","needsSequential","effectiveRequests","lastAttestationReceipt","workingPayload","resolvedUids","resolvePublishPayloadValues","rawReq","reqForPublish","normalizedOne","byLocalIdSingle","hadZeroSeedUid","seedUidFromTx","payloadForContract","rootReqSingle","firstRequest","firstRequestSeedUid","itemWithPersist","rootSeedUid","seedAttMs","clearHtmlEmbeddedImageCoPublishRows","VERIFY_DELAY_MS","VERIFY_MAX_ATTEMPTS","verifyAttestations","request","easProperties","lastError","attempt","getItemPropertiesFromEas","foundSet","createAttestationsDirectToEas","lastAttestationMs","newSeedUid","newVersionUid","seedUidFromReceipt","versionUidFromReceipt","multiRequests","multiTx","attested","sameLen","resolveItem","itemNeedsArweaveUpload","itemHasPublishUploadCandidates","activePublishProcesses","resolveAttestationStrategy","cfg","checking","publishMode","isItemOwned","validation","validateItemForPublish","attestationStrategy","needsArweave","useBundler","SUCCESS","FAILURE","attestationUsesDirectEas","attestationUsesMultiPublish","getErrorFromEvent","publishMachine","setup","errors","setPublishManagerRef","getPublishManagerRef","getStateValue","isLongRunningState","stateValue","subscribe","receive","publishProcess","managerRef","periodicSaveIntervalId","clearPeriodicSave","startPeriodicSaveIfNeeded","live","liveValue","subscription","type","createPublish","enqueueActions","enqueue","spawn","publishProcesses","publishRunId","publishCfg","arweaveUploadTags","subscriptions","subscriptionProcess","retryAttestations","stopScopedOrStandaloneChild","self","child","saveWriteTailBySeed","enqueueSaveWrite","write","next","isTerminalPublishRowStatus","statusFromSnapshot","MAX_ERROR_MESSAGE_LENGTH","MAX_ERROR_DETAILS_LENGTH","jsonStringifyPersistedSnapshot","_key","publishRunIdFromSnapshot","errorFieldsFromContext","errorMessage","errorStep","errorDetails","markInProgressPublishInterrupted","existing","and","desc","savePublish","persistedSnapshot","triggerPublishDone","snapshotStr","errorFields","rec","incomingRunId","latest","prevParsed","schemaId","stopPublish","newPublishProcesses","newSubscriptions","stopAll","query","addSubscription","newSubscription","HEAVY_PUBLISH_CONTEXT_KEYS","stripHeavyContextFields","k","stripHeavyPublishSnapshot","nestedOut","getPersistableSnapshot","actor","snap","requestSavePublish","publishDone","removeSubscription","RESTORE_DB_WAIT_MS","RESTORE_DB_POLL_MS","waitForDb","maxWaitMs","deadline","isRestorableSnapshot","isPersistedActorRef","patchPublishContextItemForRestore","record","restoreFromDb","inProgress","bySeed","sorted","publishProcessRecords","publishProcessRecord","createActor","publishManagerMachine","publishManager","PublishManager","subscriptionActor","USER_DISCONNECTED_SESSION_KEY","reportWalletSetupWarning","waitUntilSeedInitialized","seedClient","ensureExecutorModulesForConnect","mw","ma","ConnectButton","useActiveWallet","connectionStatus","useActiveWalletConnectionStatus","isAutoConnecting","useIsAutoConnecting","lastSyncedOwnedKey","prevIsAutoConnecting","reloadAutoConnectRetried","prev","navType","userChoseDisconnect","syncActiveWalletToSeed","useCallback","activeWallet","owned","tryManaged","ownedKey","cancelled","handleDisconnect","handleConnect","_allConnectedWallets","ConnectButtonThirdweb","darkTheme","PublishModeButtons","onChange","disabled","ariaLabel","base","btn","active","getDisplayStepId","machineValue","resolvePublishDisplayValue","getPublishMachineValueForUi","isTerminalDoneSnapshot","usePublishProcess","useSelector","lastPublishSnapshotRef","setMachineValue","terminalLatch","setTerminalLatch","latestProcessRowQuery","useMemo","latestRecord","useLiveQuery","recordStatus","fromRow","last","initial","sub","useCanPublishItem","canPublish","setCanPublish","useArweaveL1Finalize","jobsQuery","jobs","pending","confirmed","useItemPublishStatus","arweaveL1","isActive","usePublishProcessesQuery","usePublishProcessesQueryForSeed","usePublishProcessesState","records","nonActiveCount","usePublishProcesses","usePublishProcessesNonActiveCount","usePublishProcessesForSeed","usePublishProcessesStateForSeed","usePublishProcessesNonActiveCountForSeed","usePublishProcessById","isLoading","clearCompletedPublishProcesses","notInArray","clearCompletedPublishProcessesForSeed","clearAllPublishProcesses","clearAllUploadProcesses","uploadProcesses","deletePublishProcessesForSeed","deletePublishProcessById","deletePublishProcessesByIds","ids","inArray","getArweaveTransactionIds","at","getEasPayload","transformPayloadToIntegerIds","localIdToIndex","localId","publishLocalId","index","_omit","_omitLocalId","MSG_NO_ACCOUNT_MODULAR","ensureSmartWalletThenPublish","uniqueAddressesLower","addresses","set","x","defaultApprovedTargetsForModularPublish"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/helpers/constants.ts","../src/helpers/thirdweb/11155420/0x76f47d88bfaf670f5208911181fcdc0e160cb16d.ts","../src/helpers/thirdweb.ts","../src/helpers/easDirect.ts","../src/helpers/resolveRevokeAccount.ts","../src/services/revoke/revokeAttestations.ts","../src/config.ts","../src/errors.ts","../src/react/PublishProvider.tsx","../src/helpers/ensureExecutorModule.ts","../src/services/publishManager/actions/assignRestoreFromDb.ts","../src/helpers/blockchain.ts","../src/services/publish/actors/utils.ts","../src/services/publish/actors/createArweaveTransactions.ts","../src/services/publish/actors/createArweaveTransactionsPhase2.ts","../src/services/publish/actors/preparingHtmlEmbedded.ts","../src/services/publish/actors/rewritingHtmlEmbedded.ts","../src/services/publish/helpers/getPublishUploadData.ts","../src/helpers/arweave.ts","../src/services/publish/actors/createArweaveDataItems.ts","../src/services/publish/actors/createArweaveDataItemsPhase2.ts","../src/helpers/uploadApi.ts","../src/services/publish/actors/sendReimbursementRequest.ts","../src/services/publish/actors/pollForConfirmation.ts","../src/services/publish/actors/uploadData.ts","../src/services/publish/actors/uploadViaBundler.ts","../src/helpers/ensureManagedAccountReady.ts","../src/helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148.ts","../src/services/publish/actors/persistSeedUid.ts","../src/helpers/thirdweb/11155420/schemaRegistry.ts","../src/helpers/thirdweb/11155420/nameSchemaAttestation.ts","../src/services/publish/helpers/ensureEasSchemas.ts","../src/services/publish/helpers/verifyArweaveTransactionsExist.ts","../src/helpers/thirdweb/11155420/0x043462304114da543add6b693c686b7d98865f3e.ts","../src/services/publish/actors/seedUidHelpers.ts","../src/services/publish/helpers/receiptAttestationMs.ts","../src/services/publish/actors/publishRequestNormalize.ts","../src/services/arweaveL1Finalize/enqueue.ts","../src/helpers/ensureEip7702ModularAccountReady.ts","../src/helpers/ensureManagedAccountEasConfigured.ts","../src/services/publish/actors/createAttestations.ts","../src/services/publish/helpers/verifyAttestations.ts","../src/services/publish/actors/createAttestationsDirectToEas.ts","../src/services/publish/helpers/itemNeedsArweave.ts","../src/services/publish/actors/checking.ts","../src/services/publish/index.ts","../src/services/publishManager/publishManagerRef.ts","../src/services/publishManager/actors/subscribe.ts","../src/services/publishManager/actions/createPublish.ts","../src/services/publishManager/actions/retryAttestations.ts","../src/services/publishManager/actions/stopScopedOrStandaloneChild.ts","../src/services/publishManager/actors/savePublish.ts","../src/services/publishManager/actions/stopPublish.ts","../src/services/publishManager/actions/stopAll.ts","../src/services/publishManager/actions/query.ts","../src/services/publishManager/actions/addSubscription.ts","../src/services/publishManager/actions/requestSavePublish.ts","../src/services/publishManager/actions/publishDone.ts","../src/services/publishManager/actions/removeSubscription.ts","../src/services/publishManager/actors/restoreFromDb.ts","../src/services/publishManager/index.ts","../src/react/ConnectButton.tsx","../src/react/PublishModeButtons.tsx","../src/helpers/publishDisplayHelpers.ts","../src/hooks/usePublishProcess.ts","../src/hooks/useCanPublishItem.ts","../src/hooks/useArweaveL1Finalize.ts","../src/hooks/useItemPublishStatus.ts","../src/hooks/usePublishProcesses.ts","../src/hooks/clearCompletedPublishProcesses.ts","../src/hooks/publishProcessHelpers.ts","../src/helpers/transformPayloadToIntegerIds.ts","../src/helpers/ensureSmartWalletThenPublish.ts","../src/helpers/defaultApprovedTargetsForModularPublish.ts"],"sourcesContent":["/**\n * Constants for the publish package.\n */\n/** EAS Schema Registry on Optimism Sepolia (chain 11155420) */\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/** Thirdweb ManagedAccount factory on Optimism Sepolia (chain 11155420) */\nexport const THIRDWEB_ACCOUNT_FACTORY_ADDRESS =\n '0x76f47d88bfaf670f5208911181fcdc0e160cb16d' as const\n\n/** EAS contract address on Optimism Sepolia (chain 11155420) */\nexport const EAS_CONTRACT_ADDRESS =\n '0x4200000000000000000000000000000000000021' as const\n\n/**\n * Optimism Sepolia address of the deployment the **`multiPublish` Thirdweb ABI** was generated from\n * (`helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148`).\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 {\n prepareEvent,\n prepareContractCall,\n readContract,\n type BaseTransactionOptions,\n type AbiParameterToPrimitiveType,\n} from \"thirdweb\";\n\n/**\n* Contract events\n*/\n\n/**\n * Represents the filters for the \"AccountCreated\" event.\n */\nexport type AccountCreatedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\naccountAdmin: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"accountAdmin\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the AccountCreated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { accountCreatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * accountCreatedEvent({\n * account: ...,\n * accountAdmin: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function accountCreatedEvent(filters: AccountCreatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event AccountCreated(address indexed account, address indexed accountAdmin)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the ContractURIUpdated event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { contractURIUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * contractURIUpdatedEvent()\n * ],\n * });\n * ```\n */ \nexport function contractURIUpdatedEvent() {\n return prepareEvent({\n signature: \"event ContractURIUpdated(string prevURI, string newURI)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"ExtensionAdded\" event.\n */\nexport type ExtensionAddedEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nimplementation: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the ExtensionAdded event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { extensionAddedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * extensionAddedEvent({\n * name: ...,\n * implementation: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function extensionAddedEvent(filters: ExtensionAddedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ExtensionAdded(string indexed name, address indexed implementation, ((string name, string metadataURI, address implementation) metadata, (bytes4 functionSelector, string functionSignature)[] functions) extension)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"ExtensionRemoved\" event.\n */\nexport type ExtensionRemovedEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the ExtensionRemoved event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { extensionRemovedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * extensionRemovedEvent({\n * name: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function extensionRemovedEvent(filters: ExtensionRemovedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ExtensionRemoved(string indexed name, ((string name, string metadataURI, address implementation) metadata, (bytes4 functionSelector, string functionSignature)[] functions) extension)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"ExtensionReplaced\" event.\n */\nexport type ExtensionReplacedEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nimplementation: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"implementation\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the ExtensionReplaced event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { extensionReplacedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * extensionReplacedEvent({\n * name: ...,\n * implementation: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function extensionReplacedEvent(filters: ExtensionReplacedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ExtensionReplaced(string indexed name, address indexed implementation, ((string name, string metadataURI, address implementation) metadata, (bytes4 functionSelector, string functionSignature)[] functions) extension)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"FunctionDisabled\" event.\n */\nexport type FunctionDisabledEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"functionSelector\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the FunctionDisabled event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { functionDisabledEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * functionDisabledEvent({\n * name: ...,\n * functionSelector: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function functionDisabledEvent(filters: FunctionDisabledEventFilters = {}) {\n return prepareEvent({\n signature: \"event FunctionDisabled(string indexed name, bytes4 indexed functionSelector, (string name, string metadataURI, address implementation) extMetadata)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"FunctionEnabled\" event.\n */\nexport type FunctionEnabledEventFilters = Partial<{\n name: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"name\",\"indexed\":true}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"functionSelector\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the FunctionEnabled event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { functionEnabledEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * functionEnabledEvent({\n * name: ...,\n * functionSelector: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function functionEnabledEvent(filters: FunctionEnabledEventFilters = {}) {\n return prepareEvent({\n signature: \"event FunctionEnabled(string indexed name, bytes4 indexed functionSelector, (bytes4 functionSelector, string functionSignature) extFunction, (string name, string metadataURI, address implementation) extMetadata)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"RoleAdminChanged\" event.\n */\nexport type RoleAdminChangedEventFilters = Partial<{\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\",\"indexed\":true}>\npreviousAdminRole: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"previousAdminRole\",\"indexed\":true}>\nnewAdminRole: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"newAdminRole\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the RoleAdminChanged event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { roleAdminChangedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * roleAdminChangedEvent({\n * role: ...,\n * previousAdminRole: ...,\n * newAdminRole: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function roleAdminChangedEvent(filters: RoleAdminChangedEventFilters = {}) {\n return prepareEvent({\n signature: \"event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"RoleGranted\" event.\n */\nexport type RoleGrantedEventFilters = Partial<{\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\",\"indexed\":true}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsender: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"sender\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the RoleGranted event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { roleGrantedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * roleGrantedEvent({\n * role: ...,\n * account: ...,\n * sender: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function roleGrantedEvent(filters: RoleGrantedEventFilters = {}) {\n return prepareEvent({\n signature: \"event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"RoleRevoked\" event.\n */\nexport type RoleRevokedEventFilters = Partial<{\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\",\"indexed\":true}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsender: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"sender\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the RoleRevoked event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { roleRevokedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * roleRevokedEvent({\n * role: ...,\n * account: ...,\n * sender: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function roleRevokedEvent(filters: RoleRevokedEventFilters = {}) {\n return prepareEvent({\n signature: \"event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerAdded\" event.\n */\nexport type SignerAddedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerAdded event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerAddedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerAddedEvent({\n * account: ...,\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerAddedEvent(filters: SignerAddedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerAdded(address indexed account, address indexed signer)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerRemoved\" event.\n */\nexport type SignerRemovedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\",\"indexed\":true}>\nsigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerRemoved event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerRemovedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerRemovedEvent({\n * account: ...,\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerRemovedEvent(filters: SignerRemovedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerRemoved(address indexed account, address indexed signer)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"AdminUpdated\" event.\n */\nexport type AdminUpdatedEventFilters = Partial<{\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the AdminUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { adminUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * adminUpdatedEvent({\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function adminUpdatedEvent(filters: AdminUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event AdminUpdated(address indexed signer, bool isAdmin)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerPermissionsUpdated\" event.\n */\nexport type SignerPermissionsUpdatedEventFilters = Partial<{\n authorizingSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"authorizingSigner\",\"indexed\":true}>\ntargetSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"targetSigner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerPermissionsUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerPermissionsUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerPermissionsUpdatedEvent({\n * authorizingSigner: ...,\n * targetSigner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerPermissionsUpdatedEvent(filters: SignerPermissionsUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerPermissionsUpdated(address indexed authorizingSigner, address indexed targetSigner, (address signer, uint8 isAdmin, address[] approvedTargets, uint256 nativeTokenLimitPerTransaction, uint128 permissionStartTimestamp, uint128 permissionEndTimestamp, uint128 reqValidityStartTimestamp, uint128 reqValidityEndTimestamp, bytes32 uid) permissions)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the CreatedAttestation event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { createdAttestationEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * createdAttestationEvent()\n * ],\n * });\n * ```\n */ \nexport function createdAttestationEvent() {\n return prepareEvent({\n signature: \"event CreatedAttestation((bytes32 schemaUid, bytes32 attestationUid) result)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the EIP712DomainChanged event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { eIP712DomainChangedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * eIP712DomainChangedEvent()\n * ],\n * });\n * ```\n */ \nexport function eIP712DomainChangedEvent() {\n return prepareEvent({\n signature: \"event EIP712DomainChanged()\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Initialized event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { initializedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * initializedEvent()\n * ],\n * });\n * ```\n */ \nexport function initializedEvent() {\n return prepareEvent({\n signature: \"event Initialized(uint8 version)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Log event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { logEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * logEvent()\n * ],\n * });\n * ```\n */ \nexport function logEvent() {\n return prepareEvent({\n signature: \"event Log(string message)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"OwnershipTransferred\" event.\n */\nexport type OwnershipTransferredEventFilters = Partial<{\n previousOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true}>\nnewOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the OwnershipTransferred event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { ownershipTransferredEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * ownershipTransferredEvent({\n * previousOwner: ...,\n * newOwner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function ownershipTransferredEvent(filters: OwnershipTransferredEventFilters = {}) {\n return prepareEvent({\n signature: \"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the SeedPublished event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { seedPublishedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * seedPublishedEvent()\n * ],\n * });\n * ```\n */ \nexport function seedPublishedEvent() {\n return prepareEvent({\n signature: \"event SeedPublished(bytes returnedDataFromEAS)\",\n });\n};\n \n\n/**\n* Contract read functions\n*/\n\n\n\n/**\n * Calls the \"DEFAULT_ADMIN_ROLE\" function on the contract.\n * @param options - The options for the DEFAULT_ADMIN_ROLE function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { DEFAULT_ADMIN_ROLE } from \"TODO\";\n * \n * const result = await DEFAULT_ADMIN_ROLE();\n * \n * ```\n */\nexport async function DEFAULT_ADMIN_ROLE(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa217fddf\",\n [],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"accountImplementation\" function on the contract.\n * @param options - The options for the accountImplementation function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { accountImplementation } from \"TODO\";\n * \n * const result = await accountImplementation();\n * \n * ```\n */\nexport async function accountImplementation(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x11464fbe\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"contractURI\" function on the contract.\n * @param options - The options for the contractURI function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { contractURI } from \"TODO\";\n * \n * const result = await contractURI();\n * \n * ```\n */\nexport async function contractURI(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe8a3d485\",\n [],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"defaultExtensions\" function on the contract.\n * @param options - The options for the defaultExtensions function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { defaultExtensions } from \"TODO\";\n * \n * const result = await defaultExtensions();\n * \n * ```\n */\nexport async function defaultExtensions(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x463c4864\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"entrypoint\" function on the contract.\n * @param options - The options for the entrypoint function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { entrypoint } from \"TODO\";\n * \n * const result = await entrypoint();\n * \n * ```\n */\nexport async function entrypoint(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa65d69d4\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getAccounts\" function.\n */\nexport type GetAccountsParams = {\n start: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_start\"}>\nend: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_end\"}>\n};\n\n/**\n * Calls the \"getAccounts\" function on the contract.\n * @param options - The options for the getAccounts function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAccounts } from \"TODO\";\n * \n * const result = await getAccounts({\n * start: ...,\n * end: ...,\n * });\n * \n * ```\n */\nexport async function getAccounts(\n options: BaseTransactionOptions<GetAccountsParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe68a7c3b\",\n [\n {\n \"type\": \"uint256\",\n \"name\": \"_start\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"_end\"\n }\n ],\n [\n {\n \"type\": \"address[]\",\n \"name\": \"accounts\"\n }\n ]\n],\n params: [options.start, options.end]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getAccountsOfSigner\" function.\n */\nexport type GetAccountsOfSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"getAccountsOfSigner\" function on the contract.\n * @param options - The options for the getAccountsOfSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAccountsOfSigner } from \"TODO\";\n * \n * const result = await getAccountsOfSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function getAccountsOfSigner(\n options: BaseTransactionOptions<GetAccountsOfSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x0e6254fd\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"address[]\",\n \"name\": \"accounts\"\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getAddress\" function.\n */\nexport type GetAddressParams = {\n adminSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_adminSigner\"}>\ndata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_data\"}>\n};\n\n/**\n * Calls the \"getAddress\" function on the contract.\n * @param options - The options for the getAddress function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAddress } from \"TODO\";\n * \n * const result = await getAddress({\n * adminSigner: ...,\n * data: ...,\n * });\n * \n * ```\n */\nexport async function getAddress(\n options: BaseTransactionOptions<GetAddressParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8878ed33\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_adminSigner\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_data\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.adminSigner, options.data]\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllAccounts\" function on the contract.\n * @param options - The options for the getAllAccounts function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllAccounts } from \"TODO\";\n * \n * const result = await getAllAccounts();\n * \n * ```\n */\nexport async function getAllAccounts(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x08e93d0a\",\n [],\n [\n {\n \"type\": \"address[]\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllExtensions\" function on the contract.\n * @param options - The options for the getAllExtensions function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllExtensions } from \"TODO\";\n * \n * const result = await getAllExtensions();\n * \n * ```\n */\nexport async function getAllExtensions(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x4a00cc48\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"allExtensions\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getExtension\" function.\n */\nexport type GetExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"extensionName\"}>\n};\n\n/**\n * Calls the \"getExtension\" function on the contract.\n * @param options - The options for the getExtension function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getExtension } from \"TODO\";\n * \n * const result = await getExtension({\n * extensionName: ...,\n * });\n * \n * ```\n */\nexport async function getExtension(\n options: BaseTransactionOptions<GetExtensionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xc22707ee\",\n [\n {\n \"type\": \"string\",\n \"name\": \"extensionName\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ]\n],\n params: [options.extensionName]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getImplementationForFunction\" function.\n */\nexport type GetImplementationForFunctionParams = {\n functionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"getImplementationForFunction\" function on the contract.\n * @param options - The options for the getImplementationForFunction function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getImplementationForFunction } from \"TODO\";\n * \n * const result = await getImplementationForFunction({\n * functionSelector: ...,\n * });\n * \n * ```\n */\nexport async function getImplementationForFunction(\n options: BaseTransactionOptions<GetImplementationForFunctionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xce0b6013\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getMetadataForFunction\" function.\n */\nexport type GetMetadataForFunctionParams = {\n functionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"functionSelector\"}>\n};\n\n/**\n * Calls the \"getMetadataForFunction\" function on the contract.\n * @param options - The options for the getMetadataForFunction function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getMetadataForFunction } from \"TODO\";\n * \n * const result = await getMetadataForFunction({\n * functionSelector: ...,\n * });\n * \n * ```\n */\nexport async function getMetadataForFunction(\n options: BaseTransactionOptions<GetMetadataForFunctionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa0dbaefd\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n }\n ]\n],\n params: [options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getRoleAdmin\" function.\n */\nexport type GetRoleAdminParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\n};\n\n/**\n * Calls the \"getRoleAdmin\" function on the contract.\n * @param options - The options for the getRoleAdmin function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getRoleAdmin } from \"TODO\";\n * \n * const result = await getRoleAdmin({\n * role: ...,\n * });\n * \n * ```\n */\nexport async function getRoleAdmin(\n options: BaseTransactionOptions<GetRoleAdminParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x248a9ca3\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.role]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getRoleMember\" function.\n */\nexport type GetRoleMemberParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\nindex: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"index\"}>\n};\n\n/**\n * Calls the \"getRoleMember\" function on the contract.\n * @param options - The options for the getRoleMember function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getRoleMember } from \"TODO\";\n * \n * const result = await getRoleMember({\n * role: ...,\n * index: ...,\n * });\n * \n * ```\n */\nexport async function getRoleMember(\n options: BaseTransactionOptions<GetRoleMemberParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x9010d07c\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"index\"\n }\n ],\n [\n {\n \"type\": \"address\",\n \"name\": \"member\"\n }\n ]\n],\n params: [options.role, options.index]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getRoleMemberCount\" function.\n */\nexport type GetRoleMemberCountParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\n};\n\n/**\n * Calls the \"getRoleMemberCount\" function on the contract.\n * @param options - The options for the getRoleMemberCount function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getRoleMemberCount } from \"TODO\";\n * \n * const result = await getRoleMemberCount({\n * role: ...,\n * });\n * \n * ```\n */\nexport async function getRoleMemberCount(\n options: BaseTransactionOptions<GetRoleMemberCountParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xca15c873\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n }\n ],\n [\n {\n \"type\": \"uint256\",\n \"name\": \"count\"\n }\n ]\n],\n params: [options.role]\n });\n};\n\n\n/**\n * Represents the parameters for the \"hasRole\" function.\n */\nexport type HasRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"hasRole\" function on the contract.\n * @param options - The options for the hasRole function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { hasRole } from \"TODO\";\n * \n * const result = await hasRole({\n * role: ...,\n * account: ...,\n * });\n * \n * ```\n */\nexport async function hasRole(\n options: BaseTransactionOptions<HasRoleParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x91d14854\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"hasRoleWithSwitch\" function.\n */\nexport type HasRoleWithSwitchParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"hasRoleWithSwitch\" function on the contract.\n * @param options - The options for the hasRoleWithSwitch function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { hasRoleWithSwitch } from \"TODO\";\n * \n * const result = await hasRoleWithSwitch({\n * role: ...,\n * account: ...,\n * });\n * \n * ```\n */\nexport async function hasRoleWithSwitch(\n options: BaseTransactionOptions<HasRoleWithSwitchParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa32fa5b3\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isRegistered\" function.\n */\nexport type IsRegisteredParams = {\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_account\"}>\n};\n\n/**\n * Calls the \"isRegistered\" function on the contract.\n * @param options - The options for the isRegistered function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isRegistered } from \"TODO\";\n * \n * const result = await isRegistered({\n * account: ...,\n * });\n * \n * ```\n */\nexport async function isRegistered(\n options: BaseTransactionOptions<IsRegisteredParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xc3c5a547\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n\n\n/**\n * Calls the \"totalAccounts\" function on the contract.\n * @param options - The options for the totalAccounts function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { totalAccounts } from \"TODO\";\n * \n * const result = await totalAccounts();\n * \n * ```\n */\nexport async function totalAccounts(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x58451f97\",\n [],\n [\n {\n \"type\": \"uint256\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllActiveSigners\" function on the contract.\n * @param options - The options for the getAllActiveSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllActiveSigners } from \"TODO\";\n * \n * const result = await getAllActiveSigners();\n * \n * ```\n */\nexport async function getAllActiveSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8b52d723\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllAdmins\" function on the contract.\n * @param options - The options for the getAllAdmins function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllAdmins } from \"TODO\";\n * \n * const result = await getAllAdmins();\n * \n * ```\n */\nexport async function getAllAdmins(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe9523c97\",\n [],\n [\n {\n \"type\": \"address[]\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllSigners\" function on the contract.\n * @param options - The options for the getAllSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllSigners } from \"TODO\";\n * \n * const result = await getAllSigners();\n * \n * ```\n */\nexport async function getAllSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd42f2f35\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getMessageHash\" function.\n */\nexport type GetMessageHashParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\n};\n\n/**\n * Calls the \"getMessageHash\" function on the contract.\n * @param options - The options for the getMessageHash function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getMessageHash } from \"TODO\";\n * \n * const result = await getMessageHash({\n * hash: ...,\n * });\n * \n * ```\n */\nexport async function getMessageHash(\n options: BaseTransactionOptions<GetMessageHashParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x399b77da\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.hash]\n });\n};\n\n\n/**\n * Represents the parameters for the \"getPermissionsForSigner\" function.\n */\nexport type GetPermissionsForSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"getPermissionsForSigner\" function on the contract.\n * @param options - The options for the getPermissionsForSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getPermissionsForSigner } from \"TODO\";\n * \n * const result = await getPermissionsForSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function getPermissionsForSigner(\n options: BaseTransactionOptions<GetPermissionsForSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xf15d424e\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isActiveSigner\" function.\n */\nexport type IsActiveSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"isActiveSigner\" function on the contract.\n * @param options - The options for the isActiveSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isActiveSigner } from \"TODO\";\n * \n * const result = await isActiveSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function isActiveSigner(\n options: BaseTransactionOptions<IsActiveSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x7dff5a79\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isAdmin\" function.\n */\nexport type IsAdminParams = {\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_account\"}>\n};\n\n/**\n * Calls the \"isAdmin\" function on the contract.\n * @param options - The options for the isAdmin function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isAdmin } from \"TODO\";\n * \n * const result = await isAdmin({\n * account: ...,\n * });\n * \n * ```\n */\nexport async function isAdmin(\n options: BaseTransactionOptions<IsAdminParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x24d7806c\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isValidSignature\" function.\n */\nexport type IsValidSignatureParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"isValidSignature\" function on the contract.\n * @param options - The options for the isValidSignature function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isValidSignature } from \"TODO\";\n * \n * const result = await isValidSignature({\n * hash: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function isValidSignature(\n options: BaseTransactionOptions<IsValidSignatureParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x1626ba7e\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"magicValue\"\n }\n ]\n],\n params: [options.hash, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"supportsInterface\" function.\n */\nexport type SupportsInterfaceParams = {\n interfaceId: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"interfaceId\"}>\n};\n\n/**\n * Calls the \"supportsInterface\" function on the contract.\n * @param options - The options for the supportsInterface function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { supportsInterface } from \"TODO\";\n * \n * const result = await supportsInterface({\n * interfaceId: ...,\n * });\n * \n * ```\n */\nexport async function supportsInterface(\n options: BaseTransactionOptions<SupportsInterfaceParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x01ffc9a7\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"interfaceId\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.interfaceId]\n });\n};\n\n\n/**\n * Represents the parameters for the \"verifySignerPermissionRequest\" function.\n */\nexport type VerifySignerPermissionRequestParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"signature\"}>\n};\n\n/**\n * Calls the \"verifySignerPermissionRequest\" function on the contract.\n * @param options - The options for the verifySignerPermissionRequest function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { verifySignerPermissionRequest } from \"TODO\";\n * \n * const result = await verifySignerPermissionRequest({\n * req: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function verifySignerPermissionRequest(\n options: BaseTransactionOptions<VerifySignerPermissionRequestParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa9082d84\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ],\n [\n {\n \"type\": \"bool\",\n \"name\": \"success\"\n },\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ]\n],\n params: [options.req, options.signature]\n });\n};\n\n\n\n\n/**\n * Calls the \"eip712Domain\" function on the contract.\n * @param options - The options for the eip712Domain function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { eip712Domain } from \"TODO\";\n * \n * const result = await eip712Domain();\n * \n * ```\n */\nexport async function eip712Domain(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x84b0196e\",\n [],\n [\n {\n \"type\": \"bytes1\",\n \"name\": \"fields\"\n },\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"version\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"chainId\"\n },\n {\n \"type\": \"address\",\n \"name\": \"verifyingContract\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"salt\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"extensions\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getEas\" function on the contract.\n * @param options - The options for the getEas function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getEas } from \"TODO\";\n * \n * const result = await getEas();\n * \n * ```\n */\nexport async function getEas(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd5f5127d\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"owner\" function on the contract.\n * @param options - The options for the owner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { owner } from \"TODO\";\n * \n * const result = await owner();\n * \n * ```\n */\nexport async function owner(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8da5cb5b\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n* Contract write functions\n*/\n\n/**\n * Represents the parameters for the \"_disableFunctionInExtension\" function.\n */\nexport type _disableFunctionInExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"_disableFunctionInExtension\" function on the contract.\n * @param options - The options for the \"_disableFunctionInExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { _disableFunctionInExtension } from \"TODO\";\n * \n * const transaction = _disableFunctionInExtension({\n * extensionName: ...,\n * functionSelector: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function _disableFunctionInExtension(\n options: BaseTransactionOptions<_disableFunctionInExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x429eed80\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n },\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n []\n],\n params: [options.extensionName, options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"addExtension\" function.\n */\nexport type AddExtensionParams = {\n extension: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_extension\",\"components\":[{\"type\":\"tuple\",\"name\":\"metadata\",\"components\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"metadataURI\"},{\"type\":\"address\",\"name\":\"implementation\"}]},{\"type\":\"tuple[]\",\"name\":\"functions\",\"components\":[{\"type\":\"bytes4\",\"name\":\"functionSelector\"},{\"type\":\"string\",\"name\":\"functionSignature\"}]}]}>\n};\n\n/**\n * Calls the \"addExtension\" function on the contract.\n * @param options - The options for the \"addExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { addExtension } from \"TODO\";\n * \n * const transaction = addExtension({\n * extension: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function addExtension(\n options: BaseTransactionOptions<AddExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xe05688fe\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_extension\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ],\n []\n],\n params: [options.extension]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createAccount\" function.\n */\nexport type CreateAccountParams = {\n admin: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_admin\"}>\ndata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_data\"}>\n};\n\n/**\n * Calls the \"createAccount\" function on the contract.\n * @param options - The options for the \"createAccount\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createAccount } from \"TODO\";\n * \n * const transaction = createAccount({\n * admin: ...,\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createAccount(\n options: BaseTransactionOptions<CreateAccountParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd8fd8f44\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_admin\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_data\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.admin, options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"disableFunctionInExtension\" function.\n */\nexport type DisableFunctionInExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\nfunctionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"disableFunctionInExtension\" function on the contract.\n * @param options - The options for the \"disableFunctionInExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { disableFunctionInExtension } from \"TODO\";\n * \n * const transaction = disableFunctionInExtension({\n * extensionName: ...,\n * functionSelector: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function disableFunctionInExtension(\n options: BaseTransactionOptions<DisableFunctionInExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x512cf914\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n },\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n []\n],\n params: [options.extensionName, options.functionSelector]\n });\n};\n\n\n/**\n * Represents the parameters for the \"enableFunctionInExtension\" function.\n */\nexport type EnableFunctionInExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\nfunction: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_function\",\"components\":[{\"type\":\"bytes4\",\"name\":\"functionSelector\"},{\"type\":\"string\",\"name\":\"functionSignature\"}]}>\n};\n\n/**\n * Calls the \"enableFunctionInExtension\" function on the contract.\n * @param options - The options for the \"enableFunctionInExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { enableFunctionInExtension } from \"TODO\";\n * \n * const transaction = enableFunctionInExtension({\n * extensionName: ...,\n * function: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function enableFunctionInExtension(\n options: BaseTransactionOptions<EnableFunctionInExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x8856a113\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n },\n {\n \"type\": \"tuple\",\n \"name\": \"_function\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ],\n []\n],\n params: [options.extensionName, options.function]\n });\n};\n\n\n/**\n * Represents the parameters for the \"grantRole\" function.\n */\nexport type GrantRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"grantRole\" function on the contract.\n * @param options - The options for the \"grantRole\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { grantRole } from \"TODO\";\n * \n * const transaction = grantRole({\n * role: ...,\n * account: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function grantRole(\n options: BaseTransactionOptions<GrantRoleParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x2f2ff15d\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n []\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multicall\" function.\n */\nexport type MulticallParams = {\n data: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"data\"}>\n};\n\n/**\n * Calls the \"multicall\" function on the contract.\n * @param options - The options for the \"multicall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multicall } from \"TODO\";\n * \n * const transaction = multicall({\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multicall(\n options: BaseTransactionOptions<MulticallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xac9650d8\",\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"data\"\n }\n ],\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"results\"\n }\n ]\n],\n params: [options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onRegister\" function.\n */\nexport type OnRegisterParams = {\n salt: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_salt\"}>\n};\n\n/**\n * Calls the \"onRegister\" function on the contract.\n * @param options - The options for the \"onRegister\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onRegister } from \"TODO\";\n * \n * const transaction = onRegister({\n * salt: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onRegister(\n options: BaseTransactionOptions<OnRegisterParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x83a03f8c\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_salt\"\n }\n ],\n []\n],\n params: [options.salt]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onSignerAdded\" function.\n */\nexport type OnSignerAddedParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_signer\"}>\nsalt: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_salt\"}>\n};\n\n/**\n * Calls the \"onSignerAdded\" function on the contract.\n * @param options - The options for the \"onSignerAdded\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onSignerAdded } from \"TODO\";\n * \n * const transaction = onSignerAdded({\n * signer: ...,\n * salt: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onSignerAdded(\n options: BaseTransactionOptions<OnSignerAddedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x0b61e12b\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_signer\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"_salt\"\n }\n ],\n []\n],\n params: [options.signer, options.salt]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onSignerRemoved\" function.\n */\nexport type OnSignerRemovedParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_signer\"}>\nsalt: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_salt\"}>\n};\n\n/**\n * Calls the \"onSignerRemoved\" function on the contract.\n * @param options - The options for the \"onSignerRemoved\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onSignerRemoved } from \"TODO\";\n * \n * const transaction = onSignerRemoved({\n * signer: ...,\n * salt: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onSignerRemoved(\n options: BaseTransactionOptions<OnSignerRemovedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x9387a380\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_signer\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"_salt\"\n }\n ],\n []\n],\n params: [options.signer, options.salt]\n });\n};\n\n\n/**\n * Represents the parameters for the \"removeExtension\" function.\n */\nexport type RemoveExtensionParams = {\n extensionName: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_extensionName\"}>\n};\n\n/**\n * Calls the \"removeExtension\" function on the contract.\n * @param options - The options for the \"removeExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { removeExtension } from \"TODO\";\n * \n * const transaction = removeExtension({\n * extensionName: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function removeExtension(\n options: BaseTransactionOptions<RemoveExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xee7d2adf\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_extensionName\"\n }\n ],\n []\n],\n params: [options.extensionName]\n });\n};\n\n\n/**\n * Represents the parameters for the \"renounceRole\" function.\n */\nexport type RenounceRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"renounceRole\" function on the contract.\n * @param options - The options for the \"renounceRole\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { renounceRole } from \"TODO\";\n * \n * const transaction = renounceRole({\n * role: ...,\n * account: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function renounceRole(\n options: BaseTransactionOptions<RenounceRoleParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x36568abe\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n []\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"replaceExtension\" function.\n */\nexport type ReplaceExtensionParams = {\n extension: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_extension\",\"components\":[{\"type\":\"tuple\",\"name\":\"metadata\",\"components\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"metadataURI\"},{\"type\":\"address\",\"name\":\"implementation\"}]},{\"type\":\"tuple[]\",\"name\":\"functions\",\"components\":[{\"type\":\"bytes4\",\"name\":\"functionSelector\"},{\"type\":\"string\",\"name\":\"functionSignature\"}]}]}>\n};\n\n/**\n * Calls the \"replaceExtension\" function on the contract.\n * @param options - The options for the \"replaceExtension\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { replaceExtension } from \"TODO\";\n * \n * const transaction = replaceExtension({\n * extension: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function replaceExtension(\n options: BaseTransactionOptions<ReplaceExtensionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xc0562f6d\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_extension\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ],\n []\n],\n params: [options.extension]\n });\n};\n\n\n/**\n * Represents the parameters for the \"revokeRole\" function.\n */\nexport type RevokeRoleParams = {\n role: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"role\"}>\naccount: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"account\"}>\n};\n\n/**\n * Calls the \"revokeRole\" function on the contract.\n * @param options - The options for the \"revokeRole\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { revokeRole } from \"TODO\";\n * \n * const transaction = revokeRole({\n * role: ...,\n * account: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function revokeRole(\n options: BaseTransactionOptions<RevokeRoleParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd547741f\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"role\"\n },\n {\n \"type\": \"address\",\n \"name\": \"account\"\n }\n ],\n []\n],\n params: [options.role, options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setContractURI\" function.\n */\nexport type SetContractURIParams = {\n uri: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_uri\"}>\n};\n\n/**\n * Calls the \"setContractURI\" function on the contract.\n * @param options - The options for the \"setContractURI\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setContractURI } from \"TODO\";\n * \n * const transaction = setContractURI({\n * uri: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setContractURI(\n options: BaseTransactionOptions<SetContractURIParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x938e3d7b\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_uri\"\n }\n ],\n []\n],\n params: [options.uri]\n });\n};\n\n\n\n\n/**\n * Calls the \"addDeposit\" function on the contract.\n * @param options - The options for the \"addDeposit\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { addDeposit } from \"TODO\";\n * \n * const transaction = addDeposit();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function addDeposit(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4a58db19\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"execute\" function.\n */\nexport type ExecuteParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"execute\" function on the contract.\n * @param options - The options for the \"execute\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { execute } from \"TODO\";\n * \n * const transaction = execute({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function execute(\n options: BaseTransactionOptions<ExecuteParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb61d27f6\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"executeBatch\" function.\n */\nexport type ExecuteBatchParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address[]\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"executeBatch\" function on the contract.\n * @param options - The options for the \"executeBatch\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { executeBatch } from \"TODO\";\n * \n * const transaction = executeBatch({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function executeBatch(\n options: BaseTransactionOptions<ExecuteBatchParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x47e1da2a\",\n [\n {\n \"type\": \"address[]\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes[]\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155BatchReceived\" function.\n */\nexport type OnERC1155BatchReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155BatchReceived\" function on the contract.\n * @param options - The options for the \"onERC1155BatchReceived\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155BatchReceived } from \"TODO\";\n * \n * const transaction = onERC1155BatchReceived({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155BatchReceived(\n options: BaseTransactionOptions<OnERC1155BatchReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xbc197c81\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155Received\" function.\n */\nexport type OnERC1155ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155Received\" function on the contract.\n * @param options - The options for the \"onERC1155Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155Received } from \"TODO\";\n * \n * const transaction = onERC1155Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155Received(\n options: BaseTransactionOptions<OnERC1155ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf23a6e61\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC721Received\" function.\n */\nexport type OnERC721ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC721Received\" function on the contract.\n * @param options - The options for the \"onERC721Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC721Received } from \"TODO\";\n * \n * const transaction = onERC721Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC721Received(\n options: BaseTransactionOptions<OnERC721ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x150b7a02\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setPermissionsForSigner\" function.\n */\nexport type SetPermissionsForSignerParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"setPermissionsForSigner\" function on the contract.\n * @param options - The options for the \"setPermissionsForSigner\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setPermissionsForSigner } from \"TODO\";\n * \n * const transaction = setPermissionsForSigner({\n * req: ...,\n * signature: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setPermissionsForSigner(\n options: BaseTransactionOptions<SetPermissionsForSignerParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x5892e236\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n []\n],\n params: [options.req, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"withdrawDepositTo\" function.\n */\nexport type WithdrawDepositToParams = {\n withdrawAddress: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"withdrawAddress\"}>\namount: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"amount\"}>\n};\n\n/**\n * Calls the \"withdrawDepositTo\" function on the contract.\n * @param options - The options for the \"withdrawDepositTo\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { withdrawDepositTo } from \"TODO\";\n * \n * const transaction = withdrawDepositTo({\n * withdrawAddress: ...,\n * amount: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function withdrawDepositTo(\n options: BaseTransactionOptions<WithdrawDepositToParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4d44560d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"withdrawAddress\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"amount\"\n }\n ],\n []\n],\n params: [options.withdrawAddress, options.amount]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createSeed\" function.\n */\nexport type CreateSeedParams = {\n schemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"schemaUid\"}>\nrevocable: AbiParameterToPrimitiveType<{\"type\":\"bool\",\"name\":\"revocable\"}>\n};\n\n/**\n * Calls the \"createSeed\" function on the contract.\n * @param options - The options for the \"createSeed\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createSeed } from \"TODO\";\n * \n * const transaction = createSeed({\n * schemaUid: ...,\n * revocable: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createSeed(\n options: BaseTransactionOptions<CreateSeedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6240d6d9\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"schemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.schemaUid, options.revocable]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createVersion\" function.\n */\nexport type CreateVersionParams = {\n seedUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"seedUid\"}>\nversionSchemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"}>\n};\n\n/**\n * Calls the \"createVersion\" function on the contract.\n * @param options - The options for the \"createVersion\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createVersion } from \"TODO\";\n * \n * const transaction = createVersion({\n * seedUid: ...,\n * versionSchemaUid: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createVersion(\n options: BaseTransactionOptions<CreateVersionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x13e0c263\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.seedUid, options.versionSchemaUid]\n });\n};\n\n\n/**\n * Represents the parameters for the \"initialize\" function.\n */\nexport type InitializeParams = {\n eas: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_eas\"}>\n};\n\n/**\n * Calls the \"initialize\" function on the contract.\n * @param options - The options for the \"initialize\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { initialize } from \"TODO\";\n * \n * const transaction = initialize({\n * eas: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function initialize(\n options: BaseTransactionOptions<InitializeParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xc4d66de8\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_eas\"\n }\n ],\n []\n],\n params: [options.eas]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multiPublish\" function.\n */\nexport type MultiPublishParams = {\n requests: AbiParameterToPrimitiveType<{\"type\":\"tuple[]\",\"name\":\"requests\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"multiPublish\" function on the contract.\n * @param options - The options for the \"multiPublish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multiPublish } from \"TODO\";\n * \n * const transaction = multiPublish({\n * requests: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multiPublish(\n options: BaseTransactionOptions<MultiPublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x31e19cb8\",\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"requests\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32[]\"\n }\n ]\n],\n params: [options.requests]\n });\n};\n\n\n/**\n * Represents the parameters for the \"publish\" function.\n */\nexport type PublishParams = {\n request: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"request\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"publish\" function on the contract.\n * @param options - The options for the \"publish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { publish } from \"TODO\";\n * \n * const transaction = publish({\n * request: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function publish(\n options: BaseTransactionOptions<PublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb71308c5\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"request\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n },\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.request]\n });\n};\n\n\n\n\n/**\n * Calls the \"renounceOwnership\" function on the contract.\n * @param options - The options for the \"renounceOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { renounceOwnership } from \"TODO\";\n * \n * const transaction = renounceOwnership();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function renounceOwnership(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x715018a6\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"setEas\" function.\n */\nexport type SetEasParams = {\n eas: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_eas\"}>\n};\n\n/**\n * Calls the \"setEas\" function on the contract.\n * @param options - The options for the \"setEas\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setEas } from \"TODO\";\n * \n * const transaction = setEas({\n * eas: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setEas(\n options: BaseTransactionOptions<SetEasParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb90b6e0d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_eas\"\n }\n ],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: [options.eas]\n });\n};\n\n\n/**\n * Represents the parameters for the \"transferOwnership\" function.\n */\nexport type TransferOwnershipParams = {\n newOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\"}>\n};\n\n/**\n * Calls the \"transferOwnership\" function on the contract.\n * @param options - The options for the \"transferOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { transferOwnership } from \"TODO\";\n * \n * const transaction = transferOwnership({\n * newOwner: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function transferOwnership(\n options: BaseTransactionOptions<TransferOwnershipParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf2fde38b\",\n [\n {\n \"type\": \"address\",\n \"name\": \"newOwner\"\n }\n ],\n []\n],\n params: [options.newOwner]\n });\n};\n\n\n","import { createThirdwebClient, getContract, sendTransaction, waitForReceipt, } from 'thirdweb'\nimport { createWallet, Account, inAppWallet, type Wallet, } from 'thirdweb/wallets'\nimport { useActiveAccount } from 'thirdweb/react'\nimport { ThirdwebContract, } from 'thirdweb/contract'\nimport { isContractDeployed } from 'thirdweb/utils'\nimport { useEffect, useRef, useState, } from 'react'\nimport type { Chain } from 'thirdweb/chains'\nimport { optimismSepolia, } from 'thirdweb/chains'\nimport {\n createAccount,\n getAddress as getFactoryAddress,\n} from './thirdweb/11155420/0x76f47d88bfaf670f5208911181fcdc0e160cb16d'\nimport debug from 'debug'\nimport { getPublishConfig } from '../config'\nimport { THIRDWEB_ACCOUNT_FACTORY_ADDRESS } from './constants'\n\nconst logger = debug('permaPress:helpers:thirdweb')\n\n/**\n * Custom storage for publish in-app wallets: same prefix for modular (EIP-7702) and managed (EIP-4337).\n * Uses `localStorage` so embedded-wallet session material survives app/tab restarts.\n */\nconst SEED_IN_APP_SESSION_PREFIX = 'seedProtocol:inAppPublish:'\n\nlet _publishInAppWalletStorage: {\n getItem: (key: string) => Promise<string | null>\n setItem: (key: string, value: string) => Promise<void>\n removeItem: (key: string) => Promise<void>\n} | null = null\n\nexport function getSharedPublishInAppWalletStorage() {\n if (!_publishInAppWalletStorage) {\n _publishInAppWalletStorage = {\n getItem: async (key) => {\n if (typeof window === 'undefined') return null\n return localStorage.getItem(SEED_IN_APP_SESSION_PREFIX + key)\n },\n setItem: async (key, value) => {\n if (typeof window === 'undefined') return\n localStorage.setItem(SEED_IN_APP_SESSION_PREFIX + key, value)\n },\n removeItem: async (key) => {\n if (typeof window === 'undefined') return\n localStorage.removeItem(SEED_IN_APP_SESSION_PREFIX + key)\n },\n }\n }\n return _publishInAppWalletStorage\n}\n\nlet _client: ReturnType<typeof createThirdwebClient> | null = null\n\nexport function getClient() {\n if (!_client) {\n const { thirdwebClientId } = getPublishConfig()\n _client = createThirdwebClient({ clientId: thirdwebClientId })\n }\n return _client\n}\n\nexport const wallets = [\n // embeddedWallet(),\n createWallet('io.metamask',),\n // createWallet(\"com.coinbase.wallet\"),\n // createWallet(\"me.rainbow\"),\n]\n\nexport const useLocalWalletAccount = () => {\n\n const [ localWalletAccount, setLocalWalletAccount, ] = useState<Account | null>(null,)\n const personalWallet = createWallet('io.metamask',)\n\n const isConnecting = useRef(false)\n\n useEffect(() => {\n const _getAccount = async (): Promise<void> => {\n // if ( isConnecting.current ) {\n // return\n // }\n // isConnecting.current = true\n\n // const personalAccount = await personalWallet.connect({ client, },)\n // if ( !personalAccount ) {\n // throw new Error('Failed to connect to personal account',)\n // }\n\n // setLocalWalletAccount(personalAccount,)\n // isConnecting.current = false\n }\n\n _getAccount()\n\n }, [],)\n\n return localWalletAccount\n\n}\n\nexport const useActiveSmartWalletContract = () => {\n const account = useActiveAccount()\n\n const [ contract, setContract, ] = useState<ThirdwebContract | null>(null,)\n\n useEffect(() => {\n if ( !account || !account.address ) {\n return\n }\n\n setContract(getContract({\n client: getClient(),\n chain : optimismSepolia,\n address : account.address,\n },),)\n\n }, [ account, ],)\n\n return contract\n}\n\nexport const getManagedAccountFactoryContract = () => {\n const { thirdwebAccountFactoryAddress } = getPublishConfig()\n const contract = getContract({\n client: getClient(),\n chain : optimismSepolia,\n address : thirdwebAccountFactoryAddress,\n },)\n\n return contract\n}\n\n/**\n * Returns the deterministic smart wallet address for an admin signer and optional data.\n */\nexport async function getSmartWalletAddressForAdmin (\n adminAddress: string,\n data: string = '0x',\n): Promise<string> {\n const factory = getManagedAccountFactoryContract()\n return getFactoryAddress({\n contract : factory,\n adminSigner : adminAddress,\n data : data as `0x${string}`,\n },) as Promise<string>\n}\n\n/**\n * Returns true if the given address has contract bytecode deployed (e.g. a ManagedAccount).\n */\nexport async function isSmartWalletDeployed ( smartWalletAddress: string, ): Promise<boolean> {\n const contract = getContract({\n client: getClient(),\n chain : optimismSepolia,\n address : smartWalletAddress,\n },)\n return isContractDeployed(contract,)\n}\n\n/**\n * Resolves the smart wallet address and account to use for publish.\n * If the user has no connected account or no deployed ManagedAccount, returns needsDeploy.\n *\n * When using EIP4337 (in-app wallet with account abstraction), account.address is already\n * the smart wallet address. We detect that case and use it directly instead of deriving\n * via getSmartWalletAddressForAdmin (which assumes account.address is the EOA admin).\n */\nexport async function resolveSmartWalletForPublish (\n account: Account | null,\n): Promise<{ address: string; account: Account } | { needsDeploy: true }> {\n if ( !account ) {\n return { needsDeploy: true }\n }\n // If account.address is already a deployed smart wallet (e.g. from EIP4337), use it directly\n const accountIsDeployedSmartWallet = await isSmartWalletDeployed(account.address,)\n if ( accountIsDeployedSmartWallet ) {\n return { address: account.address, account }\n }\n // Otherwise derive smart wallet from EOA admin (e.g. MetaMask)\n const smartWalletAddress = await getSmartWalletAddressForAdmin(account.address,)\n const deployed = await isSmartWalletDeployed(smartWalletAddress,)\n if ( deployed ) {\n return { address: smartWalletAddress, account }\n }\n return { needsDeploy: true }\n}\n\n/** External wallets (MetaMask, Rainbow) for the deploy flow only; no account abstraction. */\nexport const ExternalWalletsForDeploy = [\n createWallet('io.metamask',),\n createWallet('me.rainbow',),\n]\n\nexport const deploySmartWalletContract = async ( localAccount: Account, ) => {\n const managedAccountFactoryContract = getManagedAccountFactoryContract()\n const createAccountTx = createAccount({\n contract : managedAccountFactoryContract,\n admin : localAccount.address,\n data : '0x',\n },)\n\n const result = await sendTransaction({\n account : localAccount,\n transaction : createAccountTx,\n },)\n\n logger('createAccountTx result:', result,)\n\n const receipt = await waitForReceipt({\n client: getClient(),\n transactionHash : result.transactionHash,\n chain : optimismSepolia,\n },)\n\n if ( !receipt ) {\n throw new Error('Failed to deploy smart wallet',)\n }\n\n return receipt\n}\n\nexport const appMetadata = {\n name: \"Seed Protocol\",\n description: \"Seed Protocol\",\n url: \"https://seedprotocol.io\",\n}\n\n/**\n * Connects the managed account wallet (EIP4337 in-app wallet) and returns its address.\n * Use this when you need the connected managed account address for publish flows.\n *\n * @param chain - The chain to connect to (defaults to optimismSepolia)\n * @returns The connected managed account's address\n * @throws Error if the managed account cannot be connected or retrieved\n */\nexport async function getConnectedManagedAccountAddress(\n chain: Chain = optimismSepolia\n): Promise<string> {\n const managedAccountWallet = getManagedAccountWallet()\n await managedAccountWallet.autoConnect({ client: getClient(), chain })\n const managedAccount = managedAccountWallet.getAccount()\n if (!managedAccount) {\n throw new Error('Failed to get managed account')\n }\n return managedAccount.address\n}\n\n/**\n * Returns the connected account for transaction signing (e.g. revoke).\n * Uses the modular account wallet. Returns null if not connected.\n */\nexport async function getConnectedAccount(): Promise<Account | null> {\n try {\n const wallet = getModularAccountWallet()\n await wallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const account = wallet.getAccount()\n return account ?? null\n } catch {\n return null\n }\n}\n\n/**\n * Same as {@link getConnectedAccount}: the in-app modular wallet (EIP-7702) on Optimism Sepolia.\n * Prefer this name at modular publish entry points for clarity.\n */\nexport async function getConnectedModularAccount(): Promise<Account | null> {\n return getConnectedAccount()\n}\n\n/** Single instance so Thirdweb session, Connect UI, and `autoConnect` share one wallet object. */\nlet _managedInAppWallet: Wallet | null = null\n\nexport const getManagedAccountWallet = () => {\n if (!_managedInAppWallet) {\n _managedInAppWallet = inAppWallet({\n storage: getSharedPublishInAppWalletStorage(),\n auth: {\n options: [\n \"farcaster\",\n \"email\",\n \"passkey\",\n \"phone\",\n ],\n },\n executionMode: {\n mode: 'EIP4337',\n smartAccount: {\n chain: optimismSepolia,\n factoryAddress: THIRDWEB_ACCOUNT_FACTORY_ADDRESS,\n gasless: true,\n },\n },\n // executionMode: {\n // mode: 'EIP4337',\n // smartAccount: {\n // chain: optimismSepolia,\n // factoryAddress: thirdwebAccountFactoryAddress,\n // gasless: true,\n // overrides: {\n // // Custom paymaster that passes through but lets you modify the UserOp\n // paymaster: async (userOp) => {\n\n // const hexifyBigInts: any = (obj: any) => {\n // if (typeof obj === \"bigint\") return `0x${obj.toString(16)}`;\n // if (Array.isArray(obj)) return obj.map(hexifyBigInts);\n // if (obj && typeof obj === \"object\") {\n // return Object.fromEntries(\n // Object.entries(obj).map(([k, v]) => [k, hexifyBigInts(v)])\n // );\n // }\n // return obj;\n // };\n\n // const chainIdHex = `0x${optimismSepolia.id.toString(16)}`;\n\n // // Increase callGasLimit before sending to paymaster\n // const modifiedUserOp = hexifyBigInts({\n // ...userOp,\n // callGasLimit: BigInt(8000000), // Double it, or set a fixed value\n // });\n\n // console.log(\"[SmartWallet Paymaster]\", getPublishConfig().thirdwebClientId);\n \n // // Call thirdweb's default paymaster endpoint\n // const response = await fetch(\n // `https://${optimismSepolia.id}.bundler.thirdweb.com/v2`,\n // {\n // method: \"POST\",\n // headers: { \n // \"Content-Type\": \"application/json\",\n // \"X-Client-Id\": getPublishConfig().thirdwebClientId,\n // },\n // body: JSON.stringify({\n // id: 1,\n // jsonrpc: \"2.0\",\n // method: \"pm_sponsorUserOperation\",\n // params: [modifiedUserOp, '0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789', chainIdHex],\n // }),\n // }\n // );\n \n // const data = await response.json();\n // console.log(\"[SmartWallet Paymaster Response]\", data);\n // return {\n // paymasterAndData: data.result.paymasterAndData,\n // preVerificationGas: data.result.preVerificationGas,\n // verificationGasLimit: data.result.verificationGasLimit,\n // callGasLimit: data.result.callGasLimit,\n // };\n // },\n // execute: (accountContract, transaction) => {\n // // Log the gas that was set on the transaction\n // console.log(\"[SmartWallet Execute]\", {\n // gas: transaction.gas,\n // to: transaction.to,\n // dataLength: transaction.data?.length,\n // });\n \n // // Return the default execute call — don't change behavior,\n // // just observe what's being passed through\n // return prepareContractCall({\n // contract: accountContract,\n // method: \"function execute(address, uint256, bytes)\",\n // params: [\n // transaction.to ?? \"\",\n // transaction.value ?? 0n,\n // transaction.data ?? \"0x\",\n // ],\n // gas: transaction.gas, // Pass through whatever was set\n // });\n // },\n // },\n // }\n // }\n })\n }\n return _managedInAppWallet\n}\n\n/** Single instance (pairs with {@link getManagedAccountWallet} for two execution modes, same Thirdweb client). */\nlet _modularInAppWallet: Wallet | null = null\n\nexport const getModularAccountWallet = () => {\n if (!_modularInAppWallet) {\n _modularInAppWallet = inAppWallet({\n storage: getSharedPublishInAppWalletStorage(),\n auth: {\n options: [\n \"farcaster\",\n \"email\",\n \"passkey\",\n \"phone\",\n ],\n },\n executionMode: {\n mode: 'EIP7702',\n sponsorGas: true,\n \n },\n })\n }\n return _modularInAppWallet\n}\n\nlet _walletsForConnectButton: Wallet[] | null = null\n\nexport const getWalletsForConnectButton = () => {\n if (!_walletsForConnectButton) {\n _walletsForConnectButton = [getModularAccountWallet()]\n }\n return _walletsForConnectButton\n}","import { getContract, prepareContractCall, prepareEvent, parseEventLogs } from 'thirdweb'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { encodeAbiParameters } from 'viem'\nimport { getPublishConfig } from '~/config'\n\n/**\n * EAS contract custom errors. Included so viem can decode revert data instead of\n * throwing AbiErrorSignatureNotFoundError (e.g. for AccessDenied 0x4ca88867).\n */\nconst 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 attestedEvent = () =>\n prepareEvent({\n signature:\n 'event Attested(address indexed recipient, address indexed attester, bytes32 uid, bytes32 indexed schemaUID)',\n })\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as const\nconst ZERO_BYTES32 = ('0x' + '0'.repeat(64)) as `0x${string}`\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\n/**\n * Prepares a single EAS attest call.\n * Used for Seed and Version attestations in the direct-to-EAS publish path.\n */\nexport function prepareEasAttest(\n client: ThirdwebClient,\n chain: Chain,\n params: EasAttestParams,\n) {\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function attest((bytes32 schema,(address recipient,uint64 expirationTime,bool revocable,bytes32 refUID,bytes data,uint256 value) data) request) payable returns (bytes32)' as const,\n params: [\n {\n schema: params.schema,\n data: {\n recipient: (params.data.recipient ?? ZERO_ADDRESS) as `0x${string}`,\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\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\n/**\n * Prepares an EAS multiAttest call for batch attestations.\n * Used for property attestations in the direct-to-EAS publish path.\n */\nexport function prepareEasMultiAttest(\n client: ThirdwebClient,\n chain: Chain,\n requests: MultiAttestationRequest[],\n) {\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function multiAttest((bytes32 schema,(address recipient,uint64 expirationTime,bool revocable,bytes32 refUID,bytes data,uint256 value)[] data)[] requests) payable returns (bytes32[])' as const,\n params: [requests],\n } as Parameters<typeof prepareContractCall>[0])\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 * Parses the Attested event from the receipt logs.\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 * Used after `multiAttest` to persist per-property attestation UIDs to SQLite.\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 logs: logs as import('viem').Log[],\n events: [attestedEvent()],\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\nexport type MultiRevocationRequest = {\n schema: `0x${string}`\n data: Array<{\n uid: `0x${string}`\n value?: bigint\n }>\n}\n\n/**\n * Prepares an EAS multiRevoke call for batch revocation.\n */\nexport function prepareEasMultiRevoke(\n client: ThirdwebClient,\n chain: Chain,\n requests: MultiRevocationRequest[],\n) {\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n abi: [...EAS_ERRORS_ABI],\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function multiRevoke((bytes32 schema,(bytes32 uid,uint256 value)[] data)[] multiRequests) payable' as const,\n params: [\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 } as Parameters<typeof prepareContractCall>[0])\n}\n\nexport { ZERO_ADDRESS, ZERO_BYTES32 }\n","import type { Account } from 'thirdweb/wallets'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getGetAdditionalSyncAddresses } from '@seedprotocol/sdk'\nimport {\n getClient,\n getSmartWalletAddressForAdmin,\n isSmartWalletDeployed,\n getManagedAccountWallet,\n} from '~/helpers/thirdweb'\n\n/**\n * Resolves which account to use for revoking attestations.\n * When the attester is the user's ManagedAccount (EIP4337) but they're connected\n * with a different wallet (e.g. EOA or modular account), attempts to use the\n * ManagedAccount wallet for the revoke.\n *\n * @param account - The currently connected account\n * @param attester - The attester address from the seed (publisher or attestationRaw.attester)\n * @returns The account to use for revoke\n * @throws If `attester` equals any address from {@link getGetAdditionalSyncAddresses}\n * (e.g. `modularAccountModuleContract` when `initPublish` registers it). Those addresses\n * cannot revoke via the app wallet’s EAS `multiRevoke` path today.\n */\nexport async function resolveRevokeAccount(params: {\n account: Account\n attester: string | null\n}): Promise<Account> {\n const { account, attester } = params\n\n if (!attester || account.address.toLowerCase() === attester.toLowerCase()) {\n return account\n }\n\n const additionalGetter = getGetAdditionalSyncAddresses()\n if (additionalGetter) {\n const additional = await additionalGetter()\n const attesterLower = attester.toLowerCase()\n if (additional?.some((a: string | undefined) => a?.toLowerCase() === attesterLower)) {\n throw new Error(\n 'Revocation not supported for items published via the modular executor.',\n )\n }\n }\n\n try {\n const derivedManagedAccount = await getSmartWalletAddressForAdmin(account.address)\n const attesterLower = attester.toLowerCase()\n const derivedLower = derivedManagedAccount.toLowerCase()\n\n if (attesterLower === derivedLower) {\n const deployed = await isSmartWalletDeployed(derivedManagedAccount)\n if (deployed) {\n const managedAccountWallet = getManagedAccountWallet()\n await managedAccountWallet.autoConnect({\n client: getClient(),\n chain: optimismSepolia,\n })\n const managedAccount = managedAccountWallet.getAccount()\n if (managedAccount) {\n return managedAccount\n }\n }\n }\n } catch {\n // Fall through to return account; revoke attempt may fail with AccessDenied\n }\n\n return account\n}\n","import { getClient } from '~/helpers/thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { sendTransaction, waitForReceipt } from 'thirdweb'\nimport { getConnectedAccount } from '~/helpers/thirdweb'\nimport { prepareEasMultiRevoke } from '~/helpers/easDirect'\nimport { resolveRevokeAccount } from '~/helpers/resolveRevokeAccount'\nimport {\n getVersionsForSeedUid,\n getMetadataAttestationUidsForSeedUid,\n getAttesterForSeed,\n updateSeedRevokedAt,\n VERSION_SCHEMA_UID_OPTIMISM_SEPOLIA,\n isValidEasAttestationUid,\n} from '@seedprotocol/sdk'\n\n/**\n * Revokes the Seed attestation and all Version and metadata attestations on EAS.\n * Updates local DB with revokedAt timestamp.\n *\n * Order: metadata first, then versions, then seed (children before parents).\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\n const account = await getConnectedAccount()\n if (!account) {\n throw new Error('No wallet connected. Connect a wallet to revoke attestations.')\n }\n\n const attester = await getAttesterForSeed({ seedLocalId, seedUid })\n const revokeAccount = await resolveRevokeAccount({ account, attester })\n\n const client = getClient()\n\n // Collect attestation UIDs to revoke\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 // Metadata attestations (group by schema)\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 // Version attestations\n if (versionUids.length > 0) {\n requests.push({\n schema: VERSION_SCHEMA_UID_OPTIMISM_SEPOLIA as `0x${string}`,\n data: versionUids.map((uid: string) => ({ uid: uid as `0x${string}` })),\n })\n }\n\n // Seed attestation\n requests.push({\n schema: seedSchemaUid as `0x${string}`,\n data: [{ uid: seedUid as `0x${string}` }],\n })\n\n // Execute multiRevoke in batches if needed (EAS may have limits)\n for (const req of requests) {\n if (req.data.length === 0) continue\n const multiRevokeTx = prepareEasMultiRevoke(client, optimismSepolia, [req])\n try {\n const result = await sendTransaction({ account: revokeAccount, transaction: multiRevokeTx })\n await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err)\n // EAS AccessDenied: only the original attester can revoke (selector 0x4ca88867)\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 // AlreadyRevoked: attestation was already revoked (e.g. double-click, stale UI)\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 { getConnectedManagedAccountAddress } from './helpers/thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { revokeAttestations } from './services/revoke/revokeAttestations'\nimport {\n THIRDWEB_ACCOUNT_FACTORY_ADDRESS,\n EAS_CONTRACT_ADDRESS,\n} from './helpers/constants'\nimport { ethers } from 'ethers'\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 interface PublishConfig {\n thirdwebClientId: string\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 * 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 Optimism Sepolia 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 Optimism Sepolia. Default: false (surface `managed_not_ready` instead).\n */\n autoDeployManagedAccount?: boolean\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('thirdweb/wallets').Account\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\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('thirdweb/wallets').Account\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\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 setConfigRef(c)\n setGetPublisherForNewSeeds(async () => {\n try {\n return await getConnectedManagedAccountAddress(optimismSepolia)\n } catch {\n return undefined\n }\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 thirdwebAccountFactoryAddress: string\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 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}\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 return {\n ...config,\n thirdwebAccountFactoryAddress: THIRDWEB_ACCOUNT_FACTORY_ADDRESS,\n easContractAddress: EAS_CONTRACT_ADDRESS,\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 }\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","export class AttestationVerificationError extends Error {\n constructor(\n message: string,\n public readonly seedLocalId: string,\n public readonly expectedSchemas: string[],\n public readonly foundSchemas: string[],\n public readonly code: 'METADATA_PROPERTIES_MISSING' = 'METADATA_PROPERTIES_MISSING',\n ) {\n super(message)\n this.name = 'AttestationVerificationError'\n }\n}\n\nexport type ManagedAccountPublishErrorCode =\n | 'MANAGED_ACCOUNT_NOT_DEPLOYED'\n | 'MANAGED_ACCOUNT_UNAVAILABLE'\n | 'EXECUTOR_MODULE_NOT_INSTALLED'\n | 'MANAGED_ACCOUNT_SET_EAS_FAILED'\n\n/**\n * Best-effort string for RPC / thirdweb / viem failures that are not plain `Error`\n * (so logs and UIs can show the real revert or RPC reason).\n */\nexport function stringifyUnderlyingCause(u: unknown, maxLen = 700): string {\n if (u == null) return ''\n if (u instanceof Error) {\n const nested = u.cause instanceof Error ? ` | cause: ${u.cause.message}` : ''\n return (u.message + nested).slice(0, maxLen)\n }\n if (typeof u === 'object') {\n const o = u as Record<string, unknown>\n const parts: string[] = []\n if (typeof o.message === 'string') parts.push(o.message)\n if (typeof o.shortMessage === 'string') parts.push(o.shortMessage)\n if (typeof o.details === 'string') parts.push(o.details)\n if (typeof o.reason === 'string') parts.push(o.reason)\n if (parts.length) return parts.join(' | ').slice(0, maxLen)\n try {\n return JSON.stringify(u).slice(0, maxLen)\n } catch {\n return String(u).slice(0, maxLen)\n }\n }\n return String(u).slice(0, maxLen)\n}\n\n/**\n * Thrown or returned when the managed publishing account (Optimism Sepolia) is missing,\n * unreachable, missing the executor module for the modular executor path, or EAS\n * pointer setup (`getEas` / `setEas`) fails.\n */\nexport class ManagedAccountPublishError extends Error {\n /** Original error when connection or deployment failed (avoids shadowing `Error.cause`). */\n public readonly underlyingCause?: unknown\n\n constructor(\n message: string,\n public readonly code: ManagedAccountPublishErrorCode,\n public readonly managedAddress?: string,\n underlyingCause?: unknown,\n ) {\n const extra =\n underlyingCause != null && underlyingCause !== ''\n ? ` (${stringifyUnderlyingCause(underlyingCause)})`\n : ''\n super(message + extra)\n this.name = 'ManagedAccountPublishError'\n this.underlyingCause = underlyingCause\n }\n}\n\n/**\n * True when `e` is a managed-account publish error. Uses `name` + `code` as a fallback\n * when `instanceof` fails across duplicate bundled class identities.\n */\nexport function isManagedAccountPublishError(e: unknown): e is ManagedAccountPublishError {\n if (e instanceof ManagedAccountPublishError) return true\n if (typeof e !== 'object' || e === null) return false\n const o = e as { name?: string; code?: unknown }\n return o.name === 'ManagedAccountPublishError' && typeof o.code === 'string'\n}\n\nexport type Eip7702ModularAccountPublishErrorCode =\n | 'EIP7702_MODULAR_ACCOUNT_UNAVAILABLE'\n | 'EIP7702_MODULAR_NOT_UPGRADED'\n | 'EIP7702_MODULAR_DEPLOY_FAILED'\n | 'EIP7702_MODULAR_NOT_CONFIRMED'\n\n/**\n * Thrown when the in-app modular (EIP-7702) wallet is missing, not upgraded on-chain, or deploy/bootstrap failed.\n */\nexport class Eip7702ModularAccountPublishError extends Error {\n public readonly underlyingCause?: unknown\n\n constructor(\n message: string,\n public readonly code: Eip7702ModularAccountPublishErrorCode,\n public readonly modularAddress?: string,\n underlyingCause?: unknown,\n ) {\n const extra =\n underlyingCause != null && underlyingCause !== ''\n ? ` (${stringifyUnderlyingCause(underlyingCause)})`\n : ''\n super(message + extra)\n this.name = 'Eip7702ModularAccountPublishError'\n this.underlyingCause = underlyingCause\n }\n}\n\nconst eip7702ModularCodes: Eip7702ModularAccountPublishErrorCode[] = [\n 'EIP7702_MODULAR_ACCOUNT_UNAVAILABLE',\n 'EIP7702_MODULAR_NOT_UPGRADED',\n 'EIP7702_MODULAR_DEPLOY_FAILED',\n 'EIP7702_MODULAR_NOT_CONFIRMED',\n]\n\nexport function isEip7702ModularAccountPublishError(e: unknown): e is Eip7702ModularAccountPublishError {\n if (e instanceof Eip7702ModularAccountPublishError) return true\n if (typeof e !== 'object' || e === null) return false\n const o = e as { name?: string; code?: unknown }\n return (\n o.name === 'Eip7702ModularAccountPublishError' &&\n typeof o.code === 'string' &&\n (eip7702ModularCodes as string[]).includes(o.code)\n )\n}\n\n/**\n * True when the RPC/contract error indicates the account is **not** Thirdweb ModularCore\n * (no Router / `getInstalledModules`), e.g. default EIP-4337 smart accounts.\n */\nexport function isRouterNonModularCoreAccountError(cause: unknown): boolean {\n return /Router:\\s*function does not exist/i.test(stringifyUnderlyingCause(cause))\n}\n","import React, { createContext, FC, useContext, 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\"\n\nconst PublishConfigContext = createContext<PublishConfig | null>(null)\n\nexport function usePublishConfig(): PublishConfig {\n const config = useContext(PublishConfigContext)\n if (!config) {\n throw new Error('usePublishConfig must be used within PublishProvider')\n }\n return config\n}\n\nexport interface PublishProviderProps {\n children: React.ReactNode\n /**\n * If provided, calls initPublish with this config.\n * Otherwise, assumes initPublish was already called elsewhere.\n */\n config?: PublishConfig\n /** Optional: use your own QueryClient for Seed hooks. If not provided, SeedProvider creates one. */\n queryClient?: QueryClient\n /** Optional: ref to receive the QueryClient instance (e.g. for tests). */\n queryClientRef?: MutableRefObject<QueryClient | null>\n}\n\nconst PublishProvider: 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 PublishProvider\n","import { getContract, sendTransaction, waitForReceipt } from 'thirdweb'\nimport { getInstalledModules, installModule } from 'thirdweb/modules'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport type { Account } from 'thirdweb/wallets'\nimport { encodeAbiParameters } from 'viem'\nimport { getClient } from './thirdweb'\nimport { EAS_CONTRACT_ADDRESS } from './constants'\nimport type { PublishConfig } from '../config'\nimport { isRouterNonModularCoreAccountError, ManagedAccountPublishError } from '../errors'\n\nconst MODULE_INSTALL_MSG =\n 'The executor module could not be installed on your publishing account on Optimism Sepolia. Reconnect and try again, or contact support if this persists.'\n\n/**\n * Ensures `modularAccountModuleContract` is installed on `contractAddress` when that contract\n * implements Thirdweb ModularCore (`getInstalledModules` / Router). If the account does not\n * support ModularCore (RPC error `Router: function does not exist`), this is a **no-op** — many\n * EIP-4337 managed accounts embed `multiPublish` without pluggable modules.\n *\n * No-op if `modularAccountModuleContract` is unset.\n *\n * @param contractAddress - Account contract to inspect (typically the managed smart account)\n * @param account - Account that can sign `installModule` for that contract\n */\nexport async function ensureExecutorModuleInstalled(\n contractAddress: string,\n account: Account,\n config: Pick<PublishConfig, 'modularAccountModuleContract'>,\n): Promise<void> {\n const { modularAccountModuleContract } = config\n if (!modularAccountModuleContract) return\n\n const accountContract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: contractAddress,\n })\n\n try {\n const installed = await getInstalledModules({ contract: accountContract })\n const moduleAddr = modularAccountModuleContract.toLowerCase()\n const isInstalled = installed.some(\n (m: { implementation: string }) => m.implementation?.toLowerCase() === moduleAddr,\n )\n if (isInstalled) return\n\n const tx = installModule({\n contract: accountContract,\n moduleContract: modularAccountModuleContract,\n data: encodeAbiParameters([{ type: 'address' }], [EAS_CONTRACT_ADDRESS]),\n })\n const result = await sendTransaction({ transaction: tx, account })\n await waitForReceipt({\n client: getClient(),\n transactionHash: result.transactionHash,\n chain: optimismSepolia,\n })\n } catch (cause) {\n if (isRouterNonModularCoreAccountError(cause)) {\n return\n }\n throw new ManagedAccountPublishError(\n MODULE_INSTALL_MSG,\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n contractAddress,\n cause,\n )\n }\n}\n","import { assign } from 'xstate'\n\nexport const assignRestoreFromDb = assign(({ context, event }) => {\n const ev = event as {\n publishProcesses?: Map<string, unknown>\n subscriptions?: Map<string, unknown>\n }\n const incomingProcesses = ev.publishProcesses ?? new Map()\n const incomingSubscriptions = ev.subscriptions ?? new Map()\n return {\n publishProcesses: new Map(incomingProcesses as Map<string, import('xstate').ActorRef<any, any>>),\n subscriptions: new Map(\n incomingSubscriptions as Map<string, import('xstate').ActorRef<any, import('xstate').EventObject>>\n ),\n }\n})\n","import Arweave from 'arweave'\nimport { BaseArweaveClient } from '@seedprotocol/sdk'\n\nexport const getArweave = (): Arweave => {\n const host = BaseArweaveClient.getHost()\n\n const ArweaveModule = Arweave as typeof Arweave & { default?: typeof Arweave }\n if (Object.keys(ArweaveModule).includes('default') && ArweaveModule.default) {\n return ArweaveModule.default.init({\n host,\n protocol: 'https',\n })\n }\n\n return ArweaveModule.init({\n host,\n protocol: 'https',\n })\n}\n\n","import { Item, type IItem } from '@seedprotocol/sdk'\n\nexport const ZERO_BYTES32 = '0x' + '0'.repeat(64)\nexport const BYTES32_LEN = 64\n\nexport const waitForItem = async (seedLocalId: string): Promise<IItem<any>> => {\n let item: IItem<any> | undefined\n\n try {\n item = await Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n } catch {\n // No-op: Error is intentionally ignored\n }\n\n if (item) {\n return item\n }\n\n return new Promise<IItem<any>>((resolve) => {\n const interval = setInterval(() => {\n try {\n Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n .then((found: IItem<any> | undefined) => {\n if (found) {\n clearInterval(interval)\n resolve(found)\n }\n })\n } catch {\n // No-op: Error is intentionally ignored\n }\n }, 200)\n })\n}\n\nexport function deserializeChunks(\n serialized: unknown\n): {\n data_root: Uint8Array\n chunks: Array<{ dataHash: Uint8Array; minByteRange: number; maxByteRange: number }>\n proofs: Array<{ offset: number; proof: Uint8Array }>\n} | undefined {\n if (!serialized || typeof serialized !== 'object') return undefined\n const s = serialized as {\n data_root?: number[]\n chunks?: Array<{ dataHash: number[]; minByteRange: number; maxByteRange: number }>\n proofs?: Array<{ offset: number; proof: number[] }>\n }\n if (!Array.isArray(s.data_root)) return undefined\n return {\n data_root: new Uint8Array(s.data_root),\n chunks: (s.chunks ?? []).map((c) => ({ ...c, dataHash: new Uint8Array(c.dataHash ?? []) })),\n proofs: (s.proofs ?? []).map((p) => ({ ...p, proof: new Uint8Array(p.proof ?? []) })),\n }\n}\n\nexport function serializeChunks(chunks: {\n data_root: Uint8Array\n chunks: Array<{ dataHash: Uint8Array; minByteRange: number; maxByteRange: number }>\n proofs: Array<{ offset: number; proof: Uint8Array }>\n}): unknown {\n return {\n data_root: Array.from(chunks.data_root),\n chunks: chunks.chunks.map((c) => ({ ...c, dataHash: Array.from(c.dataHash) })),\n proofs: chunks.proofs.map((p) => ({ ...p, proof: Array.from(p.proof) })),\n }\n}\n","import type { GetPublishUploadsOptions } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport Transaction from 'arweave/web/lib/transaction'\nimport { getArweave } from '~/helpers/blockchain'\nimport { getPublishConfig } from '~/config'\nimport { waitForItem, deserializeChunks, serializeChunks } from './utils'\n\nexport type CreateArweaveTransactionsResult = {\n arweaveTransactions: ArweaveTransactionInfo[]\n publishUploads: PublishUpload[]\n}\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\nexport const createArweaveTransactions = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveTransactionsResult> => {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const publishOpts: GetPublishUploadsOptions = {}\n if (context.arweaveUploadTags?.length) {\n publishOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n publishOpts.deferHtmlStorageSeedLocalIds = def\n }\n const publishUploads = await item.getPublishUploads(\n Object.keys(publishOpts).length ? publishOpts : undefined,\n )\n\n const config = getPublishConfig()\n const signArweaveTransactions = context.signArweaveTransactions ?? config.signArweaveTransactions\n const arweaveJwk = context.arweaveJwk ?? config.arweaveJwk\n const uploads = publishUploads.map((u: PublishUpload) => ({\n versionLocalId: u.versionLocalId,\n itemPropertyName: u.itemPropertyName,\n transactionJson: (u.transactionToSign as Transaction).toJSON(),\n }))\n\n let results: Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n if (signArweaveTransactions) {\n results = await signArweaveTransactions(uploads)\n } else if (arweaveJwk) {\n const arweave = getArweave()\n const jwk = arweaveJwk\n results = []\n for (const upload of uploads) {\n const tx = arweave.transactions.fromRaw(upload.transactionJson)\n if (tx.data && tx.data.byteLength > 0 && !tx.chunks) {\n await tx.prepareChunks(tx.data)\n }\n await arweave.transactions.sign(tx, jwk)\n const json = tx.toJSON() as Record<string, unknown>\n results.push({\n transaction: {\n ...json,\n chunks: tx.chunks ? serializeChunks(tx.chunks) : undefined,\n },\n versionId: upload.versionLocalId,\n modelName: upload.itemPropertyName,\n })\n }\n } else {\n throw new Error(\n 'Arweave signing not configured. Provide signArweaveTransactions or arweaveJwk at createPublish or in PublishProvider config.'\n )\n }\n\n const arweave = getArweave()\n const arweaveTransactions: ArweaveTransactionInfo[] = (\n results as Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n ).map((r) => {\n const { chunks: serializedChunks, ...rest } = r.transaction as Record<string, unknown>\n const attrs = { ...rest }\n const chunks = deserializeChunks(serializedChunks)\n if (chunks) (attrs as Record<string, unknown>).chunks = chunks\n const tx = arweave.transactions.fromRaw(attrs)\n return {\n transaction: tx,\n versionId: r.versionId,\n modelName: r.modelName,\n }\n })\n\n return {\n arweaveTransactions,\n publishUploads,\n }\n }\n)\n","import type { GetPublishUploadsOptions } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport Transaction from 'arweave/web/lib/transaction'\nimport { getArweave } from '~/helpers/blockchain'\nimport { getPublishConfig } from '~/config'\nimport { waitForItem, deserializeChunks, serializeChunks } from './utils'\nimport type { CreateArweaveTransactionsResult } from './createArweaveTransactions'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\n/** Phase 2: deferred Html storage files only (after embedded images uploaded + Html rewritten). */\nexport const createArweaveTransactionsPhase2 = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveTransactionsResult> => {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const publishOpts: GetPublishUploadsOptions = {}\n if (context.arweaveUploadTags?.length) {\n publishOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n publishOpts.onlyHtmlStorageSeedLocalIds = def\n publishOpts.skipRelationRecursion = true\n }\n\n const publishUploads = await item.getPublishUploads(\n Object.keys(publishOpts).length ? publishOpts : undefined,\n )\n\n const config = getPublishConfig()\n const signArweaveTransactions = context.signArweaveTransactions ?? config.signArweaveTransactions\n const arweaveJwk = context.arweaveJwk ?? config.arweaveJwk\n const uploads = publishUploads.map((u: PublishUpload) => ({\n versionLocalId: u.versionLocalId,\n itemPropertyName: u.itemPropertyName,\n transactionJson: (u.transactionToSign as Transaction).toJSON(),\n }))\n\n let results: Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n if (signArweaveTransactions) {\n results = await signArweaveTransactions(uploads)\n } else if (arweaveJwk) {\n const arweave = getArweave()\n const jwk = arweaveJwk\n results = []\n for (const upload of uploads) {\n const tx = arweave.transactions.fromRaw(upload.transactionJson)\n if (tx.data && tx.data.byteLength > 0 && !tx.chunks) {\n await tx.prepareChunks(tx.data)\n }\n await arweave.transactions.sign(tx, jwk)\n const json = tx.toJSON() as Record<string, unknown>\n results.push({\n transaction: {\n ...json,\n chunks: tx.chunks ? serializeChunks(tx.chunks) : undefined,\n },\n versionId: upload.versionLocalId,\n modelName: upload.itemPropertyName,\n })\n }\n } else {\n throw new Error(\n 'Arweave signing not configured. Provide signArweaveTransactions or arweaveJwk at createPublish or in PublishProvider config.'\n )\n }\n\n const arweave = getArweave()\n const arweaveTransactions: ArweaveTransactionInfo[] = (\n results as Array<{ transaction: Record<string, unknown>; versionId?: string; modelName?: string }>\n ).map((r) => {\n const { chunks: serializedChunks, ...rest } = r.transaction as Record<string, unknown>\n const attrs = { ...rest }\n const chunks = deserializeChunks(serializedChunks)\n if (chunks) (attrs as Record<string, unknown>).chunks = chunks\n const tx = arweave.transactions.fromRaw(attrs)\n return {\n transaction: tx,\n versionId: r.versionId,\n modelName: r.modelName,\n }\n })\n\n return {\n arweaveTransactions,\n publishUploads,\n }\n },\n)\n","import { prepareHtmlEmbeddedImagesForPublish } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\n\ntype Input = { input: { context: PublishMachineContext } }\n\n/**\n * Creates Image items + co-publish rows for Html `data:image/*` URIs before Arweave/DataItem build.\n * Runs for both L1 and bundler; deferred Html ids drive two-phase upload + rewrite in the machine.\n */\nexport const preparingHtmlEmbedded = fromPromise(\n async ({ input: { context } }: Input): Promise<{ deferredHtmlSeedLocalIds: string[] }> => {\n const policy = context.htmlEmbeddedDataUriPolicy ?? 'materialize'\n const r = await prepareHtmlEmbeddedImagesForPublish(context.item, policy)\n return { deferredHtmlSeedLocalIds: r.deferredHtmlSeedLocalIds }\n },\n)\n","import { rewriteHtmlEmbeddedImagesOnDisk } from '@seedprotocol/sdk'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\n\ntype Input = { input: { context: PublishMachineContext } }\n\nfunction toUploadedPairs(\n txs: ArweaveTransactionInfo[] | undefined,\n ups: PublishUpload[] | undefined,\n): { txId: string; seedLocalId?: string; versionLocalId?: string }[] {\n const out: { txId: string; seedLocalId?: string; versionLocalId?: string }[] = []\n const n = Math.min(txs?.length ?? 0, ups?.length ?? 0)\n for (let i = 0; i < n; i++) {\n const t = txs![i]!\n const u = ups![i]!\n const id = t.transaction?.id\n if (typeof id === 'string' && id.length > 0) {\n out.push({ txId: id, seedLocalId: u.seedLocalId, versionLocalId: u.versionLocalId })\n }\n }\n return out\n}\n\nexport const rewritingHtmlEmbedded = fromPromise(\n async ({ input: { context } }: Input): Promise<void> => {\n const pairs = toUploadedPairs(\n context.htmlEmbeddedPhase1ArweaveTransactions,\n context.htmlEmbeddedPhase1PublishUploads as PublishUpload[] | undefined,\n )\n await rewriteHtmlEmbeddedImagesOnDisk(context.item.seedLocalId, pairs)\n },\n)\n","/**\n * Option B: Extract raw file data from Item properties for DataItem creation.\n * Duplicates logic from getPublishUploads but returns raw data instead of transactions.\n * TODO: Replace with shared getPublishUploadData on Item/SDK once experimental path is verified.\n */\nimport {\n BaseDb,\n BaseFileManager,\n getCorrectId,\n getSegmentedItemProperties,\n htmlEmbeddedImageCoPublish,\n Item,\n ModelPropertyDataTypes,\n} from '@seedprotocol/sdk'\nimport type { IItem, IItemProperty, TransactionTag } from '@seedprotocol/sdk'\nimport { eq } from 'drizzle-orm'\n\n/** Optional extra tags appended after Content-SHA-256 / Content-Type (mirrors SDK getPublishUploads). */\nexport type GetPublishUploadDataOptions = {\n arweaveUploadTags?: TransactionTag[]\n deferHtmlStorageSeedLocalIds?: string[]\n onlyHtmlStorageSeedLocalIds?: string[]\n skipRelationRecursion?: boolean\n}\n\nconst buildPublishUploadDataTags = (\n contentHash: string | undefined,\n contentType: string | undefined,\n extra?: TransactionTag[],\n): TransactionTag[] => {\n const tags: TransactionTag[] = []\n if (contentHash) tags.push({ name: 'Content-SHA-256', value: contentHash })\n if (contentType) tags.push({ name: 'Content-Type', value: contentType })\n if (extra?.length) tags.push(...extra)\n return tags\n}\n\nconst getContentHash = async (data: Uint8Array | ArrayBuffer): Promise<string> => {\n const bytes = data instanceof Uint8Array ? new Uint8Array(data) : new Uint8Array(data)\n const hashBuffer = await crypto.subtle.digest('SHA-256', bytes)\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\nconst EXTENSION_TO_MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n html: 'text/html',\n htm: 'text/html',\n json: 'application/json',\n txt: 'text/plain',\n}\n\nconst getMimeTypeFromPath = (filePathOrName: string): string | undefined => {\n const ext = filePathOrName.split('.').pop()?.toLowerCase()\n return ext ? EXTENSION_TO_MIME[ext] : undefined\n}\n\nconst toUint8Array = async (data: Buffer | Blob): Promise<Uint8Array> => {\n if (typeof Blob !== 'undefined' && data instanceof Blob) {\n return new Uint8Array(await data.arrayBuffer())\n }\n return new Uint8Array(data as Buffer)\n}\n\nconst getStorageDirForDataType = (dataType: string): string => {\n switch (dataType) {\n case 'Image':\n return BaseFileManager.getFilesPath('images')\n case 'File':\n return BaseFileManager.getFilesPath('files')\n case 'Html':\n return BaseFileManager.getFilesPath('html')\n case 'Json':\n return BaseFileManager.getFilesPath('json')\n default:\n return BaseFileManager.getFilesPath('images')\n }\n}\n\nexport type PublishUploadData = {\n data: Uint8Array\n contentHash?: string\n contentType?: string\n /** Full tag list for DataItem / bundler: content tags then configured arweaveUploadTags. */\n tags: TransactionTag[]\n itemPropertyName: string\n itemPropertyLocalId: string\n seedLocalId: string\n versionLocalId: string\n}\n\ntype UploadProperty = {\n itemProperty: IItemProperty<any>\n childProperties: IItemProperty<any>[]\n}\n\ntype ChildUploadData = {\n propertyName: string\n localStoragePath: string\n}\n\nconst DATA_URI_IMAGE = /^data:(image\\/[a-zA-Z0-9.+-]+);base64,([\\s\\S]*)$/i\n\nfunction decodeDataUriImage(dataUri: string): { mimeType: string; bytes: Uint8Array } | null {\n const m = DATA_URI_IMAGE.exec((dataUri ?? '').trim())\n if (!m) return null\n try {\n const mimeType = m[1]!.toLowerCase().trim()\n const base64 = m[2]!.replace(/\\s/g, '')\n const binary = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0))\n return { mimeType, bytes: binary }\n } catch {\n return null\n }\n}\n\nconst processUploadPropertyData = async (\n uploadProperty: UploadProperty,\n uploads: PublishUploadData[],\n relatedItemProperty?: IItemProperty<any>,\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> => {\n const extra = options?.arweaveUploadTags\n const itemProperty = uploadProperty.itemProperty\n const childUploads: ChildUploadData[] = []\n\n for (const childProperty of uploadProperty.childProperties) {\n const filePath = childProperty.localStoragePath\n if (!filePath || filePath.endsWith('undefined')) continue\n const exists = await BaseFileManager.pathExists(filePath)\n if (!exists) continue\n childUploads.push({\n propertyName: childProperty.propertyName,\n localStoragePath: filePath,\n })\n }\n\n let fileContents: Uint8Array | undefined\n\n if (!childUploads || childUploads.length === 0) {\n if (relatedItemProperty?.localStoragePath) {\n const filePath = relatedItemProperty.localStoragePath\n if (filePath && !filePath.endsWith('undefined')) {\n const exists = await BaseFileManager.pathExists(filePath)\n if (exists) {\n try {\n const fileBuffer = await BaseFileManager.readFileAsBuffer(filePath)\n fileContents = await toUint8Array(fileBuffer)\n } catch {\n const fs = await BaseFileManager.getFs()\n fileContents = await toUint8Array(fs.readFileSync(filePath))\n }\n }\n }\n }\n }\n\n if (childUploads.length > 0) {\n const separator = '===FILE_SEPARATOR==='\n let compositeFileContents = ''\n const fs = await BaseFileManager.getFs()\n for (const childUpload of childUploads) {\n let childUploadContents: Buffer\n try {\n childUploadContents = await fs.promises.readFile(childUpload.localStoragePath)\n } catch {\n childUploadContents = fs.readFileSync(childUpload.localStoragePath)\n }\n compositeFileContents += `${separator}${childUpload.propertyName}${separator}${childUploadContents}`\n }\n fileContents =\n typeof document !== 'undefined'\n ? new TextEncoder().encode(compositeFileContents)\n : new Uint8Array(Buffer.from(compositeFileContents))\n }\n\n if (!fileContents) return uploads\n\n const uint8Array = new Uint8Array(fileContents)\n const contentHash = await getContentHash(uint8Array)\n let contentType: string | undefined\n if (childUploads.length === 0 && relatedItemProperty?.localStoragePath) {\n contentType = getMimeTypeFromPath(relatedItemProperty.localStoragePath)\n } else if (childUploads.length > 0) {\n contentType = 'application/octet-stream'\n }\n\n const itemPropertyLocalId = relatedItemProperty ? relatedItemProperty.localId : itemProperty.localId\n const itemPropertyName = relatedItemProperty ? relatedItemProperty.propertyName : itemProperty.propertyName\n\n uploads.push({\n data: uint8Array,\n contentHash,\n contentType,\n tags: buildPublishUploadDataTags(contentHash, contentType, extra),\n itemPropertyName,\n itemPropertyLocalId,\n seedLocalId: itemProperty.seedLocalId!,\n versionLocalId: itemProperty.versionLocalId!,\n })\n return uploads\n}\n\nconst getStorageSeedUploadData = async (\n itemStorageSeedProperties: IItemProperty<any>[],\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> => {\n const uploads: PublishUploadData[] = []\n const extra = options?.arweaveUploadTags\n\n for (const itemProperty of itemStorageSeedProperties) {\n const snapshot = itemProperty.getService().getSnapshot()\n const context = 'context' in snapshot ? snapshot.context : null\n if (!context) continue\n\n const propertyValue = (context as { propertyValue?: string }).propertyValue\n const refResolvedValue = (context as { refResolvedValue?: string }).refResolvedValue\n if (!refResolvedValue) continue\n\n const { localId: seedLocalId } = getCorrectId(propertyValue ?? '')\n if (!seedLocalId) continue\n\n const dataType =\n itemProperty.propertyDef?.refValueType ??\n itemProperty.propertyDef?.dataType ??\n 'Image'\n\n if (dataType === ModelPropertyDataTypes.Html) {\n if (options?.deferHtmlStorageSeedLocalIds?.includes(seedLocalId)) {\n continue\n }\n if (\n options?.onlyHtmlStorageSeedLocalIds?.length &&\n !options.onlyHtmlStorageSeedLocalIds.includes(seedLocalId)\n ) {\n continue\n }\n } else if (options?.onlyHtmlStorageSeedLocalIds?.length) {\n continue\n }\n\n const baseDir = getStorageDirForDataType(dataType)\n const filePath = `${baseDir}/${refResolvedValue}`\n\n const exists = await BaseFileManager.pathExists(filePath)\n if (!exists) continue\n\n const fileBuffer = await BaseFileManager.readFileAsBuffer(filePath)\n const fileContents = await toUint8Array(fileBuffer)\n const contentHash = await getContentHash(fileContents)\n const contentType = getMimeTypeFromPath(refResolvedValue)\n\n uploads.push({\n data: fileContents,\n contentHash,\n contentType,\n tags: buildPublishUploadDataTags(contentHash, contentType, extra),\n itemPropertyName: itemProperty.propertyName,\n itemPropertyLocalId: itemProperty.localId,\n seedLocalId,\n versionLocalId: itemProperty.versionLocalId!,\n })\n }\n return uploads\n}\n\nasync function appendCoPublishedImageUploadData(\n item: IItem<any>,\n uploads: PublishUploadData[],\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> {\n const appDb = BaseDb.getAppDb()\n if (!appDb || options?.onlyHtmlStorageSeedLocalIds?.length) return uploads\n\n const rows = await appDb\n .select()\n .from(htmlEmbeddedImageCoPublish)\n .where(eq(htmlEmbeddedImageCoPublish.parentSeedLocalId, item.seedLocalId))\n\n const seen = new Set(uploads.map((u) => u.seedLocalId))\n\n for (const row of rows) {\n if (seen.has(row.imageSeedLocalId)) continue\n const imageItem = await Item.find({ seedLocalId: row.imageSeedLocalId, modelName: 'Image' })\n if (!imageItem) continue\n\n const st =\n imageItem.internalProperties['storageTransactionId'] ??\n imageItem.allProperties['storageTransactionId']\n const stSnap = st?.getService().getSnapshot()\n const stCtx = stSnap && 'context' in stSnap ? stSnap.context : undefined\n const stValue = typeof (stCtx as { propertyValue?: unknown } | undefined)?.propertyValue === 'string'\n ? ((stCtx as { propertyValue?: string }).propertyValue ?? '')\n : ''\n const decoded = decodeDataUriImage(stValue)\n\n let more: PublishUploadData[] = []\n if (decoded && st && st.localId && st.versionLocalId) {\n const contentHash = await getContentHash(decoded.bytes)\n more = [{\n data: decoded.bytes,\n contentHash,\n contentType: decoded.mimeType,\n tags: buildPublishUploadDataTags(contentHash, decoded.mimeType, options?.arweaveUploadTags),\n itemPropertyName: st.propertyName,\n itemPropertyLocalId: st.localId,\n seedLocalId: imageItem.seedLocalId,\n versionLocalId: st.versionLocalId,\n }]\n }\n for (const u of more) {\n if (!seen.has(u.seedLocalId)) {\n uploads.push(u)\n seen.add(u.seedLocalId)\n }\n }\n }\n return uploads\n}\n\nexport const getPublishUploadData = async (\n item: IItem<any>,\n uploads: PublishUploadData[] = [],\n relatedItemProperty?: IItemProperty<any>,\n options?: GetPublishUploadDataOptions,\n): Promise<PublishUploadData[]> => {\n const { itemUploadProperties, itemRelationProperties, itemImageProperties } =\n await getSegmentedItemProperties(item)\n\n if (!relatedItemProperty && options?.onlyHtmlStorageSeedLocalIds?.length) {\n const storageSeedUploads = await getStorageSeedUploadData(itemImageProperties, options)\n uploads.push(...storageSeedUploads)\n return uploads\n }\n\n for (const uploadProperty of itemUploadProperties) {\n uploads = await processUploadPropertyData(\n uploadProperty,\n uploads,\n relatedItemProperty,\n options,\n )\n }\n\n const storageSeedUploads = await getStorageSeedUploadData(itemImageProperties, options)\n uploads.push(...storageSeedUploads)\n\n if (!relatedItemProperty && !options?.onlyHtmlStorageSeedLocalIds?.length) {\n uploads = await appendCoPublishedImageUploadData(item, uploads, options)\n }\n\n if (options?.skipRelationRecursion) {\n return uploads\n }\n\n for (const relationProperty of itemRelationProperties) {\n const snapshot = relationProperty.getService().getSnapshot()\n const context = 'context' in snapshot ? snapshot.context : null\n if (!context) continue\n\n const propertyValue = (context as { propertyValue?: string }).propertyValue\n if (!propertyValue || relationProperty.uid) continue\n\n const { localId: seedLocalId, uid: seedUid } = getCorrectId(propertyValue)\n const relatedItem = await Item.find({ seedLocalId, seedUid } as Parameters<typeof Item.find>[0])\n if (!relatedItem) {\n throw new Error(`No relatedItem found for ${relationProperty.propertyName}`)\n }\n uploads = await getPublishUploadData(relatedItem, uploads, relationProperty, options)\n }\n\n return uploads\n}\n","import { ethers } from 'ethers'\nimport type { Account } from 'thirdweb/wallets'\n\n// ============================================================================\n// ANS-104 Data Item construction — zero Node.js dependencies\n//\n// A data item is a binary structure:\n// [signature type (2 bytes)]\n// [signature (65 bytes for Ethereum)]\n// [owner/public key (65 bytes for Ethereum)]\n// [target flag (1 byte) + optional target (32 bytes)]\n// [anchor flag (1 byte) + optional anchor (32 bytes)]\n// [number of tags (8 bytes, little-endian)]\n// [number of tag bytes (8 bytes, little-endian)]\n// [serialized tags (Avro ZigZag VInt format per ANS-104)]\n// [data]\n// ============================================================================\n\nconst SIG_TYPE_ETHEREUM = 3\nconst SIG_LENGTH = 65\n\nconst PLACEHOLDER_MESSAGE = new TextEncoder().encode('seed-recovery')\n\ninterface Tag {\n name: string\n value: string\n}\n\nconst ANCHOR_LENGTH = 32\n\n/**\n * 32-byte ANS-104 anchor for publish uniqueness (timestamp + signer + nonce).\n * Matches arbundles: presence flag + exactly 32 bytes when set.\n */\nconst UINT64_MASK = 0xffffffffffffffffn\n\nexport function buildPublishAnchorBytes(\n walletAddress: string,\n timestampMs: number,\n uniqueness: bigint,\n): Uint8Array {\n const hash = ethers.solidityPackedKeccak256(\n ['uint256', 'address', 'uint64'],\n [BigInt(timestampMs), walletAddress, uniqueness & UINT64_MASK],\n )\n return ethers.getBytes(hash)\n}\n\nfunction encodeTargetOrAnchorSection(raw: Uint8Array): Uint8Array {\n if (raw.length === 0) return new Uint8Array([0])\n if (raw.length !== ANCHOR_LENGTH) {\n throw new Error(`ANS-104 target/anchor must be empty or ${ANCHOR_LENGTH} bytes, got ${raw.length}`)\n }\n const out = new Uint8Array(1 + ANCHOR_LENGTH)\n out[0] = 1\n out.set(raw, 1)\n return out\n}\n\n/**\n * Type guard: true if signer is ethers.Wallet (has privateKey). Thirdweb Account does not.\n */\nexport function isEthersWallet(signer: unknown): signer is ethers.Wallet {\n return (\n signer != null &&\n typeof signer === 'object' &&\n 'privateKey' in signer &&\n typeof (signer as ethers.Wallet).privateKey === 'string'\n )\n}\n\n/**\n * Write ZigZag-encoded variable-length integer (Avro long format).\n * Used for tag array and per-tag name/value lengths per ANS-104.\n */\nfunction writeZigZagVInt(n: number, out: Uint8Array, offset: number): number {\n const zigzag = n >= 0 ? n << 1 : (~n << 1) | 1\n let m = zigzag\n let pos = offset\n do {\n const byte = m & 0x7f\n m >>>= 7\n out[pos++] = m ? byte | 0x80 : byte\n } while (m)\n return pos - offset\n}\n\n/**\n * Serialize tags into ANS-104 Avro format (matches arbundles/Irys).\n * Format: [block count VInt][for each tag: name_len VInt][name][value_len VInt][value]][0 VInt]\n */\nexport const serializeTags = (tags: Tag[]): Uint8Array => {\n if (!tags?.length) return new Uint8Array(0)\n\n const encoder = new TextEncoder()\n const temp = new Uint8Array(16)\n const chunks: Uint8Array[] = []\n\n const appendLong = (n: number) => {\n const len = writeZigZagVInt(n, temp, 0)\n chunks.push(temp.slice(0, len))\n }\n\n appendLong(tags.length)\n for (const tag of tags) {\n const nameBytes = encoder.encode(tag.name)\n const valueBytes = encoder.encode(tag.value)\n appendLong(nameBytes.length)\n chunks.push(nameBytes)\n appendLong(valueBytes.length)\n chunks.push(valueBytes)\n }\n appendLong(0)\n\n const totalLength = chunks.reduce((sum, c) => sum + c.length, 0)\n const result = new Uint8Array(totalLength)\n let pos = 0\n for (const chunk of chunks) {\n result.set(chunk, pos)\n pos += chunk.length\n }\n return result\n}\n\n/**\n * Write a 64-bit little-endian unsigned integer into a Uint8Array.\n * (Tag counts and byte lengths use 8-byte LE in ANS-104)\n */\nexport const writeUint64LE = (value: number): Uint8Array => {\n const buf = new Uint8Array(8)\n const view = new DataView(buf.buffer)\n // Safe for values up to Number.MAX_SAFE_INTEGER\n view.setUint32(0, value & 0xffffffff, true)\n view.setUint32(4, Math.floor(value / 0x100000000), true)\n return buf\n}\n\n/**\n * Arweave deep-hash (SHA-384 based). Used for ANS-104 DataItem signing.\n * Matches arbundles/Irys getSignatureData flow.\n */\nasync function sha384(data: Uint8Array): Promise<Uint8Array> {\n // TS 5.9+: Uint8Array<ArrayBufferLike> is not assignable to BufferSource without narrowing\n return new Uint8Array(\n await crypto.subtle.digest('SHA-384', data as BufferSource),\n )\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n const out = new Uint8Array(a.length + b.length)\n out.set(a, 0)\n out.set(b, a.length)\n return out\n}\n\nasync function deepHash(data: Uint8Array | Uint8Array[]): Promise<Uint8Array> {\n const enc = new TextEncoder()\n if (Array.isArray(data)) {\n const tag = concat(enc.encode('list'), enc.encode(data.length.toString()))\n let acc = await sha384(tag)\n for (const chunk of data) {\n const chunkHash = await deepHash(chunk)\n acc = await sha384(concat(acc, chunkHash))\n }\n return acc\n }\n const tag = concat(enc.encode('blob'), enc.encode(data.byteLength.toString()))\n const tagHash = await sha384(tag)\n const dataHash = await sha384(data)\n return sha384(concat(tagHash, dataHash))\n}\n\n/**\n * Build the message to sign per ANS-104 / arbundles: deep-hash of DataItem components.\n */\nasync function getSignatureData(\n ownerBytes: Uint8Array,\n rawTarget: Uint8Array,\n rawAnchor: Uint8Array,\n rawTags: Uint8Array,\n rawData: Uint8Array,\n): Promise<Uint8Array> {\n const enc = new TextEncoder()\n return deepHash([\n enc.encode('dataitem'),\n enc.encode('1'),\n enc.encode(SIG_TYPE_ETHEREUM.toString()),\n ownerBytes,\n rawTarget,\n rawAnchor,\n rawTags,\n rawData,\n ])\n}\n\n/**\n * Build the ANS-104 message bytes (everything from owner onward) for the raw DataItem.\n */\nfunction buildMessageBytes(\n ownerBytes: Uint8Array,\n tags: Tag[],\n data: Uint8Array,\n rawTarget: Uint8Array,\n rawAnchor: Uint8Array,\n): Uint8Array {\n const serializedTags = serializeTags(tags)\n const numTagsBytes = writeUint64LE(tags.length)\n const numTagBytesBytes = writeUint64LE(serializedTags.length)\n const targetSection = encodeTargetOrAnchorSection(rawTarget)\n const anchorSection = encodeTargetOrAnchorSection(rawAnchor)\n const messageparts = [\n ownerBytes,\n targetSection,\n anchorSection,\n numTagsBytes,\n numTagBytesBytes,\n serializedTags,\n data,\n ]\n const messageLength = messageparts.reduce((s, p) => s + p.length, 0)\n const message = new Uint8Array(messageLength)\n let offset = 0\n for (const part of messageparts) {\n message.set(part, offset)\n offset += part.length\n }\n return message\n}\n\n/**\n * Assemble the full ANS-104 data item binary and compute its ID.\n * [sig type 2B][signature 65B][owner 65B][...rest of message]\n */\nasync function assembleDataItemAndId(\n signature: Uint8Array,\n message: Uint8Array,\n): Promise<{ id: string; raw: Uint8Array }> {\n const sigTypeBytes = new Uint8Array(2)\n new DataView(sigTypeBytes.buffer).setUint16(0, SIG_TYPE_ETHEREUM, true)\n const fullLength = 2 + SIG_LENGTH + message.length\n const raw = new Uint8Array(fullLength)\n raw.set(sigTypeBytes, 0)\n raw.set(signature, 2)\n raw.set(message, 2 + SIG_LENGTH)\n const hashBuffer = await crypto.subtle.digest('SHA-256', new Uint8Array(signature))\n const id = base64url(new Uint8Array(hashBuffer))\n return { id, raw }\n}\n\n/**\n * Create a signed ANS-104 DataItem. Uses deep-hash for the message to sign (per arbundles/Irys).\n */\nexport const createSignedDataItem = async (\n data: Uint8Array,\n signer: ethers.Wallet,\n tags: Tag[],\n rawAnchor: Uint8Array = new Uint8Array(0),\n): Promise<{ id: string; raw: Uint8Array }> => {\n const pubKeyHex = ethers.SigningKey.computePublicKey(signer.privateKey, false)\n const ownerBytes = ethers.getBytes(pubKeyHex)\n const serializedTags = serializeTags(tags)\n const rawTarget = new Uint8Array(0)\n\n const signatureData = await getSignatureData(\n ownerBytes,\n rawTarget,\n rawAnchor,\n serializedTags,\n data,\n )\n const signature = ethers.getBytes(await signer.signMessage(signatureData))\n\n const message = buildMessageBytes(ownerBytes, tags, data, rawTarget, rawAnchor)\n return assembleDataItemAndId(signature, message)\n}\n\n/**\n * Create a signed ANS-104 DataItem using a Thirdweb Account (EOA, ManagedAccount, Modular Account).\n * Uses deep-hash for the message to sign (per arbundles/Irys).\n */\nexport const createSignedDataItemWithAccount = async (\n data: Uint8Array,\n account: Account,\n tags: Tag[],\n rawAnchor: Uint8Array = new Uint8Array(0),\n): Promise<{ id: string; raw: Uint8Array }> => {\n // 1. Recover public key via placeholder sign (Account has no privateKey)\n const placeholderHex = ethers.hexlify(PLACEHOLDER_MESSAGE) as `0x${string}`\n const placeholderSig = await account.signMessage({\n message: { raw: placeholderHex },\n })\n const digest = ethers.hashMessage(PLACEHOLDER_MESSAGE)\n const pubKeyHex = ethers.SigningKey.recoverPublicKey(digest, placeholderSig)\n const ownerBytes = ethers.getBytes(pubKeyHex)\n\n // 2. Build signature data (deep-hash) and sign it\n const serializedTags = serializeTags(tags)\n const rawTarget = new Uint8Array(0)\n const signatureData = await getSignatureData(\n ownerBytes,\n rawTarget,\n rawAnchor,\n serializedTags,\n data,\n )\n const signatureDataHex = ethers.hexlify(signatureData) as `0x${string}`\n const sigHex = await account.signMessage({\n message: { raw: signatureDataHex },\n })\n const signature = ethers.getBytes(sigHex)\n\n // 3. Assemble and return\n const message = buildMessageBytes(ownerBytes, tags, data, rawTarget, rawAnchor)\n return assembleDataItemAndId(signature, message)\n}\n\nconst OWNER_LENGTH_ETHEREUM = 65\n\n/**\n * Byte offset of the tags section (8-byte tag count + 8-byte tag bytes length + tags + data).\n * Mirrors arbundles DataItem.getTagsStart / getAnchorStart.\n */\nfunction getTagsStartOffset(raw: Uint8Array): number | null {\n const targetStart = 2 + SIG_LENGTH + OWNER_LENGTH_ETHEREUM\n if (raw.length < targetStart + 1) return null\n const targetFlag = raw[targetStart]!\n if (targetFlag !== 0 && targetFlag !== 1) return null\n const targetPresent = targetFlag === 1\n if (targetPresent && raw.length < targetStart + 33) return null\n let pos = targetStart + (targetPresent ? 33 : 1)\n if (raw.length < pos + 1) return null\n const anchorFlag = raw[pos]!\n if (anchorFlag !== 0 && anchorFlag !== 1) return null\n const anchorPresent = anchorFlag === 1\n if (anchorPresent && raw.length < pos + 33) return null\n return pos + (anchorPresent ? 33 : 1)\n}\n\nfunction sliceTargetAndAnchor(\n raw: Uint8Array,\n): { rawTarget: Uint8Array; rawAnchor: Uint8Array; tagsStart: number } | null {\n const tagsStart = getTagsStartOffset(raw)\n if (tagsStart == null) return null\n const targetStart = 2 + SIG_LENGTH + OWNER_LENGTH_ETHEREUM\n const targetPresent = raw[targetStart] === 1\n const rawTarget = targetPresent ? raw.slice(targetStart + 1, targetStart + 33) : new Uint8Array(0)\n const anchorStart = targetStart + (targetPresent ? 33 : 1)\n const anchorPresent = raw[anchorStart] === 1\n const rawAnchor = anchorPresent ? raw.slice(anchorStart + 1, anchorStart + 33) : new Uint8Array(0)\n return { rawTarget, rawAnchor, tagsStart }\n}\n\n/**\n * Verify an ANS-104 DataItem (Ethereum sig type 3) before upload.\n * Uses deep-hash for the expected message (per arbundles/Irys).\n */\nexport async function verifyDataItem(raw: Uint8Array): Promise<boolean> {\n const parsed = sliceTargetAndAnchor(raw)\n if (parsed == null) return false\n const { rawTarget, rawAnchor, tagsStart } = parsed\n const minLength = tagsStart + 16\n if (raw.length < minLength) return false\n\n const view = new DataView(raw.buffer, raw.byteOffset, raw.byteLength)\n const sigType = view.getUint16(0, true)\n if (sigType !== SIG_TYPE_ETHEREUM) return false\n\n const signature = raw.slice(2, 2 + SIG_LENGTH)\n const ownerBytes = raw.slice(2 + SIG_LENGTH, 2 + SIG_LENGTH + OWNER_LENGTH_ETHEREUM)\n\n const numTagBytes = Number(\n view.getUint32(tagsStart + 8, true) + view.getUint32(tagsStart + 12, true) * 0x100000000\n )\n const tagsEnd = tagsStart + 16 + numTagBytes\n if (raw.length < tagsEnd) return false\n\n const rawTags = raw.slice(tagsStart + 16, tagsEnd)\n const rawData = raw.slice(tagsEnd)\n\n try {\n const signatureData = await getSignatureData(\n ownerBytes,\n rawTarget,\n rawAnchor,\n rawTags,\n rawData,\n )\n const digest = ethers.hashMessage(signatureData)\n const sigHex = ethers.hexlify(signature)\n const recoveredPubKey = ethers.SigningKey.recoverPublicKey(digest, sigHex)\n const recoveredBytes = ethers.getBytes(recoveredPubKey)\n return (\n recoveredBytes.length === ownerBytes.length &&\n recoveredBytes.every((b, i) => b === ownerBytes[i])\n )\n } catch {\n return false\n }\n}\n\n/**\n * Base64url encode (no padding) — used for data item IDs\n */\nexport const base64url = (bytes: Uint8Array): string => {\n let binary = ''\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}","import type { GetPublishUploadDataOptions, PublishUploadData } from '../helpers/getPublishUploadData'\nimport debug from 'debug'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport { waitForItem } from './utils'\nimport { getPublishUploadData } from '../helpers/getPublishUploadData'\nimport { getPublishConfig } from '~/config'\nimport {\n buildPublishAnchorBytes,\n createSignedDataItem,\n createSignedDataItemWithAccount,\n isEthersWallet,\n verifyDataItem,\n} from '~/helpers/arweave'\n\nconst logger = debug('seedProtocol:createArweaveDataItems')\n\n\n\nexport type CreateArweaveDataItemsResult = {\n arweaveTransactions: ArweaveTransactionInfo[]\n publishUploads: PublishUpload[]\n /** Signed DataItems for uploadViaBundler (dataItemSigner path only). */\n signedDataItems?: unknown[]\n}\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\ntype Signers = {\n signDataItems: PublishMachineContext['signDataItems']\n dataItemSigner: PublishMachineContext['dataItemSigner']\n}\n\n/**\n * Sign raw upload payloads as DataItems (phase 1 or phase 2). Shared by createArweaveDataItems and phase-2 actor.\n */\nexport async function signBundlerUploadDataList(\n uploadDataList: PublishUploadData[],\n signDataItems: Signers['signDataItems'],\n dataItemSigner: Signers['dataItemSigner'],\n): Promise<CreateArweaveDataItemsResult> {\n let arweaveTransactions: ArweaveTransactionInfo[]\n let signedDataItems: unknown[] | undefined\n\n if (signDataItems) {\n const result = await signDataItems(uploadDataList)\n arweaveTransactions = result.map((r) => ({\n transaction: { id: r.transaction.id },\n versionId: r.versionId,\n modelName: r.modelName,\n }))\n } else if (dataItemSigner) {\n const signer = dataItemSigner\n const items: Awaited<ReturnType<typeof createSignedDataItem>>[] = []\n const timestampMs = Date.now()\n const walletAddress = signer.address\n for (let i = 0; i < uploadDataList.length; i++) {\n const upload = uploadDataList[i]!\n const tags = upload.tags\n const randomUniq = new Uint8Array(8)\n crypto.getRandomValues(randomUniq)\n const uniqueness =\n (new DataView(randomUniq.buffer).getBigUint64(0, false) ^ BigInt(i)) &\n 0xffffffffffffffffn\n const rawAnchor = buildPublishAnchorBytes(walletAddress, timestampMs, uniqueness)\n const dataItem = isEthersWallet(signer)\n ? await createSignedDataItem(upload.data, signer, tags, rawAnchor)\n : await createSignedDataItemWithAccount(upload.data, signer, tags, rawAnchor)\n\n const isValid = await verifyDataItem(dataItem.raw)\n if (!isValid) {\n logger('DataItem verification failed: id=%s modelName=%s', dataItem.id, upload.itemPropertyName)\n throw new Error(\n `DataItem signature verification failed for ${upload.itemPropertyName}. ` +\n 'The signing key may not match the owner, or the payload may have been modified.'\n )\n }\n items.push(dataItem)\n }\n signedDataItems = items\n arweaveTransactions = items.map((dataItem, i) => ({\n transaction: { id: dataItem.id },\n versionId: uploadDataList[i]?.versionLocalId,\n modelName: uploadDataList[i]?.itemPropertyName,\n }))\n } else {\n throw new Error(\n '@seedprotocol/publish: useArweaveBundler requires signDataItems or dataItemSigner (pass at createPublish or in PublishProvider config)'\n )\n }\n\n const publishUploads: PublishUpload[] = uploadDataList.map((u) => ({\n itemPropertyName: u.itemPropertyName,\n itemPropertyLocalId: u.itemPropertyLocalId,\n seedLocalId: u.seedLocalId,\n versionLocalId: u.versionLocalId,\n transactionToSign: null,\n }))\n\n return {\n arweaveTransactions,\n publishUploads,\n signedDataItems,\n }\n}\n\n/**\n * Creates DataItems from raw upload data, signs them via signDataItems or dataItemSigner,\n * and returns arweaveTransactions for createAttestations compatibility.\n */\nexport const createArweaveDataItems = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveDataItemsResult> => {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const uploadDataOpts: GetPublishUploadDataOptions = {}\n if (context.arweaveUploadTags?.length) {\n uploadDataOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n uploadDataOpts.deferHtmlStorageSeedLocalIds = def\n }\n const uploadDataList = await getPublishUploadData(\n item,\n [],\n undefined,\n Object.keys(uploadDataOpts).length ? uploadDataOpts : undefined,\n )\n const config = getPublishConfig()\n const signDataItems = context.signDataItems ?? config.signDataItems\n const dataItemSigner = context.dataItemSigner ?? config.dataItemSigner\n\n return signBundlerUploadDataList(uploadDataList, signDataItems, dataItemSigner)\n }\n)\n","import type { GetPublishUploadDataOptions } from '../helpers/getPublishUploadData'\nimport { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport { waitForItem } from './utils'\nimport { getPublishUploadData } from '../helpers/getPublishUploadData'\nimport { getPublishConfig } from '~/config'\nimport { signBundlerUploadDataList, type CreateArweaveDataItemsResult } from './createArweaveDataItems'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\n/**\n * Phase 2 (bundler): Html storage DataItems only, after embedded images uploaded and Html rewritten on disk.\n * Exported for unit tests; the XState actor wraps this.\n */\nexport async function executeCreateArweaveDataItemsPhase2(\n context: PublishMachineContext,\n): Promise<CreateArweaveDataItemsResult> {\n let { item } = context\n\n if (!item.getPublishUploads) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const uploadDataOpts: GetPublishUploadDataOptions = {}\n if (context.arweaveUploadTags?.length) {\n uploadDataOpts.arweaveUploadTags = context.arweaveUploadTags\n }\n const def = context.htmlEmbeddedDeferredHtmlSeedLocalIds\n if (def?.length) {\n uploadDataOpts.onlyHtmlStorageSeedLocalIds = def\n uploadDataOpts.skipRelationRecursion = true\n }\n const uploadDataList = await getPublishUploadData(\n item,\n [],\n undefined,\n Object.keys(uploadDataOpts).length ? uploadDataOpts : undefined,\n )\n\n const config = getPublishConfig()\n const signDataItems = context.signDataItems ?? config.signDataItems\n const dataItemSigner = context.dataItemSigner ?? config.dataItemSigner\n\n if (uploadDataList.length === 0) {\n return {\n arweaveTransactions: [],\n publishUploads: [],\n signedDataItems: undefined,\n }\n }\n\n return signBundlerUploadDataList(uploadDataList, signDataItems, dataItemSigner)\n}\n\nexport const createArweaveDataItemsPhase2 = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<CreateArweaveDataItemsResult> =>\n executeCreateArweaveDataItemsPhase2(context),\n)\n","/**\n * Serialized form part for IPC to main process (avoids CORS by proxying uploads).\n */\nexport type UploadFormPart = {\n name: string\n value: string\n encoding?: 'base64'\n filename?: string\n}\n\n/** Chunk size for base64 encoding; spreading large arrays blows the call stack. */\nconst BASE64_CHUNK_SIZE = 8192\n\nfunction arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (let i = 0; i < bytes.length; i += BASE64_CHUNK_SIZE) {\n const chunk = bytes.subarray(i, Math.min(i + BASE64_CHUNK_SIZE, bytes.length))\n binary += String.fromCharCode.apply(null, chunk as unknown as number[])\n }\n return btoa(binary)\n}\n\n/**\n * Convert FormData to a serializable array for IPC. Blobs are base64-encoded.\n */\nexport async function formDataToSerializableParts(\n formData: FormData\n): Promise<UploadFormPart[]> {\n const parts: UploadFormPart[] = []\n for (const [name, value] of formData.entries()) {\n const entry = value as string | Blob\n if (typeof entry === 'object' && entry !== null && 'arrayBuffer' in entry) {\n const buf = await entry.arrayBuffer()\n const base64 = arrayBufferToBase64(buf)\n const file = entry as File\n parts.push({\n name,\n value: base64,\n encoding: 'base64',\n filename: file.name || undefined,\n })\n } else {\n parts.push({ name, value: String(value) })\n }\n }\n return parts\n}\n\n/** Result from upload POST (status 0 = network/proxy error). */\nexport type PostUploadResult = {\n status: number\n body: unknown\n error?: string\n message?: string\n}\n\n/** Build a user-facing message when the upload API returns a non-2xx status. */\nexport function uploadServerErrorMessage(\n status: number,\n body: unknown,\n transactionKeys?: string | null\n): string {\n const parts: string[] = ['Upload server returned ', String(status)]\n const msg =\n body && typeof body === 'object' && 'message' in body\n ? String((body as { message: unknown }).message)\n : body && typeof body === 'object' && 'error' in body\n ? String((body as { error: unknown }).error)\n : null\n if (msg) parts.push(`: ${msg}`)\n else if (transactionKeys) parts.push(` (${transactionKeys})`)\n return parts.join('')\n}\n\n/** Map technical network error messages to a short, user-facing message. */\nexport function uploadNetworkErrorMessage(technicalMessage?: string | null): string {\n if (!technicalMessage) {\n return 'Upload server unavailable. Please try again or check your connection.'\n }\n const t = technicalMessage.toLowerCase()\n if (/other side closed|econnreset|socket hang up|connection closed/i.test(t)) {\n return 'Upload server closed the connection. It may be busy or the request may be too large—try again.'\n }\n if (/etimedout|timeout/i.test(t)) {\n return 'Upload request timed out. Please try again.'\n }\n if (/enotfound|getaddrinfo|dns/i.test(t)) {\n return 'Upload server could not be reached. Check the upload URL and your network.'\n }\n return 'Upload failed. Please try again or check the upload server.'\n}\n\n/**\n * POST to the upload API. Uses main-process proxy in Electron to avoid CORS;\n * falls back to fetch when not in Electron (e.g. browser tests).\n */\nexport async function postUploadArweaveStart(\n url: string,\n formData: FormData,\n uploadApiBaseUrl: string\n): Promise<PostUploadResult> {\n const api = typeof window !== 'undefined' ? (window as Window & { Main?: { uploadArweaveStart?: (url: string, parts: UploadFormPart[]) => Promise<PostUploadResult> } }).Main : undefined\n if (api?.uploadArweaveStart) {\n const parts = await formDataToSerializableParts(formData)\n return api.uploadArweaveStart(url, parts)\n }\n const res = await fetch(url, {\n method: 'POST',\n body: formData,\n })\n const body = await res.json().catch(() => ({}))\n return { status: res.status, body }\n}\n\n/**\n * POST to Arweave bundler for instant uploads. Same FormData format as upload API.\n * Uses main-process proxy in Electron to avoid CORS.\n */\nexport async function postUploadBundler(\n url: string,\n formData: FormData\n): Promise<PostUploadResult> {\n const api = typeof window !== 'undefined' ? (window as Window & { Main?: { uploadArweaveStart?: (url: string, parts: UploadFormPart[]) => Promise<PostUploadResult> } }).Main : undefined\n if (api?.uploadArweaveStart) {\n const parts = await formDataToSerializableParts(formData)\n return api.uploadArweaveStart(url, parts)\n }\n const res = await fetch(url, {\n method: 'POST',\n body: formData,\n })\n const body = await res.json().catch(() => ({}))\n return { status: res.status, body }\n}\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { ReimbursementResponse } from '../../../types'\nimport { getPublishConfig } from '~/config'\nimport {\n postUploadArweaveStart,\n uploadNetworkErrorMessage,\n uploadServerErrorMessage,\n} from '~/helpers/uploadApi'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\nexport const sendReimbursementRequest = fromPromise(\n async ({ input: { context, event } }: PublishInput): Promise<ReimbursementResponse> => {\n const { arweaveTransactions = [], transactionKeys, reimbursementTransactionId } = context\n\n if (reimbursementTransactionId) {\n return {\n transactionId: reimbursementTransactionId,\n }\n }\n\n const transactions = arweaveTransactions.map(({ transaction }: ArweaveTransactionInfo) => transaction)\n\n const formData = new FormData()\n\n type ArweaveTx = { id: string; data?: unknown; chunks?: unknown; [key: string]: unknown }\n for (const transaction of transactions as ArweaveTx[]) {\n let { data, chunks, ...json } = transaction\n const dataBlob = data instanceof Blob ? data : new Blob([data as BlobPart])\n formData.append(`${transaction.id}-data`, dataBlob, `${transaction.id}-data`)\n const chunksBlob = new Blob([JSON.stringify(chunks)], { type: 'application/json' })\n formData.append(`${transaction.id}-chunks`, chunksBlob, `${transaction.id}-chunks`)\n const jsonBlob = new Blob([JSON.stringify(json)], { type: 'application/json' })\n formData.append(`${transaction.id}-json`, jsonBlob, `${transaction.id}-json`)\n }\n\n const { uploadApiBaseUrl } = getPublishConfig()\n const url = `${uploadApiBaseUrl}/api/upload/arweave/start`\n const { status, body, message: serverMessage } = await postUploadArweaveStart(\n url,\n formData,\n uploadApiBaseUrl\n )\n\n if (status >= 300 || status < 200) {\n const technicalMsg = status === 0 ? serverMessage : null\n if (technicalMsg) console.error('[upload]', technicalMsg)\n const errMsg =\n status === 0\n ? uploadNetworkErrorMessage(technicalMsg as string | undefined)\n : uploadServerErrorMessage(status, body, transactionKeys)\n throw new Error(errMsg)\n }\n\n return body as ReimbursementResponse\n }\n)\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport { getArweave } from '~/helpers/blockchain'\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\nexport const pollForConfirmation = fromPromise(async ({ input: { context, event } }: PublishInput): Promise<void> => {\n const { requestResponse, reimbursementTransactionId } = context\n\n if (!requestResponse) {\n throw new Error('No request response')\n }\n\n if (!reimbursementTransactionId) {\n throw new Error('No reimbursement transaction id')\n }\n\n const arweave = getArweave()\n\n const _pollForConfirmation = new Promise<void>((resolve, reject) => {\n const interval = setInterval(async () => {\n let response\n try {\n response = await arweave.transactions.getStatus(reimbursementTransactionId)\n } catch (error) {\n return\n }\n if (response && response.confirmed) {\n clearInterval(interval)\n resolve()\n }\n }, 5000)\n })\n\n await _pollForConfirmation\n})\n","import { EventObject, fromCallback } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport { getArweave } from '~/helpers/blockchain'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:actors')\n\nfunction ensureUint8Array(data: unknown): Uint8Array {\n if (data instanceof Uint8Array) return data\n if (data instanceof ArrayBuffer) return new Uint8Array(data)\n throw new Error('Transaction data must be Uint8Array or ArrayBuffer for upload resume')\n}\n\nexport const uploadData = fromCallback<EventObject, { context: PublishMachineContext }>(\n ({ sendBack, input }) => {\n const ctx = input.context\n const arweaveTransactions = ctx.arweaveTransactions ?? []\n const transactions = arweaveTransactions.map(({ transaction }: ArweaveTransactionInfo) => transaction)\n const arweave = getArweave()\n\n const resumeState = ctx.uploaderState && typeof ctx.currentTransactionIndex === 'number'\n const startIndex = resumeState ? ctx.currentTransactionIndex! : 0\n\n const processTransactions = async (): Promise<string> => {\n const total = transactions.length\n for (let i = startIndex; i < total; i++) {\n const rawTransaction = transactions[i]\n if (!rawTransaction) continue\n const transaction = arweave.transactions.fromRaw(rawTransaction as object)\n\n const verified = await arweave.transactions.verify(transaction)\n if (!verified) {\n throw new Error('Transaction verification failed')\n }\n\n let uploader: Awaited<ReturnType<typeof arweave.transactions.getUploader>>\n const uploaderState = ctx.uploaderState\n if (resumeState && i === startIndex && uploaderState) {\n const data = transaction.data\n const dataBytes = data instanceof Uint8Array ? data : ensureUint8Array(data)\n uploader = await arweave.transactions.getUploader(uploaderState as unknown as Parameters<typeof arweave.transactions.getUploader>[0], dataBytes)\n } else {\n uploader = await arweave.transactions.getUploader(transaction, transaction.data)\n }\n\n while (!uploader.isComplete) {\n logger('uploading chunk')\n logger(`uploader.pctComplete: ${uploader.pctComplete}`)\n logger(`uploader.uploadedChunks: ${uploader.uploadedChunks}`)\n logger(`uploader.totalChunks: ${uploader.totalChunks}`)\n logger(uploader.lastResponseError)\n logger(uploader.lastResponseStatus)\n try {\n await uploader.uploadChunk()\n const pct = Math.trunc(((i + uploader.pctComplete / 100) / total) * 100)\n sendBack({\n type: 'updatePercentage',\n completionPercentage: pct,\n uploaderState: uploader.toJSON(),\n currentTransactionIndex: i,\n })\n logger(`${uploader.pctComplete}% complete, ${uploader.uploadedChunks}/${uploader.totalChunks}`)\n } catch (error) {\n logger(error)\n }\n }\n }\n\n return 'done'\n }\n\n processTransactions()\n .then((result) => {\n sendBack({ type: 'uploadComplete', result })\n })\n .catch((error) => {\n sendBack({ type: 'uploadError', error })\n })\n }\n)\n","import { EventObject, fromCallback } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport { getPublishConfig } from '~/config'\n\nconst BATCH_UPLOAD_TIMEOUT_MS = 120_000\nconst importDynamic = new Function('s', 'return import(s)') as (specifier: string) => Promise<{\n readFile: (path: string) => Promise<Buffer>\n stat: (path: string) => Promise<{ size: number }>\n}>\n\ntype DataItemLike = {\n raw?: Uint8Array\n filename?: string\n getRaw?: () => Buffer | Promise<Buffer>\n}\n\nlet nodeFsPromisesCache: { readFile: (path: string) => Promise<Buffer>; stat: (path: string) => Promise<{ size: number }> } | null = null\n\nconst getNodeFsPromises = async () => {\n if (nodeFsPromisesCache) return nodeFsPromisesCache\n if (typeof window !== 'undefined') return null\n\n try {\n const specifier = `node:${['fs', 'promises'].join('/')}`\n const mod = await importDynamic(specifier)\n nodeFsPromisesCache = {\n readFile: mod.readFile,\n stat: mod.stat,\n }\n return nodeFsPromisesCache\n } catch {\n return null\n }\n}\n\n/**\n * Bundler batch upload reads from context.signedDataItems (dataItemSigner path only).\n * arweaveTransactions / publishUploads hold ids and metadata for later attestations.\n * When signDataItems is used, the callback handles upload (e.g. ArConnect) so signedDataItems\n * is undefined — we skip the upload step and send uploadComplete immediately.\n */\nexport const uploadViaBundler = fromCallback<EventObject, { context: PublishMachineContext }>(\n ({ sendBack, input: { context } }) => {\n const { signedDataItems } = context\n\n const { uploadApiBaseUrl, useArweaveBundler } = getPublishConfig()\n\n if (!useArweaveBundler || !uploadApiBaseUrl) {\n sendBack({\n type: 'uploadError',\n error: new Error(\n 'Arweave bundler not configured. Set useArweaveBundler and uploadApiBaseUrl.'\n ),\n })\n return\n }\n\n const bundlerUrl = `${uploadApiBaseUrl.replace(/\\/$/, '')}/api/upload/arweave/batch`\n\n if (!signedDataItems || signedDataItems.length === 0) {\n // signDataItems path: external signer (e.g. ArConnect) already uploaded; skip and proceed\n sendBack({ type: 'uploadComplete', result: 'done' })\n return\n }\n\n const _uploadViaBundler = async () => {\n const items = signedDataItems as unknown[]\n const itemCount = items.length\n const getRawCache: (Buffer | null)[] = new Array(itemCount).fill(null)\n\n /** Length only (pass 1). Caches buffer for getRaw() items to avoid a second read. */\n const rawByteLength = async (item: unknown, i: number): Promise<number> => {\n const o = item as DataItemLike\n if (o.raw != null && (o.raw instanceof Uint8Array || Buffer.isBuffer(o.raw))) {\n return o.raw.byteLength\n }\n if (typeof o.getRaw === 'function') {\n const r = o.getRaw()\n const resolved = r instanceof Promise ? await r : r\n const buf = Buffer.isBuffer(resolved) ? resolved : Buffer.from(resolved)\n getRawCache[i] = buf\n return buf.length\n }\n if (o.filename != null) {\n const nodeFsPromises = await getNodeFsPromises()\n if (!nodeFsPromises) {\n throw new Error(\n 'DataItem.filename requires Node.js fs access. In browser runtime, provide DataItem.raw or DataItem.getRaw().'\n )\n }\n const st = await nodeFsPromises.stat(o.filename)\n return st.size\n }\n throw new Error('Cannot get raw bytes from DataItem')\n }\n\n let totalSize = 4\n const lengths: number[] = []\n for (let i = 0; i < itemCount; i++) {\n const len = await rawByteLength(items[i], i)\n lengths.push(len)\n totalSize += 4 + len\n }\n\n const payload = Buffer.alloc(totalSize)\n let offset = 0\n payload.writeUInt32BE(itemCount, offset)\n offset += 4\n\n for (let i = 0; i < itemCount; i++) {\n const len = lengths[i]!\n const cached = getRawCache[i]\n if (cached) {\n payload.writeUInt32BE(len, offset)\n offset += 4\n cached.copy(payload, offset)\n offset += len\n continue\n }\n\n const o = items[i] as DataItemLike\n if (o.raw != null && (o.raw instanceof Uint8Array || Buffer.isBuffer(o.raw))) {\n payload.writeUInt32BE(len, offset)\n offset += 4\n payload.set(o.raw, offset)\n offset += len\n continue\n }\n if (o.filename != null) {\n const nodeFsPromises = await getNodeFsPromises()\n if (!nodeFsPromises) {\n throw new Error(\n 'DataItem.filename requires Node.js fs access. In browser runtime, provide DataItem.raw or DataItem.getRaw().'\n )\n }\n const buf = await nodeFsPromises.readFile(o.filename)\n payload.writeUInt32BE(buf.length, offset)\n offset += 4\n buf.copy(payload, offset)\n offset += buf.length\n continue\n }\n throw new Error('Cannot get raw bytes from DataItem')\n }\n\n const controller = new AbortController()\n const uploadTimeoutId = setTimeout(() => controller.abort(), BATCH_UPLOAD_TIMEOUT_MS)\n\n let response: Response\n try {\n response = await fetch(bundlerUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/octet-stream' },\n body: payload,\n signal: controller.signal,\n })\n } catch (err) {\n clearTimeout(uploadTimeoutId)\n if (err instanceof Error && err.name === 'AbortError') {\n throw new Error(\n `Arweave batch upload timed out after ${BATCH_UPLOAD_TIMEOUT_MS / 1000}s (upload API did not respond). Check uploadApiBaseUrl and network.`,\n )\n }\n throw err\n }\n clearTimeout(uploadTimeoutId)\n\n if (!response.ok) {\n throw new Error(`Batch upload failed: ${response.status}`)\n }\n\n const body = (await response.json().catch(() => ({}))) as { failed?: number; total?: number; succeeded?: number }\n const failed = typeof body.failed === 'number' ? body.failed : 0\n if (failed > 0) {\n const total = body.total ?? '?'\n const succeeded = body.succeeded ?? 0\n throw new Error(\n `Arweave batch upload failed: ${failed} of ${total} item(s) failed (${succeeded} succeeded)`\n )\n }\n }\n\n _uploadViaBundler()\n .then(() => sendBack({ type: 'uploadComplete', result: 'done' }))\n .catch((error) => sendBack({ type: 'uploadError', error }))\n }\n)\n","import { optimismSepolia } from 'thirdweb/chains'\nimport {\n deploySmartWalletContract,\n getClient,\n getConnectedManagedAccountAddress,\n getManagedAccountWallet,\n isSmartWalletDeployed,\n} from './thirdweb'\nimport { getPublishConfig } from '../config'\nimport { isManagedAccountPublishError, ManagedAccountPublishError } from '../errors'\nimport { ensureExecutorModuleInstalled } from './ensureExecutorModule'\n\nconst MSG_UNAVAILABLE =\n 'Could not connect the managed publishing account on Optimism Sepolia. Reconnect with the same sign-in method and try again.'\n\nconst MSG_NOT_DEPLOYED =\n 'Your publishing smart account is not deployed on Optimism Sepolia yet. Complete wallet setup, enable autoDeployManagedAccount in config if appropriate, then try again.'\n\nconst MSG_NOT_DEPLOYED_AFTER_ATTEMPT =\n 'The managed account could not be confirmed on Optimism Sepolia after deployment. Wait a moment and retry, or check your network connection.'\n\nconst MSG_FAILED_DEPLOY =\n 'Automatic deployment of the managed publishing account failed on Optimism Sepolia. Retry or deploy the account through your wallet provider.'\n\nexport type EnsureManagedAccountReadyResult =\n | { kind: 'skip' }\n | { kind: 'unavailable'; cause: unknown }\n | { kind: 'not_deployed'; managedAddress: string }\n | { kind: 'ready'; managedAddress: string }\n\n/**\n * Checks managed account deployment for the modular executor path.\n * Returns `{ kind: 'skip' }` when `useModularExecutor` is false.\n */\nexport async function ensureManagedAccountReady(): Promise<EnsureManagedAccountReadyResult> {\n const { useModularExecutor } = getPublishConfig()\n if (!useModularExecutor) {\n return { kind: 'skip' }\n }\n\n let managedAddress: string\n try {\n managedAddress = await getConnectedManagedAccountAddress(optimismSepolia)\n } catch (cause) {\n return { kind: 'unavailable', cause }\n }\n\n const deployed = await isSmartWalletDeployed(managedAddress)\n if (deployed) {\n return { kind: 'ready', managedAddress }\n }\n return { kind: 'not_deployed', managedAddress }\n}\n\nasync function getManagedAccountSigningAccount() {\n const managedWallet = getManagedAccountWallet()\n await managedWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const acc = managedWallet.getAccount()\n if (!acc) {\n throw new ManagedAccountPublishError(MSG_UNAVAILABLE, 'MANAGED_ACCOUNT_UNAVAILABLE')\n }\n return acc\n}\n\n/**\n * Deploys the ManagedAccount via the factory using the managed in-app wallet signer.\n * @throws ManagedAccountPublishError on missing account or deploy failure\n */\nexport async function tryDeployManagedAccount(): Promise<void> {\n const account = await getManagedAccountSigningAccount()\n try {\n await deploySmartWalletContract(account)\n } catch (cause) {\n throw new ManagedAccountPublishError(MSG_FAILED_DEPLOY, 'MANAGED_ACCOUNT_NOT_DEPLOYED', account.address, cause)\n }\n}\n\nexport type ModularExecutorPublishPrepResult =\n | { ok: true; managedAddress: string }\n | { ok: false; error: ManagedAccountPublishError }\n\n/**\n * Full gate for modular executor publish: managed-account deployment check, optional factory deploy,\n * optional executor module on the managed contract. EIP-7702 modular wallet readiness is handled separately\n * in {@link ensureEip7702ModularAccountReady}.\n * Call only when `useModularExecutor` is true.\n */\nexport async function runModularExecutorPublishPrep(): Promise<ModularExecutorPublishPrepResult> {\n const config = getPublishConfig()\n if (!config.useModularExecutor) {\n throw new Error('runModularExecutorPublishPrep: useModularExecutor is false')\n }\n\n let state = await ensureManagedAccountReady()\n\n if (state.kind === 'unavailable') {\n return {\n ok: false,\n error: new ManagedAccountPublishError(MSG_UNAVAILABLE, 'MANAGED_ACCOUNT_UNAVAILABLE', undefined, state.cause),\n }\n }\n\n if (state.kind === 'not_deployed') {\n if (config.autoDeployManagedAccount) {\n try {\n await tryDeployManagedAccount()\n } catch (e) {\n const err =\n isManagedAccountPublishError(e)\n ? e\n : new ManagedAccountPublishError(MSG_FAILED_DEPLOY, 'MANAGED_ACCOUNT_NOT_DEPLOYED', state.managedAddress, e)\n return { ok: false, error: err }\n }\n state = await ensureManagedAccountReady()\n if (state.kind !== 'ready') {\n return {\n ok: false,\n error: new ManagedAccountPublishError(\n MSG_NOT_DEPLOYED_AFTER_ATTEMPT,\n 'MANAGED_ACCOUNT_NOT_DEPLOYED',\n state.kind === 'not_deployed' ? state.managedAddress : undefined,\n ),\n }\n }\n } else {\n return {\n ok: false,\n error: new ManagedAccountPublishError(MSG_NOT_DEPLOYED, 'MANAGED_ACCOUNT_NOT_DEPLOYED', state.managedAddress),\n }\n }\n }\n\n if (state.kind === 'ready') {\n if (config.modularAccountModuleContract) {\n try {\n const signingAccount = await getManagedAccountSigningAccount()\n await ensureExecutorModuleInstalled(state.managedAddress, signingAccount, config)\n } catch (e) {\n if (isManagedAccountPublishError(e)) {\n return { ok: false, error: e }\n }\n return {\n ok: false,\n error: new ManagedAccountPublishError(\n 'Executor module setup failed on Optimism Sepolia.',\n 'EXECUTOR_MODULE_NOT_INSTALLED',\n state.managedAddress,\n e,\n ),\n }\n }\n }\n\n return { ok: true, managedAddress: state.managedAddress }\n }\n\n throw new Error('runModularExecutorPublishPrep: unexpected readiness state')\n}\n","import {\n prepareEvent,\n prepareContractCall,\n readContract,\n type BaseTransactionOptions,\n type AbiParameterToPrimitiveType,\n} from \"thirdweb\";\n\n/**\n* Contract events\n*/\n\n/**\n * Represents the filters for the \"AdminUpdated\" event.\n */\nexport type AdminUpdatedEventFilters = Partial<{\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the AdminUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { adminUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * adminUpdatedEvent({\n * signer: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function adminUpdatedEvent(filters: AdminUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event AdminUpdated(address indexed signer, bool isAdmin)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Initialized event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { initializedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * initializedEvent()\n * ],\n * });\n * ```\n */ \nexport function initializedEvent() {\n return prepareEvent({\n signature: \"event Initialized(uint8 version)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"SignerPermissionsUpdated\" event.\n */\nexport type SignerPermissionsUpdatedEventFilters = Partial<{\n authorizingSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"authorizingSigner\",\"indexed\":true}>\ntargetSigner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"targetSigner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the SignerPermissionsUpdated event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { signerPermissionsUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * signerPermissionsUpdatedEvent({\n * authorizingSigner: ...,\n * targetSigner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function signerPermissionsUpdatedEvent(filters: SignerPermissionsUpdatedEventFilters = {}) {\n return prepareEvent({\n signature: \"event SignerPermissionsUpdated(address indexed authorizingSigner, address indexed targetSigner, (address signer, uint8 isAdmin, address[] approvedTargets, uint256 nativeTokenLimitPerTransaction, uint128 permissionStartTimestamp, uint128 permissionEndTimestamp, uint128 reqValidityStartTimestamp, uint128 reqValidityEndTimestamp, bytes32 uid) permissions)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the ContractURIUpdated event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { contractURIUpdatedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * contractURIUpdatedEvent()\n * ],\n * });\n * ```\n */ \nexport function contractURIUpdatedEvent() {\n return prepareEvent({\n signature: \"event ContractURIUpdated(string prevURI, string newURI)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the CreatedAttestation event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { createdAttestationEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * createdAttestationEvent()\n * ],\n * });\n * ```\n */ \nexport function createdAttestationEvent() {\n return prepareEvent({\n signature: \"event CreatedAttestation((bytes32 schemaUid, bytes32 attestationUid) result)\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the EIP712DomainChanged event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { eIP712DomainChangedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * eIP712DomainChangedEvent()\n * ],\n * });\n * ```\n */ \nexport function eIP712DomainChangedEvent() {\n return prepareEvent({\n signature: \"event EIP712DomainChanged()\",\n });\n};\n \n\n\n\n/**\n * Creates an event object for the Log event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { logEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * logEvent()\n * ],\n * });\n * ```\n */ \nexport function logEvent() {\n return prepareEvent({\n signature: \"event Log(string message)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"OwnershipTransferred\" event.\n */\nexport type OwnershipTransferredEventFilters = Partial<{\n previousOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"previousOwner\",\"indexed\":true}>\nnewOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\",\"indexed\":true}>\n}>;\n\n/**\n * Creates an event object for the OwnershipTransferred event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { ownershipTransferredEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * ownershipTransferredEvent({\n * previousOwner: ...,\n * newOwner: ...,\n * })\n * ],\n * });\n * ```\n */ \nexport function ownershipTransferredEvent(filters: OwnershipTransferredEventFilters = {}) {\n return prepareEvent({\n signature: \"event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the SeedPublished event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { seedPublishedEvent } from \"TODO\";\n * \n * const events = await getContractEvents({\n * contract,\n * events: [\n * seedPublishedEvent()\n * ],\n * });\n * ```\n */ \nexport function seedPublishedEvent() {\n return prepareEvent({\n signature: \"event SeedPublished(bytes returnedDataFromEAS)\",\n });\n};\n \n\n/**\n* Contract read functions\n*/\n\n\n\n/**\n * Calls the \"entryPoint\" function on the contract.\n * @param options - The options for the entryPoint function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { entryPoint } from \"TODO\";\n * \n * const result = await entryPoint();\n * \n * ```\n */\nexport async function entryPoint(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xb0d691fe\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"factory\" function on the contract.\n * @param options - The options for the factory function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { factory } from \"TODO\";\n * \n * const result = await factory();\n * \n * ```\n */\nexport async function factory(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xc45a0155\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllActiveSigners\" function on the contract.\n * @param options - The options for the getAllActiveSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllActiveSigners } from \"TODO\";\n * \n * const result = await getAllActiveSigners();\n * \n * ```\n */\nexport async function getAllActiveSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8b52d723\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllAdmins\" function on the contract.\n * @param options - The options for the getAllAdmins function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllAdmins } from \"TODO\";\n * \n * const result = await getAllAdmins();\n * \n * ```\n */\nexport async function getAllAdmins(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe9523c97\",\n [],\n [\n {\n \"type\": \"address[]\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllExtensions\" function on the contract.\n * @param options - The options for the getAllExtensions function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllExtensions } from \"TODO\";\n * \n * const result = await getAllExtensions();\n * \n * ```\n */\nexport async function getAllExtensions(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x4a00cc48\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"components\": [\n {\n \"type\": \"tuple\",\n \"name\": \"metadata\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"metadataURI\"\n },\n {\n \"type\": \"address\",\n \"name\": \"implementation\"\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"functions\",\n \"components\": [\n {\n \"type\": \"bytes4\",\n \"name\": \"functionSelector\"\n },\n {\n \"type\": \"string\",\n \"name\": \"functionSignature\"\n }\n ]\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getAllSigners\" function on the contract.\n * @param options - The options for the getAllSigners function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getAllSigners } from \"TODO\";\n * \n * const result = await getAllSigners();\n * \n * ```\n */\nexport async function getAllSigners(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd42f2f35\",\n [],\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"signers\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getImplementationForFunction\" function.\n */\nexport type GetImplementationForFunctionParams = {\n functionSelector: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"_functionSelector\"}>\n};\n\n/**\n * Calls the \"getImplementationForFunction\" function on the contract.\n * @param options - The options for the getImplementationForFunction function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getImplementationForFunction } from \"TODO\";\n * \n * const result = await getImplementationForFunction({\n * functionSelector: ...,\n * });\n * \n * ```\n */\nexport async function getImplementationForFunction(\n options: BaseTransactionOptions<GetImplementationForFunctionParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xce0b6013\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"_functionSelector\"\n }\n ],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: [options.functionSelector]\n });\n};\n\n\n\n\n/**\n * Calls the \"getNonce\" function on the contract.\n * @param options - The options for the getNonce function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getNonce } from \"TODO\";\n * \n * const result = await getNonce();\n * \n * ```\n */\nexport async function getNonce(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd087d288\",\n [],\n [\n {\n \"type\": \"uint256\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getPermissionsForSigner\" function.\n */\nexport type GetPermissionsForSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"getPermissionsForSigner\" function on the contract.\n * @param options - The options for the getPermissionsForSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getPermissionsForSigner } from \"TODO\";\n * \n * const result = await getPermissionsForSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function getPermissionsForSigner(\n options: BaseTransactionOptions<GetPermissionsForSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xf15d424e\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"tuple\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"startTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"endTimestamp\"\n }\n ]\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isActiveSigner\" function.\n */\nexport type IsActiveSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"signer\"}>\n};\n\n/**\n * Calls the \"isActiveSigner\" function on the contract.\n * @param options - The options for the isActiveSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isActiveSigner } from \"TODO\";\n * \n * const result = await isActiveSigner({\n * signer: ...,\n * });\n * \n * ```\n */\nexport async function isActiveSigner(\n options: BaseTransactionOptions<IsActiveSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x7dff5a79\",\n [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.signer]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isAdmin\" function.\n */\nexport type IsAdminParams = {\n account: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_account\"}>\n};\n\n/**\n * Calls the \"isAdmin\" function on the contract.\n * @param options - The options for the isAdmin function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isAdmin } from \"TODO\";\n * \n * const result = await isAdmin({\n * account: ...,\n * });\n * \n * ```\n */\nexport async function isAdmin(\n options: BaseTransactionOptions<IsAdminParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x24d7806c\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_account\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isValidSigner\" function.\n */\nexport type IsValidSignerParams = {\n signer: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_signer\"}>\nuserOp: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_userOp\",\"components\":[{\"type\":\"address\",\"name\":\"sender\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"bytes\",\"name\":\"initCode\"},{\"type\":\"bytes\",\"name\":\"callData\"},{\"type\":\"uint256\",\"name\":\"callGasLimit\"},{\"type\":\"uint256\",\"name\":\"verificationGasLimit\"},{\"type\":\"uint256\",\"name\":\"preVerificationGas\"},{\"type\":\"uint256\",\"name\":\"maxFeePerGas\"},{\"type\":\"uint256\",\"name\":\"maxPriorityFeePerGas\"},{\"type\":\"bytes\",\"name\":\"paymasterAndData\"},{\"type\":\"bytes\",\"name\":\"signature\"}]}>\n};\n\n/**\n * Calls the \"isValidSigner\" function on the contract.\n * @param options - The options for the isValidSigner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isValidSigner } from \"TODO\";\n * \n * const result = await isValidSigner({\n * signer: ...,\n * userOp: ...,\n * });\n * \n * ```\n */\nexport async function isValidSigner(\n options: BaseTransactionOptions<IsValidSignerParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x1dd756c5\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_signer\"\n },\n {\n \"type\": \"tuple\",\n \"name\": \"_userOp\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"sender\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nonce\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"initCode\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"callData\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"callGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"verificationGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"preVerificationGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxFeePerGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxPriorityFeePerGas\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"paymasterAndData\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.signer, options.userOp]\n });\n};\n\n\n/**\n * Represents the parameters for the \"verifySignerPermissionRequest\" function.\n */\nexport type VerifySignerPermissionRequestParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"signature\"}>\n};\n\n/**\n * Calls the \"verifySignerPermissionRequest\" function on the contract.\n * @param options - The options for the verifySignerPermissionRequest function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { verifySignerPermissionRequest } from \"TODO\";\n * \n * const result = await verifySignerPermissionRequest({\n * req: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function verifySignerPermissionRequest(\n options: BaseTransactionOptions<VerifySignerPermissionRequestParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xa9082d84\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ],\n [\n {\n \"type\": \"bool\",\n \"name\": \"success\"\n },\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n }\n ]\n],\n params: [options.req, options.signature]\n });\n};\n\n\n\n\n/**\n * Calls the \"contractURI\" function on the contract.\n * @param options - The options for the contractURI function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { contractURI } from \"TODO\";\n * \n * const result = await contractURI();\n * \n * ```\n */\nexport async function contractURI(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xe8a3d485\",\n [],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"getMessageHash\" function.\n */\nexport type GetMessageHashParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\n};\n\n/**\n * Calls the \"getMessageHash\" function on the contract.\n * @param options - The options for the getMessageHash function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getMessageHash } from \"TODO\";\n * \n * const result = await getMessageHash({\n * hash: ...,\n * });\n * \n * ```\n */\nexport async function getMessageHash(\n options: BaseTransactionOptions<GetMessageHashParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x399b77da\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.hash]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isValidSignature\" function.\n */\nexport type IsValidSignatureParams = {\n hash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"_hash\"}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"isValidSignature\" function on the contract.\n * @param options - The options for the isValidSignature function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isValidSignature } from \"TODO\";\n * \n * const result = await isValidSignature({\n * hash: ...,\n * signature: ...,\n * });\n * \n * ```\n */\nexport async function isValidSignature(\n options: BaseTransactionOptions<IsValidSignatureParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x1626ba7e\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"_hash\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"magicValue\"\n }\n ]\n],\n params: [options.hash, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"supportsInterface\" function.\n */\nexport type SupportsInterfaceParams = {\n interfaceId: AbiParameterToPrimitiveType<{\"type\":\"bytes4\",\"name\":\"interfaceId\"}>\n};\n\n/**\n * Calls the \"supportsInterface\" function on the contract.\n * @param options - The options for the supportsInterface function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { supportsInterface } from \"TODO\";\n * \n * const result = await supportsInterface({\n * interfaceId: ...,\n * });\n * \n * ```\n */\nexport async function supportsInterface(\n options: BaseTransactionOptions<SupportsInterfaceParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x01ffc9a7\",\n [\n {\n \"type\": \"bytes4\",\n \"name\": \"interfaceId\"\n }\n ],\n [\n {\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.interfaceId]\n });\n};\n\n\n\n\n/**\n * Calls the \"eip712Domain\" function on the contract.\n * @param options - The options for the eip712Domain function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { eip712Domain } from \"TODO\";\n * \n * const result = await eip712Domain();\n * \n * ```\n */\nexport async function eip712Domain(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x84b0196e\",\n [],\n [\n {\n \"type\": \"bytes1\",\n \"name\": \"fields\"\n },\n {\n \"type\": \"string\",\n \"name\": \"name\"\n },\n {\n \"type\": \"string\",\n \"name\": \"version\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"chainId\"\n },\n {\n \"type\": \"address\",\n \"name\": \"verifyingContract\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"salt\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"extensions\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"getEas\" function on the contract.\n * @param options - The options for the getEas function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getEas } from \"TODO\";\n * \n * const result = await getEas();\n * \n * ```\n */\nexport async function getEas(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd5f5127d\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n\n\n/**\n * Calls the \"owner\" function on the contract.\n * @param options - The options for the owner function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { owner } from \"TODO\";\n * \n * const result = await owner();\n * \n * ```\n */\nexport async function owner(\n options: BaseTransactionOptions\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x8da5cb5b\",\n [],\n [\n {\n \"type\": \"address\"\n }\n ]\n],\n params: []\n });\n};\n\n\n/**\n* Contract write functions\n*/\n\n/**\n * Represents the parameters for the \"initialize\" function.\n */\nexport type InitializeParams = {\n defaultAdmin: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_defaultAdmin\"}>\ndata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_data\"}>\n};\n\n/**\n * Calls the \"initialize\" function on the contract.\n * @param options - The options for the \"initialize\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { initialize } from \"TODO\";\n * \n * const transaction = initialize({\n * defaultAdmin: ...,\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function initialize(\n options: BaseTransactionOptions<InitializeParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd1f57894\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_defaultAdmin\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_data\"\n }\n ],\n []\n],\n params: [options.defaultAdmin, options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multicall\" function.\n */\nexport type MulticallParams = {\n data: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"data\"}>\n};\n\n/**\n * Calls the \"multicall\" function on the contract.\n * @param options - The options for the \"multicall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multicall } from \"TODO\";\n * \n * const transaction = multicall({\n * data: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multicall(\n options: BaseTransactionOptions<MulticallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xac9650d8\",\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"data\"\n }\n ],\n [\n {\n \"type\": \"bytes[]\",\n \"name\": \"results\"\n }\n ]\n],\n params: [options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setEntrypointOverride\" function.\n */\nexport type SetEntrypointOverrideParams = {\n entrypointOverride: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_entrypointOverride\"}>\n};\n\n/**\n * Calls the \"setEntrypointOverride\" function on the contract.\n * @param options - The options for the \"setEntrypointOverride\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setEntrypointOverride } from \"TODO\";\n * \n * const transaction = setEntrypointOverride({\n * entrypointOverride: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setEntrypointOverride(\n options: BaseTransactionOptions<SetEntrypointOverrideParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb76464d5\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_entrypointOverride\"\n }\n ],\n []\n],\n params: [options.entrypointOverride]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setPermissionsForSigner\" function.\n */\nexport type SetPermissionsForSignerParams = {\n req: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"_req\",\"components\":[{\"type\":\"address\",\"name\":\"signer\"},{\"type\":\"uint8\",\"name\":\"isAdmin\"},{\"type\":\"address[]\",\"name\":\"approvedTargets\"},{\"type\":\"uint256\",\"name\":\"nativeTokenLimitPerTransaction\"},{\"type\":\"uint128\",\"name\":\"permissionStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"permissionEndTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityStartTimestamp\"},{\"type\":\"uint128\",\"name\":\"reqValidityEndTimestamp\"},{\"type\":\"bytes32\",\"name\":\"uid\"}]}>\nsignature: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_signature\"}>\n};\n\n/**\n * Calls the \"setPermissionsForSigner\" function on the contract.\n * @param options - The options for the \"setPermissionsForSigner\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setPermissionsForSigner } from \"TODO\";\n * \n * const transaction = setPermissionsForSigner({\n * req: ...,\n * signature: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setPermissionsForSigner(\n options: BaseTransactionOptions<SetPermissionsForSignerParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x5892e236\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"_req\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"signer\"\n },\n {\n \"type\": \"uint8\",\n \"name\": \"isAdmin\"\n },\n {\n \"type\": \"address[]\",\n \"name\": \"approvedTargets\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nativeTokenLimitPerTransaction\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"permissionEndTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityStartTimestamp\"\n },\n {\n \"type\": \"uint128\",\n \"name\": \"reqValidityEndTimestamp\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"uid\"\n }\n ]\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_signature\"\n }\n ],\n []\n],\n params: [options.req, options.signature]\n });\n};\n\n\n/**\n * Represents the parameters for the \"validateUserOp\" function.\n */\nexport type ValidateUserOpParams = {\n userOp: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"userOp\",\"components\":[{\"type\":\"address\",\"name\":\"sender\"},{\"type\":\"uint256\",\"name\":\"nonce\"},{\"type\":\"bytes\",\"name\":\"initCode\"},{\"type\":\"bytes\",\"name\":\"callData\"},{\"type\":\"uint256\",\"name\":\"callGasLimit\"},{\"type\":\"uint256\",\"name\":\"verificationGasLimit\"},{\"type\":\"uint256\",\"name\":\"preVerificationGas\"},{\"type\":\"uint256\",\"name\":\"maxFeePerGas\"},{\"type\":\"uint256\",\"name\":\"maxPriorityFeePerGas\"},{\"type\":\"bytes\",\"name\":\"paymasterAndData\"},{\"type\":\"bytes\",\"name\":\"signature\"}]}>\nuserOpHash: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"userOpHash\"}>\nmissingAccountFunds: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"missingAccountFunds\"}>\n};\n\n/**\n * Calls the \"validateUserOp\" function on the contract.\n * @param options - The options for the \"validateUserOp\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { validateUserOp } from \"TODO\";\n * \n * const transaction = validateUserOp({\n * userOp: ...,\n * userOpHash: ...,\n * missingAccountFunds: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function validateUserOp(\n options: BaseTransactionOptions<ValidateUserOpParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x3a871cdd\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"userOp\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"sender\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"nonce\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"initCode\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"callData\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"callGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"verificationGasLimit\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"preVerificationGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxFeePerGas\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"maxPriorityFeePerGas\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"paymasterAndData\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"signature\"\n }\n ]\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"userOpHash\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"missingAccountFunds\"\n }\n ],\n [\n {\n \"type\": \"uint256\",\n \"name\": \"validationData\"\n }\n ]\n],\n params: [options.userOp, options.userOpHash, options.missingAccountFunds]\n });\n};\n\n\n\n\n/**\n * Calls the \"addDeposit\" function on the contract.\n * @param options - The options for the \"addDeposit\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { addDeposit } from \"TODO\";\n * \n * const transaction = addDeposit();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function addDeposit(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4a58db19\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"execute\" function.\n */\nexport type ExecuteParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"execute\" function on the contract.\n * @param options - The options for the \"execute\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { execute } from \"TODO\";\n * \n * const transaction = execute({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function execute(\n options: BaseTransactionOptions<ExecuteParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb61d27f6\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"executeBatch\" function.\n */\nexport type ExecuteBatchParams = {\n target: AbiParameterToPrimitiveType<{\"type\":\"address[]\",\"name\":\"_target\"}>\nvalue: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\",\"name\":\"_value\"}>\ncalldata: AbiParameterToPrimitiveType<{\"type\":\"bytes[]\",\"name\":\"_calldata\"}>\n};\n\n/**\n * Calls the \"executeBatch\" function on the contract.\n * @param options - The options for the \"executeBatch\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { executeBatch } from \"TODO\";\n * \n * const transaction = executeBatch({\n * target: ...,\n * value: ...,\n * calldata: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function executeBatch(\n options: BaseTransactionOptions<ExecuteBatchParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x47e1da2a\",\n [\n {\n \"type\": \"address[]\",\n \"name\": \"_target\"\n },\n {\n \"type\": \"uint256[]\",\n \"name\": \"_value\"\n },\n {\n \"type\": \"bytes[]\",\n \"name\": \"_calldata\"\n }\n ],\n []\n],\n params: [options.target, options.value, options.calldata]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155BatchReceived\" function.\n */\nexport type OnERC1155BatchReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256[]\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155BatchReceived\" function on the contract.\n * @param options - The options for the \"onERC1155BatchReceived\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155BatchReceived } from \"TODO\";\n * \n * const transaction = onERC1155BatchReceived({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155BatchReceived(\n options: BaseTransactionOptions<OnERC1155BatchReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xbc197c81\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"uint256[]\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC1155Received\" function.\n */\nexport type OnERC1155ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_4: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC1155Received\" function on the contract.\n * @param options - The options for the \"onERC1155Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC1155Received } from \"TODO\";\n * \n * const transaction = onERC1155Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * arg_4: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC1155Received(\n options: BaseTransactionOptions<OnERC1155ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf23a6e61\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3, options.arg_4]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onERC721Received\" function.\n */\nexport type OnERC721ReceivedParams = {\n arg_0: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_1: AbiParameterToPrimitiveType<{\"type\":\"address\"}>\narg_2: AbiParameterToPrimitiveType<{\"type\":\"uint256\"}>\narg_3: AbiParameterToPrimitiveType<{\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onERC721Received\" function on the contract.\n * @param options - The options for the \"onERC721Received\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onERC721Received } from \"TODO\";\n * \n * const transaction = onERC721Received({\n * arg_0: ...,\n * arg_1: ...,\n * arg_2: ...,\n * arg_3: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function onERC721Received(\n options: BaseTransactionOptions<OnERC721ReceivedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x150b7a02\",\n [\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"address\"\n },\n {\n \"type\": \"uint256\"\n },\n {\n \"type\": \"bytes\"\n }\n ],\n [\n {\n \"type\": \"bytes4\"\n }\n ]\n],\n params: [options.arg_0, options.arg_1, options.arg_2, options.arg_3]\n });\n};\n\n\n/**\n * Represents the parameters for the \"setContractURI\" function.\n */\nexport type SetContractURIParams = {\n uri: AbiParameterToPrimitiveType<{\"type\":\"string\",\"name\":\"_uri\"}>\n};\n\n/**\n * Calls the \"setContractURI\" function on the contract.\n * @param options - The options for the \"setContractURI\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setContractURI } from \"TODO\";\n * \n * const transaction = setContractURI({\n * uri: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setContractURI(\n options: BaseTransactionOptions<SetContractURIParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x938e3d7b\",\n [\n {\n \"type\": \"string\",\n \"name\": \"_uri\"\n }\n ],\n []\n],\n params: [options.uri]\n });\n};\n\n\n/**\n * Represents the parameters for the \"withdrawDepositTo\" function.\n */\nexport type WithdrawDepositToParams = {\n withdrawAddress: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"withdrawAddress\"}>\namount: AbiParameterToPrimitiveType<{\"type\":\"uint256\",\"name\":\"amount\"}>\n};\n\n/**\n * Calls the \"withdrawDepositTo\" function on the contract.\n * @param options - The options for the \"withdrawDepositTo\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { withdrawDepositTo } from \"TODO\";\n * \n * const transaction = withdrawDepositTo({\n * withdrawAddress: ...,\n * amount: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function withdrawDepositTo(\n options: BaseTransactionOptions<WithdrawDepositToParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x4d44560d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"withdrawAddress\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"amount\"\n }\n ],\n []\n],\n params: [options.withdrawAddress, options.amount]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createSeed\" function.\n */\nexport type CreateSeedParams = {\n schemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"schemaUid\"}>\nrevocable: AbiParameterToPrimitiveType<{\"type\":\"bool\",\"name\":\"revocable\"}>\n};\n\n/**\n * Calls the \"createSeed\" function on the contract.\n * @param options - The options for the \"createSeed\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createSeed } from \"TODO\";\n * \n * const transaction = createSeed({\n * schemaUid: ...,\n * revocable: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createSeed(\n options: BaseTransactionOptions<CreateSeedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6240d6d9\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"schemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.schemaUid, options.revocable]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createVersion\" function.\n */\nexport type CreateVersionParams = {\n seedUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"seedUid\"}>\nversionSchemaUid: AbiParameterToPrimitiveType<{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"}>\n};\n\n/**\n * Calls the \"createVersion\" function on the contract.\n * @param options - The options for the \"createVersion\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createVersion } from \"TODO\";\n * \n * const transaction = createVersion({\n * seedUid: ...,\n * versionSchemaUid: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function createVersion(\n options: BaseTransactionOptions<CreateVersionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x13e0c263\",\n [\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.seedUid, options.versionSchemaUid]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multiPublish\" function.\n */\nexport type MultiPublishParams = {\n requests: AbiParameterToPrimitiveType<{\"type\":\"tuple[]\",\"name\":\"requests\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"multiPublish\" function on the contract.\n * @param options - The options for the \"multiPublish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multiPublish } from \"TODO\";\n * \n * const transaction = multiPublish({\n * requests: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function multiPublish(\n options: BaseTransactionOptions<MultiPublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x31e19cb8\",\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"requests\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32[]\"\n }\n ]\n],\n params: [options.requests],\n });\n};\n\n/**\n * multiPublish variant that uses uint256 localIdIndex and publishLocalIdIndex instead of strings.\n * Use when the contract expects integer-based IDs (gas-efficient).\n * Selector: keccak256(\"multiPublish((uint256,bytes32,...)[])[]\") -> 0xd688e801\n */\nexport type MultiPublishWithIntegerIdsParams = {\n requests: Array<{\n localIdIndex: bigint\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 publishLocalIdIndex: bigint\n propertySchemaUid: `0x${string}`\n }>\n }>\n}\n\nexport function multiPublishWithIntegerIds(\n options: BaseTransactionOptions<MultiPublishWithIntegerIdsParams>,\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xd688e801\",\n [\n {\n \"type\": \"tuple[]\",\n \"name\": \"requests\",\n \"components\": [\n { \"type\": \"uint256\", \"name\": \"localIdIndex\" },\n { \"type\": \"bytes32\", \"name\": \"seedUid\" },\n { \"type\": \"bytes32\", \"name\": \"seedSchemaUid\" },\n { \"type\": \"bytes32\", \"name\": \"versionUid\" },\n { \"type\": \"bytes32\", \"name\": \"versionSchemaUid\" },\n { \"type\": \"bool\", \"name\": \"seedIsRevocable\" },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n { \"type\": \"bytes32\", \"name\": \"schema\" },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n { \"type\": \"address\", \"name\": \"recipient\" },\n { \"type\": \"uint64\", \"name\": \"expirationTime\" },\n { \"type\": \"bool\", \"name\": \"revocable\" },\n { \"type\": \"bytes32\", \"name\": \"refUID\" },\n { \"type\": \"bytes\", \"name\": \"data\" },\n { \"type\": \"uint256\", \"name\": \"value\" },\n ],\n },\n ],\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n { \"type\": \"uint256\", \"name\": \"publishLocalIdIndex\" },\n { \"type\": \"bytes32\", \"name\": \"propertySchemaUid\" },\n ],\n },\n ],\n },\n ],\n [{ \"type\": \"bytes32[]\" }],\n ],\n params: [options.requests],\n });\n}\n\n/**\n * Represents the parameters for the \"publish\" function.\n */\nexport type PublishParams = {\n request: AbiParameterToPrimitiveType<{\"type\":\"tuple\",\"name\":\"request\",\"components\":[{\"type\":\"string\",\"name\":\"localId\"},{\"type\":\"bytes32\",\"name\":\"seedUid\"},{\"type\":\"bytes32\",\"name\":\"seedSchemaUid\"},{\"type\":\"bytes32\",\"name\":\"versionUid\"},{\"type\":\"bytes32\",\"name\":\"versionSchemaUid\"},{\"type\":\"bool\",\"name\":\"seedIsRevocable\"},{\"type\":\"tuple[]\",\"name\":\"listOfAttestations\",\"components\":[{\"type\":\"bytes32\",\"name\":\"schema\"},{\"type\":\"tuple[]\",\"name\":\"data\",\"components\":[{\"type\":\"address\",\"name\":\"recipient\"},{\"type\":\"uint64\",\"name\":\"expirationTime\"},{\"type\":\"bool\",\"name\":\"revocable\"},{\"type\":\"bytes32\",\"name\":\"refUID\"},{\"type\":\"bytes\",\"name\":\"data\"},{\"type\":\"uint256\",\"name\":\"value\"}]}]},{\"type\":\"tuple[]\",\"name\":\"propertiesToUpdate\",\"components\":[{\"type\":\"string\",\"name\":\"publishLocalId\"},{\"type\":\"bytes32\",\"name\":\"propertySchemaUid\"}]}]}>\n};\n\n/**\n * Calls the \"publish\" function on the contract.\n * @param options - The options for the \"publish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { publish } from \"TODO\";\n * \n * const transaction = publish({\n * request: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function publish(\n options: BaseTransactionOptions<PublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb71308c5\",\n [\n {\n \"type\": \"tuple\",\n \"name\": \"request\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"localId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"seedSchemaUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionUid\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"versionSchemaUid\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"seedIsRevocable\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"listOfAttestations\",\n \"components\": [\n {\n \"type\": \"bytes32\",\n \"name\": \"schema\"\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"data\",\n \"components\": [\n {\n \"type\": \"address\",\n \"name\": \"recipient\"\n },\n {\n \"type\": \"uint64\",\n \"name\": \"expirationTime\"\n },\n {\n \"type\": \"bool\",\n \"name\": \"revocable\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"refUID\"\n },\n {\n \"type\": \"bytes\",\n \"name\": \"data\"\n },\n {\n \"type\": \"uint256\",\n \"name\": \"value\"\n }\n ]\n }\n ]\n },\n {\n \"type\": \"tuple[]\",\n \"name\": \"propertiesToUpdate\",\n \"components\": [\n {\n \"type\": \"string\",\n \"name\": \"publishLocalId\"\n },\n {\n \"type\": \"bytes32\",\n \"name\": \"propertySchemaUid\"\n }\n ]\n }\n ]\n }\n ],\n [\n {\n \"type\": \"bytes32\"\n },\n {\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.request]\n });\n};\n\n\n\n\n/**\n * Calls the \"renounceOwnership\" function on the contract.\n * @param options - The options for the \"renounceOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { renounceOwnership } from \"TODO\";\n * \n * const transaction = renounceOwnership();\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function renounceOwnership(\n options: BaseTransactionOptions\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x715018a6\",\n [],\n []\n],\n params: []\n });\n};\n\n\n/**\n * Represents the parameters for the \"setEas\" function.\n */\nexport type SetEasParams = {\n eas: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"_eas\"}>\n};\n\n/**\n * Calls the \"setEas\" function on the contract.\n * @param options - The options for the \"setEas\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { setEas } from \"TODO\";\n * \n * const transaction = setEas({\n * eas: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function setEas(\n options: BaseTransactionOptions<SetEasParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xb90b6e0d\",\n [\n {\n \"type\": \"address\",\n \"name\": \"_eas\"\n }\n ],\n [\n {\n \"type\": \"string\"\n }\n ]\n],\n params: [options.eas]\n });\n};\n\n\n/**\n * Represents the parameters for the \"transferOwnership\" function.\n */\nexport type TransferOwnershipParams = {\n newOwner: AbiParameterToPrimitiveType<{\"type\":\"address\",\"name\":\"newOwner\"}>\n};\n\n/**\n * Calls the \"transferOwnership\" function on the contract.\n * @param options - The options for the \"transferOwnership\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { transferOwnership } from \"TODO\";\n * \n * const transaction = transferOwnership({\n * newOwner: ...,\n * });\n * \n * // Send the transaction\n * ...\n * \n * ```\n */\nexport function transferOwnership(\n options: BaseTransactionOptions<TransferOwnershipParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0xf2fde38b\",\n [\n {\n \"type\": \"address\",\n \"name\": \"newOwner\"\n }\n ],\n []\n],\n params: [options.newOwner]\n });\n};\n\n\n","import debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:actors:persistSeedUid')\n\nconst ZERO_BYTES32 = '0x' + '0'.repeat(64)\n\n/** Timeout for persistSeedUid. Attestations are already on-chain; DB write is best-effort. */\nconst PERSIST_SEED_UID_TIMEOUT_MS = 15_000\n\nexport type RequestWithSeedUid = { seedUid?: string; localId?: string }\n\n/**\n * Assigns the published item's seedUid from the matching request (by item.seedLocalId).\n * Multi-publish payloads are ordered so the first request is not always the root item (e.g. Image before Post).\n */\nexport function persistSeedUidFromPublishResult(\n item: { seedUid?: string; seedLocalId?: string },\n normalizedRequests: RequestWithSeedUid[],\n): void {\n const seedLocalId = item.seedLocalId\n const match = seedLocalId\n ? normalizedRequests.find((r) => r?.localId === seedLocalId)\n : undefined\n const uid =\n match?.seedUid && match.seedUid !== ZERO_BYTES32\n ? match.seedUid\n : normalizedRequests[0]?.seedUid\n if (uid && uid !== ZERO_BYTES32) {\n item.seedUid = uid\n }\n}\n\n/**\n * Wraps item.persistSeedUid with timeout and error handling. Attestations are already\n * on-chain; if this fails or times out, we log and continue. Prevents the publish\n * flow from hanging when DB write is slow or fails.\n */\nexport async function persistSeedUidSafely(\n item: {\n persistSeedUid?: (publisher?: string, attestationCreatedAtMs?: number) => Promise<void>\n },\n address: string,\n attestationCreatedAtMs?: number,\n): Promise<void> {\n const persist = item.persistSeedUid\n if (typeof persist !== 'function') return\n\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('persistSeedUid timed out')), PERSIST_SEED_UID_TIMEOUT_MS),\n )\n\n try {\n await Promise.race([persist.call(item, address, attestationCreatedAtMs), timeout])\n } catch (err) {\n logger('persistSeedUid failed (attestations already on-chain):', err)\n // Don't throw - attestations are confirmed; DB write is best-effort\n }\n}\n","import { getContract, prepareContractCall, readContract } from 'thirdweb'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { SCHEMA_REGISTRY_ADDRESS } from '~/helpers/constants'\n\nconst SCHEMA_REGISTRY_ABI = [\n {\n inputs: [{ internalType: 'bytes32', name: 'uid', type: 'bytes32' }],\n name: 'getSchema',\n outputs: [\n {\n components: [\n { internalType: 'bytes32', name: 'uid', type: 'bytes32' },\n { internalType: 'contract ISchemaResolver', name: 'resolver', type: 'address' },\n { internalType: 'bool', name: 'revocable', type: 'bool' },\n { internalType: 'string', name: 'schema', type: 'string' },\n ],\n internalType: 'struct SchemaRecord',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'string', name: 'schema', type: 'string' },\n { internalType: 'contract ISchemaResolver', name: 'resolver', type: 'address' },\n { internalType: 'bool', name: 'revocable', type: 'bool' },\n ],\n name: 'register',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const\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 function getSchemaRegistryContract(client: ThirdwebClient, chain: Chain) {\n return getContract({\n client,\n chain,\n address: SCHEMA_REGISTRY_ADDRESS,\n abi: SCHEMA_REGISTRY_ABI,\n })\n}\n\n/** Use string signature for getSchema - the EAS SchemaRegistry expects this exact selector.\n * The ABI-based method resolution can produce a different selector (e.g. from internalType\n * or tuple encoding) causing \"Router: function does not exist\" on proxy/router contracts. */\nconst GET_SCHEMA_SIGNATURE =\n 'function getSchema(bytes32 uid) view returns ((bytes32 uid, address resolver, bool revocable, string schema))' as const\n\nexport async function getSchemaRecord(\n client: ThirdwebClient,\n chain: Chain,\n uid: string,\n): Promise<SchemaRecord | null> {\n const contract = getContract({\n client,\n chain,\n address: SCHEMA_REGISTRY_ADDRESS,\n // No ABI - use string method so thirdweb parses the exact signature and produces correct selector\n })\n const result = await readContract({\n contract,\n method: GET_SCHEMA_SIGNATURE,\n params: [uid as `0x${string}`],\n })\n if (!result || (result as SchemaRecord).uid === ZERO_BYTES32) {\n return null\n }\n return result as SchemaRecord\n}\n\nexport type RegisterSchemaParams = {\n schema: string\n resolverAddress: string\n revocable: boolean\n}\n\nexport function registerSchema(\n client: ThirdwebClient,\n chain: Chain,\n params: RegisterSchemaParams,\n) {\n const contract = getSchemaRegistryContract(client, chain)\n return prepareContractCall({\n contract,\n method: 'register',\n params: [params.schema, params.resolverAddress as `0x${string}`, params.revocable],\n })\n}\n","import { getContract, prepareContractCall } from 'thirdweb'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { SchemaEncoder, NO_EXPIRATION, ZERO_BYTES32 } from '@ethereum-attestation-service/eas-sdk'\nimport { getPublishConfig } from '~/config'\nimport { EAS_SCHEMA_NAME_ATTESTATION_UID } from '~/helpers/constants'\n\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\n\nexport type NameSchemaAttestationParams = {\n schemaUid: string\n schemaName: string\n}\n\nexport function prepareNameSchemaAttestation(\n client: ThirdwebClient,\n chain: Chain,\n params: NameSchemaAttestationParams,\n) {\n const schemaEncoder = new SchemaEncoder('bytes32 schemaId,string name')\n const encodedData = schemaEncoder.encodeData([\n { name: 'schemaId', value: params.schemaUid as `0x${string}`, type: 'bytes32' },\n { name: 'name', value: params.schemaName, type: 'string' },\n ])\n\n const { easContractAddress } = getPublishConfig()\n const contract = getContract({\n client,\n chain,\n address: easContractAddress as `0x${string}`,\n // No ABI - use string method so thirdweb parses the exact signature\n })\n\n return prepareContractCall({\n contract,\n method:\n 'function attest((bytes32 schema,(address recipient,uint64 expirationTime,bool revocable,bytes32 refUID,bytes data,uint256 value) data) request) payable returns (bytes32)' as const,\n params: [\n {\n schema: EAS_SCHEMA_NAME_ATTESTATION_UID as `0x${string}`,\n data: {\n recipient: ZERO_ADDRESS as `0x${string}`,\n expirationTime: BigInt(NO_EXPIRATION),\n revocable: true,\n refUID: ZERO_BYTES32 as `0x${string}`,\n data: encodedData as `0x${string}`,\n value: 0n,\n },\n },\n ],\n })\n}\n","import {\n getSegmentedItemProperties,\n getRelatedItemsForPublish,\n INTERNAL_DATA_TYPES,\n getEasSchemaForItemProperty,\n setSchemaUidForSchemaDefinition,\n setSchemaUidForModel,\n} from '@seedprotocol/sdk'\nimport type { IItem } from '@seedprotocol/sdk'\nimport { SchemaRegistry } from '@ethereum-attestation-service/eas-sdk'\nimport type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { sendTransaction, waitForReceipt } from 'thirdweb'\nimport type { Account } from 'thirdweb/wallets'\nimport { getSchemaRecord, registerSchema } from '~/helpers/thirdweb/11155420/schemaRegistry'\nimport { prepareNameSchemaAttestation } from '~/helpers/thirdweb/11155420/nameSchemaAttestation'\n\nconst RESOLVER_ADDRESS = '0x0000000000000000000000000000000000000000'\nconst REVOCABLE = true\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase()\n}\n\n/**\n * Collects all model names used by the item (item's model + relation refs + list refs + Image).\n */\nasync function getModelNamesForItem(item: IItem<any>): Promise<Set<string>> {\n const { itemRelationProperties, itemImageProperties, itemListProperties } =\n await getSegmentedItemProperties(item)\n const modelNames = new Set<string>()\n\n if (item.modelName) {\n modelNames.add(item.modelName)\n }\n\n for (const prop of itemRelationProperties) {\n const ref = prop.propertyDef?.ref as string | undefined\n if (ref) modelNames.add(ref)\n }\n\n for (const prop of itemImageProperties) {\n const dataType = prop.propertyDef?.dataType\n if (dataType === 'File') modelNames.add('File')\n else if (dataType === 'Html') modelNames.add('Html')\n else modelNames.add('Image')\n }\n\n for (const prop of itemListProperties) {\n const ref = prop.propertyDef?.ref as string | undefined\n if (ref) modelNames.add(ref)\n }\n\n return modelNames\n}\n\n/**\n * Ensures EAS schemas exist for each item property and each model used by the item.\n * If a schema is not found on-chain or in the indexer, registers it via SchemaRegistry\n * and creates a name attestation (Schema #1) so EASSCAN displays it.\n * Populates the SDK's schema map so getPublishPayload can resolve schema UIDs.\n */\nexport async function ensureEasSchemasForItem(\n item: IItem<any>,\n account: Account,\n client: ThirdwebClient,\n chain: Chain,\n): Promise<void> {\n const { itemBasicProperties, itemRelationProperties, itemImageProperties, itemListProperties } =\n await getSegmentedItemProperties(item)\n\n const allProperties = [\n ...itemBasicProperties,\n ...itemRelationProperties,\n ...itemImageProperties,\n ...itemListProperties,\n ]\n\n const registeredSchemaUids = new Set<string>()\n\n // Ensure model schemas (bytes32 <model_name>) so getPublishPayload can resolve seedSchemaUid\n const modelNames = await getModelNamesForItem(item)\n const registeredModelSchemaUids = new Set<string>()\n\n for (const modelName of modelNames) {\n const schemaDef = `bytes32 ${toSnakeCase(modelName)}`\n const schemaUid = SchemaRegistry.getSchemaUID(\n schemaDef,\n RESOLVER_ADDRESS as `0x${string}`,\n REVOCABLE,\n )\n\n const onChainRecord = await getSchemaRecord(client, chain, schemaUid)\n if (onChainRecord) {\n setSchemaUidForModel({ modelName, schemaUid })\n continue\n }\n\n if (registeredModelSchemaUids.has(schemaUid)) {\n setSchemaUidForModel({ modelName, schemaUid })\n continue\n }\n\n try {\n const registerTx = registerSchema(client, chain, {\n schema: schemaDef,\n resolverAddress: RESOLVER_ADDRESS,\n revocable: REVOCABLE,\n })\n\n const registerResult = await sendTransaction({\n account,\n transaction: registerTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: registerResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to register EAS schema for model ${modelName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n try {\n const attestTx = prepareNameSchemaAttestation(client, chain, {\n schemaUid,\n schemaName: toSnakeCase(modelName),\n })\n\n const attestResult = await sendTransaction({\n account,\n transaction: attestTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: attestResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to name EAS schema for model ${modelName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n registeredModelSchemaUids.add(schemaUid)\n setSchemaUidForModel({ modelName, schemaUid })\n }\n\n // Ensure storage seed property schemas (Image/File/Html models have storageTransactionId).\n // The top-level item doesn't have these properties, but nested storage seeds do.\n const storageSchemaDef = 'string storage_transaction_id'\n const storageSchemaUid = SchemaRegistry.getSchemaUID(\n storageSchemaDef,\n RESOLVER_ADDRESS as `0x${string}`,\n REVOCABLE,\n )\n const storageOnChain = await getSchemaRecord(client, chain, storageSchemaUid)\n if (storageOnChain) {\n setSchemaUidForSchemaDefinition({ text: storageSchemaDef, schemaUid: storageSchemaUid })\n } else if (!registeredSchemaUids.has(storageSchemaUid) && (modelNames.has('Image') || modelNames.has('File') || modelNames.has('Html'))) {\n try {\n const registerTx = registerSchema(client, chain, {\n schema: storageSchemaDef,\n resolverAddress: RESOLVER_ADDRESS,\n revocable: REVOCABLE,\n })\n const registerResult = await sendTransaction({ account, transaction: registerTx })\n await waitForReceipt({ client, chain, transactionHash: registerResult.transactionHash })\n const attestTx = prepareNameSchemaAttestation(client, chain, {\n schemaUid: storageSchemaUid,\n schemaName: 'storage_transaction_id',\n })\n const attestResult = await sendTransaction({ account, transaction: attestTx })\n await waitForReceipt({ client, chain, transactionHash: attestResult.transactionHash })\n } catch (err) {\n throw new Error(\n `Failed to register EAS schema for storageTransactionId: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n registeredSchemaUids.add(storageSchemaUid)\n setSchemaUidForSchemaDefinition({ text: storageSchemaDef, schemaUid: storageSchemaUid })\n }\n\n for (const property of allProperties) {\n if (!property.propertyDef) continue\n\n const easDataTypeRaw =\n (INTERNAL_DATA_TYPES as Record<string, { eas?: string }>)[property.propertyDef.dataType]?.eas ?? 'string'\n const prop = property as { storagePropertyName?: string; propertyName: string }\n const nameForEas =\n prop.storagePropertyName && prop.storagePropertyName.length > 0\n ? prop.storagePropertyName\n : property.propertyName\n const propertyNameSnakeCase = toSnakeCase(nameForEas)\n const schemaDef = `${easDataTypeRaw} ${propertyNameSnakeCase}`\n\n // getEasSchemaForItemProperty expects TypedData['type'] which excludes 'bytes32[]'\n const validEasTypes = [\n 'string', 'address', 'bool', 'bytes', 'bytes32',\n 'uint8', 'uint16', 'uint32', 'uint64', 'uint128', 'uint256',\n ] as const\n const easDataTypeForLookup =\n validEasTypes.includes(easDataTypeRaw as (typeof validEasTypes)[number])\n ? (easDataTypeRaw as (typeof validEasTypes)[number])\n : undefined\n\n let schema = await getEasSchemaForItemProperty({\n schemaUid: property.schemaUid,\n propertyName: nameForEas,\n easDataType: easDataTypeForLookup,\n })\n\n if (schema) {\n // Verify SDK schema matches our schemaDef on-chain before trusting it.\n // The SDK may return a cached schema from a different chain/definition.\n const onChainRecord = await getSchemaRecord(client, chain, schema.id)\n const matches = onChainRecord && onChainRecord.schema === schemaDef\n if (matches) {\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid: schema.id })\n continue\n }\n // Schema mismatch or not found: fall through to register/use our schemaDef\n }\n\n const schemaUid = SchemaRegistry.getSchemaUID(schemaDef, RESOLVER_ADDRESS as `0x${string}`, REVOCABLE)\n const onChainRecord = await getSchemaRecord(client, chain, schemaUid)\n\n if (onChainRecord) {\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid })\n continue\n }\n\n if (registeredSchemaUids.has(schemaUid)) {\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid })\n continue\n }\n\n try {\n const registerTx = registerSchema(client, chain, {\n schema: schemaDef,\n resolverAddress: RESOLVER_ADDRESS,\n revocable: REVOCABLE,\n })\n\n const registerResult = await sendTransaction({\n account,\n transaction: registerTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: registerResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to register EAS schema for property ${property.propertyName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n try {\n const attestTx = prepareNameSchemaAttestation(client, chain, {\n schemaUid,\n schemaName: propertyNameSnakeCase,\n })\n\n const attestResult = await sendTransaction({\n account,\n transaction: attestTx,\n })\n\n await waitForReceipt({\n client,\n chain,\n transactionHash: attestResult.transactionHash,\n })\n } catch (err) {\n throw new Error(\n `Failed to name EAS schema for property ${property.propertyName}: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n\n registeredSchemaUids.add(schemaUid)\n setSchemaUidForSchemaDefinition({ text: schemaDef, schemaUid })\n }\n\n // Ensure schemas for related/list items that will be in the multiPublish payload.\n // Without this, schemas for nested items (e.g. Image's properties) are never registered,\n // causing EAS multiAttest to revert with InvalidSchema.\n const relatedItems = await getRelatedItemsForPublish(item)\n for (const relatedItem of relatedItems) {\n await ensureEasSchemasForItem(relatedItem as IItem<any>, account, client, chain)\n }\n}\n","import { getUploadPipelineTransactionStatus } from '@seedprotocol/sdk'\nimport { getPublishConfig } from '~/config'\n\n/**\n * Verifies each id is available via the upload API (`/api/upload/arweave/data/:id`)\n * before creating storageTransactionId attestations. Prevents attestations when\n * the upload pipeline has not indexed the transaction or data item yet.\n *\n * @param txIds - Arweave L1 transaction ids and/or bundler data item ids\n * @throws Error if any id is not found (404) or not yet available\n */\nexport async function verifyArweaveTransactionsExist(txIds: string[]): Promise<void> {\n if (txIds.length === 0) return\n\n const { arweaveUploadVerificationBaseUrl } = getPublishConfig()\n\n const results = await Promise.all(\n txIds.map((txId) =>\n getUploadPipelineTransactionStatus(arweaveUploadVerificationBaseUrl, txId),\n ),\n )\n\n for (let i = 0; i < txIds.length; i++) {\n const txId = txIds[i]\n const status = results[i]\n if (!status) continue\n\n if (status.status === 404) {\n throw new Error(\n `Arweave transaction ${txId} not found. Upload may have failed. Delete this publish record and try again.`\n )\n }\n\n if (status.status !== 200) {\n const detail =\n status.status === 504\n ? 'request timed out (upload service did not respond in time)'\n : `status: ${status.status}`\n throw new Error(\n `Arweave transaction ${txId} is not yet available from the upload service (${detail}). Wait and retry.`\n )\n }\n }\n}\n","import {\n prepareEvent,\n prepareContractCall,\n readContract,\n type BaseTransactionOptions,\n type AbiParameterToPrimitiveType,\n} from \"thirdweb\";\n\n/**\n* Contract events\n*/\n\n\n\n/**\n * Creates an event object for the CreatedAttestation event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { createdAttestationEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * createdAttestationEvent()\n * ],\n * });\n * ```\n */\nexport function createdAttestationEvent() {\n return prepareEvent({\n signature: \"event CreatedAttestation((bytes32 schemaUid, bytes32 attestationUid) result)\",\n });\n};\n \n\n/**\n * Represents the filters for the \"ModuleInitialized\" event.\n */\nexport type ModuleInitializedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\neas: AbiParameterToPrimitiveType<{\"indexed\":true,\"internalType\":\"address\",\"name\":\"eas\",\"type\":\"address\"}>\n}>;\n\n/**\n * Creates an event object for the ModuleInitialized event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { moduleInitializedEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * moduleInitializedEvent({\n * account: ...,\n * eas: ...,\n * })\n * ],\n * });\n * ```\n */\nexport function moduleInitializedEvent(filters: ModuleInitializedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ModuleInitialized(address indexed account, address indexed eas)\",\n filters,\n });\n};\n \n\n/**\n * Represents the filters for the \"ModuleUninitialized\" event.\n */\nexport type ModuleUninitializedEventFilters = Partial<{\n account: AbiParameterToPrimitiveType<{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\n}>;\n\n/**\n * Creates an event object for the ModuleUninitialized event.\n * @param filters - Optional filters to apply to the event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { moduleUninitializedEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * moduleUninitializedEvent({\n * account: ...,\n * })\n * ],\n * });\n * ```\n */\nexport function moduleUninitializedEvent(filters: ModuleUninitializedEventFilters = {}) {\n return prepareEvent({\n signature: \"event ModuleUninitialized(address indexed account)\",\n filters,\n });\n};\n \n\n\n\n/**\n * Creates an event object for the SeedPublished event.\n * @returns The prepared event object.\n * @example\n * ```\n * import { getContractEvents } from \"thirdweb\";\n * import { seedPublishedEvent } from \"TODO\";\n *\n * const events = await getContractEvents({\n * contract,\n * events: [\n * seedPublishedEvent()\n * ],\n * });\n * ```\n */\nexport function seedPublishedEvent() {\n return prepareEvent({\n signature: \"event SeedPublished(bytes32 seedUid, bytes32 versionUid)\",\n });\n};\n \n\n/**\n* Contract read functions\n*/\n\n/**\n * Represents the parameters for the \"getEAS\" function.\n */\nexport type GetEASParams = {\n account: AbiParameterToPrimitiveType<{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\n};\n\n/**\n * Calls the \"getEAS\" function on the contract.\n * @param options - The options for the getEAS function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { getEAS } from \"TODO\";\n *\n * const result = await getEAS({\n * account: ...,\n * });\n *\n * ```\n */\nexport async function getEAS(\n options: BaseTransactionOptions<GetEASParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0x7dda06c4\",\n [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isInitialized\" function.\n */\nexport type IsInitializedParams = {\n account: AbiParameterToPrimitiveType<{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}>\n};\n\n/**\n * Calls the \"isInitialized\" function on the contract.\n * @param options - The options for the isInitialized function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isInitialized } from \"TODO\";\n *\n * const result = await isInitialized({\n * account: ...,\n * });\n *\n * ```\n */\nexport async function isInitialized(\n options: BaseTransactionOptions<IsInitializedParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xd60b347f\",\n [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.account]\n });\n};\n\n\n/**\n * Represents the parameters for the \"isModuleType\" function.\n */\nexport type IsModuleTypeParams = {\n moduleTypeId: AbiParameterToPrimitiveType<{\"internalType\":\"uint256\",\"name\":\"moduleTypeId\",\"type\":\"uint256\"}>\n};\n\n/**\n * Calls the \"isModuleType\" function on the contract.\n * @param options - The options for the isModuleType function.\n * @returns The parsed result of the function call.\n * @example\n * ```\n * import { isModuleType } from \"TODO\";\n *\n * const result = await isModuleType({\n * moduleTypeId: ...,\n * });\n *\n * ```\n */\nexport async function isModuleType(\n options: BaseTransactionOptions<IsModuleTypeParams>\n) {\n return readContract({\n contract: options.contract,\n method: [\n \"0xecd05961\",\n [\n {\n \"internalType\": \"uint256\",\n \"name\": \"moduleTypeId\",\n \"type\": \"uint256\"\n }\n ],\n [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ]\n],\n params: [options.moduleTypeId]\n });\n};\n\n\n/**\n* Contract write functions\n*/\n\n/**\n * Represents the parameters for the \"createSeed\" function.\n */\nexport type CreateSeedParams = {\n schemaUid: AbiParameterToPrimitiveType<{\"internalType\":\"bytes32\",\"name\":\"schemaUid\",\"type\":\"bytes32\"}>\nrevocable: AbiParameterToPrimitiveType<{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"}>\n};\n\n/**\n * Calls the \"createSeed\" function on the contract.\n * @param options - The options for the \"createSeed\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createSeed } from \"TODO\";\n *\n * const transaction = createSeed({\n * schemaUid: ...,\n * revocable: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function createSeed(\n options: BaseTransactionOptions<CreateSeedParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6240d6d9\",\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"schemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"revocable\",\n \"type\": \"bool\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.schemaUid, options.revocable]\n });\n};\n\n\n/**\n * Represents the parameters for the \"createVersion\" function.\n */\nexport type CreateVersionParams = {\n seedUid: AbiParameterToPrimitiveType<{\"internalType\":\"bytes32\",\"name\":\"seedUid\",\"type\":\"bytes32\"}>\nversionSchemaUid: AbiParameterToPrimitiveType<{\"internalType\":\"bytes32\",\"name\":\"versionSchemaUid\",\"type\":\"bytes32\"}>\n};\n\n/**\n * Calls the \"createVersion\" function on the contract.\n * @param options - The options for the \"createVersion\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { createVersion } from \"TODO\";\n *\n * const transaction = createVersion({\n * seedUid: ...,\n * versionSchemaUid: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function createVersion(\n options: BaseTransactionOptions<CreateVersionParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x13e0c263\",\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionSchemaUid\",\n \"type\": \"bytes32\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.seedUid, options.versionSchemaUid]\n });\n};\n\n\n/**\n * Represents the parameters for the \"multiPublish\" function.\n */\nexport type MultiPublishParams = {\n requests: AbiParameterToPrimitiveType<{\"components\":[{\"internalType\":\"string\",\"name\":\"localId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"seedUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"seedSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"seedIsRevocable\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiAttestationRequest[]\",\"name\":\"listOfAttestations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"publishIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"propertySchemaUid\",\"type\":\"bytes32\"}],\"internalType\":\"struct PropertyToUpdateWithSeed[]\",\"name\":\"propertiesToUpdate\",\"type\":\"tuple[]\"}],\"internalType\":\"struct PublishRequestData[]\",\"name\":\"requests\",\"type\":\"tuple[]\"}>\n};\n\n/**\n * Calls the \"multiPublish\" function on the contract.\n * @param options - The options for the \"multiPublish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { multiPublish } from \"TODO\";\n *\n * const transaction = multiPublish({\n * requests: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function multiPublish(\n options: BaseTransactionOptions<MultiPublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x2a29fadc\",\n [\n {\n \"components\": [\n {\n \"internalType\": \"string\",\n \"name\": \"localId\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"seedIsRevocable\",\n \"type\": \"bool\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"schema\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"expirationTime\",\n \"type\": \"uint64\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"revocable\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"refUID\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct AttestationRequestData[]\",\n \"name\": \"data\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct MultiAttestationRequest[]\",\n \"name\": \"listOfAttestations\",\n \"type\": \"tuple[]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"publishIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"propertySchemaUid\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct PropertyToUpdateWithSeed[]\",\n \"name\": \"propertiesToUpdate\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct PublishRequestData[]\",\n \"name\": \"requests\",\n \"type\": \"tuple[]\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"\",\n \"type\": \"bytes32[]\"\n }\n ]\n],\n params: [options.requests]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onInstall\" function.\n */\nexport type OnInstallParams = {\n data: AbiParameterToPrimitiveType<{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onInstall\" function on the contract.\n * @param options - The options for the \"onInstall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onInstall } from \"TODO\";\n *\n * const transaction = onInstall({\n * data: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function onInstall(\n options: BaseTransactionOptions<OnInstallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x6d61fe70\",\n [\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n }\n ],\n []\n],\n params: [options.data]\n });\n};\n\n\n/**\n * Represents the parameters for the \"onUninstall\" function.\n */\nexport type OnUninstallParams = {\n arg_0: AbiParameterToPrimitiveType<{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}>\n};\n\n/**\n * Calls the \"onUninstall\" function on the contract.\n * @param options - The options for the \"onUninstall\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { onUninstall } from \"TODO\";\n *\n * const transaction = onUninstall({\n * arg_0: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function onUninstall(\n options: BaseTransactionOptions<OnUninstallParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x8a91b0e3\",\n [\n {\n \"internalType\": \"bytes\",\n \"name\": \"\",\n \"type\": \"bytes\"\n }\n ],\n []\n],\n params: [options.arg_0]\n });\n};\n\n\n/**\n * Represents the parameters for the \"publish\" function.\n */\nexport type PublishParams = {\n request: AbiParameterToPrimitiveType<{\"components\":[{\"internalType\":\"string\",\"name\":\"localId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"seedUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"seedSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"versionSchemaUid\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"seedIsRevocable\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiAttestationRequest[]\",\"name\":\"listOfAttestations\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"publishIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"propertySchemaUid\",\"type\":\"bytes32\"}],\"internalType\":\"struct PropertyToUpdateWithSeed[]\",\"name\":\"propertiesToUpdate\",\"type\":\"tuple[]\"}],\"internalType\":\"struct PublishRequestData\",\"name\":\"request\",\"type\":\"tuple\"}>\n};\n\n/**\n * Calls the \"publish\" function on the contract.\n * @param options - The options for the \"publish\" function.\n * @returns A prepared transaction object.\n * @example\n * ```\n * import { publish } from \"TODO\";\n *\n * const transaction = publish({\n * request: ...,\n * });\n *\n * // Send the transaction\n * ...\n *\n * ```\n */\nexport function publish(\n options: BaseTransactionOptions<PublishParams>\n) {\n return prepareContractCall({\n contract: options.contract,\n method: [\n \"0x801d5ac9\",\n [\n {\n \"components\": [\n {\n \"internalType\": \"string\",\n \"name\": \"localId\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"seedSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"versionSchemaUid\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"seedIsRevocable\",\n \"type\": \"bool\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"schema\",\n \"type\": \"bytes32\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint64\",\n \"name\": \"expirationTime\",\n \"type\": \"uint64\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"revocable\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"refUID\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes\",\n \"name\": \"data\",\n \"type\": \"bytes\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"value\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct AttestationRequestData[]\",\n \"name\": \"data\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct MultiAttestationRequest[]\",\n \"name\": \"listOfAttestations\",\n \"type\": \"tuple[]\"\n },\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"publishIndex\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"propertySchemaUid\",\n \"type\": \"bytes32\"\n }\n ],\n \"internalType\": \"struct PropertyToUpdateWithSeed[]\",\n \"name\": \"propertiesToUpdate\",\n \"type\": \"tuple[]\"\n }\n ],\n \"internalType\": \"struct PublishRequestData\",\n \"name\": \"request\",\n \"type\": \"tuple\"\n }\n ],\n [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ]\n],\n params: [options.request]\n });\n};\n\n\n","import { parseEventLogs } from 'thirdweb'\nimport { decodeAbiParameters } from 'viem'\nimport {\n createdAttestationEvent,\n seedPublishedEvent,\n} from '~/helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148'\nimport {\n createdAttestationEvent as executorCreatedAttestationEvent,\n seedPublishedEvent as executorSeedPublishedEvent,\n} from '~/helpers/thirdweb/11155420/0x043462304114da543add6b693c686b7d98865f3e'\nimport { ZERO_BYTES32 } from './utils'\n\nexport function toHex32Normalized(v: string | undefined): string {\n if (v == null || v === '') return ZERO_BYTES32\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(64, '0').slice(-64)\n return ('0x' + hex).toLowerCase()\n}\n\n/**\n * Extract the seed attestation UID by matching the request's seedSchemaUid to a CreatedAttestation\n * event. The payload links each request to a schema (seedSchemaUid); the contract emits\n * CreatedAttestation(schemaUid, attestationUid) for each attestation, so we find the event whose\n * schemaUid matches and use its attestationUid. No index guessing.\n */\nexport function seedUidFromCreatedAttestationEvents(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n seedSchemaUid: string | undefined,\n useModularExecutor: boolean\n): string | undefined {\n if (!seedSchemaUid || !receipt.logs?.length) return undefined\n const wantSchema = toHex32Normalized(seedSchemaUid)\n if (wantSchema === ZERO_BYTES32) return undefined\n const createdAttestationEvt = useModularExecutor ? executorCreatedAttestationEvent : createdAttestationEvent\n try {\n const parsed = parseEventLogs({\n logs: receipt.logs as import('viem').Log[],\n events: [createdAttestationEvt()],\n strict: false,\n })\n for (const ev of parsed) {\n const result = ev?.args?.result as { schemaUid?: string; attestationUid?: string } | undefined\n if (!result?.attestationUid) continue\n if (toHex32Normalized(result.schemaUid) === wantSchema) {\n const uid = result.attestationUid\n if (uid && toHex32Normalized(uid) !== ZERO_BYTES32) return uid\n return undefined\n }\n }\n } catch {\n // ignore\n }\n return undefined\n}\n\nexport type SeedPublishedPair = {\n seedUid?: string\n versionUid?: string\n}\n\n/**\n * Seed + Version UIDs from SeedPublished (executor: typed args; extension: bytes32[] layout).\n * Extension layout: seed at index listOfAttestationsCount, version at listOfAttestationsCount + 1 when present.\n */\nexport function uidsFromSeedPublished(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n contractAddress: string,\n listOfAttestationsCount: number,\n useModularExecutor: boolean,\n): SeedPublishedPair {\n const want = contractAddress.toLowerCase()\n const logs = receipt.logs?.filter((l) => l.address && l.address.toLowerCase() === want)\n if (!logs?.length) return {}\n try {\n const seedPublishedEvt = useModularExecutor ? executorSeedPublishedEvent : seedPublishedEvent\n const parsed = parseEventLogs({\n logs: logs as import('viem').Log[],\n events: [seedPublishedEvt()],\n strict: false,\n })\n const first = parsed[0]\n if (!first) return {}\n if (useModularExecutor) {\n const args = first.args as { seedUid?: string; versionUid?: string }\n const seedUid =\n args?.seedUid && toHex32Normalized(args.seedUid) !== ZERO_BYTES32 ? args.seedUid : undefined\n const versionUid =\n args?.versionUid && toHex32Normalized(args.versionUid) !== ZERO_BYTES32\n ? args.versionUid\n : undefined\n return { seedUid, versionUid }\n }\n const args = first.args as { returnedDataFromEAS?: `0x${string}` }\n const data = args?.returnedDataFromEAS\n if (!data || data === '0x') return {}\n const decoded = decodeAbiParameters([{ type: 'bytes32[]' }], data)\n const uids = decoded[0] as readonly `0x${string}`[]\n if (!uids?.length) return {}\n const seedIndex = listOfAttestationsCount\n const atSeed = uids[seedIndex]\n const atVersion = uids[seedIndex + 1]\n const seedUid =\n atSeed && atSeed !== ZERO_BYTES32\n ? (atSeed as string)\n : uids.length === 1 && uids[0] && uids[0] !== ZERO_BYTES32\n ? (uids[0] as string)\n : undefined\n const versionUid =\n atVersion && atVersion !== ZERO_BYTES32 ? (atVersion as string) : undefined\n return { seedUid, versionUid }\n } catch {\n return {}\n }\n}\n\n/**\n * Fallback: extract seed UID from SeedPublished when CreatedAttestation events are not\n * available or don't match.\n * Extension: SeedPublished(bytes returnedDataFromEAS) - decode bytes as bytes32[], use index.\n * Executor: SeedPublished(bytes32 seedUid, bytes32 versionUid) - read args.seedUid directly.\n */\nexport function seedUidFromSeedPublished(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n contractAddress: string,\n listOfAttestationsCount: number,\n useModularExecutor: boolean,\n): string | undefined {\n return uidsFromSeedPublished(\n receipt,\n contractAddress,\n listOfAttestationsCount,\n useModularExecutor,\n ).seedUid\n}\n\n/**\n * Version attestation UID from CreatedAttestation logs (schema matches request versionSchemaUid).\n */\nexport function versionUidFromCreatedAttestationEvents(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n versionSchemaUid: string | undefined,\n useModularExecutor: boolean,\n): string | undefined {\n if (!versionSchemaUid || !receipt.logs?.length) return undefined\n const wantSchema = toHex32Normalized(versionSchemaUid)\n if (wantSchema === ZERO_BYTES32) return undefined\n const createdAttestationEvt = useModularExecutor ? executorCreatedAttestationEvent : createdAttestationEvent\n try {\n const parsed = parseEventLogs({\n logs: receipt.logs as import('viem').Log[],\n events: [createdAttestationEvt()],\n strict: false,\n })\n for (const ev of parsed) {\n const result = ev?.args?.result as { schemaUid?: string; attestationUid?: string } | undefined\n if (!result?.attestationUid) continue\n if (toHex32Normalized(result.schemaUid) === wantSchema) {\n const uid = result.attestationUid\n if (uid && toHex32Normalized(uid) !== ZERO_BYTES32) return uid\n return undefined\n }\n }\n } catch {\n // ignore\n }\n return undefined\n}\n\nexport type CreatedAttestationPair = { schemaUid: string; attestationUid: string }\n\n/**\n * All `CreatedAttestation` (schemaUid, attestationUid) pairs from the receipt, in parse order.\n * Includes seed, version, and property attestations emitted by the Seed Protocol publish flow.\n */\nexport function listCreatedAttestationPairsFromReceipt(\n receipt: { logs?: Array<{ address?: string; data?: string; topics?: unknown[] }> },\n useModularExecutor: boolean,\n): CreatedAttestationPair[] {\n if (!receipt.logs?.length) return []\n const createdAttestationEvt = useModularExecutor\n ? executorCreatedAttestationEvent\n : createdAttestationEvent\n try {\n const parsed = parseEventLogs({\n logs: receipt.logs as import('viem').Log[],\n events: [createdAttestationEvt()],\n strict: false,\n })\n const out: CreatedAttestationPair[] = []\n for (const ev of parsed) {\n const result = ev?.args?.result as\n | { schemaUid?: string; attestationUid?: string }\n | undefined\n if (!result?.attestationUid) continue\n const uid = result.attestationUid\n if (!uid || toHex32Normalized(uid) === ZERO_BYTES32) continue\n const su = result.schemaUid\n if (!su) continue\n out.push({ schemaUid: su, attestationUid: uid })\n }\n return out\n } catch {\n return []\n }\n}\n","import type { ThirdwebClient } from 'thirdweb'\nimport type { Chain } from 'thirdweb/chains'\nimport { eth_getBlockByNumber, getRpcClient } from 'thirdweb/rpc'\n\n/**\n * Block time in milliseconds for the receipt's block, or `Date.now()` if unavailable.\n */\nexport async function attestationMsFromReceipt(\n client: ThirdwebClient,\n chain: Chain,\n receipt: { blockNumber?: bigint },\n): Promise<number> {\n const bn = receipt?.blockNumber\n if (bn == null) return Date.now()\n try {\n const rpc = getRpcClient({ client, chain })\n const block = await eth_getBlockByNumber(rpc, { blockNumber: bn })\n const ts = block?.timestamp\n if (ts != null) return Number(ts) * 1000\n } catch {\n // ignore\n }\n return Date.now()\n}\n","import { ZERO_ADDRESS } from '@ethereum-attestation-service/eas-sdk'\nimport { ZERO_BYTES32 } from './utils'\n\nconst BYTES32_LEN = 64\n\nexport const toHex32 = (v: unknown): string => {\n if (v == null) return '0x' + '0'.repeat(BYTES32_LEN)\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n return '0x' + hex\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n const hex = Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n return '0x' + hex.padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n }\n return '0x' + '0'.repeat(BYTES32_LEN)\n}\n\nexport const toBytesHex = (v: unknown): string => {\n if (v == null || (typeof v === 'string' && (v === '' || v === '0x'))) return '0x'\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0')\n return '0x' + (hex.length % 2 === 1 ? '0' + hex : hex)\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n return '0x' + Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n return '0x'\n}\n\n/** True when an attestation still references another seed in this batch by localId (needs client-side resolution between txs). */\nexport function hasCrossPayloadUnresolved(reqs: unknown[]): boolean {\n const localIds = new Set(\n reqs.map((r) => (r as { localId?: string })?.localId).filter((id): id is string => !!id),\n )\n return reqs.some((req) =>\n ((req as { listOfAttestations?: unknown[] })?.listOfAttestations ?? []).some((a) => {\n const att = a as { _unresolvedValue?: string; _rawListIdsForResolve?: string[] }\n if (att._unresolvedValue && localIds.has(att._unresolvedValue)) return true\n if (Array.isArray(att._rawListIdsForResolve)) {\n return att._rawListIdsForResolve.some((id) => id && localIds.has(String(id).trim()))\n }\n return false\n }),\n )\n}\n\n/** Keep only propertiesToUpdate whose target is in the same multiPublish batch (same tx). */\nexport function filterPropertiesToUpdateForBatch<T extends { publishLocalId?: string }>(\n propertiesToUpdate: T[] | undefined,\n batchLocalIds: Set<string>,\n): T[] {\n return (propertiesToUpdate ?? []).filter(\n (pu) => pu.publishLocalId && batchLocalIds.has(pu.publishLocalId),\n )\n}\n\nconst placeholderData = {\n recipient: ZERO_ADDRESS,\n expirationTime: BigInt(0),\n revocable: true,\n refUID: ZERO_BYTES32,\n data: ZERO_BYTES32 as `0x${string}`,\n value: BigInt(0),\n}\n\n/** Normalize one publish request for SeedProtocol multiPublish (same rules as createAttestations). */\nexport function normalizePublishRequest(req: any): any {\n const listOfAttestations = (req?.listOfAttestations ?? []).map((att: any) => {\n const dataArr = Array.isArray(att?.data) ? att.data : []\n return {\n schema: toHex32(att?.schema),\n data: dataArr.map((d: any) => ({\n ...d,\n refUID: toHex32(d?.refUID),\n data: toBytesHex(d?.data),\n expirationTime: d?.expirationTime != null ? BigInt(d.expirationTime) : BigInt(0),\n value: d?.value != null ? BigInt(d.value) : BigInt(0),\n })),\n ...(typeof att?._propertyName === 'string' && att._propertyName !== ''\n ? { _propertyName: att._propertyName }\n : {}),\n ...(typeof att?._propertyNameForSchema === 'string' && att._propertyNameForSchema !== ''\n ? { _propertyNameForSchema: att._propertyNameForSchema }\n : {}),\n }\n })\n const propertiesToUpdate = (req?.propertiesToUpdate ?? []).map((p: any) => ({\n ...p,\n propertySchemaUid: toHex32(p?.propertySchemaUid),\n }))\n return {\n ...req,\n seedUid: toHex32(req?.seedUid),\n seedSchemaUid: toHex32(req?.seedSchemaUid),\n versionUid: toHex32(req?.versionUid),\n versionSchemaUid: toHex32(req?.versionSchemaUid),\n listOfAttestations,\n propertiesToUpdate,\n }\n}\n\n/** Ensure placeholder attestation data for contract injection targets (full batch). */\nexport function applyPropertiesToUpdatePlaceholders(\n normalizedRequests: any[],\n byLocalId: Map<string, any>,\n): void {\n for (const req of normalizedRequests) {\n for (const pu of req?.propertiesToUpdate ?? []) {\n const targetId = pu?.publishLocalId\n const schemaUid = toHex32(pu?.propertySchemaUid)\n if (!targetId || !schemaUid) continue\n const targetReq = byLocalId.get(targetId)\n if (!targetReq?.listOfAttestations) continue\n const att = targetReq.listOfAttestations.find(\n (a: any) => toHex32(a?.schema)?.toLowerCase() === schemaUid?.toLowerCase(),\n )\n if (!att) continue\n if (!Array.isArray(att.data) || att.data.length === 0) {\n att.data = [{ ...placeholderData, refUID: ZERO_BYTES32 }]\n }\n }\n }\n}\n","import { arweaveL1FinalizeJobs, BaseDb } from '@seedprotocol/sdk'\nimport type { ArweaveTransactionInfo, PublishMachineContext, PublishUpload } from '../../types'\nimport { getPublishConfig } from '~/config'\n\nconst PHASE_PENDING = 'pending_l1' as const\n\n/**\n * Inserts one row per bundler DataItem id so the L1 finalize worker can resolve the L1 tx\n * and wait for anchoring. Idempotent on `data_item_id`.\n */\nexport async function enqueueArweaveL1FinalizeJobsFromPublishContext(\n context: PublishMachineContext,\n): Promise<void> {\n const { useArweaveBundler } = getPublishConfig()\n if (!useArweaveBundler) return\n\n const txs = context.arweaveTransactions ?? []\n const uploads = (context.publishUploads ?? []) as PublishUpload[]\n if (txs.length === 0 || txs.length !== uploads.length) return\n\n const db = BaseDb.getAppDb()\n if (!db) return\n\n const now = Date.now()\n\n for (let i = 0; i < txs.length; i++) {\n const ar = txs[i] as ArweaveTransactionInfo\n const up = uploads[i]\n if (!up) continue\n const dataItemId = (ar.transaction as { id?: string })?.id\n if (!dataItemId || typeof dataItemId !== 'string') continue\n\n try {\n await db\n .insert(arweaveL1FinalizeJobs)\n .values({\n seedLocalId: up.seedLocalId,\n dataItemId,\n versionLocalId: up.versionLocalId ?? null,\n itemPropertyName: up.itemPropertyName ?? null,\n phase: PHASE_PENDING,\n createdAt: now,\n updatedAt: now,\n })\n .onConflictDoNothing()\n } catch {\n /* ignore duplicate or DB errors */\n }\n }\n}\n","import { deploySmartAccount, getContract } from 'thirdweb'\nimport { isContractDeployed } from 'thirdweb/utils'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getPublishConfig } from '../config'\nimport { Eip7702ModularAccountPublishError } from '../errors'\nimport { getClient, getModularAccountWallet } from './thirdweb'\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 Optimism Sepolia 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 Optimism Sepolia. 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\n/**\n * Ensures the Thirdweb in-app modular wallet (EIP-7702) has non-empty bytecode at its address\n * on Optimism Sepolia (delegation / minimal account). If not, optionally runs Thirdweb's\n * {@link deploySmartAccount} bootstrap (dummy tx) when {@link ResolvedPublishConfig.autoDeployEip7702ModularAccount} is true.\n *\n * Call only when `useModularExecutor` is true and before sending `multiPublish` with the modular account.\n */\nexport async function ensureEip7702ModularAccountReady(): Promise<void> {\n const { autoDeployEip7702ModularAccount } = getPublishConfig()\n const modularAccountWallet = getModularAccountWallet()\n await modularAccountWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\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: optimismSepolia,\n address: modularAccount.address,\n })\n\n if (await isContractDeployed(accountContract)) {\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: optimismSepolia,\n client,\n accountContract,\n })\n } catch (cause) {\n throw new Eip7702ModularAccountPublishError(\n MSG_DEPLOY_FAILED,\n 'EIP7702_MODULAR_DEPLOY_FAILED',\n modularAccount.address,\n cause,\n )\n }\n\n if (!(await isContractDeployed(accountContract))) {\n throw new Eip7702ModularAccountPublishError(\n MSG_NOT_CONFIRMED,\n 'EIP7702_MODULAR_NOT_CONFIRMED',\n modularAccount.address,\n )\n }\n}\n","import { getContract, sendTransaction, waitForReceipt } from 'thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport type { Account } from 'thirdweb/wallets'\nimport { zeroAddress } from 'viem'\nimport { getPublishConfig } from '../config'\nimport { ManagedAccountPublishError } from '../errors'\nimport { getClient } from './thirdweb'\nimport {\n getEas,\n setEas,\n} from './thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148'\n\nconst MSG_SET_EAS =\n 'Could not verify or set the EAS contract address on your publishing account on Optimism Sepolia.'\n\nfunction normAddr(a: string): string {\n return a.toLowerCase()\n}\n\n/**\n * Ensures the ManagedAccount contract’s on-chain EAS address matches {@link getPublishConfig}.easContractAddress.\n * If `getEas` is zero or differs, sends `setEas` signed by `account` (same signer as modular `multiPublish`).\n *\n * Call only on the modular executor path, after {@link ensureEip7702ModularAccountReady}.\n */\nexport async function ensureManagedAccountEasConfigured(\n managedAddress: string,\n account: Account,\n): Promise<void> {\n const { easContractAddress } = getPublishConfig()\n const expected = normAddr(easContractAddress)\n if (!expected || expected === normAddr(zeroAddress)) {\n throw new ManagedAccountPublishError(\n 'Publish config is missing a valid easContractAddress.',\n 'MANAGED_ACCOUNT_SET_EAS_FAILED',\n managedAddress,\n )\n }\n\n const contract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: managedAddress,\n })\n\n let current: string\n try {\n const raw = await getEas({ contract })\n current = normAddr(typeof raw === 'string' ? raw : String(raw))\n } catch (cause) {\n throw new ManagedAccountPublishError(MSG_SET_EAS, 'MANAGED_ACCOUNT_SET_EAS_FAILED', managedAddress, cause)\n }\n\n if (current === expected) {\n return\n }\n\n try {\n const tx = setEas({\n contract,\n eas: easContractAddress as `0x${string}`,\n })\n const result = await sendTransaction({ transaction: tx, account })\n await waitForReceipt({\n client: getClient(),\n transactionHash: result.transactionHash,\n chain: optimismSepolia,\n })\n } catch (cause) {\n throw new ManagedAccountPublishError(MSG_SET_EAS, 'MANAGED_ACCOUNT_SET_EAS_FAILED', managedAddress, cause)\n }\n}\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport type { PublishUpload } from '../../../types'\nimport {\n applyPropertyAttestationUidsFromPublish,\n resolvePublishPayloadValues,\n updateVersionUid,\n} from '@seedprotocol/sdk'\nimport { getContract, sendTransaction, waitForReceipt } from 'thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getClient, getModularAccountWallet, isSmartWalletDeployed } from '~/helpers/thirdweb'\nimport { runModularExecutorPublishPrep } from '~/helpers/ensureManagedAccountReady'\nimport {\n multiPublish,\n} from '~/helpers/thirdweb/11155420/0xcd8c945872df8e664e55cf8885c85ea3ea8f2148'\nimport { persistSeedUidFromPublishResult, persistSeedUidSafely } from './persistSeedUid'\nimport { ensureEasSchemasForItem } from '../helpers/ensureEasSchemas'\nimport { verifyArweaveTransactionsExist } from '../helpers/verifyArweaveTransactionsExist'\nimport { getPublishConfig } from '~/config'\nimport { waitForItem } from './utils'\nimport { ZERO_BYTES32 } from './utils'\nimport {\n seedUidFromCreatedAttestationEvents,\n seedUidFromSeedPublished,\n versionUidFromCreatedAttestationEvents,\n uidsFromSeedPublished,\n listCreatedAttestationPairsFromReceipt,\n type CreatedAttestationPair,\n} from './seedUidHelpers'\nimport { attestationMsFromReceipt } from '../helpers/receiptAttestationMs'\nimport {\n normalizePublishRequest,\n applyPropertiesToUpdatePlaceholders,\n hasCrossPayloadUnresolved,\n filterPropertiesToUpdateForBatch,\n toHex32,\n} from './publishRequestNormalize'\nimport { enqueueArweaveL1FinalizeJobsFromPublishContext } from '../../arweaveL1Finalize/enqueue'\nimport { ensureEip7702ModularAccountReady } from '~/helpers/ensureEip7702ModularAccountReady'\nimport { ensureManagedAccountEasConfigured } from '~/helpers/ensureManagedAccountEasConfigured'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:actors')\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\ntype ReceiptLike = {\n blockNumber?: bigint\n logs?: Array<{ address?: string; data?: string; topics?: unknown[] }>\n}\n\ntype PublishRoutingInput = {\n useModularExecutor: boolean\n publisherAddress: string\n modularAccountModuleContract?: string\n managedAddress?: string\n}\n\ntype PublishRouting = {\n txTargetAddress: string\n contractAddressForEvents: string\n}\n\nexport function resolvePublishRouting(input: PublishRoutingInput): PublishRouting {\n const {\n useModularExecutor,\n publisherAddress,\n modularAccountModuleContract,\n managedAddress,\n } = input\n if (useModularExecutor) {\n if (!managedAddress) {\n throw new Error('resolvePublishRouting: managedAddress is required when useModularExecutor is true')\n }\n return {\n txTargetAddress: managedAddress,\n contractAddressForEvents: modularAccountModuleContract || managedAddress,\n }\n }\n return {\n txTargetAddress: publisherAddress,\n contractAddressForEvents: publisherAddress,\n }\n}\n\nasync function persistVersionUidFromPublishReceipt(params: {\n receipt: ReceiptLike\n seedLocalId: string | undefined\n versionSchemaUid: string | undefined\n contractAddressForEvents: string\n listOfAttestationsCount: number\n useModularExecutor: boolean\n publisherAddress: string\n}): Promise<void> {\n const {\n receipt,\n seedLocalId,\n versionSchemaUid,\n contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n publisherAddress,\n } = params\n if (!seedLocalId) return\n const raw =\n versionUidFromCreatedAttestationEvents(\n receipt,\n versionSchemaUid,\n useModularExecutor,\n ) ??\n uidsFromSeedPublished(\n receipt,\n contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n ).versionUid\n const versionUid = raw ? toHex32(raw) : undefined\n if (!versionUid || versionUid === ZERO_BYTES32) return\n const attMs = await attestationMsFromReceipt(getClient(), optimismSepolia, receipt)\n await updateVersionUid({\n seedLocalId,\n versionUid,\n publisher: publisherAddress,\n attestationCreatedAt: attMs,\n })\n}\n\nfunction schemaMatchesAttestationPair(\n pairSchema: string | undefined,\n requestSchema: string | undefined,\n): boolean {\n if (!pairSchema || !requestSchema) return false\n return toHex32(pairSchema).toLowerCase() === toHex32(requestSchema).toLowerCase()\n}\n\nfunction consumeIfSchemaMatches(\n all: CreatedAttestationPair[],\n offset: number,\n schemaUid: string | undefined,\n): number {\n if (!schemaUid || offset >= all.length) return offset\n if (schemaMatchesAttestationPair(all[offset]?.schemaUid, schemaUid)) return offset + 1\n return offset\n}\n\n/**\n * Walk CreatedAttestation event order (per request: optional seed, version, then property schemas)\n * and persist property attestation UIDs onto metadata rows.\n */\nasync function persistPropertyMetadataUidsFromContractReceipt(params: {\n receipt: ReceiptLike\n normalizedRequests: any[]\n useModularExecutor: boolean\n}): Promise<void> {\n const { receipt, normalizedRequests, useModularExecutor } = params\n const allPairs = listCreatedAttestationPairsFromReceipt(receipt, useModularExecutor)\n if (!allPairs.length) return\n const attMs = await attestationMsFromReceipt(getClient(), optimismSepolia, receipt)\n let offset = 0\n for (const req of normalizedRequests) {\n const list = req.listOfAttestations ?? []\n if (!list.length) continue\n const hadNewSeed = !req.seedUid || toHex32(req.seedUid) === ZERO_BYTES32\n if (hadNewSeed) {\n offset = consumeIfSchemaMatches(allPairs, offset, req.seedSchemaUid)\n }\n offset = consumeIfSchemaMatches(allPairs, offset, req.versionSchemaUid)\n const n = list.length\n const slice = allPairs.slice(offset, offset + n)\n offset += n\n if (!slice.length) continue\n const nApply = Math.min(slice.length, n)\n let versionUidRow =\n req.versionUid && toHex32(req.versionUid) !== ZERO_BYTES32\n ? toHex32(req.versionUid)\n : undefined\n if (!versionUidRow) {\n versionUidRow = versionUidFromCreatedAttestationEvents(\n receipt,\n req.versionSchemaUid,\n useModularExecutor,\n )\n }\n await applyPropertyAttestationUidsFromPublish({\n seedLocalId: req.localId,\n attestationCreatedAtMs: attMs ?? null,\n versionUid:\n versionUidRow && toHex32(versionUidRow) !== ZERO_BYTES32 ? toHex32(versionUidRow) : null,\n pairs: slice.slice(0, nApply).map((p, j) => ({\n schemaUid: p.schemaUid,\n attestationUid: p.attestationUid,\n propertyName:\n typeof list[j]?._propertyName === 'string' && list[j]._propertyName !== ''\n ? list[j]._propertyName\n : undefined,\n })),\n })\n }\n}\n\nexport const createAttestations = fromPromise(\n async ({ input: { context } }: PublishInput): Promise<{ easPayload: unknown }> => {\n const { address, account } = context\n const arweaveTransactions = context.arweaveTransactions ?? []\n const publishUploads = context.publishUploads ?? []\n let { item } = context\n\n const { modularAccountModuleContract, useModularExecutor } = getPublishConfig()\n\n if (!address || typeof address !== 'string' || !address.trim()) {\n throw new Error('No wallet address for publish. Connect a wallet and try again.')\n }\n\n if (!account) {\n throw new Error('Wallet session is missing. Reconnect your wallet and retry the publish.')\n }\n\n if (!useModularExecutor && !(await isSmartWalletDeployed(address))) {\n throw new Error(\n 'EOA publishing must use the direct EAS path (multiPublish requires a deployed publisher contract). If you see this, attestation routing is misconfigured.',\n )\n }\n\n if (!item?.seedLocalId) {\n throw new Error(\n 'Attestation recovery failed: Item data is missing. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const waitForItemUsed = typeof item.getPublishUploads !== 'function'\n if (waitForItemUsed) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const txCount = arweaveTransactions.length\n const uploadCount = publishUploads.length\n if (txCount !== uploadCount) {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data is missing or incomplete. Delete this publish record and try a full publish from the beginning.',\n )\n }\n\n let routing = resolvePublishRouting({\n useModularExecutor: false,\n publisherAddress: address,\n })\n let activeAccount = account\n\n await ensureEasSchemasForItem(item, account, getClient(), optimismSepolia)\n\n const uploadDataWithTxIds: Array<PublishUpload & { txId: string }> = arweaveTransactions.map(\n (arweaveTransaction: ArweaveTransactionInfo, i: number) => {\n const tx = arweaveTransaction.transaction as { id?: string }\n const txId = tx?.id\n if (!txId || typeof txId !== 'string') {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data did not survive restore. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const upload = publishUploads[i] as PublishUpload | undefined\n if (!upload) throw new Error('Publish upload index mismatch')\n return { ...upload, txId }\n },\n )\n\n await verifyArweaveTransactionsExist(uploadDataWithTxIds.map((u) => u.txId))\n\n const requestData = await (\n item.getPublishPayload as (\n uploads: typeof uploadDataWithTxIds,\n opts?: { publishMode?: 'patch' | 'new_version' },\n ) => ReturnType<typeof item.getPublishPayload>\n )(uploadDataWithTxIds, { publishMode: context.publishMode ?? 'patch' })\n\n const reqs = Array.isArray(requestData) ? requestData : [requestData]\n\n if (useModularExecutor) {\n const prep = await runModularExecutorPublishPrep()\n if (!prep.ok) {\n throw prep.error\n }\n routing = resolvePublishRouting({\n useModularExecutor,\n publisherAddress: address,\n modularAccountModuleContract,\n managedAddress: prep.managedAddress,\n })\n const modularAccountWallet = getModularAccountWallet()\n await modularAccountWallet.autoConnect({ client: getClient(), chain: optimismSepolia })\n const modularAccount = modularAccountWallet.getAccount()\n if (!modularAccount) {\n throw new Error('Failed to get modular account')\n }\n activeAccount = modularAccount\n await ensureEip7702ModularAccountReady()\n await ensureManagedAccountEasConfigured(prep.managedAddress, modularAccount)\n }\n const targetContract = getContract({\n client: getClient(),\n chain: optimismSepolia,\n address: routing.txTargetAddress,\n })\n\n const needsSequential = reqs.length > 1 && hasCrossPayloadUnresolved(reqs)\n\n let effectiveRequests: any[]\n let lastAttestationReceipt: ReceiptLike | null = null\n\n if (needsSequential) {\n let workingPayload = structuredClone(reqs) as any[]\n const resolvedUids: Record<string, string> = {}\n\n for (let i = 0; i < workingPayload.length; i++) {\n workingPayload = await resolvePublishPayloadValues(workingPayload as any, resolvedUids)\n const rawReq = workingPayload[i]\n const batchLocalIds = new Set([rawReq.localId])\n const reqForPublish = {\n ...rawReq,\n propertiesToUpdate: filterPropertiesToUpdateForBatch(rawReq.propertiesToUpdate, batchLocalIds),\n }\n const normalizedOne = normalizePublishRequest(reqForPublish)\n const byLocalIdSingle = new Map([[normalizedOne.localId, normalizedOne]])\n applyPropertiesToUpdatePlaceholders([normalizedOne], byLocalIdSingle)\n\n const tx = {\n ...multiPublish({\n contract: targetContract,\n requests: [normalizedOne],\n }),\n gas: 5_000_000n,\n }\n\n const result = await sendTransaction({\n account: activeAccount,\n transaction: await Promise.resolve(tx),\n })\n\n const receipt = await waitForReceipt({\n client: getClient(),\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) {\n throw new Error('Failed to send transaction')\n }\n\n lastAttestationReceipt = receipt\n const listOfAttestationsCount = normalizedOne?.listOfAttestations?.length ?? 0\n await persistVersionUidFromPublishReceipt({\n receipt,\n seedLocalId: rawReq.localId,\n versionSchemaUid: normalizedOne.versionSchemaUid,\n contractAddressForEvents: routing.contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n publisherAddress: address,\n })\n\n const hadZeroSeedUid =\n !normalizedOne.seedUid || toHex32(normalizedOne.seedUid) === ZERO_BYTES32\n const seedSchemaUid = normalizedOne?.seedSchemaUid\n if (hadZeroSeedUid) {\n const seedUidFromTx =\n seedUidFromCreatedAttestationEvents(receipt, seedSchemaUid, useModularExecutor) ??\n seedUidFromSeedPublished(\n receipt,\n routing.contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n )\n if (seedUidFromTx) {\n resolvedUids[rawReq.localId] = seedUidFromTx\n workingPayload[i] = { ...workingPayload[i], seedUid: seedUidFromTx }\n }\n }\n\n await persistPropertyMetadataUidsFromContractReceipt({\n receipt,\n normalizedRequests: [normalizedOne],\n useModularExecutor,\n })\n }\n\n for (const p of workingPayload) {\n const id = p?.localId\n const su = p?.seedUid\n if (id && su && toHex32(su) !== ZERO_BYTES32) {\n resolvedUids[id] = toHex32(su)\n }\n }\n\n const fullyResolved = await resolvePublishPayloadValues(structuredClone(reqs), resolvedUids)\n effectiveRequests = fullyResolved.map((r: any) =>\n normalizePublishRequest({\n ...r,\n seedUid: resolvedUids[r.localId] ?? r.seedUid,\n }),\n )\n } else {\n const normalizedRequests = reqs.map((req: any) => normalizePublishRequest(req))\n\n const byLocalId = new Map(normalizedRequests.map((r: any) => [r?.localId, r]))\n applyPropertiesToUpdatePlaceholders(normalizedRequests, byLocalId)\n\n const payloadForContract = Array.isArray(requestData) ? normalizedRequests : [normalizedRequests[0]]\n const tx = {\n ...multiPublish({\n contract: targetContract,\n requests: payloadForContract,\n }),\n gas: 5_000_000n,\n }\n\n let result: Awaited<ReturnType<typeof sendTransaction>>\n try {\n result = await sendTransaction({\n account: activeAccount,\n transaction: await Promise.resolve(tx),\n })\n } catch (e) {\n logger('sendTransaction failed in non-sequential publish %O', e)\n throw e\n }\n\n const receipt = await waitForReceipt({\n client: getClient(),\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) {\n throw new Error('Failed to send transaction')\n }\n\n lastAttestationReceipt = receipt\n const rootReqSingle =\n normalizedRequests.find((r: any) => r?.localId === item.seedLocalId) ?? normalizedRequests[0]\n await persistVersionUidFromPublishReceipt({\n receipt,\n seedLocalId: rootReqSingle?.localId,\n versionSchemaUid: rootReqSingle?.versionSchemaUid,\n contractAddressForEvents: routing.contractAddressForEvents,\n listOfAttestationsCount: rootReqSingle?.listOfAttestations?.length ?? 0,\n useModularExecutor,\n publisherAddress: address,\n })\n\n await persistPropertyMetadataUidsFromContractReceipt({\n receipt,\n normalizedRequests: payloadForContract,\n useModularExecutor,\n })\n\n const firstRequest = normalizedRequests[0]\n const firstRequestSeedUid = firstRequest?.seedUid\n const hadZeroSeedUid = firstRequestSeedUid === ZERO_BYTES32 || !firstRequestSeedUid\n const listOfAttestationsCount = firstRequest?.listOfAttestations?.length ?? 0\n const seedSchemaUid = firstRequest?.seedSchemaUid\n const seedUidFromTx = hadZeroSeedUid\n ? (seedUidFromCreatedAttestationEvents(receipt, seedSchemaUid, useModularExecutor) ??\n seedUidFromSeedPublished(\n receipt,\n routing.contractAddressForEvents,\n listOfAttestationsCount,\n useModularExecutor,\n ))\n : undefined\n effectiveRequests =\n seedUidFromTx && normalizedRequests.length > 0\n ? [{ ...normalizedRequests[0], seedUid: seedUidFromTx }, ...normalizedRequests.slice(1)]\n : normalizedRequests\n }\n\n persistSeedUidFromPublishResult(item as { seedUid?: string; seedLocalId?: string }, effectiveRequests)\n const itemWithPersist = item as {\n persistSeedUid?: (publisher?: string, attestationCreatedAtMs?: number) => Promise<void>\n }\n const rootRequest = effectiveRequests.find((r) => r?.localId === item.seedLocalId)\n const rootSeedUid = rootRequest?.seedUid\n if (rootSeedUid && rootSeedUid !== ZERO_BYTES32) {\n const seedAttMs = lastAttestationReceipt\n ? await attestationMsFromReceipt(getClient(), optimismSepolia, lastAttestationReceipt)\n : undefined\n await persistSeedUidSafely(itemWithPersist, address, seedAttMs)\n }\n\n logger('requestData', requestData)\n\n void enqueueArweaveL1FinalizeJobsFromPublishContext(context)\n\n try {\n const { clearHtmlEmbeddedImageCoPublishRows } = await import('@seedprotocol/sdk')\n await clearHtmlEmbeddedImageCoPublishRows(item.seedLocalId)\n } catch {\n /* best-effort cleanup */\n }\n\n return { easPayload: requestData }\n },\n)\n","import { getItemPropertiesFromEas } from '@seedprotocol/sdk'\nimport { AttestationVerificationError } from '../../../errors'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:verifyAttestations')\n\nconst ZERO_BYTES32 = '0x' + '0'.repeat(64)\n\nconst BYTES32_LEN = 64\nconst toHex32 = (v: unknown): string => {\n if (v == null) return '0x' + '0'.repeat(BYTES32_LEN)\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n return '0x' + hex\n }\n return '0x' + '0'.repeat(BYTES32_LEN)\n}\n\n/** Delay between verification retries. EAS indexing can lag; longer delay improves success rate. */\nconst VERIFY_DELAY_MS = 5000\n/** Max retries before giving up. EAS indexing can take 10–30+ seconds in high load. */\nconst VERIFY_MAX_ATTEMPTS = 6\n\ntype NormalizedRequest = {\n localId: string\n versionUid: string\n listOfAttestations: Array<{ schema: string }>\n}\n\ntype VerifyAttestationsInput = {\n normalizedRequests: NormalizedRequest[]\n item: { seedLocalId: string }\n}\n\n/**\n * Verifies that property/metadata attestations created during publish exist on EAS.\n * Throws AttestationVerificationError if any expected attestations are missing.\n */\nexport async function verifyAttestations({\n normalizedRequests,\n item,\n}: VerifyAttestationsInput): Promise<void> {\n const seedLocalId = item.seedLocalId\n\n for (const request of normalizedRequests) {\n if (request.listOfAttestations.length === 0) continue\n if (request.versionUid === ZERO_BYTES32) continue\n\n const expectedSchemas = request.listOfAttestations.map((a) =>\n toHex32(a.schema).toLowerCase(),\n )\n\n let easProperties: { schemaId?: string }[] = []\n let lastError: unknown\n\n for (let attempt = 1; attempt <= VERIFY_MAX_ATTEMPTS; attempt++) {\n try {\n if (attempt > 1) {\n await new Promise((r) => setTimeout(r, VERIFY_DELAY_MS))\n }\n easProperties = await getItemPropertiesFromEas({\n versionUids: [request.versionUid],\n })\n break\n } catch (err) {\n lastError = err\n logger('verifyAttestations attempt %d failed:', attempt, err)\n if (attempt === VERIFY_MAX_ATTEMPTS) {\n logger('verifyAttestations: giving up after %d attempts', VERIFY_MAX_ATTEMPTS)\n throw lastError\n }\n }\n }\n\n const foundSchemas = easProperties\n .map((p) => (p.schemaId ? toHex32(p.schemaId).toLowerCase() : ''))\n .filter(Boolean)\n const foundSet = new Set(foundSchemas)\n\n const missing = expectedSchemas.filter((s) => !foundSet.has(s))\n if (missing.length > 0) {\n throw new AttestationVerificationError(\n `Publish verification failed: Seed and Version attestations were created, but ` +\n `property/metadata attestations are missing or incomplete. ` +\n `Expected ${expectedSchemas.length} property attestations for schema(s) ${expectedSchemas.join(', ')}; ` +\n `found ${foundSchemas.length}. ` +\n `Use PublishManager.retryAttestations('${seedLocalId}') to retry.`,\n seedLocalId,\n expectedSchemas,\n foundSchemas,\n 'METADATA_PROPERTIES_MISSING',\n )\n }\n }\n}\n","import { fromPromise } from 'xstate'\nimport type { PublishMachineContext } from '../../../types'\nimport { ZERO_ADDRESS } from '@ethereum-attestation-service/eas-sdk'\nimport { sendTransaction, waitForReceipt } from 'thirdweb'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getClient } from '~/helpers/thirdweb'\nimport {\n Item,\n updateVersionUid,\n applyPropertyAttestationUidsFromPublish,\n type IItem,\n} from '@seedprotocol/sdk'\nimport type { PublishUpload } from '../../../types'\nimport { persistSeedUidFromPublishResult, persistSeedUidSafely } from './persistSeedUid'\nimport { verifyAttestations } from '../helpers/verifyAttestations'\nimport { AttestationVerificationError } from '../../../errors'\nimport { ensureEasSchemasForItem } from '../helpers/ensureEasSchemas'\nimport { verifyArweaveTransactionsExist } from '../helpers/verifyArweaveTransactionsExist'\nimport { enqueueArweaveL1FinalizeJobsFromPublishContext } from '../../arweaveL1Finalize/enqueue'\nimport { getPublishConfig } from '~/config'\nimport { attestationMsFromReceipt } from '../helpers/receiptAttestationMs'\nimport {\n prepareEasAttest,\n prepareEasMultiAttest,\n encodeBytes32,\n ZERO_BYTES32,\n getAttestationUidFromReceipt,\n getAttestedUidsFromReceipt,\n type MultiAttestationRequest,\n} from '~/helpers/easDirect'\nimport type { ArweaveTransactionInfo } from '../../../types'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:publish:createAttestationsDirectToEas')\n\nconst BYTES32_LEN = 64\nconst toHex32 = (v: unknown): string => {\n if (v == null) return '0x' + '0'.repeat(BYTES32_LEN)\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0').padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n return '0x' + hex\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n const hex = Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n return '0x' + hex.padStart(BYTES32_LEN, '0').slice(-BYTES32_LEN)\n }\n return '0x' + '0'.repeat(BYTES32_LEN)\n}\nconst toBytesHex = (v: unknown): string => {\n if (v == null || (typeof v === 'string' && (v === '' || v === '0x'))) return '0x'\n if (typeof v === 'string') {\n const raw = v.startsWith('0x') ? v.slice(2) : v\n const hex = raw.replace(/[^0-9a-fA-F]/g, '0')\n return '0x' + (hex.length % 2 === 1 ? '0' + hex : hex)\n }\n if (v instanceof Uint8Array || (typeof ArrayBuffer !== 'undefined' && v instanceof ArrayBuffer)) {\n const arr = v instanceof Uint8Array ? v : new Uint8Array(v)\n return '0x' + Array.from(arr).map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n return '0x'\n}\n\nconst waitForItem = async (seedLocalId: string): Promise<IItem<any>> => {\n let item: IItem<any> | undefined\n try {\n item = await Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n } catch {\n // No-op\n }\n if (item) return item\n return new Promise<IItem<any>>((resolve) => {\n const interval = setInterval(() => {\n try {\n Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n .then((found: IItem<any> | undefined) => {\n if (found) {\n clearInterval(interval)\n resolve(found)\n }\n })\n } catch {\n // No-op\n }\n }, 200)\n })\n}\n\ntype PublishInput = { input: { context: PublishMachineContext; event: unknown } }\n\ntype NormalizedRequest = {\n localId: string\n seedUid: string\n seedSchemaUid: string\n versionUid: string\n versionSchemaUid: string\n seedIsRevocable: boolean\n listOfAttestations: Array<{\n schema: string\n data: Array<{\n recipient: string\n expirationTime: bigint\n revocable: boolean\n refUID: string\n data: string\n value: bigint\n }>\n _propertyName?: string\n _propertyNameForSchema?: string\n }>\n propertiesToUpdate: Array<{ publishLocalId: string; propertySchemaUid: string }>\n}\n\nexport const createAttestationsDirectToEas = fromPromise(\n async ({ input: { context, event } }: PublishInput): Promise<{ easPayload: unknown }> => {\n const { address, account } = context\n const arweaveTransactions = context.arweaveTransactions ?? []\n const publishUploads = context.publishUploads ?? []\n let { item } = context\n\n if (!address || typeof address !== 'string' || !address.trim()) {\n throw new Error('No wallet address for publish. Connect a wallet and try again.')\n }\n\n if (!account) {\n throw new Error('Wallet session is missing. Reconnect your wallet and retry the publish.')\n }\n\n if (!item?.seedLocalId) {\n throw new Error(\n 'Attestation recovery failed: Item data is missing. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const waitForItemUsed = typeof item.getPublishUploads !== 'function'\n if (waitForItemUsed) {\n item = await waitForItem(item.seedLocalId)\n }\n\n const txCount = arweaveTransactions.length\n const uploadCount = publishUploads.length\n if (txCount !== uploadCount) {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data is missing or incomplete. Delete this publish record and try a full publish from the beginning.',\n )\n }\n\n await ensureEasSchemasForItem(item, account, getClient(), optimismSepolia)\n\n const uploadDataWithTxIds: Array<PublishUpload & { txId: string }> = arweaveTransactions.map(\n (arweaveTransaction: ArweaveTransactionInfo, i: number) => {\n const tx = arweaveTransaction.transaction as { id?: string }\n const txId = tx?.id\n if (!txId || typeof txId !== 'string') {\n throw new Error(\n 'Attestation recovery failed: Arweave transaction data did not survive restore. Delete this publish record and try a full publish from the beginning.',\n )\n }\n const upload = publishUploads[i] as PublishUpload | undefined\n if (!upload) throw new Error('Publish upload index mismatch')\n return { ...upload, txId }\n },\n )\n\n await verifyArweaveTransactionsExist(uploadDataWithTxIds.map((u) => u.txId))\n\n const requestData = await (\n item.getPublishPayload as (\n uploads: typeof uploadDataWithTxIds,\n opts?: { publishMode?: 'patch' | 'new_version' },\n ) => ReturnType<typeof item.getPublishPayload>\n )(uploadDataWithTxIds, { publishMode: context.publishMode ?? 'patch' })\n const reqs = Array.isArray(requestData) ? requestData : [requestData]\n\n const normalizedRequests: NormalizedRequest[] = reqs.map((req: any) => {\n const listOfAttestations = (req?.listOfAttestations ?? []).map((att: any) => {\n const dataArr = Array.isArray(att?.data) ? att.data : []\n return {\n schema: toHex32(att?.schema),\n data: dataArr.map((d: any) => ({\n ...d,\n refUID: toHex32(d?.refUID),\n data: toBytesHex(d?.data),\n })),\n ...(typeof att?._propertyName === 'string' && att._propertyName !== ''\n ? { _propertyName: att._propertyName }\n : {}),\n ...(typeof att?._propertyNameForSchema === 'string' && att._propertyNameForSchema !== ''\n ? { _propertyNameForSchema: att._propertyNameForSchema }\n : {}),\n }\n })\n const propertiesToUpdate = (req?.propertiesToUpdate ?? []).map((p: any) => ({\n ...p,\n propertySchemaUid: toHex32(p?.propertySchemaUid),\n }))\n return {\n ...req,\n seedUid: toHex32(req?.seedUid),\n seedSchemaUid: toHex32(req?.seedSchemaUid),\n versionUid: toHex32(req?.versionUid),\n versionSchemaUid: toHex32(req?.versionSchemaUid),\n listOfAttestations,\n propertiesToUpdate,\n }\n })\n\n const byLocalId = new Map(normalizedRequests.map((r) => [r.localId, r]))\n const placeholderData = {\n recipient: ZERO_ADDRESS,\n expirationTime: BigInt(0),\n revocable: true,\n refUID: ZERO_BYTES32,\n data: ZERO_BYTES32 as `0x${string}`,\n value: BigInt(0),\n }\n for (const req of normalizedRequests) {\n for (const pu of req.propertiesToUpdate ?? []) {\n const targetId = pu.publishLocalId\n const schemaUid = toHex32(pu.propertySchemaUid)\n if (!targetId || !schemaUid) continue\n const targetReq = byLocalId.get(targetId)\n if (!targetReq?.listOfAttestations) continue\n const att = targetReq.listOfAttestations.find(\n (a) => toHex32(a?.schema)?.toLowerCase() === schemaUid?.toLowerCase(),\n )\n if (!att) continue\n if (!Array.isArray(att.data) || att.data.length === 0) {\n att.data = [{ ...placeholderData, refUID: ZERO_BYTES32 }]\n }\n }\n }\n\n const client = getClient()\n let lastAttestationMs = Date.now()\n\n for (let i = 0; i < normalizedRequests.length; i++) {\n const request = normalizedRequests[i] as NormalizedRequest\n let newSeedUid = request.seedUid\n let newVersionUid = request.versionUid\n\n if (newSeedUid === ZERO_BYTES32) {\n const attestTx = prepareEasAttest(client, optimismSepolia, {\n schema: request.seedSchemaUid as `0x${string}`,\n data: {\n refUID: ZERO_BYTES32,\n data: encodeBytes32(request.seedSchemaUid as `0x${string}`),\n revocable: request.seedIsRevocable,\n },\n })\n const result = await sendTransaction({ account, transaction: attestTx })\n const receipt = await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) throw new Error('Failed to create Seed attestation')\n lastAttestationMs = await attestationMsFromReceipt(client, optimismSepolia, receipt)\n const { easContractAddress } = getPublishConfig()\n const seedUidFromReceipt = getAttestationUidFromReceipt(receipt, easContractAddress)\n if (!seedUidFromReceipt || seedUidFromReceipt === ZERO_BYTES32) {\n throw new Error('Failed to get Seed UID from attestation receipt')\n }\n newSeedUid = seedUidFromReceipt\n request.seedUid = seedUidFromReceipt\n logger('created Seed attestation', newSeedUid)\n }\n\n if (newSeedUid !== ZERO_BYTES32 && newVersionUid === ZERO_BYTES32) {\n const attestTx = prepareEasAttest(client, optimismSepolia, {\n schema: request.versionSchemaUid as `0x${string}`,\n data: {\n refUID: newSeedUid as `0x${string}`,\n data: encodeBytes32(request.versionSchemaUid as `0x${string}`),\n revocable: true,\n },\n })\n const result = await sendTransaction({ account, transaction: attestTx })\n const receipt = await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) throw new Error('Failed to create Version attestation')\n lastAttestationMs = await attestationMsFromReceipt(client, optimismSepolia, receipt)\n const { easContractAddress } = getPublishConfig()\n const versionUidFromReceipt = getAttestationUidFromReceipt(receipt, easContractAddress)\n if (!versionUidFromReceipt || versionUidFromReceipt === ZERO_BYTES32) {\n throw new Error('Failed to get Version UID from attestation receipt')\n }\n newVersionUid = versionUidFromReceipt\n request.versionUid = versionUidFromReceipt\n await updateVersionUid({\n seedLocalId: request.localId,\n versionUid: versionUidFromReceipt,\n publisher: address,\n attestationCreatedAt: lastAttestationMs,\n })\n logger('created Version attestation', newVersionUid)\n }\n\n for (const att of request.listOfAttestations) {\n for (const d of att.data) {\n d.refUID = newVersionUid\n }\n }\n\n for (const pu of request.propertiesToUpdate ?? []) {\n const targetReq = byLocalId.get(pu.publishLocalId)\n if (!targetReq?.listOfAttestations) continue\n const schemaUid = toHex32(pu.propertySchemaUid)\n const att = targetReq.listOfAttestations.find(\n (a) => toHex32(a?.schema)?.toLowerCase() === schemaUid?.toLowerCase(),\n )\n if (!att?.data?.[0]) continue\n att.data[0].data = encodeBytes32(newSeedUid as `0x${string}`)\n }\n\n const multiRequests: MultiAttestationRequest[] = request.listOfAttestations.map((att) => ({\n schema: att.schema as `0x${string}`,\n data: att.data.map((d) => ({\n recipient: (d.recipient ?? ZERO_ADDRESS) as `0x${string}`,\n expirationTime: d.expirationTime ?? 0n,\n revocable: d.revocable ?? true,\n refUID: (d.refUID ?? ZERO_BYTES32) as `0x${string}`,\n data: (d.data ?? '0x') as `0x${string}`,\n value: d.value ?? 0n,\n })),\n }))\n\n if (multiRequests.length > 0) {\n const multiTx = prepareEasMultiAttest(client, optimismSepolia, multiRequests)\n const result = await sendTransaction({ account, transaction: multiTx })\n const receipt = await waitForReceipt({\n client,\n chain: optimismSepolia,\n transactionHash: result.transactionHash,\n })\n if (!receipt) throw new Error('Failed to create property attestations')\n lastAttestationMs = await attestationMsFromReceipt(client, optimismSepolia, receipt)\n logger('created property attestations for request', i)\n const { easContractAddress } = getPublishConfig()\n const attested = getAttestedUidsFromReceipt(receipt, easContractAddress)\n const list = request.listOfAttestations\n const sameLen = attested.length === list.length\n await applyPropertyAttestationUidsFromPublish({\n seedLocalId: request.localId,\n attestationCreatedAtMs: lastAttestationMs ?? null,\n versionUid: newVersionUid !== ZERO_BYTES32 ? newVersionUid : null,\n pairs: attested.map((a, j) => ({\n schemaUid: a.schemaUid,\n attestationUid: a.uid,\n propertyName:\n sameLen && typeof list[j]?._propertyName === 'string' && list[j]!._propertyName !== ''\n ? list[j]!._propertyName\n : undefined,\n })),\n })\n }\n }\n\n persistSeedUidFromPublishResult(item as { seedUid?: string }, normalizedRequests)\n const itemWithPersist = item as {\n persistSeedUid?: (publisher?: string, attestationCreatedAtMs?: number) => Promise<void>\n }\n if (normalizedRequests[0]?.seedUid && normalizedRequests[0].seedUid !== ZERO_BYTES32) {\n await persistSeedUidSafely(itemWithPersist, address, lastAttestationMs)\n }\n\n try {\n await verifyAttestations({ normalizedRequests, item })\n } catch (err) {\n if (err instanceof AttestationVerificationError) {\n throw err\n }\n logger('verifyAttestations failed (non-verification error):', err)\n throw err\n }\n\n logger('direct EAS publish complete')\n\n void enqueueArweaveL1FinalizeJobsFromPublishContext(context)\n\n try {\n const { clearHtmlEmbeddedImageCoPublishRows } = await import('@seedprotocol/sdk')\n await clearHtmlEmbeddedImageCoPublishRows(item.seedLocalId)\n } catch {\n /* best-effort cleanup */\n }\n\n return { easPayload: requestData }\n },\n)\n","import { Item, itemHasPublishUploadCandidates, type IItem } from '@seedprotocol/sdk'\n\n/**\n * Resolve a full Item (with getPublishUploads) by seedLocalId, polling until found.\n * Used when the input item might not have the data needed for the \"needs Arweave\" check.\n */\nconst resolveItem = async (seedLocalId: string): Promise<IItem<any>> => {\n let item: IItem<any> | undefined\n try {\n item = await Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n } catch {\n // No-op: Error is intentionally ignored\n }\n if (item) return item\n\n return new Promise<IItem<any>>((resolve) => {\n const interval = setInterval(() => {\n Item.find({ seedLocalId } as Parameters<typeof Item.find>[0])\n .then((found: IItem<any> | undefined) => {\n if (found) {\n clearInterval(interval)\n resolve(found)\n }\n })\n .catch(() => {})\n }, 200)\n })\n}\n\n/**\n * Returns true if the item needs the Arweave upload path (reimbursement, poll, upload)\n * before creating attestations. Returns false when the item has no storage or no values\n * to upload, in which case the publish flow can skip straight to EAS.\n *\n * Uses {@link itemHasPublishUploadCandidates} (local paths / storage seeds only) so we do not\n * create Arweave transactions or call the network here — {@link getPublishUploads} builds txs\n * and can throw (e.g. gateway unreachable) even when uploads are required.\n */\nexport async function itemNeedsArweaveUpload(item: IItem<any>): Promise<boolean> {\n const usedPassedItem = typeof item.getPublishUploads === 'function'\n const resolved = usedPassedItem\n ? item\n : await resolveItem(item.seedLocalId)\n const needs = await itemHasPublishUploadCandidates(resolved)\n return needs\n}\n","import type { PublishMachineContext } from '../../../types'\n\ntype FromCallbackInput<T> = { context: T; event?: unknown }\nimport { EventObject, fromCallback } from 'xstate'\nimport { optimismSepolia } from 'thirdweb/chains'\nimport { getClient, isSmartWalletDeployed } from '~/helpers/thirdweb'\nimport { itemNeedsArweaveUpload } from '../helpers/itemNeedsArweave'\nimport { ensureEasSchemasForItem } from '../helpers/ensureEasSchemas'\nimport { isItemOwned, validateItemForPublish } from '@seedprotocol/sdk'\nimport { getPublishConfig } from '~/config'\n\nconst activePublishProcesses = new Set<string>()\n\nasync function resolveAttestationStrategy(publisherAddress: string): Promise<'multiPublish' | 'directEas'> {\n const cfg = getPublishConfig()\n if (cfg.useDirectEas) return 'directEas'\n if (cfg.useModularExecutor) return 'multiPublish'\n const deployed = await isSmartWalletDeployed(publisherAddress)\n return deployed ? 'multiPublish' : 'directEas'\n}\n\nexport const checking = fromCallback<EventObject, FromCallbackInput<PublishMachineContext>>(\n ({ sendBack, input: { context } }) => {\n const { item, account, publishMode, address } = context\n\n const _check = async () => {\n const owned = await isItemOwned(item)\n if (!owned) {\n sendBack({ type: 'notOwner' })\n return\n }\n\n if (activePublishProcesses.has(item.seedLocalId)) {\n sendBack({\n type: 'redundantPublishProcess',\n })\n return\n }\n\n activePublishProcesses.add(item.seedLocalId)\n\n try {\n if (account) {\n await ensureEasSchemasForItem(item, account, getClient(), optimismSepolia)\n }\n\n const validation = await (validateItemForPublish as any)(item, [], {\n publishMode: publishMode ?? 'patch',\n })\n if (!validation.isValid) {\n activePublishProcesses.delete(item.seedLocalId)\n sendBack({ type: 'validationFailed', errors: validation.errors })\n return\n }\n\n if (!address || typeof address !== 'string' || !address.trim()) {\n activePublishProcesses.delete(item.seedLocalId)\n sendBack({\n type: 'validationFailed',\n errors: [{ message: 'No publisher address for publish. Connect a wallet and try again.' }],\n })\n return\n }\n\n let attestationStrategy: 'multiPublish' | 'directEas'\n try {\n attestationStrategy = await resolveAttestationStrategy(address.trim())\n } catch (cause) {\n activePublishProcesses.delete(item.seedLocalId)\n sendBack({\n type: 'checkingFailed',\n error: new Error(\n 'Could not verify whether the publisher is a deployed contract on Optimism Sepolia. Check your RPC connection and retry.',\n { cause },\n ),\n })\n return\n }\n\n const needsArweave = await itemNeedsArweaveUpload(item)\n const useBundler = getPublishConfig().useArweaveBundler\n const payload = { attestationStrategy } as const\n if (needsArweave) {\n if (useBundler) {\n sendBack({ type: 'validPublishProcessBundler', ...payload })\n } else {\n sendBack({ type: 'validPublishProcess', ...payload })\n }\n } else {\n sendBack({ type: 'skipArweave', ...payload })\n }\n } catch (err) {\n activePublishProcesses.delete(item.seedLocalId)\n console.error('[checking] failed', err)\n sendBack({\n type: 'checkingFailed',\n error: err instanceof Error ? err : new Error(String(err)),\n })\n }\n }\n\n _check().catch((err) => {\n activePublishProcesses.delete(item.seedLocalId)\n console.error('[checking] unhandled rejection', err)\n sendBack({\n type: 'checkingFailed',\n error: err instanceof Error ? err : new Error(String(err)),\n })\n })\n\n return () => {\n activePublishProcesses.delete(item.seedLocalId)\n }\n },\n)\n","import type { Account } from 'thirdweb/wallets'\nimport type { ActorRefFrom } from 'xstate'\nimport { setup, assign } from 'xstate'\nimport {\n ArweaveTransactionInfo,\n PublishMachineContext,\n ReimbursementResponse,\n PublishUpload,\n} from '../../types'\nimport {\n createArweaveTransactions,\n createArweaveTransactionsPhase2,\n createArweaveDataItems,\n createArweaveDataItemsPhase2,\n createAttestations,\n createAttestationsDirectToEas,\n sendReimbursementRequest,\n pollForConfirmation,\n uploadData,\n uploadViaBundler,\n checking,\n preparingHtmlEmbedded,\n rewritingHtmlEmbedded,\n} from './actors'\nimport {\n PublishMachineStates,\n} from '~/helpers/constants'\nimport { getPublishConfig } from '~/config'\n\n\nconst {\n SUCCESS,\n FAILURE,\n} = PublishMachineStates\n\n/** Prefer context from `checking`; fall back to `useDirectEas` for restored snapshots without `attestationStrategy`. */\nfunction attestationUsesDirectEas(context: Partial<PublishMachineContext>): boolean {\n const s = context.attestationStrategy\n if (s === 'directEas') return true\n if (s === 'multiPublish') return false\n return getPublishConfig().useDirectEas\n}\n\nfunction attestationUsesMultiPublish(context: Partial<PublishMachineContext>): boolean {\n const s = context.attestationStrategy\n if (s === 'multiPublish') return true\n if (s === 'directEas') return false\n return !getPublishConfig().useDirectEas\n}\n\n/** Extract error from event. Supports event.error (custom events like uploadError) and event.data (XState fromPromise invoke errors). */\nfunction getErrorFromEvent(event: unknown): unknown {\n const e = event as { error?: unknown; data?: unknown }\n return e.error ?? e.data\n}\n\nexport const publishMachine = setup({\n types : {\n context : {} as Partial<PublishMachineContext>,\n input : {} as Partial<PublishMachineContext> | undefined,\n },\n actors : {\n createArweaveTransactions,\n createArweaveTransactionsPhase2,\n createArweaveDataItems,\n createArweaveDataItemsPhase2,\n sendReimbursementRequest,\n pollForConfirmation,\n uploadData,\n uploadViaBundler,\n createAttestations,\n createAttestationsDirectToEas,\n checking,\n preparingHtmlEmbedded,\n rewritingHtmlEmbedded,\n },\n actions : {\n /** Log error; error/errorStep are assigned per transition. Supports both event.error (custom events) and event.data (XState fromPromise invoke errors). */\n handleError : ( { event, }, ) => {\n const err = getErrorFromEvent(event,)\n if (err != null) {\n console.error(err,)\n } else {\n console.error('Unknown error (full event):', event,)\n }\n },\n assignErrorCreatingArweaveTransactions : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveTransactions',\n },),\n assignErrorCreatingArweaveDataItems : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveDataItems',\n },),\n assignErrorSendingReimbursementRequest : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'sendingReimbursementRequest',\n },),\n assignErrorPollingForConfirmation : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'pollingForConfirmation',\n },),\n assignErrorUploadingData : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingData',\n },),\n assignErrorPreparingHtmlEmbedded : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'preparingHtmlEmbedded',\n },),\n assignErrorRewritingHtmlEmbedded : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'rewritingHtmlEmbedded',\n },),\n assignErrorCreatingArweaveTransactionsPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveTransactionsPhase2',\n },),\n assignErrorUploadingDataPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingDataPhase2',\n },),\n assignErrorUploadingViaBundler : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingViaBundler',\n },),\n assignErrorCreatingArweaveDataItemsPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingArweaveDataItemsPhase2',\n },),\n assignErrorUploadingViaBundlerPhase2 : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'uploadingViaBundlerPhase2',\n },),\n assignErrorCreatingAttestations : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingAttestations',\n },),\n assignErrorCreatingAttestationsDirectToEas : assign({\n error : ( { event, }, ) => getErrorFromEvent(event,),\n errorStep : () => 'creatingAttestationsDirectToEas',\n },),\n assignAccountFromRetry : assign({\n account : ( { event, }, ) => (event as { account?: Account }).account,\n },),\n assignErrorNotOwner : assign({\n error : () => new Error('Item is read-only: you do not own this item. Only the publisher can publish.'),\n errorStep : () => 'checking',\n },),\n assignErrorValidationFailed : assign({\n error : ( { event, }, ) => {\n const ev = event as { errors?: Array<{ field?: string; message: string }> }\n const errors = ev.errors ?? []\n const message = errors.length > 0\n ? `Validation failed (${errors.length} error${errors.length === 1 ? '' : 's'}):\\n${errors.map((e) => e.message).join('\\n')}`\n : 'Validation failed'\n const err = new Error(message) as Error & { validationErrors?: typeof errors }\n err.validationErrors = errors\n return err\n },\n errorStep : () => 'checking',\n },),\n assignErrorCheckingFailed : assign({\n error : ({ event }) => {\n const ev = event as { error?: unknown }\n const e = ev.error\n return e instanceof Error ? e : new Error(String(e ?? 'Publish check failed'))\n },\n errorStep : () => 'checking',\n },),\n },\n\n},).createMachine({\n id : 'publish',\n initial : 'checking',\n context : ( { input, }, ) => input as PublishMachineContext,\n states : {\n checking : {\n on: {\n notOwner: {\n target: FAILURE,\n actions: ['assignErrorNotOwner', 'handleError'],\n },\n validationFailed: {\n target: FAILURE,\n actions: ['assignErrorValidationFailed', 'handleError'],\n },\n redundantPublishProcess: {\n target: 'stopping',\n },\n checkingFailed: {\n target: FAILURE,\n actions: ['assignErrorCheckingFailed', 'handleError'],\n },\n validPublishProcess: {\n target: 'preparingHtmlEmbedded',\n actions: assign({\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n validPublishProcessBundler: {\n target: 'preparingHtmlEmbedded',\n actions: assign({\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n skipArweave: [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n arweaveTransactions: () => [],\n publishUploads: () => [],\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n arweaveTransactions: () => [],\n publishUploads: () => [],\n attestationStrategy: ({ event }) =>\n (event as { attestationStrategy?: PublishMachineContext['attestationStrategy'] })\n .attestationStrategy,\n }),\n },\n ],\n },\n invoke : {\n src : 'checking',\n input : ( { context } ) => ({ context } as { context: PublishMachineContext }),\n },\n },\n preparingHtmlEmbedded: {\n invoke: {\n src: 'preparingHtmlEmbedded',\n input: ({ context }) => ({ context } as { context: PublishMachineContext }),\n onDone: [\n {\n guard: () => getPublishConfig().useArweaveBundler,\n target: 'creatingArweaveDataItems',\n actions: assign({\n htmlEmbeddedDeferredHtmlSeedLocalIds: ({ event }) =>\n (event.output as { deferredHtmlSeedLocalIds: string[] }).deferredHtmlSeedLocalIds,\n }),\n },\n {\n target: 'creatingArweaveTransactions',\n actions: assign({\n htmlEmbeddedDeferredHtmlSeedLocalIds: ({ event }) =>\n (event.output as { deferredHtmlSeedLocalIds: string[] }).deferredHtmlSeedLocalIds,\n }),\n },\n ],\n onError: {\n target: FAILURE,\n actions: ['assignErrorPreparingHtmlEmbedded', 'handleError'],\n },\n },\n },\n creatingArweaveTransactions : {\n invoke : {\n src : 'createArweaveTransactions',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'sendingReimbursementRequest',\n actions : assign({\n arweaveTransactions : ( { event, }, ) => event.output.arweaveTransactions as ArweaveTransactionInfo[],\n publishUploads : ( { event, }, ) => event.output.publishUploads as PublishUpload[],\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorCreatingArweaveTransactions', 'handleError', ],\n },\n },\n },\n creatingArweaveDataItems : {\n invoke : {\n src : 'createArweaveDataItems',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'uploadingViaBundler',\n actions : assign({\n arweaveTransactions : ( { event, }, ) => event.output.arweaveTransactions as ArweaveTransactionInfo[],\n publishUploads : ( { event, }, ) => event.output.publishUploads as PublishUpload[],\n signedDataItems : ( { event, }, ) => (event.output as { signedDataItems?: { id: string; raw: Uint8Array }[] }).signedDataItems,\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorCreatingArweaveDataItems', 'handleError', ],\n },\n },\n },\n sendingReimbursementRequest : {\n invoke : {\n src : 'sendReimbursementRequest',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'pollingForConfirmation',\n actions : assign({\n requestResponse : ( { event, }, ) => event.output as ReimbursementResponse,\n reimbursementTransactionId : ( { event, }, ) => (event.output as ReimbursementResponse).transactionId as string,\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorSendingReimbursementRequest', 'handleError', ],\n },\n },\n },\n pollingForConfirmation : {\n invoke : {\n src : 'pollForConfirmation',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : 'uploadingData',\n actions : assign({\n reimbursementConfirmed : true,\n },),\n },\n onError : {\n target : 'failure',\n actions : [ 'assignErrorPollingForConfirmation', 'handleError', ],\n },\n }\n },\n uploadingViaBundler : {\n on : {\n uploadComplete : [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n {\n guard: (args) =>\n ((args.context?.htmlEmbeddedDeferredHtmlSeedLocalIds?.length ?? 0) > 0),\n target: 'rewritingHtmlEmbedded',\n actions: assign({\n htmlEmbeddedPhase1PublishUploads: ({ context }) =>\n (context.publishUploads ?? []) as PublishUpload[],\n htmlEmbeddedPhase1ArweaveTransactions: ({ context }) =>\n (context.arweaveTransactions ?? []) as ArweaveTransactionInfo[],\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n ],\n uploadError : {\n target : 'failure',\n actions : [ 'assignErrorUploadingViaBundler', 'handleError', ],\n },\n },\n invoke : {\n src : 'uploadViaBundler',\n input : ( { context } ) => ({ context }) as { context: PublishMachineContext },\n },\n },\n creatingArweaveDataItemsPhase2: {\n invoke: {\n src: 'createArweaveDataItemsPhase2',\n input: ({ context, event }) =>\n ({ context, event }) as { context: PublishMachineContext; event: unknown },\n onDone: {\n target: 'uploadingViaBundlerPhase2',\n actions: assign({\n arweaveTransactions: ({ event }) =>\n (event.output as { arweaveTransactions: ArweaveTransactionInfo[] }).arweaveTransactions,\n publishUploads: ({ event }) =>\n (event.output as { publishUploads: PublishUpload[] }).publishUploads,\n signedDataItems: ({ event }) =>\n (event.output as { signedDataItems?: PublishMachineContext['signedDataItems'] })\n .signedDataItems,\n uploaderState: () => undefined,\n currentTransactionIndex: () => undefined,\n }),\n },\n onError: {\n target: FAILURE,\n actions: ['assignErrorCreatingArweaveDataItemsPhase2', 'handleError'],\n },\n },\n },\n uploadingViaBundlerPhase2: {\n on: {\n uploadComplete: [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n signedDataItems: () => undefined,\n arweaveUploadData: () => undefined,\n publishUploads: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1PublishUploads ?? []) as PublishUpload[]),\n ...((context.publishUploads ?? []) as PublishUpload[]),\n ],\n arweaveTransactions: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1ArweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ...((context.arweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ],\n }),\n },\n ],\n uploadError: {\n target: FAILURE,\n actions: ['assignErrorUploadingViaBundlerPhase2', 'handleError'],\n },\n },\n invoke: {\n src: 'uploadViaBundler',\n input: ({ context }) => ({ context }) as { context: PublishMachineContext },\n },\n },\n uploadingData : {\n on : {\n updatePercentage : {\n actions : assign({\n completionPercentage : ( { event, }, ) => {\n const ev = event as { completionPercentage?: number }\n return ev.completionPercentage as number\n },\n uploaderState : ( { event, }, ) =>\n (event as { uploaderState?: PublishMachineContext['uploaderState'] }).uploaderState,\n currentTransactionIndex : ( { event, }, ) =>\n (event as { currentTransactionIndex?: number }).currentTransactionIndex,\n },),\n },\n uploadComplete : [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n }),\n },\n {\n guard: (args) =>\n ((args.context?.htmlEmbeddedDeferredHtmlSeedLocalIds?.length ?? 0) > 0),\n target: 'rewritingHtmlEmbedded',\n actions: assign({\n htmlEmbeddedPhase1PublishUploads: ({ context }) =>\n (context.publishUploads ?? []) as PublishUpload[],\n htmlEmbeddedPhase1ArweaveTransactions: ({ context }) =>\n (context.arweaveTransactions ?? []) as ArweaveTransactionInfo[],\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n }),\n },\n ],\n uploadError : {\n target : 'failure',\n actions : [ 'assignErrorUploadingData', 'handleError', ],\n },\n },\n invoke : {\n src : 'uploadData',\n input : ( { context } ) => ({ context }) as { context: PublishMachineContext },\n },\n },\n rewritingHtmlEmbedded: {\n invoke: {\n src: 'rewritingHtmlEmbedded',\n input: ({ context }) => ({ context }) as { context: PublishMachineContext },\n onDone: [\n {\n guard: () => !getPublishConfig().useArweaveBundler,\n target: 'creatingArweaveTransactionsPhase2',\n },\n {\n guard: () => getPublishConfig().useArweaveBundler,\n target: 'creatingArweaveDataItemsPhase2',\n },\n ],\n onError: {\n target: FAILURE,\n actions: ['assignErrorRewritingHtmlEmbedded', 'handleError'],\n },\n },\n },\n creatingArweaveTransactionsPhase2: {\n invoke: {\n src: 'createArweaveTransactionsPhase2',\n input: ({ context, event }) =>\n ({ context, event }) as { context: PublishMachineContext; event: unknown },\n onDone: {\n target: 'uploadingDataPhase2',\n actions: assign({\n arweaveTransactions: ({ event }) =>\n (event.output as { arweaveTransactions: ArweaveTransactionInfo[] }).arweaveTransactions,\n publishUploads: ({ event }) =>\n (event.output as { publishUploads: PublishUpload[] }).publishUploads,\n uploaderState: () => undefined,\n currentTransactionIndex: () => undefined,\n }),\n },\n onError: {\n target: FAILURE,\n actions: ['assignErrorCreatingArweaveTransactionsPhase2', 'handleError'],\n },\n },\n },\n uploadingDataPhase2: {\n on: {\n updatePercentage: {\n actions: assign({\n completionPercentage: ({ event }) => {\n const ev = event as { completionPercentage?: number }\n return ev.completionPercentage as number\n },\n uploaderState: ({ event }) =>\n (event as { uploaderState?: PublishMachineContext['uploaderState'] }).uploaderState,\n currentTransactionIndex: ({ event }) =>\n (event as { currentTransactionIndex?: number }).currentTransactionIndex,\n }),\n },\n uploadComplete: [\n {\n guard: ({ context }) => attestationUsesDirectEas(context),\n target: 'creatingAttestationsDirectToEas',\n actions: assign({\n completionPercentage: 100,\n }),\n },\n {\n guard: ({ context }) => attestationUsesMultiPublish(context),\n target: 'creatingAttestations',\n actions: assign({\n completionPercentage: 100,\n publishUploads: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1PublishUploads ?? []) as PublishUpload[]),\n ...((context.publishUploads ?? []) as PublishUpload[]),\n ],\n arweaveTransactions: ({ context }) =>\n [\n ...((context.htmlEmbeddedPhase1ArweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ...((context.arweaveTransactions ?? []) as ArweaveTransactionInfo[]),\n ],\n }),\n },\n ],\n uploadError: {\n target: FAILURE,\n actions: ['assignErrorUploadingDataPhase2', 'handleError'],\n },\n },\n invoke: {\n src: 'uploadData',\n input: ({ context }) => ({ context }) as { context: PublishMachineContext },\n },\n },\n creatingAttestations : {\n invoke : {\n src : 'createAttestations',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : SUCCESS,\n actions : assign({\n easPayload : ( { event, }, ) => (event.output as { easPayload?: unknown })?.easPayload,\n },),\n },\n onError : {\n target : 'attestationFailureRecoverable',\n actions : [ 'assignErrorCreatingAttestations', 'handleError', ],\n },\n },\n },\n attestationFailureRecoverable : {\n on : {\n retry : {\n target : 'creatingAttestations',\n actions : [ 'assignAccountFromRetry', ],\n },\n },\n },\n creatingAttestationsDirectToEas : {\n invoke : {\n src : 'createAttestationsDirectToEas',\n input : ( { context, event } ) => ({ context, event } as { context: PublishMachineContext; event: unknown }),\n onDone : {\n target : SUCCESS,\n actions : assign({\n easPayload : ( { event, }, ) => (event.output as { easPayload?: unknown })?.easPayload,\n },),\n },\n onError : {\n target : 'attestationFailureRecoverableDirectToEas',\n actions : [ 'assignErrorCreatingAttestationsDirectToEas', 'handleError', ],\n },\n },\n },\n attestationFailureRecoverableDirectToEas : {\n on : {\n retry : {\n target : 'creatingAttestationsDirectToEas',\n actions : [ 'assignAccountFromRetry', ],\n },\n },\n },\n stopping: {\n entry: ( { context }: { context: Partial<PublishMachineContext> } ) => {\n console.log(`Actor for ${context.item?.seedLocalId} stopped`,)\n },\n type: 'final',\n },\n [SUCCESS] : {\n type : 'final',\n },\n [FAILURE] : {\n type : 'final',\n },\n },\n})\n\nexport type PublishActor = ActorRefFrom<typeof publishMachine>\n","/**\n * Holds a reference to the PublishManager service to avoid circular imports.\n * Subscribe actor uses this to call savePublish and onPublishDone.\n */\nexport type PublishManagerRef = {\n savePublish: (\n seedLocalId: string,\n publishProcess: { getPersistedSnapshot?: () => unknown; getSnapshot: () => unknown },\n options?: { triggerPublishDone?: boolean }\n ) => void\n onPublishDone: (seedLocalId: string) => void\n removeSubscription: (seedLocalId: string) => void\n}\n\nlet ref: PublishManagerRef | null = null\n\nexport function setPublishManagerRef(r: PublishManagerRef) {\n ref = r\n}\n\nexport function getPublishManagerRef(): PublishManagerRef | null {\n return ref\n}\n","import { fromCallback, EventObject } from 'xstate'\nimport { getPublishManagerRef } from '../publishManagerRef'\nimport {\n LONG_RUNNING_PUBLISH_STATES,\n PERIODIC_SAVE_INTERVAL_MS,\n} from '~/helpers/constants'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:PublishManager:actors:subscribe')\n\nfunction getStateValue(snapshot: { value?: unknown }): string {\n const v = snapshot.value\n if (typeof v === 'string') return v\n if (v && typeof v === 'object') {\n const keys = Object.keys(v)\n return (keys[0] ?? '') as string\n }\n return ''\n}\n\nfunction isLongRunningState(stateValue: string): boolean {\n return LONG_RUNNING_PUBLISH_STATES.includes(stateValue as (typeof LONG_RUNNING_PUBLISH_STATES)[number])\n}\n\nexport interface SubscribeInput {\n publishProcess: import('xstate').ActorRef<any, any>\n seedLocalId: string\n}\n\nexport const subscribe = fromCallback<EventObject, SubscribeInput>(\n ({ receive, input: { publishProcess, seedLocalId } }) => {\n const managerRef = getPublishManagerRef()\n let periodicSaveIntervalId: ReturnType<typeof setInterval> | null = null\n\n const clearPeriodicSave = () => {\n if (periodicSaveIntervalId != null) {\n clearInterval(periodicSaveIntervalId)\n periodicSaveIntervalId = null\n }\n }\n\n const startPeriodicSaveIfNeeded = (snapshot: { value?: unknown }) => {\n const stateValue = getStateValue(snapshot)\n if (isLongRunningState(stateValue) && periodicSaveIntervalId == null && managerRef) {\n periodicSaveIntervalId = setInterval(() => {\n // Timer callbacks can run after transition to a non-long-running state or after\n // completion (clearInterval does not remove an already-queued task). Never persist\n // in that case — matches ~30s regressions seen as \"Creating attestations\" again.\n try {\n const live = publishProcess.getSnapshot() as { status?: string; value?: unknown }\n if (live.status === 'done') {\n clearPeriodicSave()\n return\n }\n const liveValue = getStateValue(live)\n if (!isLongRunningState(liveValue)) {\n clearPeriodicSave()\n return\n }\n } catch {\n return\n }\n managerRef?.savePublish(seedLocalId, publishProcess)\n }, PERIODIC_SAVE_INTERVAL_MS)\n } else if (!isLongRunningState(stateValue)) {\n clearPeriodicSave()\n }\n }\n\n const subscription = publishProcess.subscribe(async (snapshot) => {\n logger('Publish state:', snapshot.value)\n if (managerRef) {\n if (snapshot.status === 'done') {\n clearPeriodicSave()\n // Save first, then onPublishDone is triggered only after save completes (via SAVE_PUBLISH_DONE)\n managerRef.savePublish(seedLocalId, publishProcess, { triggerPublishDone: true })\n } else {\n managerRef.savePublish(seedLocalId, publishProcess)\n startPeriodicSaveIfNeeded(snapshot)\n }\n }\n })\n\n receive(({ type }) => {\n if (type === 'UNSUBSCRIBE') {\n logger('Received UNSUBSCRIBE event')\n clearPeriodicSave()\n subscription.unsubscribe()\n managerRef?.removeSubscription(seedLocalId)\n }\n })\n }\n)\n","import type { Item } from '@seedprotocol/sdk'\nimport type { Account } from 'thirdweb/wallets'\nimport { enqueueActions } from 'xstate'\nimport { getPublishConfig } from '~/config'\nimport { publishMachine } from '../../publish'\nimport { subscribe } from '../actors/subscribe'\n\nexport const createPublish = enqueueActions(({ event, enqueue }) => {\n const ev = event as unknown as {\n item: Item<any>\n address?: string\n account?: unknown\n options?: import('~/config').CreatePublishOptions\n }\n const { item, address, account, options } = ev\n\n const hasAddress = address != null && typeof address === 'string' && address.trim().length > 0\n if (!hasAddress) {\n console.warn('[createPublish] No valid wallet address; skipping spawn.')\n return\n }\n\n enqueue.assign(({ context, spawn }) => {\n const { publishProcesses } = context\n if (publishProcesses && publishProcesses.has(item.seedLocalId)) {\n console.warn(`Publish process with seedLocalId \"${item.seedLocalId}\" already exists.`)\n return context\n }\n const publishRunId =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `run_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`\n\n const publishCfg = getPublishConfig()\n const arweaveUploadTags = [\n ...(publishCfg.arweaveUploadTags ?? []),\n ...(options?.arweaveUploadTags ?? []),\n ]\n\n const publishProcess = spawn(publishMachine, {\n input: {\n item,\n address: address as string,\n account: account as Account | undefined,\n modelName: item.modelName,\n schemaId: item.schemaUid,\n signDataItems: options?.signDataItems,\n dataItemSigner: options?.dataItemSigner,\n signArweaveTransactions: options?.signArweaveTransactions,\n arweaveJwk: options?.arweaveJwk,\n publishMode: options?.publishMode ?? 'patch',\n publishRunId,\n arweaveUploadTags: arweaveUploadTags.length ? arweaveUploadTags : undefined,\n htmlEmbeddedDataUriPolicy:\n options?.htmlEmbeddedDataUriPolicy ??\n publishCfg.htmlEmbeddedDataUriPolicy ??\n 'materialize',\n },\n })\n\n publishProcesses.set(item.seedLocalId, publishProcess)\n\n return {\n publishProcesses: new Map(publishProcesses),\n }\n })\n\n enqueue.assign(({ context, spawn }) => {\n const { subscriptions, publishProcesses } = context\n const publishProcess = publishProcesses.get(item.seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${item.seedLocalId}\" does not exist.`)\n return context\n }\n\n if (subscriptions && subscriptions.has(item.seedLocalId)) {\n console.warn(`Subscription with seedLocalId \"${item.seedLocalId}\" already exists.`)\n return context\n }\n\n const subscriptionProcess = spawn(subscribe, {\n input: { publishProcess, seedLocalId: item.seedLocalId },\n })\n\n subscriptions.set(item.seedLocalId, subscriptionProcess)\n\n return {\n subscriptions: new Map(subscriptions),\n }\n })\n})\n","import type { Account } from 'thirdweb/wallets'\n\nexport const retryAttestations = ({\n context,\n event,\n}: {\n context: { publishProcesses: Map<string, { send: (event: { type: string; account?: Account }) => void }> }\n event: unknown\n}) => {\n const ev = event as { seedLocalId: string; account?: Account }\n const { seedLocalId, account } = ev\n const publishProcess = context.publishProcesses.get(seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${seedLocalId}\" does not exist.`)\n return\n }\n publishProcess.send({ type: 'retry', account })\n}\n","import type { AnyActorRef } from 'xstate'\n\n/**\n * Spawned publish/subscription actors are children of the publish manager (`enqueue.stopChild`).\n * DB-restored actors are created with `createActor` and are not children — stop them with `.stop()`.\n */\nexport function stopScopedOrStandaloneChild(\n self: AnyActorRef,\n child: AnyActorRef,\n enqueue: { stopChild: (c: AnyActorRef) => void },\n): void {\n if (child._parent === self) {\n enqueue.stopChild(child)\n } else {\n child.stop()\n }\n}\n","import { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { EventObject, fromCallback } from 'xstate'\nimport { eq, and, desc } from 'drizzle-orm'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:services:PublishManager:actors:savePublish')\n\n/**\n * Multiple savePublish actors can be in flight per seed (subscribe + periodic + final).\n * SQLite writes complete in completion order, not invocation order — a slower stale write\n * can finish after the terminal save, miss the in_progress row (already completed), and\n * INSERT a new row with an intermediate snapshot. That makes UIs jump back to e.g.\n * creatingAttestations seconds after success. Serialize the actual DB work per seedLocalId.\n */\nconst saveWriteTailBySeed = new Map<string, Promise<void>>()\n\nfunction enqueueSaveWrite(seedLocalId: string, write: () => Promise<void>): Promise<void> {\n const prev = saveWriteTailBySeed.get(seedLocalId) ?? Promise.resolve()\n const next = prev.then(write)\n saveWriteTailBySeed.set(seedLocalId, next.catch(() => {}))\n return next\n}\n\nexport function isTerminalPublishRowStatus(\n status: string | null | undefined,\n): status is 'completed' | 'failed' | 'interrupted' {\n return status === 'completed' || status === 'failed' || status === 'interrupted'\n}\n\nfunction statusFromSnapshot(snapshot: { status?: string; value?: unknown }): 'in_progress' | 'completed' | 'failed' | 'interrupted' {\n if (snapshot.status === 'done') {\n if (snapshot.value === 'success') return 'completed'\n if (snapshot.value === 'failure') return 'failed'\n return 'completed'\n }\n return 'in_progress'\n}\n\nconst MAX_ERROR_MESSAGE_LENGTH = 500\nconst MAX_ERROR_DETAILS_LENGTH = 2000\n\n/** JSON.stringify cannot serialize BigInt; publish context (e.g. gas, tx fields) may contain bigint. */\nfunction jsonStringifyPersistedSnapshot(value: unknown): string {\n return JSON.stringify(value, (_key, v) => (typeof v === 'bigint' ? v.toString() : v))\n}\n\n/** XState persisted snapshots usually have `context` at the root; some shapes nest it. */\nfunction publishRunIdFromSnapshot(snapshot: unknown): string | undefined {\n if (snapshot == null || typeof snapshot !== 'object') return undefined\n const s = snapshot as Record<string, unknown>\n const nested = s.snapshot as { context?: { publishRunId?: string } } | undefined\n const ctx =\n (s.context as { publishRunId?: string } | undefined) ?? nested?.context\n const id = ctx?.publishRunId\n return typeof id === 'string' && id.length > 0 ? id : undefined\n}\n\nfunction errorFieldsFromContext(context: { error?: unknown; errorStep?: string } | undefined, status: 'in_progress' | 'completed' | 'failed' | 'interrupted') {\n if (!context?.error) return {}\n if (status !== 'failed' && status !== 'in_progress') return {}\n const err = context.error\n const errorMessage = err != null\n ? (err instanceof Error ? err.message : String(err)).slice(0, MAX_ERROR_MESSAGE_LENGTH)\n : undefined\n const errorStep = context.errorStep\n let errorDetails: string | undefined\n if (err instanceof Error && err.stack) {\n errorDetails = err.stack.slice(0, MAX_ERROR_DETAILS_LENGTH)\n } else if (err != null && typeof err === 'object') {\n try {\n errorDetails = JSON.stringify(err).slice(0, MAX_ERROR_DETAILS_LENGTH)\n } catch {\n errorDetails = String(err).slice(0, MAX_ERROR_DETAILS_LENGTH)\n }\n } else if (err != null) {\n errorDetails = String(err).slice(0, MAX_ERROR_DETAILS_LENGTH)\n }\n return { errorMessage: errorMessage ?? undefined, errorStep, errorDetails }\n}\n\nexport function markInProgressPublishInterrupted(seedLocalId: string): Promise<void> {\n return enqueueSaveWrite(seedLocalId, async () => {\n const db = BaseDb.getAppDb()\n if (!db) {\n logger('markInProgressPublishInterrupted: DB not ready, skipping')\n return\n }\n\n const existing = await db\n .select()\n .from(publishProcesses)\n .where(and(eq(publishProcesses.seedLocalId, seedLocalId), eq(publishProcesses.status, 'in_progress')))\n .orderBy(desc(publishProcesses.updatedAt))\n .limit(1)\n\n if (existing.length === 0) {\n return\n }\n\n const now = Date.now()\n await db\n .update(publishProcesses)\n .set({\n status: 'interrupted',\n completedAt: now,\n updatedAt: now,\n errorMessage: null,\n errorStep: null,\n errorDetails: null,\n })\n .where(eq(publishProcesses.id, existing[0].id!))\n })\n}\n\nexport const savePublish = fromCallback<\n EventObject & { seedLocalId?: string; triggerPublishDone?: boolean },\n { persistedSnapshot: unknown; seedLocalId: string; triggerPublishDone?: boolean }\n>(({ sendBack, input: { persistedSnapshot, seedLocalId, triggerPublishDone } }) => {\n logger('savePublish seedLocalId', seedLocalId)\n const snapshot = persistedSnapshot as {\n status?: string\n value?: unknown\n context?: {\n publishRunId?: string\n modelName?: string\n schemaId?: string\n item?: { seedLocalId: string; seedUid?: string; modelName?: string; schemaId?: string }\n error?: unknown\n errorStep?: string\n }\n }\n\n const _save = async () => {\n const db = BaseDb.getAppDb()\n if (!db) {\n logger('savePublish: DB not ready, skipping')\n sendBack({ type: 'SAVE_PUBLISH_DONE', seedLocalId, triggerPublishDone })\n return\n }\n\n const existing = await db\n .select()\n .from(publishProcesses)\n .where(and(eq(publishProcesses.seedLocalId, seedLocalId), eq(publishProcesses.status, 'in_progress')))\n .orderBy(desc(publishProcesses.updatedAt))\n .limit(1)\n\n const snapshotStr =\n typeof persistedSnapshot === 'string' ? persistedSnapshot : jsonStringifyPersistedSnapshot(persistedSnapshot)\n const status = statusFromSnapshot(snapshot)\n const now = Date.now()\n const errorFields = errorFieldsFromContext(snapshot.context, status)\n\n if (existing.length > 0) {\n const rec = existing[0]\n await db\n .update(publishProcesses)\n .set({\n persistedSnapshot: snapshotStr,\n status,\n updatedAt: now,\n ...(snapshot.status === 'done' && status !== 'in_progress' ? { completedAt: now } : {}),\n ...errorFields,\n })\n .where(eq(publishProcesses.id, rec.id!))\n } else {\n // No in_progress row: either first save of a new run, or a stale async save after the row\n // was already moved to completed (INSERT would create a duplicate with a newer startedAt).\n const incomingRunId = publishRunIdFromSnapshot(snapshot)\n if (incomingRunId != null && status === 'in_progress' && snapshot.status !== 'done') {\n const latestAny = await db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n .limit(1)\n const latest = latestAny[0]\n if (latest && isTerminalPublishRowStatus(latest.status)) {\n try {\n const prevParsed = JSON.parse(latest.persistedSnapshot) as unknown\n const terminalRunId = publishRunIdFromSnapshot(prevParsed)\n if (terminalRunId === incomingRunId) {\n logger(\n 'savePublish: skip stale insert — same publishRunId as latest terminal row',\n seedLocalId,\n incomingRunId,\n )\n return\n }\n } catch {\n /* ignore parse errors; proceed with insert */\n }\n }\n }\n\n const item = snapshot.context?.item\n const modelName = snapshot.context?.modelName ?? item?.modelName ?? ''\n const schemaId = snapshot.context?.schemaId ?? item?.schemaId\n await db.insert(publishProcesses).values({\n seedLocalId,\n modelName,\n schemaId: schemaId ?? null,\n status,\n startedAt: now,\n persistedSnapshot: snapshotStr,\n createdAt: now,\n updatedAt: now,\n ...errorFields,\n })\n }\n }\n\n enqueueSaveWrite(seedLocalId, _save)\n .then(() => {\n sendBack({ type: 'SAVE_PUBLISH_DONE', seedLocalId, triggerPublishDone })\n })\n .catch((err) => {\n logger('savePublish error', err)\n sendBack({ type: 'SAVE_PUBLISH_DONE', seedLocalId, triggerPublishDone })\n })\n})\n","import type { AnyActorRef } from 'xstate'\nimport { enqueueActions } from 'xstate'\nimport { stopScopedOrStandaloneChild } from './stopScopedOrStandaloneChild'\nimport { markInProgressPublishInterrupted } from '../actors/savePublish'\n\nexport const stopPublish = enqueueActions(({ context, event, enqueue, self }) => {\n const { publishProcesses, subscriptions } = context\n const { seedLocalId } = event as unknown as { seedLocalId: string }\n\n void markInProgressPublishInterrupted(seedLocalId).catch((error) => {\n console.warn(\n `[stopPublish] Failed to mark publish_processes row interrupted for \"${seedLocalId}\":`,\n error,\n )\n })\n\n const publishProcess = publishProcesses.get(seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${seedLocalId}\" does not exist.`)\n return\n }\n\n stopScopedOrStandaloneChild(self, publishProcess as AnyActorRef, enqueue)\n\n const subscriptionProcess = subscriptions.get(seedLocalId)\n if (subscriptionProcess) {\n stopScopedOrStandaloneChild(self, subscriptionProcess as AnyActorRef, enqueue)\n }\n\n const newPublishProcesses = new Map(publishProcesses)\n newPublishProcesses.delete(seedLocalId)\n const newSubscriptions = new Map(subscriptions)\n newSubscriptions.delete(seedLocalId)\n\n enqueue.assign({\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n })\n})\n","import type { ActorRef, AnyActorRef, EventObject } from 'xstate'\nimport { enqueueActions } from 'xstate'\nimport debug from 'debug'\nimport { stopScopedOrStandaloneChild } from './stopScopedOrStandaloneChild'\n\nconst logger = debug('seedProtocol:PublishManager:index')\n\nexport const stopAll = enqueueActions(({ context, enqueue, self }) => {\n logger('Stopping all actors...')\n\n context.publishProcesses.forEach((publishProcess: ActorRef<any, any>) => {\n stopScopedOrStandaloneChild(self, publishProcess as AnyActorRef, enqueue)\n })\n context.subscriptions.forEach((subscriptionProcess: ActorRef<any, EventObject>) => {\n stopScopedOrStandaloneChild(self, subscriptionProcess as AnyActorRef, enqueue)\n })\n\n enqueue.assign({\n publishProcesses: new Map(),\n subscriptions: new Map(),\n })\n})\n","import { enqueueActions } from 'xstate'\n\nexport const query = enqueueActions(({ context, event, enqueue }) => {\n const { seedLocalId } = event as unknown as { seedLocalId: string }\n const publishProcess = context.publishProcesses.get(seedLocalId)\n if (!publishProcess) {\n console.warn(`Publish process with seedLocalId \"${seedLocalId}\" does not exist.`)\n return\n }\n\n enqueue.stopChild(publishProcess)\n\n const subscriptionProcess = context.subscriptions.get(seedLocalId)\n if (subscriptionProcess) {\n enqueue.stopChild(subscriptionProcess)\n }\n\n const newPublishProcesses = new Map(context.publishProcesses)\n newPublishProcesses.delete(seedLocalId)\n const newSubscriptions = new Map(context.subscriptions)\n newSubscriptions.delete(seedLocalId)\n\n enqueue.assign({\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n })\n})\n","import { assign } from 'xstate'\n\nexport const addSubscription = assign(({ context, event }) => {\n const { subscriptions } = context\n const { seedLocalId, newSubscription } = event as unknown as {\n seedLocalId: string\n newSubscription?: import('xstate').ActorRef<any, import('xstate').EventObject>\n }\n\n if (newSubscription) {\n subscriptions.set(seedLocalId, newSubscription)\n }\n\n return {\n subscriptions: new Map(subscriptions),\n }\n})\n","import { assign } from 'xstate'\nimport { savePublish } from '../actors/savePublish'\n\ntype PublishProcessActor = {\n getPersistedSnapshot?: () => unknown\n getSnapshot: () => { status?: string; value?: unknown; context?: Record<string, unknown> }\n}\n\n/** Never persist multi-megabyte binary fields to SQLite (periodic saves during bundler upload). */\nconst HEAVY_PUBLISH_CONTEXT_KEYS = ['signedDataItems', 'arweaveUploadData'] as const\n\nfunction stripHeavyContextFields(\n ctx: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (ctx == null || typeof ctx !== 'object') return ctx\n const next = { ...ctx }\n for (const k of HEAVY_PUBLISH_CONTEXT_KEYS) {\n delete next[k]\n }\n return next\n}\n\nfunction stripHeavyPublishSnapshot(snapshot: unknown): unknown {\n if (snapshot == null || typeof snapshot !== 'object') return snapshot\n const s = snapshot as Record<string, unknown>\n const out: Record<string, unknown> = { ...s }\n if (s.context != null && typeof s.context === 'object') {\n out.context = stripHeavyContextFields(s.context as Record<string, unknown>)\n }\n const nested = s.snapshot\n if (nested != null && typeof nested === 'object') {\n const n = nested as Record<string, unknown>\n const nestedOut: Record<string, unknown> = { ...n }\n if (n.context != null && typeof n.context === 'object') {\n nestedOut.context = stripHeavyContextFields(n.context as Record<string, unknown>)\n }\n out.snapshot = nestedOut\n }\n return out\n}\n\nfunction getPersistableSnapshot(actor: PublishProcessActor): unknown {\n try {\n const snap = actor.getPersistedSnapshot?.() ?? actor.getSnapshot()\n return stripHeavyPublishSnapshot(snap)\n } catch {\n const snapshot = actor.getSnapshot()\n const ctx = snapshot.context\n if (!ctx?.item) return stripHeavyPublishSnapshot(snapshot)\n const item = ctx.item as { seedLocalId?: string; modelName?: string; schemaId?: string }\n return stripHeavyPublishSnapshot({\n ...snapshot,\n context: {\n ...ctx,\n item: {\n seedLocalId: item.seedLocalId,\n modelName: item.modelName,\n schemaId: item.schemaId,\n },\n },\n })\n }\n}\n\nexport const requestSavePublish = assign(({ context, event, spawn }) => {\n const { publishProcesses } = context\n const { seedLocalId, publishProcess, triggerPublishDone } = event as unknown as {\n seedLocalId: string\n publishProcess?: PublishProcessActor\n triggerPublishDone?: boolean\n }\n\n if (!publishProcess) {\n return context\n }\n\n const newPublishProcesses = new Map(publishProcesses)\n newPublishProcesses.set(seedLocalId, publishProcess)\n\n const persistedSnapshot = getPersistableSnapshot(publishProcess)\n\n spawn(savePublish, {\n id: `savePublish_${seedLocalId}_${Date.now()}`,\n input: { persistedSnapshot, seedLocalId, triggerPublishDone },\n })\n\n return { publishProcesses: newPublishProcesses }\n})\n","import { assign } from 'xstate'\n\nexport const publishDone = assign(({ context, event }) => {\n const { publishProcesses, subscriptions } = context\n const seedLocalId = (event as unknown as { seedLocalId: string }).seedLocalId\n const subscriptionProcess = subscriptions.get(seedLocalId)\n if (subscriptionProcess) {\n subscriptionProcess.send({ type: 'UNSUBSCRIBE' })\n }\n const newPublishProcesses = new Map(publishProcesses)\n newPublishProcesses.delete(seedLocalId)\n const newSubscriptions = new Map(subscriptions)\n newSubscriptions.delete(seedLocalId)\n return {\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n }\n})\n","import { assign } from 'xstate'\n\nexport const removeSubscription = assign(({ context, event }) => {\n const { subscriptions } = context\n const seedLocalId = (event as unknown as { seedLocalId: string }).seedLocalId\n const newSubscriptions = new Map(subscriptions)\n newSubscriptions.delete(seedLocalId)\n return {\n subscriptions: newSubscriptions,\n }\n})\n","import { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { createActor, EventObject, fromCallback } from 'xstate'\nimport { eq } from 'drizzle-orm'\nimport { publishMachine } from '../../publish'\nimport { subscribe } from './subscribe'\n\nconst RESTORE_DB_WAIT_MS = 60_000\nconst RESTORE_DB_POLL_MS = 2_000\n\nasync function waitForDb(maxWaitMs: number): Promise<boolean> {\n const deadline = Date.now() + maxWaitMs\n while (Date.now() < deadline) {\n if (BaseDb.PlatformClass && BaseDb.getAppDb()) return true\n await new Promise((r) => setTimeout(r, RESTORE_DB_POLL_MS))\n }\n return false\n}\n\n/** Minimal snapshot shape for restore; avoids excessive type recursion from SnapshotFrom<typeof publishMachine>.\n * Older rows may omit `context.attestationStrategy`; publish guards then fall back to `useDirectEas`. */\ninterface PersistedSnapshot {\n status?: string\n value?: string | Record<string, unknown>\n context?: {\n item?: { seedLocalId?: string; modelName?: string; schemaId?: string }\n modelName?: string\n schemaId?: string\n reimbursementTransactionId?: string\n requestResponse?: unknown\n arweaveTransactions?: unknown[]\n publishUploads?: unknown[]\n }\n}\n\nfunction getStateValue(parsed: PersistedSnapshot): string {\n const v = parsed.value\n if (typeof v === 'string') return v\n if (v && typeof v === 'object') {\n const keys = Object.keys(v)\n return (keys[0] ?? '') as string\n }\n return ''\n}\n\nfunction isRestorableSnapshot(parsed: PersistedSnapshot): boolean {\n const stateValue = getStateValue(parsed)\n if (stateValue === 'pollingForConfirmation') {\n if (!parsed.context?.reimbursementTransactionId || !parsed.context?.requestResponse) return false\n }\n if (stateValue === 'uploadingData') {\n const txs = parsed.context?.arweaveTransactions\n const uploads = parsed.context?.publishUploads\n if (!Array.isArray(txs) || txs.length === 0 || !Array.isArray(uploads)) return false\n }\n return true\n}\n\n/**\n * XState `persistContext` serializes actor refs as `{ xstate$$type: 1, id }`. `restoreSnapshot` swaps those\n * for live child actors; if the id is not in `snapshot.children`, `context.item` becomes `undefined` and\n * restored publishes throw on resume (e.g. createAttestations). Real item data is always a plain object.\n */\nfunction isPersistedActorRef(value: unknown): value is { xstate$$type: number; id: string } {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'xstate$$type' in value &&\n (value as { xstate$$type: number }).xstate$$type === 1 &&\n typeof (value as { id?: unknown }).id === 'string'\n )\n}\n\nfunction patchPublishContextItemForRestore(\n parsed: PersistedSnapshot,\n seedLocalId: string,\n record: { modelName?: string | null; schemaId?: string | null },\n) {\n parsed.context = parsed.context ?? {}\n const raw = parsed.context.item\n if (isPersistedActorRef(raw)) {\n parsed.context.item = {\n seedLocalId,\n modelName: parsed.context.modelName ?? record.modelName ?? '',\n schemaId: parsed.context.schemaId ?? record.schemaId ?? undefined,\n }\n return\n }\n parsed.context.item = {\n ...(typeof raw === 'object' && raw !== null && !Array.isArray(raw)\n ? (raw as Record<string, unknown>)\n : {}),\n seedLocalId,\n modelName:\n (raw as { modelName?: string } | undefined)?.modelName ??\n parsed.context.modelName ??\n record.modelName ??\n '',\n schemaId:\n (raw as { schemaId?: string } | undefined)?.schemaId ??\n parsed.context.schemaId ??\n record.schemaId ??\n undefined,\n }\n}\n\nexport interface RestoreFromDbInput {\n context: {\n publishProcesses: Map<string, unknown>\n subscriptions: Map<string, unknown>\n }\n}\n\nexport const restoreFromDb = fromCallback<EventObject, RestoreFromDbInput>(\n ({ sendBack, input: { context } }) => {\n const _restoreFromDb = async () => {\n const newPublishProcesses = new Map<string, import('xstate').ActorRef<any, any>>()\n const newSubscriptions = new Map<string, import('xstate').ActorRef<any, EventObject>>()\n\n // BaseDb.PlatformClass is set by platformClassesInit when client.init() runs.\n // PublishManager starts on module load, which can happen before client.init().\n // Wait for DB to be ready before attempting restore (poll every 2s, up to 60s).\n const dbReady = await waitForDb(RESTORE_DB_WAIT_MS)\n if (!dbReady) {\n sendBack({ type: 'RESTORE_FROM_DB_DONE', publishProcesses: newPublishProcesses, subscriptions: newSubscriptions })\n return { newPublishProcesses, newSubscriptions }\n }\n\n const db = BaseDb.getAppDb()\n if (!db) {\n sendBack({ type: 'RESTORE_FROM_DB_DONE', publishProcesses: newPublishProcesses, subscriptions: newSubscriptions })\n return { newPublishProcesses, newSubscriptions }\n }\n\n const inProgress = await db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.status, 'in_progress'))\n\n // Dedupe by seedLocalId, keep latest per seedLocalId (by updatedAt then createdAt)\n const bySeed = new Map<string, (typeof inProgress)[0]>()\n const sorted = [...inProgress].sort(\n (a, b) => (b.updatedAt ?? b.createdAt ?? 0) - (a.updatedAt ?? a.createdAt ?? 0)\n )\n for (const rec of sorted) {\n if (!bySeed.has(rec.seedLocalId)) bySeed.set(rec.seedLocalId, rec)\n }\n const publishProcessRecords = Array.from(bySeed.values())\n\n for (const publishProcessRecord of publishProcessRecords) {\n let parsed: PersistedSnapshot\n try {\n parsed = JSON.parse(publishProcessRecord.persistedSnapshot) as PersistedSnapshot\n } catch {\n continue\n }\n if (parsed.status === 'done') continue\n const seedLocalId = parsed.context?.item?.seedLocalId ?? publishProcessRecord.seedLocalId\n if (!seedLocalId) continue\n if (!isRestorableSnapshot(parsed)) continue\n\n // Item is an SDK class instance; persistence loses getters. Also strip mistaken XState actor stubs on item.\n patchPublishContextItemForRestore(parsed, seedLocalId, publishProcessRecord)\n\n const publishProcess = createActor(publishMachine as unknown as import('xstate').AnyActorLogic, {\n snapshot: parsed as any,\n input: undefined,\n })\n\n const subscription = createActor(subscribe, {\n input: {\n publishProcess,\n seedLocalId,\n },\n })\n newPublishProcesses.set(seedLocalId, publishProcess)\n newSubscriptions.set(seedLocalId, subscription)\n\n publishProcess.start()\n subscription.start()\n }\n return { newPublishProcesses, newSubscriptions }\n }\n\n _restoreFromDb().then((result) => {\n if (!result) return\n const { newPublishProcesses, newSubscriptions } = result\n sendBack({\n type: 'RESTORE_FROM_DB_DONE',\n publishProcesses: newPublishProcesses,\n subscriptions: newSubscriptions,\n })\n })\n }\n)\n","import { ActorRefFrom, createActor, setup } from 'xstate'\nimport { Item } from '@seedprotocol/sdk'\nimport { publishMachine } from '../publish'\nimport { assignRestoreFromDb } from './actions/assignRestoreFromDb'\nimport { createPublish } from './actions/createPublish'\nimport { retryAttestations } from './actions/retryAttestations'\nimport { stopPublish } from './actions/stopPublish'\nimport { stopAll } from './actions/stopAll'\nimport { query } from './actions/query'\nimport { addSubscription } from './actions/addSubscription'\nimport { requestSavePublish } from './actions/requestSavePublish'\nimport { publishDone } from './actions/publishDone'\nimport { removeSubscription } from './actions/removeSubscription'\nimport { restoreFromDb } from './actors/restoreFromDb'\nimport { setPublishManagerRef } from './publishManagerRef'\nimport debug from 'debug'\n\nconst logger = debug('seedProtocol:PublishManager:index')\n\nexport interface PublishManagerMachineContext {\n publishProcesses: Map<string, import('xstate').ActorRef<any, any>>\n subscriptions: Map<string, import('xstate').ActorRef<any, import('xstate').EventObject>>\n}\n\ntype PublishManagerEvent =\n | { type: 'RESTORE_FROM_DB_DONE'; publishProcesses: PublishManagerMachineContext['publishProcesses']; subscriptions: PublishManagerMachineContext['subscriptions'] }\n | { type: 'CREATE_PUBLISH'; item: import('@seedprotocol/sdk').Item<any>; address: string; account?: unknown; options?: import('../../config').CreatePublishOptions }\n | { type: 'ADD_SUBSCRIPTION'; seedLocalId: string; newSubscription?: import('xstate').ActorRef<any, any> }\n | { type: 'REQUEST_SAVE_PUBLISH'; seedLocalId: string; publishProcess?: unknown; triggerPublishDone?: boolean }\n | { type: 'SAVE_PUBLISH_DONE'; seedLocalId: string; triggerPublishDone?: boolean }\n | { type: 'PUBLISH_DONE'; seedLocalId: string }\n | { type: 'REMOVE_SUBSCRIPTION'; seedLocalId: string }\n | { type: 'RETRY_ATTESTATIONS'; seedLocalId: string; account?: unknown }\n | { type: 'STOP_PUBLISH'; seedLocalId: string }\n | { type: 'QUERY'; seedLocalId: string }\n | { type: 'STOP_ALL' }\n\nexport const publishManagerMachine = setup({\n types: {\n context: {} as PublishManagerMachineContext,\n input: {} as PublishManagerMachineContext,\n events: {} as PublishManagerEvent,\n },\n actors: {\n restoreFromDb,\n },\n actions: {\n assignRestoreFromDb,\n createPublish,\n addSubscription,\n requestSavePublish,\n publishDone,\n removeSubscription,\n retryAttestations,\n stopPublish,\n stopAll,\n query,\n } as unknown as Record<string, (args: unknown) => void>,\n}).createMachine({\n id: 'publishManager',\n initial: 'restoreFromDb',\n context: {\n publishProcesses: new Map(),\n subscriptions: new Map(),\n },\n states: {\n restoreFromDb: {\n on: {\n RESTORE_FROM_DB_DONE: {\n target: 'active',\n actions: ['assignRestoreFromDb'],\n },\n },\n invoke: {\n src: 'restoreFromDb',\n input: ({ context }) => ({ context }),\n },\n },\n active: {\n on: {\n CREATE_PUBLISH: {\n actions: ['createPublish'],\n },\n ADD_SUBSCRIPTION: {\n actions: ['addSubscription'],\n },\n REQUEST_SAVE_PUBLISH: {\n actions: ['requestSavePublish'],\n },\n SAVE_PUBLISH_DONE: [\n {\n guard: ({ event }) => (event as { triggerPublishDone?: boolean }).triggerPublishDone === true,\n actions: ['publishDone'],\n },\n ],\n PUBLISH_DONE: {\n actions: ['publishDone'],\n },\n REMOVE_SUBSCRIPTION: {\n actions: ['removeSubscription'],\n },\n RETRY_ATTESTATIONS: {\n actions: ['retryAttestations'],\n },\n STOP_PUBLISH: {\n actions: ['stopPublish'],\n },\n QUERY: {\n actions: ['query'],\n },\n STOP_ALL: {\n actions: ['stopAll'],\n },\n },\n },\n },\n})\n\nconst publishManager = createActor(publishManagerMachine, {\n input: {\n publishProcesses: new Map(),\n subscriptions: new Map(),\n },\n})\n\n// Set ref for subscribe actor to call savePublish, onPublishDone, removeSubscription\nsetPublishManagerRef({\n savePublish: (seedLocalId, publishProcess, options) => {\n publishManager.send({\n type: 'REQUEST_SAVE_PUBLISH',\n seedLocalId,\n publishProcess,\n triggerPublishDone: options?.triggerPublishDone,\n })\n },\n onPublishDone: (seedLocalId) => {\n publishManager.send({ type: 'PUBLISH_DONE', seedLocalId })\n },\n removeSubscription: (seedLocalId) => {\n publishManager.send({ type: 'REMOVE_SUBSCRIPTION', seedLocalId })\n },\n})\n\nconst subscription = publishManager.subscribe((snapshot) => {\n logger('PublishManager snapshot:', snapshot)\n})\n\nif (typeof document !== 'undefined') {\n publishManager.start()\n\n window.addEventListener('load', () => {\n logger('PublishManager started')\n })\n\n window.addEventListener('beforeunload', () => {\n subscription.unsubscribe()\n publishManager.stop()\n })\n}\n\nexport const PublishManager = {\n getService: () => publishManager,\n createPublish: (\n item: InstanceType<typeof Item>,\n address: string,\n account?: import('thirdweb/wallets').Account,\n options?: import('../../config').CreatePublishOptions\n ) => publishManager.send({ type: 'CREATE_PUBLISH', item, address, account, options }),\n retryAttestations: (seedLocalId: string, account?: import('thirdweb/wallets').Account) =>\n publishManager.send({ type: 'RETRY_ATTESTATIONS', seedLocalId, account }),\n stopPublish: (seedLocalId: string) => publishManager.send({ type: 'STOP_PUBLISH', seedLocalId }),\n query: (seedLocalId: string) => publishManager.send({ type: 'QUERY', seedLocalId }),\n stopAll: () => publishManager.send({ type: 'STOP_ALL' }),\n getPublish: (seedLocalId: string) => publishManager.getSnapshot().context.publishProcesses.get(seedLocalId),\n savePublish: (seedLocalId: string, publishProcess: ActorRefFrom<typeof publishMachine>) =>\n publishManager.send({ type: 'REQUEST_SAVE_PUBLISH', seedLocalId, publishProcess }),\n addSubscription: (seedLocalId: string, subscriptionActor: import('xstate').ActorRef<any, any>) =>\n publishManager.send({ type: 'ADD_SUBSCRIPTION', seedLocalId, newSubscription: subscriptionActor }),\n removeSubscription: (seedLocalId: string) => publishManager.send({ type: 'REMOVE_SUBSCRIPTION', seedLocalId }),\n}\n","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 getWalletsForConnectButton,\n} from \"../helpers/thirdweb\"\nimport { usePublishConfig } from \"./PublishProvider\"\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 console.error(\"[ConnectButton] Wallet setup / module install failed:\", 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 reportWalletSetupWarning(\n new Error(\n 'Executor module: managed account address not available yet (managed wallet may still be syncing).',\n ),\n )\n return\n }\n try {\n const mw = getManagedAccountWallet()\n await mw.autoConnect({ client: getClient(), chain: optimismSepolia })\n const ma = mw.getAccount()\n if (!ma) {\n reportWalletSetupWarning(new Error('Executor module: managed wallet has no account'))\n return\n }\n await ensureExecutorModuleInstalled(managedAddress, ma, config)\n } catch (err) {\n reportWalletSetupWarning(err)\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 getModularAccountWallet()\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])\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 const tryManaged = async () => {\n try {\n return await getConnectedManagedAccountAddress(optimismSepolia)\n } catch {\n return undefined\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 await seedClient.setAddresses({ owned: [...owned] })\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 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, { type FC } from 'react'\nimport type { PublishMode } from '../types'\n\nexport type PublishModeButtonsProps = {\n value: PublishMode\n onChange: (mode: PublishMode) => void\n disabled?: boolean\n /** Accessible label for the group */\n 'aria-label'?: string\n}\n\n/**\n * Optional control to choose patch (same Version) vs new Version before calling\n * `ensureSmartWalletThenPublish(item, …, { publishMode })` or `PublishManager.createPublish(…, { publishMode })`.\n */\nexport const PublishModeButtons: FC<PublishModeButtonsProps> = ({\n value,\n onChange,\n disabled = false,\n 'aria-label': ariaLabel = 'Publish mode',\n}) => {\n const base: React.CSSProperties = {\n display: 'inline-flex',\n gap: 8,\n flexWrap: 'wrap',\n }\n const btn = (active: boolean): React.CSSProperties => ({\n padding: '8px 14px',\n fontSize: 13,\n borderRadius: 8,\n border: `1px solid ${active ? '#344054' : '#D0D5DD'}`,\n background: active ? '#101828' : '#fff',\n color: active ? '#fff' : '#344054',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.6 : 1,\n })\n\n return (\n <div role=\"group\" aria-label={ariaLabel} style={base}>\n <button\n type=\"button\"\n disabled={disabled}\n style={btn(value === 'patch')}\n onClick={() => onChange('patch')}\n >\n Publish updates\n </button>\n <button\n type=\"button\"\n disabled={disabled}\n style={btn(value === 'new_version')}\n onClick={() => onChange('new_version')}\n >\n New version\n </button>\n </div>\n )\n}\n","import { PublishMachineStates } from '~/helpers/constants'\n\n/**\n * Maps internal publish machine state values to display step IDs for UI consistency.\n * The direct-EAS path uses `creatingAttestationsDirectToEas` internally, but UIs\n * typically show a single \"Creating attestations\" step. This helper normalizes the\n * machine value for display.\n */\nexport function getDisplayStepId(machineValue: string): string {\n if (machineValue === 'creatingAttestationsDirectToEas') {\n return 'creatingAttestations'\n }\n return machineValue\n}\n\ntype PublishRowStatus = 'in_progress' | 'completed' | 'failed' | 'interrupted'\n\n/**\n * Single source of truth for step UIs: the live machine while running; once the\n * actor is gone, prefer the DB row status so we never flash an intermediate\n * `persistedSnapshot` value (e.g. creatingAttestations) after a completed run.\n */\nexport function resolvePublishDisplayValue(\n publishProcess: unknown | null | undefined,\n record: { status: PublishRowStatus } | undefined,\n machineValue: string | undefined\n): string | undefined {\n if (publishProcess != null) return machineValue\n if (record?.status === 'completed') return PublishMachineStates.SUCCESS\n if (record?.status === 'failed') return PublishMachineStates.FAILURE\n if (record?.status === 'interrupted') return undefined\n return machineValue\n}\n\nexport type PublishRowForDisplay = {\n status: string\n persistedSnapshot: string\n completedAt?: number | null\n}\n\n/**\n * Derives the machine-state string for UI from the persisted DB row. Prefer\n * `status` / `completedAt` over raw `persistedSnapshot` JSON so a stale or\n * out-of-order snapshot write cannot force the UI back to an intermediate step\n * after a terminal save (common when consumers read `JSON.parse(persistedSnapshot).value`).\n */\nexport function getPublishMachineValueForUi(record: PublishRowForDisplay | undefined): string | undefined {\n if (!record) return undefined\n\n if (record.status === 'failed') return PublishMachineStates.FAILURE\n if (record.status === 'completed') return PublishMachineStates.SUCCESS\n if (record.status === 'interrupted') return undefined\n\n if (record.completedAt != null) {\n try {\n const p = JSON.parse(record.persistedSnapshot) as { value?: unknown; status?: string }\n if (p.status === 'done' && p.value === PublishMachineStates.FAILURE) {\n return PublishMachineStates.FAILURE\n }\n } catch {\n /* ignore */\n }\n return PublishMachineStates.SUCCESS\n }\n\n try {\n const p = JSON.parse(record.persistedSnapshot) as { value?: unknown; status?: string }\n if (p.status === 'done') {\n if (p.value === PublishMachineStates.SUCCESS) return PublishMachineStates.SUCCESS\n if (p.value === PublishMachineStates.FAILURE) return PublishMachineStates.FAILURE\n }\n if (typeof p.value === 'string') return p.value\n } catch {\n return undefined\n }\n return undefined\n}\n","import { useState, useEffect, useRef, useMemo } from 'react'\nimport { useSelector } from '@xstate/react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { eq, desc } from 'drizzle-orm'\nimport { PublishManager } from '../services/publishManager'\nimport { PublishMachineStates } from '~/helpers/constants'\nimport { getPublishMachineValueForUi, resolvePublishDisplayValue } from '~/helpers/publishDisplayHelpers'\n\nfunction isTerminalDoneSnapshot(snapshot: { value?: unknown; status?: string } | null): snapshot is { value: string; status: 'done' } {\n if (!snapshot || snapshot.status !== 'done') return false\n return snapshot.value === PublishMachineStates.SUCCESS || snapshot.value === PublishMachineStates.FAILURE\n}\n\nexport function usePublishProcess(seedLocalId: string) {\n const publishManager = PublishManager.getService()\n\n const publishProcess = useSelector(publishManager, (snapshot) => {\n return snapshot?.context?.publishProcesses?.get(seedLocalId) ?? null\n })\n\n /** Last snapshot from the publish actor; survives removal from the manager map so we can keep terminal `value`. */\n const lastPublishSnapshotRef = useRef<{ value?: unknown; status?: string } | null>(null)\n\n useEffect(() => {\n lastPublishSnapshotRef.current = null\n }, [seedLocalId])\n\n const [machineValue, setMachineValue] = useState<string | undefined>(undefined)\n /**\n * Once we have observed a terminal outcome for this seed (machine done or DB row), keep\n * showing success/failure until a new publish actor is spawned. Prevents the UI from\n * flipping back to an intermediate step when live-query or row ordering briefly reports\n * in_progress or a stale persistedSnapshot after completion.\n */\n const [terminalLatch, setTerminalLatch] = useState<'success' | 'failure' | null>(null)\n\n const db = BaseDb.getAppDb()\n const latestProcessRowQuery = useMemo(\n () =>\n seedLocalId && db\n ? db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n .limit(1)\n : null,\n [db, seedLocalId]\n )\n const latestRecords = useLiveQuery(latestProcessRowQuery)\n const latestRecord = latestRecords?.[0] as\n | { status: string; persistedSnapshot: string; completedAt?: number | null }\n | undefined\n const recordStatus = latestRecord?.status as\n | 'in_progress'\n | 'completed'\n | 'failed'\n | 'interrupted'\n | undefined\n\n const value = useMemo(() => {\n if (publishProcess != null) {\n return machineValue\n }\n if (terminalLatch === 'success' || terminalLatch === 'failure') {\n return terminalLatch\n }\n const fromRow = getPublishMachineValueForUi(latestRecord)\n if (fromRow === PublishMachineStates.SUCCESS || fromRow === PublishMachineStates.FAILURE) {\n return fromRow\n }\n return resolvePublishDisplayValue(\n publishProcess,\n recordStatus != null ? { status: recordStatus } : undefined,\n machineValue\n )\n }, [publishProcess, recordStatus, machineValue, terminalLatch, latestRecord])\n\n useEffect(() => {\n setTerminalLatch(null)\n }, [seedLocalId])\n\n useEffect(() => {\n if (publishProcess != null) {\n return\n }\n if (recordStatus === 'completed') {\n setTerminalLatch('success')\n } else if (recordStatus === 'failed') {\n setTerminalLatch('failure')\n }\n }, [recordStatus, publishProcess])\n\n useEffect(() => {\n if (publishProcess != null) {\n setTerminalLatch(null)\n }\n }, [publishProcess])\n\n useEffect(() => {\n if (!publishProcess) {\n const last = lastPublishSnapshotRef.current\n const preserve = isTerminalDoneSnapshot(last)\n if (preserve) {\n setMachineValue(last.value as string)\n if (last.value === PublishMachineStates.SUCCESS) {\n setTerminalLatch('success')\n } else if (last.value === PublishMachineStates.FAILURE) {\n setTerminalLatch('failure')\n }\n } else {\n setMachineValue(undefined)\n }\n return\n }\n const initial = publishProcess.getSnapshot()\n lastPublishSnapshotRef.current = { value: initial?.value, status: (initial as { status?: string }).status }\n setMachineValue(initial?.value as string | undefined)\n const sub = publishProcess.subscribe((snapshot: { value?: unknown; status?: string }) => {\n lastPublishSnapshotRef.current = { value: snapshot?.value, status: snapshot?.status }\n setMachineValue(snapshot?.value as string | undefined)\n })\n return () => {\n sub.unsubscribe()\n }\n }, [publishProcess, seedLocalId])\n\n return {\n publishProcess: publishProcess ?? null,\n value,\n }\n}\n","import { useState, useEffect } from 'react'\nimport { isItemOwned } from '@seedprotocol/sdk'\nimport type { Item } from '@seedprotocol/sdk'\n\nexport function useCanPublishItem(item: Item<any> | null | undefined): boolean {\n const [canPublish, setCanPublish] = useState(true)\n\n useEffect(() => {\n if (!item) {\n setCanPublish(false)\n return\n }\n isItemOwned(item)\n .then(setCanPublish)\n .catch(() => setCanPublish(false))\n }, [item?.seedLocalId])\n\n return canPublish\n}\n","import { useMemo } from 'react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { arweaveL1FinalizeJobs, BaseDb } from '@seedprotocol/sdk'\nimport { eq, desc } from 'drizzle-orm'\n\nexport type ArweaveL1FinalizeJobRow = {\n id: number\n seedLocalId: string\n dataItemId: string\n l1TransactionId: string | null\n bundleId: string | null\n phase: string\n statusJson: string | null\n errorMessage: string | null\n versionLocalId: string | null\n itemPropertyName: string | null\n updatedAt: number | null\n}\n\n/**\n * Live L1 finalization jobs for a seed (bundler path). Empty when not using bundler or no jobs.\n */\nexport function useArweaveL1Finalize(seedLocalId: string | undefined) {\n const db = BaseDb.getAppDb()\n const jobsQuery = useMemo(\n () =>\n seedLocalId && db\n ? db\n .select()\n .from(arweaveL1FinalizeJobs)\n .where(eq(arweaveL1FinalizeJobs.seedLocalId, seedLocalId))\n .orderBy(desc(arweaveL1FinalizeJobs.updatedAt))\n : null,\n [db, seedLocalId]\n )\n const rows = useLiveQuery(jobsQuery)\n\n const jobs = (rows ?? []) as ArweaveL1FinalizeJobRow[]\n\n const summary = useMemo(() => {\n const pending = jobs.filter((j) => j.phase === 'pending_l1').length\n const confirmed = jobs.filter((j) => j.phase === 'confirmed').length\n return {\n hasPendingL1: pending > 0,\n pendingCount: pending,\n confirmedCount: confirmed,\n jobs,\n }\n }, [jobs])\n\n return summary\n}\n","import { useMemo } from 'react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { eq, desc } from 'drizzle-orm'\nimport { usePublishProcess } from './usePublishProcess'\nimport { useArweaveL1Finalize } from './useArweaveL1Finalize'\n\nexport type PublishProcessStatus = 'in_progress' | 'completed' | 'failed' | 'interrupted'\n\nexport interface PublishProcessRecord {\n id: number\n seedLocalId: string\n modelName: string\n schemaId?: string\n status: PublishProcessStatus\n startedAt: number\n completedAt?: number\n errorMessage?: string\n errorStep?: string\n errorDetails?: string\n persistedSnapshot: string\n createdAt?: number\n updatedAt?: number\n}\n\nexport function useItemPublishStatus(seedLocalId: string | undefined) {\n const { publishProcess, value } = usePublishProcess(seedLocalId ?? '')\n const arweaveL1 = useArweaveL1Finalize(seedLocalId)\n\n const db = BaseDb.getAppDb()\n const latestProcessRowQuery = useMemo(\n () =>\n seedLocalId && db\n ? db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n .limit(1)\n : null,\n [db, seedLocalId]\n )\n const latestRecords = useLiveQuery(latestProcessRowQuery)\n\n const record = latestRecords?.[0] as PublishProcessRecord | undefined\n const isActive = !!publishProcess || record?.status === 'in_progress'\n\n return {\n latestRecord: record,\n publishProcess,\n isActive,\n publishValue: value,\n arweaveL1Pending: arweaveL1.hasPendingL1,\n arweaveL1Jobs: arweaveL1.jobs,\n arweaveL1Summary: arweaveL1,\n }\n}\n","import { useMemo } from 'react'\nimport { useLiveQuery } from '@seedprotocol/react'\nimport { BaseDb, publishProcesses } from '@seedprotocol/sdk'\nimport { desc, eq } from 'drizzle-orm'\nimport type { PublishProcessRecord } from './useItemPublishStatus'\n\nfunction usePublishProcessesQuery() {\n const db = BaseDb.getAppDb()\n return useMemo(\n () => (db ? db.select().from(publishProcesses).orderBy(desc(publishProcesses.startedAt)) : null),\n [db]\n )\n}\n\nfunction usePublishProcessesQueryForSeed(seedLocalId: string | undefined) {\n const db = BaseDb.getAppDb()\n return useMemo(\n () =>\n db && seedLocalId\n ? db\n .select()\n .from(publishProcesses)\n .where(eq(publishProcesses.seedLocalId, seedLocalId))\n .orderBy(desc(publishProcesses.startedAt))\n : null,\n [db, seedLocalId]\n )\n}\n\n/**\n * Single live subscription for the ordered publish_processes list plus a derived non-active count.\n * Prefer this when you need both values in one component so you do not combine\n * {@link usePublishProcesses} and {@link usePublishProcessesNonActiveCount} (which would subscribe twice).\n */\nexport function usePublishProcessesState(): {\n records: PublishProcessRecord[] | undefined\n nonActiveCount: number | undefined\n} {\n const query = usePublishProcessesQuery()\n const records = useLiveQuery(query) as PublishProcessRecord[] | undefined\n const nonActiveCount = useMemo(\n () => (records === undefined ? undefined : records.filter((r) => r.status !== 'in_progress').length),\n [records]\n )\n return { records, nonActiveCount }\n}\n\nexport function usePublishProcesses(): PublishProcessRecord[] | undefined {\n const query = usePublishProcessesQuery()\n return useLiveQuery(query) as PublishProcessRecord[] | undefined\n}\n\nexport function usePublishProcessesNonActiveCount(): number | undefined {\n return usePublishProcessesState().nonActiveCount\n}\n\n/**\n * Live query of `publish_processes` for one seed, ordered by `startedAt` descending.\n * Pass `undefined` to disable the query (returns `undefined`).\n */\nexport function usePublishProcessesForSeed(\n seedLocalId: string | undefined\n): PublishProcessRecord[] | undefined {\n const query = usePublishProcessesQueryForSeed(seedLocalId)\n return useLiveQuery(query) as PublishProcessRecord[] | undefined\n}\n\n/**\n * Same as {@link usePublishProcessesForSeed} plus a derived count of rows whose status is not\n * `in_progress`. Prefer this over combining {@link usePublishProcessesForSeed} and a separate\n * count hook so you only subscribe once.\n */\nexport function usePublishProcessesStateForSeed(seedLocalId: string | undefined): {\n records: PublishProcessRecord[] | undefined\n nonActiveCount: number | undefined\n} {\n const query = usePublishProcessesQueryForSeed(seedLocalId)\n const records = useLiveQuery(query) as PublishProcessRecord[] | undefined\n const nonActiveCount = useMemo(\n () => (records === undefined ? undefined : records.filter((r) => r.status !== 'in_progress').length),\n [records]\n )\n return { records, nonActiveCount }\n}\n\nexport function usePublishProcessesNonActiveCountForSeed(\n seedLocalId: string | undefined\n): number | undefined {\n return usePublishProcessesStateForSeed(seedLocalId).nonActiveCount\n}\n\nexport function usePublishProcessById(\n id: number | undefined\n): { record: PublishProcessRecord | null; isLoading: boolean } {\n const db = BaseDb.getAppDb()\n const query = useMemo(\n () =>\n id != null && db\n ? db.select().from(publishProcesses).where(eq(publishProcesses.id, id)).limit(1)\n : null,\n [db, id]\n )\n const records = useLiveQuery(query)\n const isLoading = records === undefined\n const record = records && records.length > 0 ? (records[0] as PublishProcessRecord) : null\n return { record, isLoading }\n}\n","import { BaseDb, publishProcesses, uploadProcesses } from '@seedprotocol/sdk'\nimport { and, notInArray, eq, inArray } from 'drizzle-orm'\n\n/** Remove every publish_processes row whose status is not `in_progress` (app-wide). */\nexport async function clearCompletedPublishProcesses(): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db\n .delete(publishProcesses)\n .where(notInArray(publishProcesses.status, ['in_progress']))\n}\n\n/**\n * Same semantics as {@link clearCompletedPublishProcesses}, but only for rows with the given\n * `seedLocalId`. Never deletes `in_progress` runs for that seed.\n */\nexport async function clearCompletedPublishProcessesForSeed(seedLocalId: string): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db\n .delete(publishProcesses)\n .where(\n and(eq(publishProcesses.seedLocalId, seedLocalId), notInArray(publishProcesses.status, ['in_progress']))\n )\n}\n\nexport async function clearAllPublishProcesses(): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db.delete(publishProcesses)\n}\n\nexport async function clearAllUploadProcesses(): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db.delete(uploadProcesses)\n}\n\n/**\n * Deletes **all** `publish_processes` rows for this seed (full history, including any\n * `in_progress` run). For removing individual runs, use {@link deletePublishProcessById} or\n * {@link deletePublishProcessesByIds}.\n */\nexport async function deletePublishProcessesForSeed(seedLocalId: string): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n\n await db.delete(publishProcesses).where(eq(publishProcesses.seedLocalId, seedLocalId))\n}\n\n/** Delete a single publish process record by id. */\nexport async function deletePublishProcessById(id: number): Promise<void> {\n const db = BaseDb.getAppDb()\n if (!db) return\n await db.delete(publishProcesses).where(eq(publishProcesses.id, id))\n}\n\n/** Delete multiple publish process records by ids. */\nexport async function deletePublishProcessesByIds(ids: number[]): Promise<void> {\n if (ids.length === 0) return\n const db = BaseDb.getAppDb()\n if (!db) return\n await db.delete(publishProcesses).where(inArray(publishProcesses.id, ids))\n}\n","/**\n * Extracts Arweave transaction IDs from a publish process record's persisted snapshot.\n * Returns an empty array on parse error or when no transactions exist.\n */\nexport function getArweaveTransactionIds(record: { persistedSnapshot: string }): string[] {\n try {\n const parsed = JSON.parse(record.persistedSnapshot) as {\n context?: { arweaveTransactions?: Array<{ transaction?: { id?: string } }> }\n }\n const txs = parsed.context?.arweaveTransactions ?? []\n return txs\n .map((at) => (at.transaction as { id?: string })?.id)\n .filter((id): id is string => typeof id === 'string')\n } catch {\n return []\n }\n}\n\n/**\n * Extracts the EAS attestation payload from a publish process record's persisted snapshot.\n * Returns undefined on parse error or when no payload was persisted.\n */\nexport function getEasPayload(record: { persistedSnapshot: string }): unknown {\n try {\n const parsed = JSON.parse(record.persistedSnapshot) as {\n context?: { easPayload?: unknown }\n }\n return parsed.context?.easPayload ?? undefined\n } catch {\n return undefined\n }\n}\n","/**\n * Transforms multiPublish payload from string-based localId/publishLocalId to integer indices\n * for gas-efficient contract comparison. Use when the contract expects uint256 localIdIndex\n * and publishLocalIdIndex instead of strings.\n */\n\nexport type RequestWithStringIds = {\n localId: string\n propertiesToUpdate?: Array<{ publishLocalId?: string; propertySchemaUid?: string; [k: string]: unknown }>\n [k: string]: unknown\n}\n\nexport type RequestWithIntegerIds = Omit<RequestWithStringIds, 'localId' | 'propertiesToUpdate'> & {\n localIdIndex: bigint\n propertiesToUpdate?: Array<{\n publishLocalIdIndex: bigint\n propertySchemaUid?: string\n [k: string]: unknown\n }>\n}\n\n/**\n * Converts localId/publishLocalId strings to uint256 indices.\n * Each request's index is its position in the array (0-based).\n * Throws if any publishLocalId does not exist in the payload.\n */\nexport function transformPayloadToIntegerIds(\n requests: RequestWithStringIds[],\n): RequestWithIntegerIds[] {\n const localIdToIndex = new Map<string, bigint>()\n for (let i = 0; i < requests.length; i++) {\n const localId = requests[i]?.localId\n if (localId != null) {\n localIdToIndex.set(localId, BigInt(i))\n }\n }\n\n return requests.map((req, i) => {\n const propertiesToUpdate = (req.propertiesToUpdate ?? []).map((pu) => {\n const publishLocalId = pu.publishLocalId\n const index = publishLocalId != null ? localIdToIndex.get(publishLocalId) : undefined\n if (publishLocalId != null && publishLocalId !== '' && index === undefined) {\n throw new Error(\n `publishLocalId \"${publishLocalId}\" not found in payload (valid localIds: ${Array.from(localIdToIndex.keys()).join(', ')})`,\n )\n }\n const { publishLocalId: _omit, ...rest } = pu\n return {\n ...rest,\n publishLocalIdIndex: index ?? BigInt(0),\n }\n })\n\n const { localId: _omitLocalId, ...rest } = req\n return {\n ...rest,\n localIdIndex: BigInt(i),\n propertiesToUpdate,\n } as RequestWithIntegerIds\n })\n}\n\n/**\n * Transforms propertiesToUpdate from publishLocalId (string) to publishIndex (uint256)\n * for the Executor contract, which expects publishIndex. Keeps localId as string.\n */\nexport function transformPayloadForExecutor<T extends RequestWithStringIds>(\n requests: T[],\n): T[] {\n const localIdToIndex = new Map<string, bigint>()\n for (let i = 0; i < requests.length; i++) {\n const localId = requests[i]?.localId\n if (localId != null) {\n localIdToIndex.set(localId, BigInt(i))\n }\n }\n\n return requests.map((req) => {\n const propertiesToUpdate = (req.propertiesToUpdate ?? []).map((pu) => {\n const publishLocalId = pu.publishLocalId\n const index = publishLocalId != null ? localIdToIndex.get(publishLocalId) : undefined\n if (publishLocalId != null && publishLocalId !== '' && index === undefined) {\n throw new Error(\n `publishLocalId \"${publishLocalId}\" not found in payload (valid localIds: ${Array.from(localIdToIndex.keys()).join(', ')})`,\n )\n }\n const { publishLocalId: _omit, ...rest } = pu\n return {\n ...rest,\n publishIndex: index ?? BigInt(0),\n }\n })\n return { ...req, propertiesToUpdate } as T\n })\n}\n","import type { Account } from 'thirdweb/wallets'\nimport type { Item } from '@seedprotocol/sdk'\nimport { getConnectedModularAccount, resolveSmartWalletForPublish } from './thirdweb'\nimport { PublishManager } from '../services/publishManager'\nimport type { CreatePublishOptions } from '../config'\nimport { getPublishConfig } from '../config'\nimport { runModularExecutorPublishPrep } from './ensureManagedAccountReady'\nimport { ManagedAccountPublishError } from '../errors'\nimport { ensureEip7702ModularAccountReady } from './ensureEip7702ModularAccountReady'\n\nexport type EnsureSmartWalletResult =\n | { outcome: 'started' }\n | { outcome: 'no_address' }\n | { outcome: 'needs_deploy' }\n | { outcome: 'managed_not_ready'; error: ManagedAccountPublishError }\n\nconst MSG_NO_ACCOUNT_MODULAR =\n 'A connected wallet is required for publishing with the modular executor. Connect your wallet and try again.'\n\n/**\n * Resolves the smart wallet for the current account; if deployed, starts publish.\n * If the user has no deployed ManagedAccount (non-modular path), returns needs_deploy so the caller can open the deploy modal.\n *\n * When **`useModularExecutor`** is true:\n * - Runs {@link runModularExecutorPublishPrep} first and uses the **ManagedAccount** address as the publish `address` (context for `multiPublish`).\n * - Resolves the signing account from the **modular EIP-7702** in-app wallet ({@link getConnectedModularAccount}), not from `activeAccount` or {@link resolveSmartWalletForPublish}.\n * - Runs {@link ensureEip7702ModularAccountReady} before spawning the publish machine (idempotent with `createAttestations`).\n * The **`activeAccount`** argument is ignored on this path (kept for API compatibility with call sites).\n *\n * Pass `options.publishMode`: `patch` (default) publishes only pending properties on the current Version;\n * `new_version` creates a new Version attestation and re-attests all properties (requires an existing Seed UID).\n */\nexport async function ensureSmartWalletThenPublish(\n item: Item<any>,\n activeAccount: Account | null | undefined,\n getAddress: () => Promise<string | null>,\n options?: CreatePublishOptions,\n): Promise<EnsureSmartWalletResult> {\n const config = getPublishConfig()\n const address = await getAddress()\n if (!address || !address.trim()) {\n return { outcome: 'no_address' }\n }\n\n if (config.useModularExecutor) {\n const prep = await runModularExecutorPublishPrep()\n if (!prep.ok) {\n return { outcome: 'managed_not_ready', error: prep.error }\n }\n\n const modularAccount = await getConnectedModularAccount()\n if (!modularAccount) {\n return {\n outcome: 'managed_not_ready',\n error: new ManagedAccountPublishError(MSG_NO_ACCOUNT_MODULAR, 'MANAGED_ACCOUNT_UNAVAILABLE'),\n }\n }\n\n await ensureEip7702ModularAccountReady()\n\n const managedAddress = prep.managedAddress\n PublishManager.createPublish(item, managedAddress, modularAccount, {\n dataItemSigner: modularAccount,\n ...options,\n })\n return { outcome: 'started' }\n }\n\n const resolved = await resolveSmartWalletForPublish(activeAccount ?? null)\n if ('address' in resolved) {\n PublishManager.createPublish(item, resolved.address, resolved.account, {\n dataItemSigner: resolved.account,\n ...options,\n })\n return { outcome: 'started' }\n }\n return { outcome: 'needs_deploy' }\n}\n","import { getPublishConfig } from '../config'\nimport { EAS_CONTRACT_ADDRESS } from './constants'\n\nfunction uniqueAddressesLower(addresses: string[]): `0x${string}`[] {\n const set = new Set<string>()\n for (const a of addresses) {\n const t = a.trim().toLowerCase()\n if (t.startsWith('0x') && t.length === 42) set.add(t)\n }\n return [...set].sort().map((x) => x as `0x${string}`)\n}\n\n/** Allowlisted call targets for modular session signers: managed account, EAS, optional executor module. */\nexport function defaultApprovedTargetsForModularPublish(managedAddress: string): `0x${string}`[] {\n const cfg = getPublishConfig()\n const extra: string[] = [managedAddress, EAS_CONTRACT_ADDRESS]\n if (cfg.modularAccountModuleContract?.trim()) {\n extra.push(cfg.modularAccountModuleContract.trim())\n }\n return uniqueAddressesLower(extra)\n}\n"],"names":["SCHEMA_REGISTRY_ADDRESS","EAS_SCHEMA_NAME_ATTESTATION_UID","THIRDWEB_ACCOUNT_FACTORY_ADDRESS","EAS_CONTRACT_ADDRESS","MULTI_PUBLISH_ABI_REFERENCE_ADDRESS_OP_SEPOLIA","SEED_PROTOCOL_CONTRACT_ADDRESS_OP_SEPOLIA","PublishMachineStates","LONG_RUNNING_PUBLISH_STATES","PERIODIC_SAVE_INTERVAL_MS","getAddress","options","readContract","createAccount","prepareContractCall","logger","debug","SEED_IN_APP_SESSION_PREFIX","_publishInAppWalletStorage","getSharedPublishInAppWalletStorage","key","value","_client","getClient","thirdwebClientId","getPublishConfig","createThirdwebClient","wallets","createWallet","useLocalWalletAccount","localWalletAccount","setLocalWalletAccount","useState","useRef","useEffect","useActiveSmartWalletContract","account","useActiveAccount","contract","setContract","getContract","optimismSepolia","getManagedAccountFactoryContract","thirdwebAccountFactoryAddress","getSmartWalletAddressForAdmin","adminAddress","data","factory","getFactoryAddress","isSmartWalletDeployed","smartWalletAddress","isContractDeployed","resolveSmartWalletForPublish","ExternalWalletsForDeploy","deploySmartWalletContract","localAccount","managedAccountFactoryContract","createAccountTx","result","sendTransaction","receipt","waitForReceipt","appMetadata","getConnectedManagedAccountAddress","chain","managedAccountWallet","getManagedAccountWallet","managedAccount","getConnectedAccount","wallet","getModularAccountWallet","getConnectedModularAccount","_managedInAppWallet","inAppWallet","_modularInAppWallet","_walletsForConnectButton","getWalletsForConnectButton","EAS_ERRORS_ABI","attestedEvent","prepareEvent","ZERO_ADDRESS","ZERO_BYTES32","prepareEasAttest","client","params","easContractAddress","prepareEasMultiAttest","requests","encodeBytes32","encodeAbiParameters","getAttestationUidFromReceipt","getAttestedUidsFromReceipt","want","logs","l","parsed","parseEventLogs","out","ev","uid","schemaUid","prepareEasMultiRevoke","r","d","resolveRevokeAccount","attester","additionalGetter","getGetAdditionalSyncAddresses","additional","attesterLower","a","derivedManagedAccount","derivedLower","revokeAttestations","seedLocalId","seedUid","seedSchemaUid","getAttesterForSeed","revokeAccount","versionRows","metadataRows","getVersionsForSeedUid","getMetadataAttestationUidsForSeedUid","versionUids","isValidEasAttestationUid","metadataBySchema","list","uids","VERSION_SCHEMA_UID_OPTIMISM_SEPOLIA","req","multiRevokeTx","err","msg","revokedAt","updateSeedRevokedAt","configRef","setConfigRef","c","getConfigRef","initPublish","setGetPublisherForNewSeeds","setRevokeExecutor","m","setAdditionalSyncAddresses","configurePublish","config","useArweaveBundler","arweaveUploadVerificationBaseUrl","arweaveGraphqlUrl","DEFAULT_ARWEAVE_GRAPHQL_URL","useModularExecutor","resolveAutoDeployEip7702ModularAccount","AttestationVerificationError","message","expectedSchemas","foundSchemas","code","stringifyUnderlyingCause","u","maxLen","nested","o","parts","ManagedAccountPublishError","managedAddress","underlyingCause","extra","isManagedAccountPublishError","Eip7702ModularAccountPublishError","modularAddress","eip7702ModularCodes","isEip7702ModularAccountPublishError","isRouterNonModularCoreAccountError","cause","PublishConfigContext","createContext","usePublishConfig","useContext","PublishProvider","children","queryClient","queryClientRef","jsx","ThirdwebProvider","SeedProvider","MODULE_INSTALL_MSG","ensureExecutorModuleInstalled","contractAddress","modularAccountModuleContract","accountContract","installed","getInstalledModules","moduleAddr","tx","installModule","assignRestoreFromDb","assign","context","event","incomingProcesses","incomingSubscriptions","getArweave","host","BaseArweaveClient","ArweaveModule","Arweave","waitForItem","item","Item","resolve","interval","found","deserializeChunks","serialized","s","p","serializeChunks","chunks","createArweaveTransactions","fromPromise","publishOpts","def","publishUploads","signArweaveTransactions","arweaveJwk","uploads","results","arweave","jwk","upload","json","serializedChunks","rest","attrs","createArweaveTransactionsPhase2","preparingHtmlEmbedded","policy","prepareHtmlEmbeddedImagesForPublish","toUploadedPairs","txs","ups","n","i","t","id","rewritingHtmlEmbedded","pairs","rewriteHtmlEmbeddedImagesOnDisk","buildPublishUploadDataTags","contentHash","contentType","tags","getContentHash","bytes","hashBuffer","b","EXTENSION_TO_MIME","getMimeTypeFromPath","filePathOrName","ext","toUint8Array","getStorageDirForDataType","dataType","BaseFileManager","DATA_URI_IMAGE","decodeDataUriImage","dataUri","mimeType","base64","binary","processUploadPropertyData","uploadProperty","relatedItemProperty","itemProperty","childUploads","childProperty","filePath","fileContents","fileBuffer","fs","separator","compositeFileContents","childUpload","childUploadContents","uint8Array","itemPropertyLocalId","itemPropertyName","getStorageSeedUploadData","itemStorageSeedProperties","snapshot","propertyValue","refResolvedValue","getCorrectId","ModelPropertyDataTypes","appendCoPublishedImageUploadData","appDb","BaseDb","rows","htmlEmbeddedImageCoPublish","eq","seen","row","imageItem","st","stSnap","stCtx","stValue","decoded","more","getPublishUploadData","itemUploadProperties","itemRelationProperties","itemImageProperties","getSegmentedItemProperties","storageSeedUploads","relationProperty","relatedItem","SIG_TYPE_ETHEREUM","SIG_LENGTH","PLACEHOLDER_MESSAGE","ANCHOR_LENGTH","UINT64_MASK","buildPublishAnchorBytes","walletAddress","timestampMs","uniqueness","hash","ethers","encodeTargetOrAnchorSection","raw","isEthersWallet","signer","writeZigZagVInt","offset","pos","byte","serializeTags","encoder","temp","appendLong","len","tag","nameBytes","valueBytes","totalLength","sum","chunk","writeUint64LE","buf","view","sha384","concat","deepHash","enc","acc","chunkHash","tagHash","dataHash","getSignatureData","ownerBytes","rawTarget","rawAnchor","rawTags","rawData","buildMessageBytes","serializedTags","numTagsBytes","numTagBytesBytes","targetSection","anchorSection","messageparts","messageLength","part","assembleDataItemAndId","signature","sigTypeBytes","fullLength","base64url","createSignedDataItem","pubKeyHex","signatureData","createSignedDataItemWithAccount","placeholderHex","placeholderSig","digest","signatureDataHex","sigHex","OWNER_LENGTH_ETHEREUM","getTagsStartOffset","targetStart","targetFlag","targetPresent","anchorFlag","anchorPresent","sliceTargetAndAnchor","tagsStart","anchorStart","verifyDataItem","minLength","numTagBytes","tagsEnd","recoveredPubKey","recoveredBytes","signBundlerUploadDataList","uploadDataList","signDataItems","dataItemSigner","arweaveTransactions","signedDataItems","items","randomUniq","dataItem","createArweaveDataItems","uploadDataOpts","executeCreateArweaveDataItemsPhase2","createArweaveDataItemsPhase2","BASE64_CHUNK_SIZE","arrayBufferToBase64","buffer","formDataToSerializableParts","formData","name","entry","file","uploadServerErrorMessage","status","body","transactionKeys","uploadNetworkErrorMessage","technicalMessage","postUploadArweaveStart","url","uploadApiBaseUrl","api","res","sendReimbursementRequest","reimbursementTransactionId","transactions","transaction","dataBlob","chunksBlob","jsonBlob","serverMessage","technicalMsg","errMsg","pollForConfirmation","requestResponse","reject","response","ensureUint8Array","uploadData","fromCallback","sendBack","input","ctx","resumeState","startIndex","total","rawTransaction","uploader","uploaderState","dataBytes","pct","error","BATCH_UPLOAD_TIMEOUT_MS","importDynamic","nodeFsPromisesCache","getNodeFsPromises","specifier","mod","uploadViaBundler","bundlerUrl","itemCount","getRawCache","rawByteLength","resolved","nodeFsPromises","totalSize","lengths","payload","cached","controller","uploadTimeoutId","failed","succeeded","MSG_UNAVAILABLE","MSG_NOT_DEPLOYED","MSG_NOT_DEPLOYED_AFTER_ATTEMPT","MSG_FAILED_DEPLOY","ensureManagedAccountReady","getManagedAccountSigningAccount","managedWallet","tryDeployManagedAccount","runModularExecutorPublishPrep","state","e","signingAccount","adminUpdatedEvent","filters","initializedEvent","signerPermissionsUpdatedEvent","contractURIUpdatedEvent","createdAttestationEvent","eIP712DomainChangedEvent","logEvent","ownershipTransferredEvent","seedPublishedEvent","entryPoint","getAllActiveSigners","getAllAdmins","getAllExtensions","getAllSigners","getImplementationForFunction","getNonce","getPermissionsForSigner","isActiveSigner","isAdmin","isValidSigner","verifySignerPermissionRequest","contractURI","getMessageHash","isValidSignature","supportsInterface","eip712Domain","getEas","owner","initialize","multicall","setEntrypointOverride","setPermissionsForSigner","validateUserOp","addDeposit","execute","executeBatch","onERC1155BatchReceived","onERC1155Received","onERC721Received","setContractURI","withdrawDepositTo","createSeed","createVersion","multiPublish","multiPublishWithIntegerIds","publish","renounceOwnership","setEas","transferOwnership","PERSIST_SEED_UID_TIMEOUT_MS","persistSeedUidFromPublishResult","normalizedRequests","match","persistSeedUidSafely","address","attestationCreatedAtMs","persist","timeout","_","SCHEMA_REGISTRY_ABI","getSchemaRegistryContract","GET_SCHEMA_SIGNATURE","getSchemaRecord","registerSchema","prepareNameSchemaAttestation","encodedData","SchemaEncoder","NO_EXPIRATION","RESOLVER_ADDRESS","REVOCABLE","toSnakeCase","str","getModelNamesForItem","itemListProperties","modelNames","prop","ref","ensureEasSchemasForItem","itemBasicProperties","allProperties","registeredSchemaUids","registeredModelSchemaUids","modelName","schemaDef","SchemaRegistry","setSchemaUidForModel","registerTx","registerResult","attestTx","attestResult","storageSchemaDef","storageSchemaUid","setSchemaUidForSchemaDefinition","property","easDataTypeRaw","INTERNAL_DATA_TYPES","nameForEas","propertyNameSnakeCase","easDataTypeForLookup","schema","getEasSchemaForItemProperty","onChainRecord","relatedItems","getRelatedItemsForPublish","verifyArweaveTransactionsExist","txIds","txId","getUploadPipelineTransactionStatus","detail","toHex32Normalized","v","seedUidFromCreatedAttestationEvents","wantSchema","createdAttestationEvt","executorCreatedAttestationEvent","uidsFromSeedPublished","listOfAttestationsCount","first","executorSeedPublishedEvent","args","versionUid","decodeAbiParameters","seedIndex","atSeed","atVersion","seedUidFromSeedPublished","versionUidFromCreatedAttestationEvents","versionSchemaUid","listCreatedAttestationPairsFromReceipt","su","attestationMsFromReceipt","bn","rpc","getRpcClient","ts","eth_getBlockByNumber","BYTES32_LEN","toHex32","arr","toBytesHex","hex","hasCrossPayloadUnresolved","reqs","localIds","att","filterPropertiesToUpdateForBatch","propertiesToUpdate","batchLocalIds","pu","placeholderData","normalizePublishRequest","listOfAttestations","dataArr","applyPropertiesToUpdatePlaceholders","byLocalId","targetId","targetReq","PHASE_PENDING","enqueueArweaveL1FinalizeJobsFromPublishContext","db","now","ar","up","dataItemId","arweaveL1FinalizeJobs","MSG_NO_ACCOUNT","MSG_NOT_UPGRADED","MSG_DEPLOY_FAILED","MSG_NOT_CONFIRMED","ensureEip7702ModularAccountReady","autoDeployEip7702ModularAccount","modularAccountWallet","modularAccount","deploySmartAccount","MSG_SET_EAS","normAddr","ensureManagedAccountEasConfigured","expected","zeroAddress","current","resolvePublishRouting","publisherAddress","persistVersionUidFromPublishReceipt","contractAddressForEvents","attMs","updateVersionUid","schemaMatchesAttestationPair","pairSchema","requestSchema","consumeIfSchemaMatches","all","persistPropertyMetadataUidsFromContractReceipt","allPairs","slice","nApply","versionUidRow","applyPropertyAttestationUidsFromPublish","j","createAttestations","txCount","uploadCount","routing","activeAccount","uploadDataWithTxIds","arweaveTransaction","requestData","prep","targetContract","needsSequential","effectiveRequests","lastAttestationReceipt","workingPayload","resolvedUids","resolvePublishPayloadValues","rawReq","reqForPublish","normalizedOne","byLocalIdSingle","hadZeroSeedUid","seedUidFromTx","payloadForContract","rootReqSingle","firstRequest","firstRequestSeedUid","itemWithPersist","rootSeedUid","seedAttMs","clearHtmlEmbeddedImageCoPublishRows","VERIFY_DELAY_MS","VERIFY_MAX_ATTEMPTS","verifyAttestations","request","easProperties","lastError","attempt","getItemPropertiesFromEas","foundSet","createAttestationsDirectToEas","lastAttestationMs","newSeedUid","newVersionUid","seedUidFromReceipt","versionUidFromReceipt","multiRequests","multiTx","attested","sameLen","resolveItem","itemNeedsArweaveUpload","itemHasPublishUploadCandidates","activePublishProcesses","resolveAttestationStrategy","cfg","checking","publishMode","isItemOwned","validation","validateItemForPublish","attestationStrategy","needsArweave","useBundler","SUCCESS","FAILURE","attestationUsesDirectEas","attestationUsesMultiPublish","getErrorFromEvent","publishMachine","setup","errors","setPublishManagerRef","getPublishManagerRef","getStateValue","isLongRunningState","stateValue","subscribe","receive","publishProcess","managerRef","periodicSaveIntervalId","clearPeriodicSave","startPeriodicSaveIfNeeded","live","liveValue","subscription","type","createPublish","enqueueActions","enqueue","spawn","publishProcesses","publishRunId","publishCfg","arweaveUploadTags","subscriptions","subscriptionProcess","retryAttestations","stopScopedOrStandaloneChild","self","child","saveWriteTailBySeed","enqueueSaveWrite","write","next","isTerminalPublishRowStatus","statusFromSnapshot","MAX_ERROR_MESSAGE_LENGTH","MAX_ERROR_DETAILS_LENGTH","jsonStringifyPersistedSnapshot","_key","publishRunIdFromSnapshot","errorFieldsFromContext","errorMessage","errorStep","errorDetails","markInProgressPublishInterrupted","existing","and","desc","savePublish","persistedSnapshot","triggerPublishDone","snapshotStr","errorFields","rec","incomingRunId","latest","prevParsed","schemaId","stopPublish","newPublishProcesses","newSubscriptions","stopAll","query","addSubscription","newSubscription","HEAVY_PUBLISH_CONTEXT_KEYS","stripHeavyContextFields","k","stripHeavyPublishSnapshot","nestedOut","getPersistableSnapshot","actor","snap","requestSavePublish","publishDone","removeSubscription","RESTORE_DB_WAIT_MS","RESTORE_DB_POLL_MS","waitForDb","maxWaitMs","deadline","isRestorableSnapshot","isPersistedActorRef","patchPublishContextItemForRestore","record","restoreFromDb","inProgress","bySeed","sorted","publishProcessRecords","publishProcessRecord","createActor","publishManagerMachine","publishManager","PublishManager","subscriptionActor","USER_DISCONNECTED_SESSION_KEY","reportWalletSetupWarning","waitUntilSeedInitialized","seedClient","ensureExecutorModulesForConnect","mw","ma","ConnectButton","useActiveWallet","connectionStatus","useActiveWalletConnectionStatus","isAutoConnecting","useIsAutoConnecting","lastSyncedOwnedKey","prevIsAutoConnecting","reloadAutoConnectRetried","prev","navType","userChoseDisconnect","syncActiveWalletToSeed","useCallback","activeWallet","owned","tryManaged","ownedKey","cancelled","handleDisconnect","handleConnect","_allConnectedWallets","ConnectButtonThirdweb","darkTheme","PublishModeButtons","onChange","disabled","ariaLabel","base","btn","active","getDisplayStepId","machineValue","resolvePublishDisplayValue","getPublishMachineValueForUi","isTerminalDoneSnapshot","usePublishProcess","useSelector","lastPublishSnapshotRef","setMachineValue","terminalLatch","setTerminalLatch","latestProcessRowQuery","useMemo","latestRecord","useLiveQuery","recordStatus","fromRow","last","initial","sub","useCanPublishItem","canPublish","setCanPublish","useArweaveL1Finalize","jobsQuery","jobs","pending","confirmed","useItemPublishStatus","arweaveL1","isActive","usePublishProcessesQuery","usePublishProcessesQueryForSeed","usePublishProcessesState","records","nonActiveCount","usePublishProcesses","usePublishProcessesNonActiveCount","usePublishProcessesForSeed","usePublishProcessesStateForSeed","usePublishProcessesNonActiveCountForSeed","usePublishProcessById","isLoading","clearCompletedPublishProcesses","notInArray","clearCompletedPublishProcessesForSeed","clearAllPublishProcesses","clearAllUploadProcesses","uploadProcesses","deletePublishProcessesForSeed","deletePublishProcessById","deletePublishProcessesByIds","ids","inArray","getArweaveTransactionIds","at","getEasPayload","transformPayloadToIntegerIds","localIdToIndex","localId","publishLocalId","index","_omit","_omitLocalId","MSG_NO_ACCOUNT_MODULAR","ensureSmartWalletThenPublish","uniqueAddressesLower","addresses","set","x","defaultApprovedTargetsForModularPublish"],"mappings":"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"}