@ensforge/core 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +5 -3
  2. package/dist/action/index.d.ts +1 -1
  3. package/dist/actions/batch/execute-write-plan.d.ts.map +1 -1
  4. package/dist/actions/batch/execute-write-plan.js +20 -2
  5. package/dist/actions/batch/execute-write-plan.js.map +1 -1
  6. package/dist/actions/batch/get-wallet-capabilities.d.ts +1 -1
  7. package/dist/actions/capabilities/get-name-capabilities/index.d.ts +1 -1
  8. package/dist/actions/capabilities/get-operator-approval/index.d.ts +1 -1
  9. package/dist/actions/capabilities/get-record-permissions/index.d.ts.map +1 -1
  10. package/dist/actions/capabilities/get-record-permissions/index.js +13 -1
  11. package/dist/actions/capabilities/get-record-permissions/index.js.map +1 -1
  12. package/dist/actions/capabilities/get-required-authorization/index.d.ts +1 -1
  13. package/dist/actions/capabilities/get-resolver-capabilities/index.d.ts +1 -1
  14. package/dist/actions/capabilities/get-write-target/index.d.ts +1 -1
  15. package/dist/actions/dns/get-dns-claim-status/index.d.ts +1 -1
  16. package/dist/actions/dns/get-dns-import-plan/index.d.ts +1 -1
  17. package/dist/actions/dns/get-zone-hash/index.d.ts +1 -1
  18. package/dist/actions/dns/has-dns-records/index.d.ts +1 -1
  19. package/dist/actions/dns/types.d.ts +3 -3
  20. package/dist/actions/dns/types.d.ts.map +1 -1
  21. package/dist/actions/dns/types.js.map +1 -1
  22. package/dist/actions/events/get-ens-events/index.d.ts +4 -4
  23. package/dist/actions/events/get-name-history/index.d.ts +4 -4
  24. package/dist/actions/events/types.d.ts +1 -1
  25. package/dist/actions/index.d.ts +25 -25
  26. package/dist/actions/migration/mutation.js +1 -1
  27. package/dist/actions/name/get-expiry/types.d.ts +2 -2
  28. package/dist/actions/name/get-name-state/types.d.ts +2 -2
  29. package/dist/actions/name/get-owner/index.d.ts +1 -1
  30. package/dist/actions/name/get-owner/types.d.ts +2 -2
  31. package/dist/actions/records/get-abi/types.d.ts +2 -2
  32. package/dist/actions/records/get-address/types.d.ts +2 -2
  33. package/dist/actions/records/get-avatar/types.d.ts +2 -2
  34. package/dist/actions/records/get-content-hash/types.d.ts +2 -2
  35. package/dist/actions/records/get-data/types.d.ts +2 -2
  36. package/dist/actions/records/get-interface/types.d.ts +2 -2
  37. package/dist/actions/records/get-name/types.d.ts +2 -2
  38. package/dist/actions/records/get-pubkey/types.d.ts +2 -2
  39. package/dist/actions/records/get-records/types.d.ts +3 -3
  40. package/dist/actions/records/get-text/types.d.ts +2 -2
  41. package/dist/actions/records/set-records/index.js +1 -1
  42. package/dist/actions/registration/get-commitment-status/index.d.ts +1 -1
  43. package/dist/actions/registration/get-registration-parameters/index.d.ts +1 -1
  44. package/dist/actions/registration/get-registration-plan/index.d.ts +9 -9
  45. package/dist/actions/registration/get-registration-price/index.d.ts +9 -9
  46. package/dist/actions/registration/get-renewal-price/index.d.ts +9 -9
  47. package/dist/actions/registration/is-payment-token-supported/index.d.ts +1 -1
  48. package/dist/actions/registration/renew-names/index.js +2 -2
  49. package/dist/actions/registration/renew-names/index.js.map +1 -1
  50. package/dist/actions/registration/renewal-mutation.d.ts +0 -1
  51. package/dist/actions/registration/renewal-mutation.d.ts.map +1 -1
  52. package/dist/actions/registration/renewal-mutation.js +27 -71
  53. package/dist/actions/registration/renewal-mutation.js.map +1 -1
  54. package/dist/actions/registration/types.d.ts +3 -3
  55. package/dist/actions/registration/types.d.ts.map +1 -1
  56. package/dist/actions/registration/types.js.map +1 -1
  57. package/dist/actions/resolution/create-resolver/index.d.ts +2 -0
  58. package/dist/actions/resolution/create-resolver/index.d.ts.map +1 -1
  59. package/dist/actions/resolution/create-resolver/index.js +39 -21
  60. package/dist/actions/resolution/create-resolver/index.js.map +1 -1
  61. package/dist/actions/resolution/create-resolver/prepare.d.ts.map +1 -1
  62. package/dist/actions/resolution/create-resolver/prepare.js +7 -5
  63. package/dist/actions/resolution/create-resolver/prepare.js.map +1 -1
  64. package/dist/actions/resolution/get-alias/index.d.ts.map +1 -1
  65. package/dist/actions/resolution/get-alias/index.js.map +1 -1
  66. package/dist/actions/resolution/get-resolver/types.d.ts +2 -2
  67. package/dist/actions/resolution/get-resolver-version/index.d.ts +1 -1
  68. package/dist/actions/resolution/resolve/types.d.ts +2 -2
  69. package/dist/actions/resolution/resolve-batch/index.d.ts +1 -1
  70. package/dist/actions/resolution/set-resolver/index.js +1 -1
  71. package/dist/actions/resolution/upgrade-resolver/index.js +1 -1
  72. package/dist/actions/reverse/get-primary-name/types.d.ts +2 -2
  73. package/dist/actions/subnames/intents.js +4 -24
  74. package/dist/actions/subnames/intents.js.map +1 -1
  75. package/dist/actions/wrapping/intents.js +1 -1
  76. package/dist/batch.d.ts +10 -0
  77. package/dist/batch.js +11 -0
  78. package/dist/{actions/capabilities/index.d.ts → capabilities.d.ts} +15 -15
  79. package/dist/capabilities.js +17 -0
  80. package/dist/config/config.d.ts +2 -9
  81. package/dist/config/config.d.ts.map +1 -1
  82. package/dist/config/config.js.map +1 -1
  83. package/dist/config/create-config.d.ts.map +1 -1
  84. package/dist/config/create-config.js +4 -56
  85. package/dist/config/create-config.js.map +1 -1
  86. package/dist/config/index.d.ts +2 -2
  87. package/dist/dns.d.ts +14 -0
  88. package/dist/dns.js +13 -0
  89. package/dist/errors/index.d.ts +2 -2
  90. package/dist/{actions/events/index.d.ts → events.d.ts} +4 -4
  91. package/dist/events.js +6 -0
  92. package/dist/index.d.ts +16 -16
  93. package/dist/index.js +3 -2
  94. package/dist/internal/config/create-config.js +54 -0
  95. package/dist/internal/config/create-config.js.map +1 -0
  96. package/dist/internal/errors/viem-error.d.ts +1 -1
  97. package/dist/internal/errors/write-error.js +6 -2
  98. package/dist/internal/errors/write-error.js.map +1 -1
  99. package/dist/internal/gateway/ccip-request.js +5 -1
  100. package/dist/internal/gateway/ccip-request.js.map +1 -1
  101. package/dist/internal/read/execution-context.d.ts +1 -1
  102. package/dist/internal/write/execute-sequential.js +41 -13
  103. package/dist/internal/write/execute-sequential.js.map +1 -1
  104. package/dist/internal/write/prepare-write-intents.js +1 -1
  105. package/dist/internal/write/resolver-write-action.js +1 -1
  106. package/dist/internal/write/resume-sequential.js +62 -0
  107. package/dist/internal/write/resume-sequential.js.map +1 -0
  108. package/dist/internal/write/single-write-action.js +1 -1
  109. package/dist/{actions/migration/index.d.ts → migration.d.ts} +8 -8
  110. package/dist/migration.js +10 -0
  111. package/dist/{actions/name/index.d.ts → name.d.ts} +18 -18
  112. package/dist/name.js +20 -0
  113. package/dist/{actions/ownership/index.d.ts → ownership.d.ts} +8 -8
  114. package/dist/ownership.js +8 -0
  115. package/dist/{actions/permissions/index.d.ts → permissions.d.ts} +12 -12
  116. package/dist/permissions.js +8 -0
  117. package/dist/{actions/records/index.d.ts → records.d.ts} +46 -46
  118. package/dist/records.js +34 -0
  119. package/dist/{actions/registration/index.d.ts → registration.d.ts} +15 -15
  120. package/dist/registration.js +16 -0
  121. package/dist/{actions/resolution/index.d.ts → resolution.d.ts} +20 -20
  122. package/dist/resolution.js +15 -0
  123. package/dist/{actions/reverse/index.d.ts → reverse.d.ts} +7 -7
  124. package/dist/reverse.js +8 -0
  125. package/dist/{actions/subnames/index.d.ts → subnames.d.ts} +5 -5
  126. package/dist/subnames.js +6 -0
  127. package/dist/testing/create-test-config.js +2 -2
  128. package/dist/wagmi/config.d.ts +9 -0
  129. package/dist/wagmi/config.d.ts.map +1 -0
  130. package/dist/wagmi/create-config.d.ts +7 -0
  131. package/dist/wagmi/create-config.d.ts.map +1 -0
  132. package/dist/wagmi/create-config.js +20 -0
  133. package/dist/wagmi/create-config.js.map +1 -0
  134. package/dist/wagmi.d.ts +3 -0
  135. package/dist/wagmi.js +3 -0
  136. package/dist/{actions/wrapping/index.d.ts → wrapping.d.ts} +10 -10
  137. package/dist/wrapping.js +7 -0
  138. package/dist/write/types.d.ts +2 -2
  139. package/package.json +25 -3
  140. package/dist/actions/batch/index.d.ts +0 -10
  141. package/dist/actions/dns/index.d.ts +0 -14
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/actions/registration/renew-names/index.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { erc20AllowanceAbi } from \"@ensforge/contracts/shared\";\nimport { keccak256, stringToHex } from \"viem\";\n\nimport { defineAction } from \"../../../action/action.js\";\nimport type { EnsforgeConfig } from \"../../../config/config.js\";\nimport { RenewalError } from \"../../../errors/renewal-error.js\";\nimport { provideConfig } from \"../../../internal/config/context.js\";\nimport { viemErrorToEffectError } from \"../../../internal/errors/viem-error.js\";\nimport { resolveWalletContext } from \"../../../internal/services/wallet-client.js\";\nimport { normalizeName } from \"../../../names/normalize.js\";\nimport type { WriteError, WritePlan } from \"../../../write/types.js\";\nimport { executeWritePlan } from \"../../batch/execute-write-plan.js\";\nimport { getExpiry } from \"../../name/get-expiry/index.js\";\nimport { getNameState } from \"../../name/get-name-state/index.js\";\nimport { getRenewalPrice } from \"../get-renewal-price/index.js\";\nimport {\n approveRenewalPayment,\n makeRenewalBatchIntent,\n makeRenewalIntent,\n supportsContractRenewalBatch,\n} from \"../renewal-mutation.js\";\nimport type {\n RenewNamesParameters,\n RenewNamesResult,\n RenewalApproval,\n RenewalPriceResult,\n} from \"../types.js\";\n\nconst confirmed = { type: \"confirmed\" } as const;\n\ntype Quote = Extract<RenewalPriceResult, { status: \"renewable\" }>;\ntype Entry = {\n readonly index: number;\n readonly parameters: RenewNamesParameters[\"renewals\"][number];\n readonly name: string;\n readonly quote: Quote;\n readonly previousExpiry: bigint | null;\n};\n\nconst planId = (parameters: RenewNamesParameters, names: ReadonlyArray<string>) =>\n `renewNames:${keccak256(\n stringToHex(\n JSON.stringify(\n {\n renewals: parameters.renewals.map((renewal, index) => ({\n ...renewal,\n name: names[index] ?? renewal.name,\n })),\n maxTotalPrice: parameters.maxTotalPrice ?? null,\n },\n (_key, value: unknown) => (typeof value === \"bigint\" ? value.toString() : value),\n ),\n ),\n )}`;\n\nconst requireQuote = (quote: RenewalPriceResult): Effect.Effect<Quote, RenewalError> => {\n switch (quote.status) {\n case \"not-renewable\":\n return new RenewalError({\n code: \"NAME_NOT_RENEWABLE\",\n message: `${quote.name} is not renewable`,\n });\n case \"payment-token-required\":\n return new RenewalError({\n code: \"PAYMENT_TOKEN_REQUIRED\",\n message: `A payment token is required to renew ${quote.name}`,\n });\n case \"unsupported-payment-token\":\n return new RenewalError({\n code: \"PAYMENT_TOKEN_UNSUPPORTED\",\n message: `The selected payment token is not supported for ${quote.name}`,\n });\n default:\n return Effect.succeed(quote);\n }\n};\n\nconst renewNamesEffect = Effect.fn(\"ensforge.renewNames\")(function* (\n config: EnsforgeConfig,\n parameters: RenewNamesParameters,\n): Effect.fn.Return<RenewNamesResult, WriteError> {\n if (parameters.renewals.length === 0) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"renewNames requires at least one renewal\",\n });\n }\n const names = yield* Effect.forEach(parameters.renewals, (renewal) =>\n normalizeName.effect(renewal.name),\n );\n if (new Set(names).size !== names.length) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"renewNames cannot contain duplicate names\",\n });\n }\n const id = planId(parameters, names);\n if (parameters.resume?.write.status === \"completed\") {\n if (parameters.resume.write.planId !== id) {\n return yield* new RenewalError({\n code: \"ROUTE_CHANGED\",\n message: \"Renewal resume data does not match the supplied renewals\",\n });\n }\n const renewals = yield* Effect.forEach(parameters.resume.renewals, (renewal) =>\n Effect.all(\n [\n getExpiry.effect(config, { name: renewal.name }),\n getNameState.effect(config, { name: renewal.name }),\n ] as const,\n { concurrency: \"unbounded\" },\n ).pipe(\n Effect.map(([expiry, finalState]) => ({\n ...renewal,\n newExpiry: expiry?.expiry ?? null,\n finalState,\n })),\n ),\n );\n return { ...parameters.resume, renewals };\n }\n\n const entries = yield* Effect.forEach(\n parameters.renewals,\n (renewal, index) =>\n Effect.all(\n [\n getRenewalPrice\n .effect(config, {\n name: names[index] ?? renewal.name,\n duration: renewal.duration,\n ...(renewal.paymentToken === undefined ? {} : { paymentToken: renewal.paymentToken }),\n })\n .pipe(Effect.flatMap(requireQuote)),\n getExpiry.effect(config, { name: names[index] ?? renewal.name }),\n ] as const,\n { concurrency: \"unbounded\" },\n ).pipe(\n Effect.map(([quote, expiry]): Entry => ({\n index,\n parameters: renewal,\n name: names[index] ?? renewal.name,\n quote,\n previousExpiry:\n parameters.resume?.renewals[index]?.previousExpiry ?? expiry?.expiry ?? null,\n })),\n ),\n { concurrency: config.reads.concurrency },\n );\n for (const entry of entries) {\n if (entry.parameters.maxPrice !== undefined && entry.quote.price > entry.parameters.maxPrice) {\n return yield* new RenewalError({\n code: \"PRICE_EXCEEDS_MAXIMUM\",\n message: `The current renewal price for ${entry.name} exceeds maxPrice`,\n });\n }\n }\n const totalPrice = entries.reduce((sum, entry) => sum + entry.quote.price, 0n);\n if (parameters.maxTotalPrice !== undefined && totalPrice > parameters.maxTotalPrice) {\n return yield* new RenewalError({\n code: \"TOTAL_PRICE_EXCEEDS_MAXIMUM\",\n message: \"The current renewal price exceeds maxTotalPrice\",\n });\n }\n\n const grouped = new Map<string, Array<Entry>>();\n for (const entry of entries) {\n const token = entry.quote.currency.kind === \"erc20\" ? entry.quote.currency.address : \"native\";\n const v1Arguments =\n entry.quote.route === \"v1-controller\"\n ? `${entry.parameters.duration}:${entry.parameters.referrer ?? \"default\"}`\n : \"mixed\";\n const key = `${entry.quote.route}:${entry.quote.renewer}:${token}:${v1Arguments}`;\n grouped.set(key, [...(grouped.get(key) ?? []), entry]);\n }\n\n const { account } = yield* provideConfig(config, resolveWalletContext(parameters));\n const payer = typeof account === \"string\" ? account : account.address;\n const stages: Array<WritePlan[\"stages\"][number]> = [];\n const approvals: Array<RenewalApproval> = [];\n let groupIndex = 0;\n for (const group of grouped.values()) {\n const first = group[0];\n if (first === undefined) continue;\n const renewalStageId = `renew-group-${groupIndex}`;\n const groupCompleted = parameters.resume?.write.completedStages.some(\n (stage) => stage.id === renewalStageId,\n );\n let approval = parameters.resume?.approvals.find(\n (candidate) =>\n candidate.spender === first.quote.renewer &&\n candidate.token ===\n (first.quote.currency.kind === \"erc20\" ? first.quote.currency.address : null),\n );\n if (first.quote.currency.kind === \"erc20\" && approval === undefined && !groupCompleted) {\n const currency = first.quote.currency;\n const allowance = yield* Effect.tryPromise({\n try: () =>\n config.publicClient.readContract({\n address: currency.address,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [payer, first.quote.renewer],\n }),\n catch: (cause) => viemErrorToEffectError(cause, \"readContract\"),\n });\n const groupPrice = group.reduce((sum, entry) => sum + entry.quote.price, 0n);\n approval = {\n required: allowance < groupPrice,\n spender: first.quote.renewer,\n token: currency.address,\n amount: group.reduce(\n (sum, entry) => sum + (entry.parameters.maxPrice ?? entry.quote.price),\n 0n,\n ),\n };\n }\n if (approval !== undefined) approvals.push(approval);\n if (approval?.required && approval.token !== null) {\n stages.push({\n type: \"calls\",\n id: `approve-group-${groupIndex}`,\n calls: [\n approveRenewalPayment.call({\n name: first.name,\n duration: first.parameters.duration,\n paymentToken: approval.token,\n amount: approval.amount,\n }),\n ],\n mode: \"sequential\",\n atomicity: \"none\",\n confirmation: confirmed,\n });\n }\n const contractBatch = supportsContractRenewalBatch(config, first.quote.route);\n stages.push({\n type: \"calls\",\n id: renewalStageId,\n calls: contractBatch\n ? [\n makeRenewalBatchIntent({\n renewals: group.map((entry) => entry.parameters),\n ...(parameters.maxTotalPrice === undefined\n ? {}\n : { maxTotalPrice: parameters.maxTotalPrice }),\n }),\n ]\n : group.map((entry) => makeRenewalIntent(entry.parameters)),\n mode: contractBatch ? \"sequential\" : (parameters.mode ?? \"auto\"),\n atomicity: contractBatch || group.length === 1 ? \"none\" : \"preferred\",\n confirmation: parameters.confirmation ?? confirmed,\n });\n groupIndex += 1;\n }\n\n const write = yield* executeWritePlan\n .effect(config, {\n plan: { id, stages },\n ...(parameters.resume === undefined ? {} : { resume: parameters.resume.write }),\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n })\n .pipe(\n Effect.mapError((error) =>\n error instanceof RenewalError\n ? error\n : new RenewalError({ code: \"RENEWAL_FAILED\", message: \"Unable to renew names\" }),\n ),\n );\n const completedIds = new Set(write.completedStages.map((stage) => stage.id));\n const renewals = yield* Effect.forEach(\n entries,\n Effect.fn(\"ensforge.renewNames.result\")(function* (entry) {\n const containingGroup = [...grouped.values()].findIndex((group) => group.includes(entry));\n const group = [...grouped.values()][containingGroup];\n const stageId = `renew-group-${containingGroup}`;\n const stage = write.completedStages.find((candidate) => candidate.id === stageId);\n const entryCall = group?.findIndex((candidate) => candidate === entry) ?? -1;\n const callResult =\n stage?.result.mode === \"sequential\" && entryCall >= 0\n ? stage.result.calls[entryCall]\n : undefined;\n const completed =\n completedIds.has(stageId) ||\n (group !== undefined &&\n !supportsContractRenewalBatch(config, entry.quote.route) &&\n callResult !== undefined &&\n callResult.status !== \"not-started\");\n if (!completed) {\n return {\n name: entry.quote.name,\n protocol: entry.quote.protocol,\n route: entry.quote.route,\n duration: entry.parameters.duration,\n previousExpiry: entry.previousExpiry,\n newExpiry: null,\n price: entry.quote.price,\n currency: entry.quote.currency,\n finalState: null,\n } satisfies RenewNamesResult[\"renewals\"][number];\n }\n const [expiry, finalState] = yield* Effect.all(\n [\n getExpiry.effect(config, { name: entry.name }),\n getNameState.effect(config, { name: entry.name }),\n ] as const,\n { concurrency: \"unbounded\" },\n );\n return {\n name: entry.quote.name,\n protocol: entry.quote.protocol,\n route: entry.quote.route,\n duration: entry.parameters.duration,\n previousExpiry: entry.previousExpiry,\n newExpiry: expiry?.expiry ?? null,\n price: entry.quote.price,\n currency: entry.quote.currency,\n finalState,\n } satisfies RenewNamesResult[\"renewals\"][number];\n }),\n );\n return {\n status: write.status === \"completed\" ? \"completed\" : \"partial\",\n renewals,\n approvals,\n totalPrice,\n write,\n };\n});\n\nexport const renewNames = defineAction<RenewNamesParameters, RenewNamesResult, WriteError>(\n renewNamesEffect,\n);\n\nexport type { RenewNamesParameters, RenewNamesResult } from \"../types.js\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/actions/registration/renew-names/index.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { erc20AllowanceAbi } from \"@ensforge/contracts/shared\";\nimport { keccak256, stringToHex } from \"viem\";\n\nimport { defineAction } from \"../../../action/action.js\";\nimport type { EnsforgeConfig } from \"../../../config/config.js\";\nimport { RenewalError } from \"../../../errors/renewal-error.js\";\nimport { provideConfig } from \"../../../internal/config/context.js\";\nimport { viemErrorToEffectError } from \"../../../internal/errors/viem-error.js\";\nimport { resolveWalletContext } from \"../../../internal/services/wallet-client.js\";\nimport { normalizeName } from \"../../../names/normalize.js\";\nimport type { WriteError, WritePlan } from \"../../../write/types.js\";\nimport { executeWritePlan } from \"../../batch/execute-write-plan.js\";\nimport { getExpiry } from \"../../name/get-expiry/index.js\";\nimport { getNameState } from \"../../name/get-name-state/index.js\";\nimport { getRenewalPrice } from \"../get-renewal-price/index.js\";\nimport {\n approveRenewalPayment,\n makeRenewalBatchIntent,\n makeRenewalIntent,\n supportsContractRenewalBatch,\n} from \"../renewal-mutation.js\";\nimport type {\n RenewNamesParameters,\n RenewNamesResult,\n RenewalApproval,\n RenewalPriceResult,\n} from \"../types.js\";\n\nconst confirmed = { type: \"confirmed\" } as const;\n\ntype Quote = Extract<RenewalPriceResult, { status: \"renewable\" }>;\ntype Entry = {\n readonly index: number;\n readonly parameters: RenewNamesParameters[\"renewals\"][number];\n readonly name: string;\n readonly quote: Quote;\n readonly previousExpiry: bigint | null;\n};\n\nconst planId = (parameters: RenewNamesParameters, names: ReadonlyArray<string>) =>\n `renewNames:${keccak256(\n stringToHex(\n JSON.stringify(\n {\n renewals: parameters.renewals.map((renewal, index) => ({\n ...renewal,\n name: names[index] ?? renewal.name,\n })),\n maxTotalPrice: parameters.maxTotalPrice ?? null,\n },\n (_key, value: unknown) => (typeof value === \"bigint\" ? value.toString() : value),\n ),\n ),\n )}`;\n\nconst requireQuote = (quote: RenewalPriceResult): Effect.Effect<Quote, RenewalError> => {\n switch (quote.status) {\n case \"not-renewable\":\n return new RenewalError({\n code: \"NAME_NOT_RENEWABLE\",\n message: `${quote.name} is not renewable`,\n });\n case \"payment-token-required\":\n return new RenewalError({\n code: \"PAYMENT_TOKEN_REQUIRED\",\n message: `A payment token is required to renew ${quote.name}`,\n });\n case \"unsupported-payment-token\":\n return new RenewalError({\n code: \"PAYMENT_TOKEN_UNSUPPORTED\",\n message: `The selected payment token is not supported for ${quote.name}`,\n });\n default:\n return Effect.succeed(quote);\n }\n};\n\nconst renewNamesEffect = Effect.fn(\"ensforge.renewNames\")(function* (\n config: EnsforgeConfig,\n parameters: RenewNamesParameters,\n): Effect.fn.Return<RenewNamesResult, WriteError> {\n if (parameters.renewals.length === 0) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"renewNames requires at least one renewal\",\n });\n }\n const names = yield* Effect.forEach(parameters.renewals, (renewal) =>\n normalizeName.effect(renewal.name),\n );\n if (new Set(names).size !== names.length) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"renewNames cannot contain duplicate names\",\n });\n }\n const id = planId(parameters, names);\n if (parameters.resume?.write.status === \"completed\") {\n if (parameters.resume.write.planId !== id) {\n return yield* new RenewalError({\n code: \"ROUTE_CHANGED\",\n message: \"Renewal resume data does not match the supplied renewals\",\n });\n }\n const renewals = yield* Effect.forEach(parameters.resume.renewals, (renewal) =>\n Effect.all(\n [\n getExpiry.effect(config, { name: renewal.name }),\n getNameState.effect(config, { name: renewal.name }),\n ] as const,\n { concurrency: \"unbounded\" },\n ).pipe(\n Effect.map(([expiry, finalState]) => ({\n ...renewal,\n newExpiry: expiry?.expiry ?? null,\n finalState,\n })),\n ),\n );\n return { ...parameters.resume, renewals };\n }\n\n const entries = yield* Effect.forEach(\n parameters.renewals,\n (renewal, index) =>\n Effect.all(\n [\n getRenewalPrice\n .effect(config, {\n name: names[index] ?? renewal.name,\n duration: renewal.duration,\n ...(renewal.paymentToken === undefined ? {} : { paymentToken: renewal.paymentToken }),\n })\n .pipe(Effect.flatMap(requireQuote)),\n getExpiry.effect(config, { name: names[index] ?? renewal.name }),\n ] as const,\n { concurrency: \"unbounded\" },\n ).pipe(\n Effect.map(([quote, expiry]): Entry => ({\n index,\n parameters: renewal,\n name: names[index] ?? renewal.name,\n quote,\n previousExpiry:\n parameters.resume?.renewals[index]?.previousExpiry ?? expiry?.expiry ?? null,\n })),\n ),\n { concurrency: config.reads.concurrency },\n );\n for (const entry of entries) {\n if (entry.parameters.maxPrice !== undefined && entry.quote.price > entry.parameters.maxPrice) {\n return yield* new RenewalError({\n code: \"PRICE_EXCEEDS_MAXIMUM\",\n message: `The current renewal price for ${entry.name} exceeds maxPrice`,\n });\n }\n }\n const totalPrice = entries.reduce((sum, entry) => sum + entry.quote.price, 0n);\n if (parameters.maxTotalPrice !== undefined && totalPrice > parameters.maxTotalPrice) {\n return yield* new RenewalError({\n code: \"TOTAL_PRICE_EXCEEDS_MAXIMUM\",\n message: \"The current renewal price exceeds maxTotalPrice\",\n });\n }\n\n const grouped = new Map<string, Array<Entry>>();\n for (const entry of entries) {\n const token = entry.quote.currency.kind === \"erc20\" ? entry.quote.currency.address : \"native\";\n const v1Arguments =\n entry.quote.route === \"v1-controller\"\n ? `${entry.parameters.duration}:${entry.parameters.referrer ?? \"default\"}`\n : \"mixed\";\n const key = `${entry.quote.route}:${entry.quote.renewer}:${token}:${v1Arguments}`;\n grouped.set(key, [...(grouped.get(key) ?? []), entry]);\n }\n\n const { account } = yield* provideConfig(config, resolveWalletContext(parameters));\n const payer = typeof account === \"string\" ? account : account.address;\n const stages: Array<WritePlan[\"stages\"][number]> = [];\n const approvals: Array<RenewalApproval> = [];\n let groupIndex = 0;\n for (const group of grouped.values()) {\n const first = group[0];\n if (first === undefined) continue;\n const renewalStageId = `renew-group-${groupIndex}`;\n const groupCompleted = parameters.resume?.write.completedStages.some(\n (stage) => stage.id === renewalStageId,\n );\n let approval = parameters.resume?.approvals.find(\n (candidate) =>\n candidate.spender === first.quote.renewer &&\n candidate.token ===\n (first.quote.currency.kind === \"erc20\" ? first.quote.currency.address : null),\n );\n if (first.quote.currency.kind === \"erc20\" && approval === undefined && !groupCompleted) {\n const currency = first.quote.currency;\n const allowance = yield* Effect.tryPromise({\n try: () =>\n config.publicClient.readContract({\n address: currency.address,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [payer, first.quote.renewer],\n }),\n catch: (cause) => viemErrorToEffectError(cause, \"readContract\"),\n });\n const groupPrice = group.reduce((sum, entry) => sum + entry.quote.price, 0n);\n approval = {\n required: allowance < groupPrice,\n spender: first.quote.renewer,\n token: currency.address,\n amount: group.reduce(\n (sum, entry) => sum + (entry.parameters.maxPrice ?? entry.quote.price),\n 0n,\n ),\n };\n }\n if (approval !== undefined) approvals.push(approval);\n if (approval?.required && approval.token !== null) {\n stages.push({\n type: \"calls\",\n id: `approve-group-${groupIndex}`,\n calls: [\n approveRenewalPayment.call({\n name: first.name,\n duration: first.parameters.duration,\n paymentToken: approval.token,\n amount: approval.amount,\n }),\n ],\n mode: \"sequential\",\n atomicity: \"none\",\n confirmation: confirmed,\n });\n }\n const contractBatch = supportsContractRenewalBatch(first.quote.route);\n stages.push({\n type: \"calls\",\n id: renewalStageId,\n calls: contractBatch\n ? [\n makeRenewalBatchIntent({\n renewals: group.map((entry) => entry.parameters),\n ...(parameters.maxTotalPrice === undefined\n ? {}\n : { maxTotalPrice: parameters.maxTotalPrice }),\n }),\n ]\n : group.map((entry) => makeRenewalIntent(entry.parameters)),\n mode: contractBatch ? \"sequential\" : (parameters.mode ?? \"auto\"),\n atomicity: contractBatch || group.length === 1 ? \"none\" : \"preferred\",\n confirmation: parameters.confirmation ?? confirmed,\n });\n groupIndex += 1;\n }\n\n const write = yield* executeWritePlan\n .effect(config, {\n plan: { id, stages },\n ...(parameters.resume === undefined ? {} : { resume: parameters.resume.write }),\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n })\n .pipe(\n Effect.mapError((error) =>\n error instanceof RenewalError\n ? error\n : new RenewalError({ code: \"RENEWAL_FAILED\", message: \"Unable to renew names\" }),\n ),\n );\n const completedIds = new Set(write.completedStages.map((stage) => stage.id));\n const renewals = yield* Effect.forEach(\n entries,\n Effect.fn(\"ensforge.renewNames.result\")(function* (entry) {\n const containingGroup = [...grouped.values()].findIndex((group) => group.includes(entry));\n const group = [...grouped.values()][containingGroup];\n const stageId = `renew-group-${containingGroup}`;\n const stage = write.completedStages.find((candidate) => candidate.id === stageId);\n const entryCall = group?.findIndex((candidate) => candidate === entry) ?? -1;\n const callResult =\n stage?.result.mode === \"sequential\" && entryCall >= 0\n ? stage.result.calls[entryCall]\n : undefined;\n const completed =\n completedIds.has(stageId) ||\n (group !== undefined &&\n !supportsContractRenewalBatch(entry.quote.route) &&\n callResult !== undefined &&\n callResult.status !== \"not-started\");\n if (!completed) {\n return {\n name: entry.quote.name,\n protocol: entry.quote.protocol,\n route: entry.quote.route,\n duration: entry.parameters.duration,\n previousExpiry: entry.previousExpiry,\n newExpiry: null,\n price: entry.quote.price,\n currency: entry.quote.currency,\n finalState: null,\n } satisfies RenewNamesResult[\"renewals\"][number];\n }\n const [expiry, finalState] = yield* Effect.all(\n [\n getExpiry.effect(config, { name: entry.name }),\n getNameState.effect(config, { name: entry.name }),\n ] as const,\n { concurrency: \"unbounded\" },\n );\n return {\n name: entry.quote.name,\n protocol: entry.quote.protocol,\n route: entry.quote.route,\n duration: entry.parameters.duration,\n previousExpiry: entry.previousExpiry,\n newExpiry: expiry?.expiry ?? null,\n price: entry.quote.price,\n currency: entry.quote.currency,\n finalState,\n } satisfies RenewNamesResult[\"renewals\"][number];\n }),\n );\n return {\n status: write.status === \"completed\" ? \"completed\" : \"partial\",\n renewals,\n approvals,\n totalPrice,\n write,\n };\n});\n\nexport const renewNames = defineAction<RenewNamesParameters, RenewNamesResult, WriteError>(\n renewNamesEffect,\n);\n\nexport type { RenewNamesParameters, RenewNamesResult } from \"../types.js\";\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { CallExecutionResult, WriteError } from "../../write/types.js";
2
2
  import { EnsWriteAction } from "../../action/write-intent.js";
3
3
  import { ApproveRenewalPaymentParameters } from "./types.js";
4
- import "./get-renewal-price/index.js";
5
4
  import "../../index.js";
6
5
  //#region src/actions/registration/renewal-mutation.d.ts
7
6
  declare const approveRenewalPayment: EnsWriteAction<ApproveRenewalPaymentParameters, CallExecutionResult, WriteError>;
@@ -1 +1 @@
1
- {"version":3,"file":"renewal-mutation.d.ts","names":[],"sources":["../../../src/actions/registration/renewal-mutation.ts"],"mappings":";;;;;;cA2Sa,uBAAqB,eAAA,iCAAA,qBAAA"}
1
+ {"version":3,"file":"renewal-mutation.d.ts","names":[],"sources":["../../../src/actions/registration/renewal-mutation.ts"],"mappings":";;;;;cAgOa,uBAAqB,eAAA,iCAAA,qBAAA"}
@@ -1,6 +1,6 @@
1
- import { makeWriteIntent } from "../../action/write-intent.js";
2
1
  import { ContractError } from "../../errors/contract-error.js";
3
2
  import { viemErrorToEffectError } from "../../internal/errors/viem-error.js";
3
+ import { makeWriteIntent } from "../../action/write-intent.js";
4
4
  import { makeSingleWriteAction } from "../../internal/write/single-write-action.js";
5
5
  import { decodeOwnershipAddress } from "../ownership/address.js";
6
6
  import { getSecondLevelEthLabel } from "../../internal/registration/second-level-eth.js";
@@ -9,12 +9,11 @@ import { RenewalError } from "../../errors/renewal-error.js";
9
9
  import { Effect } from "effect";
10
10
  import { encodeFunctionData, zeroHash } from "viem";
11
11
  import { bulkRenewalV1RenewAllAbi, ethRegistrarControllerV1RenewAbi } from "@ensforge/contracts/v1";
12
- import { ethRegistrarV2InterfaceRenewAbi, ethRegistrarV2InterfaceRenewBatchAbi, ethRegistrarV2RenewAbi, ethRenewerV1RenewAbi, ethRenewerV2InterfaceRenewAbi, ethRenewerV2InterfaceRenewBatchAbi } from "@ensforge/contracts/v2";
12
+ import { ethRegistrarV2RenewAbi, ethRenewerV1RenewAbi } from "@ensforge/contracts/v2";
13
13
  import { erc20AllowanceAbi, erc20ApproveAbi } from "@ensforge/contracts/shared";
14
14
 
15
15
  //#region src/actions/registration/renewal-mutation.ts
16
- const usesFlatRenewalAbi = (config) => config.deployments.protocol === "v2" && config.deployments.v2.id === "sepolia-v2";
17
- const supportsContractRenewalBatch = (config, route) => route === "v1-controller" || !usesFlatRenewalAbi(config);
16
+ const supportsContractRenewalBatch = (route) => route === "v1-controller";
18
17
  const encode = (operation, makeData) => Effect.try({
19
18
  try: makeData,
20
19
  catch: (cause) => new ContractError({
@@ -113,7 +112,7 @@ const renewalPreparer = Effect.fn("ensforge.renewName.prepare")(function* (confi
113
112
  });
114
113
  return {
115
114
  to: quote.renewer,
116
- data: yield* encode("renewName", () => usesFlatRenewalAbi(config) ? encodeFunctionData({
115
+ data: yield* encode("renewName", () => encodeFunctionData({
117
116
  abi: quote.route === "v1-renewer" ? ethRenewerV1RenewAbi : ethRegistrarV2RenewAbi,
118
117
  functionName: "renew",
119
118
  args: [
@@ -122,98 +121,55 @@ const renewalPreparer = Effect.fn("ensforge.renewName.prepare")(function* (confi
122
121
  currency.address,
123
122
  referrer
124
123
  ]
125
- }) : encodeFunctionData({
126
- abi: quote.route === "v1-renewer" ? ethRenewerV2InterfaceRenewAbi : ethRegistrarV2InterfaceRenewAbi,
127
- functionName: "renew",
128
- args: [{
129
- label,
130
- duration: parameters.duration,
131
- referrer
132
- }, currency.address]
133
124
  })),
134
125
  value: 0n,
135
126
  protocol: quote.protocol
136
127
  };
137
128
  });
138
- const batchRenewalPreparer = Effect.fn("ensforge.renewNames.prepareBatch")(function* (config, parameters, context) {
129
+ const v1BatchRenewalPreparer = Effect.fn("ensforge.renewNames.prepareV1Batch")(function* (config, parameters) {
139
130
  if (parameters.renewals.length === 0) return yield* new RenewalError({
140
131
  code: "RENEWAL_FAILED",
141
132
  message: "Renewal batch is empty"
142
133
  });
143
- const quotes = yield* Effect.forEach(parameters.renewals, (renewal) => requireQuote(config, renewal));
144
- const first = quotes[0];
145
- if (first === void 0) return yield* new RenewalError({
134
+ const duration = parameters.renewals[0]?.duration;
135
+ if (duration === void 0 || parameters.renewals.some((renewal) => renewal.duration !== duration)) return yield* new RenewalError({
146
136
  code: "RENEWAL_FAILED",
147
- message: "Renewal batch is empty"
137
+ message: "ENSv1 bulk renewal requires a shared duration"
148
138
  });
149
- if (quotes.some((quote) => quote.route !== first.route || quote.renewer !== first.renewer)) return yield* new RenewalError({
139
+ const quotes = yield* Effect.forEach(parameters.renewals, (renewal) => requireQuote(config, renewal));
140
+ if (quotes.some((quote) => quote.route !== "v1-controller")) return yield* new RenewalError({
150
141
  code: "ROUTE_CHANGED",
151
- message: "All names in a renewal batch must use the same renewal contract"
142
+ message: "ENSv1 bulk renewal only accepts names routed through the V1 controller"
152
143
  });
153
144
  const total = quotes.reduce((sum, quote) => sum + quote.price, 0n);
154
145
  if (parameters.maxTotalPrice !== void 0 && total > parameters.maxTotalPrice) return yield* new RenewalError({
155
146
  code: "TOTAL_PRICE_EXCEEDS_MAXIMUM",
156
147
  message: "The current renewal batch price exceeds maxTotalPrice"
157
148
  });
158
- const labels = yield* Effect.forEach(quotes, (quote) => getSecondLevelEthLabel(quote.name));
159
- if (first.route === "v1-controller") {
160
- const v1 = config.deployments.v1;
161
- if (v1 === void 0) return yield* new RenewalError({
162
- code: "ROUTE_CHANGED",
163
- message: "The ENSv1 bulk renewal deployment is unavailable"
164
- });
165
- const duration = parameters.renewals[0]?.duration;
166
- if (duration === void 0 || parameters.renewals.some((renewal) => renewal.duration !== duration)) return yield* new RenewalError({
167
- code: "RENEWAL_FAILED",
168
- message: "ENSv1 bulk renewal requires a shared duration"
169
- });
170
- return {
171
- to: v1.contracts.bulkRenewal,
172
- data: yield* encode("renewNames", () => encodeFunctionData({
173
- abi: bulkRenewalV1RenewAllAbi,
174
- functionName: "renewAll",
175
- args: [
176
- labels,
177
- duration,
178
- parameters.renewals[0]?.referrer ?? zeroHash
179
- ]
180
- })),
181
- value: total,
182
- protocol: "v1"
183
- };
184
- }
185
- if (!supportsContractRenewalBatch(config, first.route)) return yield* new RenewalError({
186
- code: "RENEWAL_FAILED",
187
- message: "The selected renewal deployment does not support contract-native batching"
188
- });
189
- const currency = first.currency;
190
- if (currency.kind !== "erc20" || quotes.some((quote) => quote.currency.kind !== "erc20" || quote.currency.address !== currency.address)) return yield* new RenewalError({
191
- code: "PAYMENT_TOKEN_UNSUPPORTED",
192
- message: "All names in an ENSv2 renewal batch must use the same payment token"
193
- });
194
- const account = typeof context.account === "string" ? context.account : context.account.address;
195
- if ((yield* readAllowance(config, currency.address, first.renewer, account)) < total) return yield* new RenewalError({
196
- code: "INSUFFICIENT_ALLOWANCE",
197
- message: "Payment-token allowance is insufficient for the renewal batch"
149
+ const v1 = config.deployments.v1;
150
+ if (v1 === void 0) return yield* new RenewalError({
151
+ code: "ROUTE_CHANGED",
152
+ message: "The ENSv1 bulk renewal deployment is unavailable"
198
153
  });
154
+ const labels = yield* Effect.forEach(quotes, (quote) => getSecondLevelEthLabel(quote.name));
199
155
  return {
200
- to: first.renewer,
156
+ to: v1.contracts.bulkRenewal,
201
157
  data: yield* encode("renewNames", () => encodeFunctionData({
202
- abi: first.route === "v1-renewer" ? ethRenewerV2InterfaceRenewBatchAbi : ethRegistrarV2InterfaceRenewBatchAbi,
203
- functionName: "renewBatch",
204
- args: [parameters.renewals.map((renewal, index) => ({
205
- label: labels[index] ?? "",
206
- duration: renewal.duration,
207
- referrer: renewal.referrer ?? zeroHash
208
- })), currency.address]
158
+ abi: bulkRenewalV1RenewAllAbi,
159
+ functionName: "renewAll",
160
+ args: [
161
+ labels,
162
+ duration,
163
+ parameters.renewals[0]?.referrer ?? zeroHash
164
+ ]
209
165
  })),
210
- value: 0n,
211
- protocol: first.protocol
166
+ value: total,
167
+ protocol: "v1"
212
168
  };
213
169
  });
214
170
  const approveRenewalPayment = makeSingleWriteAction("approveRenewalPayment", approvalPreparer);
215
171
  const makeRenewalIntent = (parameters) => makeWriteIntent("renewName", parameters, renewalPreparer);
216
- const makeRenewalBatchIntent = (parameters) => makeWriteIntent("renewNames", parameters, batchRenewalPreparer);
172
+ const makeRenewalBatchIntent = (parameters) => makeWriteIntent("renewNames", parameters, v1BatchRenewalPreparer);
217
173
 
218
174
  //#endregion
219
175
  export { approveRenewalPayment, makeRenewalBatchIntent, makeRenewalIntent, supportsContractRenewalBatch };
@@ -1 +1 @@
1
- {"version":3,"file":"renewal-mutation.js","names":[],"sources":["../../../src/actions/registration/renewal-mutation.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { erc20AllowanceAbi, erc20ApproveAbi } from \"@ensforge/contracts/shared\";\nimport { bulkRenewalV1RenewAllAbi, ethRegistrarControllerV1RenewAbi } from \"@ensforge/contracts/v1\";\nimport {\n ethRegistrarV2InterfaceRenewBatchAbi,\n ethRegistrarV2InterfaceRenewAbi,\n ethRegistrarV2RenewAbi,\n ethRenewerV1RenewAbi,\n ethRenewerV2InterfaceRenewBatchAbi,\n ethRenewerV2InterfaceRenewAbi,\n} from \"@ensforge/contracts/v2\";\nimport { encodeFunctionData, zeroHash } from \"viem\";\n\nimport {\n makeWriteIntent,\n type EnsWriteIntent,\n type EnsWriteIntentPreparer,\n} from \"../../action/write-intent.js\";\nimport { ContractError } from \"../../errors/contract-error.js\";\nimport { RenewalError } from \"../../errors/renewal-error.js\";\nimport { viemErrorToEffectError } from \"../../internal/errors/viem-error.js\";\nimport { getSecondLevelEthLabel } from \"../../internal/registration/second-level-eth.js\";\nimport { makeSingleWriteAction } from \"../../internal/write/single-write-action.js\";\nimport type { CallExecutionResult, WriteError } from \"../../write/types.js\";\nimport { decodeOwnershipAddress } from \"../ownership/address.js\";\nimport { getRenewalPrice } from \"./get-renewal-price/index.js\";\nimport type { ApproveRenewalPaymentParameters, RenewNameCallParameters } from \"./types.js\";\n\nexport interface RenewBatchCallParameters {\n readonly renewals: ReadonlyArray<RenewNameCallParameters>;\n readonly maxTotalPrice?: bigint;\n}\n\nconst usesFlatRenewalAbi = (config: Parameters<typeof getRenewalPrice.effect>[0]) =>\n // The July Sepolia beta predates the tuple-based renewals and registrar-level batch methods.\n config.deployments.protocol === \"v2\" && config.deployments.v2.id === \"sepolia-v2\";\n\nexport const supportsContractRenewalBatch = (\n config: Parameters<typeof getRenewalPrice.effect>[0],\n route: \"v1-controller\" | \"v1-renewer\" | \"v2-registrar\",\n) => route === \"v1-controller\" || !usesFlatRenewalAbi(config);\n\nconst encode = (operation: string, makeData: () => `0x${string}`) =>\n Effect.try({\n try: makeData,\n catch: (cause) =>\n new ContractError({ code: \"ENCODE_FAILED\", message: `Unable to encode ${operation}`, cause }),\n });\n\nconst requireQuote = Effect.fn(\"ensforge.renewal.requireQuote\")(function* (\n config: Parameters<typeof getRenewalPrice.effect>[0],\n parameters: RenewNameCallParameters,\n) {\n const quote = yield* getRenewalPrice.effect(config, parameters);\n switch (quote.status) {\n case \"not-renewable\":\n return yield* new RenewalError({\n code: \"NAME_NOT_RENEWABLE\",\n message: `${quote.name} is not renewable`,\n });\n case \"payment-token-required\":\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_REQUIRED\",\n message: `A payment token is required to renew ${quote.name}`,\n });\n case \"unsupported-payment-token\":\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_UNSUPPORTED\",\n message: `The selected payment token is not supported for ${quote.name}`,\n });\n default:\n if (parameters.maxPrice !== undefined && quote.price > parameters.maxPrice) {\n return yield* new RenewalError({\n code: \"PRICE_EXCEEDS_MAXIMUM\",\n message: `The current renewal price for ${quote.name} exceeds maxPrice`,\n });\n }\n return quote;\n }\n});\n\nconst readAllowance = Effect.fn(\"ensforge.renewal.readAllowance\")(function* (\n config: Parameters<typeof getRenewalPrice.effect>[0],\n token: `0x${string}`,\n spender: `0x${string}`,\n account: `0x${string}`,\n) {\n return yield* Effect.tryPromise({\n try: () =>\n config.publicClient.readContract({\n address: token,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [account, spender],\n }),\n catch: (cause) => viemErrorToEffectError(cause, \"readContract\"),\n });\n});\n\nconst approvalPreparer: EnsWriteIntentPreparer<ApproveRenewalPaymentParameters, WriteError> =\n Effect.fn(\"ensforge.approveRenewalPayment.prepare\")(function* (config, parameters) {\n if (parameters.amount < 0n) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"Renewal payment approval amount cannot be negative\",\n });\n }\n const paymentToken = yield* decodeOwnershipAddress(parameters.paymentToken, \"payment token\");\n const quote = yield* requireQuote(config, {\n name: parameters.name,\n duration: parameters.duration,\n paymentToken,\n });\n if (quote.currency.kind !== \"erc20\") {\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_UNSUPPORTED\",\n message: \"ENSv1 renewal uses native ETH and does not accept payment tokens\",\n });\n }\n return {\n to: paymentToken,\n data: yield* encode(\"approveRenewalPayment\", () =>\n encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [quote.renewer, parameters.amount],\n }),\n ),\n value: 0n,\n protocol: quote.protocol,\n };\n });\n\nconst renewalPreparer: EnsWriteIntentPreparer<RenewNameCallParameters, WriteError> = Effect.fn(\n \"ensforge.renewName.prepare\",\n)(function* (config, parameters, context) {\n const quote = yield* requireQuote(config, parameters);\n const label = yield* getSecondLevelEthLabel(quote.name);\n const referrer = parameters.referrer ?? zeroHash;\n if (quote.route === \"v1-controller\") {\n return {\n to: quote.renewer,\n data: yield* encode(\"renewName\", () =>\n encodeFunctionData({\n abi: ethRegistrarControllerV1RenewAbi,\n functionName: \"renew\",\n args: [label, parameters.duration, referrer],\n }),\n ),\n value: quote.price,\n protocol: \"v1\" as const,\n };\n }\n if (quote.currency.kind !== \"erc20\") {\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_REQUIRED\",\n message: `An ERC-20 payment token is required to renew ${quote.name}`,\n });\n }\n const currency = quote.currency;\n const account = typeof context.account === \"string\" ? context.account : context.account.address;\n const allowance = yield* readAllowance(config, currency.address, quote.renewer, account);\n if (allowance < quote.price) {\n return yield* new RenewalError({\n code: \"INSUFFICIENT_ALLOWANCE\",\n message: `Payment-token allowance is insufficient to renew ${quote.name}`,\n });\n }\n return {\n to: quote.renewer,\n data: yield* encode(\"renewName\", () =>\n usesFlatRenewalAbi(config)\n ? encodeFunctionData({\n abi: quote.route === \"v1-renewer\" ? ethRenewerV1RenewAbi : ethRegistrarV2RenewAbi,\n functionName: \"renew\",\n args: [label, parameters.duration, currency.address, referrer],\n })\n : encodeFunctionData({\n abi:\n quote.route === \"v1-renewer\"\n ? ethRenewerV2InterfaceRenewAbi\n : ethRegistrarV2InterfaceRenewAbi,\n functionName: \"renew\",\n args: [{ label, duration: parameters.duration, referrer }, currency.address],\n }),\n ),\n value: 0n,\n protocol: quote.protocol,\n };\n});\n\nconst batchRenewalPreparer: EnsWriteIntentPreparer<RenewBatchCallParameters, WriteError> =\n Effect.fn(\"ensforge.renewNames.prepareBatch\")(function* (config, parameters, context) {\n if (parameters.renewals.length === 0) {\n return yield* new RenewalError({ code: \"RENEWAL_FAILED\", message: \"Renewal batch is empty\" });\n }\n const quotes = yield* Effect.forEach(parameters.renewals, (renewal) =>\n requireQuote(config, renewal),\n );\n const first = quotes[0];\n if (first === undefined) {\n return yield* new RenewalError({ code: \"RENEWAL_FAILED\", message: \"Renewal batch is empty\" });\n }\n if (quotes.some((quote) => quote.route !== first.route || quote.renewer !== first.renewer)) {\n return yield* new RenewalError({\n code: \"ROUTE_CHANGED\",\n message: \"All names in a renewal batch must use the same renewal contract\",\n });\n }\n const total = quotes.reduce((sum, quote) => sum + quote.price, 0n);\n if (parameters.maxTotalPrice !== undefined && total > parameters.maxTotalPrice) {\n return yield* new RenewalError({\n code: \"TOTAL_PRICE_EXCEEDS_MAXIMUM\",\n message: \"The current renewal batch price exceeds maxTotalPrice\",\n });\n }\n const labels = yield* Effect.forEach(quotes, (quote) => getSecondLevelEthLabel(quote.name));\n if (first.route === \"v1-controller\") {\n const v1 = config.deployments.v1;\n if (v1 === undefined) {\n return yield* new RenewalError({\n code: \"ROUTE_CHANGED\",\n message: \"The ENSv1 bulk renewal deployment is unavailable\",\n });\n }\n const duration = parameters.renewals[0]?.duration;\n if (\n duration === undefined ||\n parameters.renewals.some((renewal) => renewal.duration !== duration)\n ) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"ENSv1 bulk renewal requires a shared duration\",\n });\n }\n return {\n to: v1.contracts.bulkRenewal,\n data: yield* encode(\"renewNames\", () =>\n encodeFunctionData({\n abi: bulkRenewalV1RenewAllAbi,\n functionName: \"renewAll\",\n args: [labels, duration, parameters.renewals[0]?.referrer ?? zeroHash],\n }),\n ),\n value: total,\n protocol: \"v1\" as const,\n };\n }\n if (!supportsContractRenewalBatch(config, first.route)) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"The selected renewal deployment does not support contract-native batching\",\n });\n }\n const currency = first.currency;\n if (\n currency.kind !== \"erc20\" ||\n quotes.some(\n (quote) => quote.currency.kind !== \"erc20\" || quote.currency.address !== currency.address,\n )\n ) {\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_UNSUPPORTED\",\n message: \"All names in an ENSv2 renewal batch must use the same payment token\",\n });\n }\n const account = typeof context.account === \"string\" ? context.account : context.account.address;\n const allowance = yield* readAllowance(config, currency.address, first.renewer, account);\n if (allowance < total) {\n return yield* new RenewalError({\n code: \"INSUFFICIENT_ALLOWANCE\",\n message: \"Payment-token allowance is insufficient for the renewal batch\",\n });\n }\n return {\n to: first.renewer,\n data: yield* encode(\"renewNames\", () =>\n encodeFunctionData({\n abi:\n first.route === \"v1-renewer\"\n ? ethRenewerV2InterfaceRenewBatchAbi\n : ethRegistrarV2InterfaceRenewBatchAbi,\n functionName: \"renewBatch\",\n args: [\n parameters.renewals.map((renewal, index) => ({\n label: labels[index] ?? \"\",\n duration: renewal.duration,\n referrer: renewal.referrer ?? zeroHash,\n })),\n currency.address,\n ],\n }),\n ),\n value: 0n,\n protocol: first.protocol,\n };\n });\n\nexport const approveRenewalPayment = makeSingleWriteAction(\n \"approveRenewalPayment\",\n approvalPreparer,\n);\n\nexport const makeRenewalIntent = (\n parameters: RenewNameCallParameters,\n): EnsWriteIntent<CallExecutionResult, WriteError> =>\n makeWriteIntent(\"renewName\", parameters, renewalPreparer);\n\nexport const makeRenewalBatchIntent = (\n parameters: RenewBatchCallParameters,\n): EnsWriteIntent<CallExecutionResult, WriteError> =>\n makeWriteIntent(\"renewNames\", parameters, batchRenewalPreparer);\n"],"mappings":"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"}
1
+ {"version":3,"file":"renewal-mutation.js","names":[],"sources":["../../../src/actions/registration/renewal-mutation.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { erc20AllowanceAbi, erc20ApproveAbi } from \"@ensforge/contracts/shared\";\nimport { bulkRenewalV1RenewAllAbi, ethRegistrarControllerV1RenewAbi } from \"@ensforge/contracts/v1\";\nimport { ethRegistrarV2RenewAbi, ethRenewerV1RenewAbi } from \"@ensforge/contracts/v2\";\nimport { encodeFunctionData, zeroHash } from \"viem\";\n\nimport {\n makeWriteIntent,\n type EnsWriteIntent,\n type EnsWriteIntentPreparer,\n} from \"../../action/write-intent.js\";\nimport { ContractError } from \"../../errors/contract-error.js\";\nimport { RenewalError } from \"../../errors/renewal-error.js\";\nimport { viemErrorToEffectError } from \"../../internal/errors/viem-error.js\";\nimport { getSecondLevelEthLabel } from \"../../internal/registration/second-level-eth.js\";\nimport { makeSingleWriteAction } from \"../../internal/write/single-write-action.js\";\nimport type { CallExecutionResult, WriteError } from \"../../write/types.js\";\nimport { decodeOwnershipAddress } from \"../ownership/address.js\";\nimport { getRenewalPrice } from \"./get-renewal-price/index.js\";\nimport type { ApproveRenewalPaymentParameters, RenewNameCallParameters } from \"./types.js\";\n\nexport const supportsContractRenewalBatch = (\n route: \"v1-controller\" | \"v1-renewer\" | \"v2-registrar\",\n) => route === \"v1-controller\";\n\nexport interface RenewBatchCallParameters {\n readonly renewals: ReadonlyArray<RenewNameCallParameters>;\n readonly maxTotalPrice?: bigint;\n}\n\nconst encode = (operation: string, makeData: () => `0x${string}`) =>\n Effect.try({\n try: makeData,\n catch: (cause) =>\n new ContractError({ code: \"ENCODE_FAILED\", message: `Unable to encode ${operation}`, cause }),\n });\n\nconst requireQuote = Effect.fn(\"ensforge.renewal.requireQuote\")(function* (\n config: Parameters<typeof getRenewalPrice.effect>[0],\n parameters: RenewNameCallParameters,\n) {\n const quote = yield* getRenewalPrice.effect(config, parameters);\n switch (quote.status) {\n case \"not-renewable\":\n return yield* new RenewalError({\n code: \"NAME_NOT_RENEWABLE\",\n message: `${quote.name} is not renewable`,\n });\n case \"payment-token-required\":\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_REQUIRED\",\n message: `A payment token is required to renew ${quote.name}`,\n });\n case \"unsupported-payment-token\":\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_UNSUPPORTED\",\n message: `The selected payment token is not supported for ${quote.name}`,\n });\n default:\n if (parameters.maxPrice !== undefined && quote.price > parameters.maxPrice) {\n return yield* new RenewalError({\n code: \"PRICE_EXCEEDS_MAXIMUM\",\n message: `The current renewal price for ${quote.name} exceeds maxPrice`,\n });\n }\n return quote;\n }\n});\n\nconst readAllowance = Effect.fn(\"ensforge.renewal.readAllowance\")(function* (\n config: Parameters<typeof getRenewalPrice.effect>[0],\n token: `0x${string}`,\n spender: `0x${string}`,\n account: `0x${string}`,\n) {\n return yield* Effect.tryPromise({\n try: () =>\n config.publicClient.readContract({\n address: token,\n abi: erc20AllowanceAbi,\n functionName: \"allowance\",\n args: [account, spender],\n }),\n catch: (cause) => viemErrorToEffectError(cause, \"readContract\"),\n });\n});\n\nconst approvalPreparer: EnsWriteIntentPreparer<ApproveRenewalPaymentParameters, WriteError> =\n Effect.fn(\"ensforge.approveRenewalPayment.prepare\")(function* (config, parameters) {\n if (parameters.amount < 0n) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"Renewal payment approval amount cannot be negative\",\n });\n }\n const paymentToken = yield* decodeOwnershipAddress(parameters.paymentToken, \"payment token\");\n const quote = yield* requireQuote(config, {\n name: parameters.name,\n duration: parameters.duration,\n paymentToken,\n });\n if (quote.currency.kind !== \"erc20\") {\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_UNSUPPORTED\",\n message: \"ENSv1 renewal uses native ETH and does not accept payment tokens\",\n });\n }\n return {\n to: paymentToken,\n data: yield* encode(\"approveRenewalPayment\", () =>\n encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: \"approve\",\n args: [quote.renewer, parameters.amount],\n }),\n ),\n value: 0n,\n protocol: quote.protocol,\n };\n });\n\nconst renewalPreparer: EnsWriteIntentPreparer<RenewNameCallParameters, WriteError> = Effect.fn(\n \"ensforge.renewName.prepare\",\n)(function* (config, parameters, context) {\n const quote = yield* requireQuote(config, parameters);\n const label = yield* getSecondLevelEthLabel(quote.name);\n const referrer = parameters.referrer ?? zeroHash;\n if (quote.route === \"v1-controller\") {\n return {\n to: quote.renewer,\n data: yield* encode(\"renewName\", () =>\n encodeFunctionData({\n abi: ethRegistrarControllerV1RenewAbi,\n functionName: \"renew\",\n args: [label, parameters.duration, referrer],\n }),\n ),\n value: quote.price,\n protocol: \"v1\" as const,\n };\n }\n if (quote.currency.kind !== \"erc20\") {\n return yield* new RenewalError({\n code: \"PAYMENT_TOKEN_REQUIRED\",\n message: `An ERC-20 payment token is required to renew ${quote.name}`,\n });\n }\n const currency = quote.currency;\n const account = typeof context.account === \"string\" ? context.account : context.account.address;\n const allowance = yield* readAllowance(config, currency.address, quote.renewer, account);\n if (allowance < quote.price) {\n return yield* new RenewalError({\n code: \"INSUFFICIENT_ALLOWANCE\",\n message: `Payment-token allowance is insufficient to renew ${quote.name}`,\n });\n }\n return {\n to: quote.renewer,\n data: yield* encode(\"renewName\", () =>\n encodeFunctionData({\n abi: quote.route === \"v1-renewer\" ? ethRenewerV1RenewAbi : ethRegistrarV2RenewAbi,\n functionName: \"renew\",\n args: [label, parameters.duration, currency.address, referrer],\n }),\n ),\n value: 0n,\n protocol: quote.protocol,\n };\n});\n\nconst v1BatchRenewalPreparer: EnsWriteIntentPreparer<RenewBatchCallParameters, WriteError> =\n Effect.fn(\"ensforge.renewNames.prepareV1Batch\")(function* (config, parameters) {\n if (parameters.renewals.length === 0) {\n return yield* new RenewalError({ code: \"RENEWAL_FAILED\", message: \"Renewal batch is empty\" });\n }\n const duration = parameters.renewals[0]?.duration;\n if (\n duration === undefined ||\n parameters.renewals.some((renewal) => renewal.duration !== duration)\n ) {\n return yield* new RenewalError({\n code: \"RENEWAL_FAILED\",\n message: \"ENSv1 bulk renewal requires a shared duration\",\n });\n }\n const quotes = yield* Effect.forEach(parameters.renewals, (renewal) =>\n requireQuote(config, renewal),\n );\n if (quotes.some((quote) => quote.route !== \"v1-controller\")) {\n return yield* new RenewalError({\n code: \"ROUTE_CHANGED\",\n message: \"ENSv1 bulk renewal only accepts names routed through the V1 controller\",\n });\n }\n const total = quotes.reduce((sum, quote) => sum + quote.price, 0n);\n if (parameters.maxTotalPrice !== undefined && total > parameters.maxTotalPrice) {\n return yield* new RenewalError({\n code: \"TOTAL_PRICE_EXCEEDS_MAXIMUM\",\n message: \"The current renewal batch price exceeds maxTotalPrice\",\n });\n }\n const v1 = config.deployments.v1;\n if (v1 === undefined) {\n return yield* new RenewalError({\n code: \"ROUTE_CHANGED\",\n message: \"The ENSv1 bulk renewal deployment is unavailable\",\n });\n }\n const labels = yield* Effect.forEach(quotes, (quote) => getSecondLevelEthLabel(quote.name));\n return {\n to: v1.contracts.bulkRenewal,\n data: yield* encode(\"renewNames\", () =>\n encodeFunctionData({\n abi: bulkRenewalV1RenewAllAbi,\n functionName: \"renewAll\",\n args: [labels, duration, parameters.renewals[0]?.referrer ?? zeroHash],\n }),\n ),\n value: total,\n protocol: \"v1\" as const,\n };\n });\n\nexport const approveRenewalPayment = makeSingleWriteAction(\n \"approveRenewalPayment\",\n approvalPreparer,\n);\n\nexport const makeRenewalIntent = (\n parameters: RenewNameCallParameters,\n): EnsWriteIntent<CallExecutionResult, WriteError> =>\n makeWriteIntent(\"renewName\", parameters, renewalPreparer);\n\nexport const makeRenewalBatchIntent = (\n parameters: RenewBatchCallParameters,\n): EnsWriteIntent<CallExecutionResult, WriteError> =>\n makeWriteIntent(\"renewNames\", parameters, v1BatchRenewalPreparer);\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { EnsProtocol } from "../../schemas/protocol.js";
2
2
  import { ConfirmationPolicy } from "../../config/write-options.js";
3
3
  import { EnsAction } from "../../action/action.js";
4
+ import { RpcError } from "../../errors/rpc-error.js";
4
5
  import { BlockParameters } from "../../action/block.js";
5
- import { CodecError } from "../../errors/codec-error.js";
6
6
  import { ContractError } from "../../errors/contract-error.js";
7
+ import { CodecError } from "../../errors/codec-error.js";
7
8
  import { NameError } from "../../errors/name-error.js";
8
- import { RpcError } from "../../errors/rpc-error.js";
9
9
  import { CallExecutionResult, WriteError, WriteMode, WritePlanProgress } from "../../write/types.js";
10
10
  import { EnsWriteIntent } from "../../action/write-intent.js";
11
11
  import { EthereumAddress } from "../../schemas/identity.js";
@@ -414,5 +414,5 @@ interface RenewNamesResult {
414
414
  readonly write: WritePlanProgress;
415
415
  }
416
416
  //#endregion
417
- export { ApprovePaymentTokenParameters, ApproveRenewalPaymentParameters, AvailableRegistrationPrice, CommitNameParameters, CommitmentStatus, CompleteRegistrationParameters, Erc20PaymentCurrency, NativePaymentCurrency, PaymentCurrency, PaymentTokenSupport, RegisterNameParameters, RegisterNameResult, RegisterNamesEntryParameters, RegisterNamesParameters, RegisterNamesResult, RegistrationCommitment, RegistrationCommitmentParameters, RegistrationNameParameters, RegistrationParameters, RegistrationPlan, RegistrationPriceParameters, RegistrationPriceResult, RegistrationReadError, RegistrationWriteError, RegistrationWriteIntent, RegistrationWriteResult, RenewNameAction, RenewNameCallParameters, RenewNameParameters, RenewNameResult, RenewNamesEntryParameters, RenewNamesParameters, RenewNamesResult, RenewalApproval, RenewalPriceResult, RenewalRoute };
417
+ export { ApprovePaymentTokenParameters, ApproveRenewalPaymentParameters, AvailableRegistrationPrice, CommitNameParameters, CommitmentStatus, CompleteRegistrationParameters, Erc20PaymentCurrency, NativePaymentCurrency, PaymentCurrency, PaymentTokenSupport, RegisterNameParameters, RegisterNameResult, RegisterNamesEntryParameters, RegisterNamesParameters, RegisterNamesResult, RegistrationCommitment, RegistrationCommitmentParameters, RegistrationNameParameters, RegistrationParameters, RegistrationPlan, RegistrationPriceParameters, RegistrationPriceResult, RegistrationReadError, RegistrationWalletParameters, RegistrationWriteError, RegistrationWriteIntent, RegistrationWriteResult, RenewNameAction, RenewNameCallParameters, RenewNameParameters, RenewNameResult, RenewNamesEntryParameters, RenewNamesParameters, RenewNamesResult, RenewalApproval, RenewalPriceResult, RenewalRoute };
418
418
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/actions/registration/types.ts"],"mappings":";;;;;;;;;;;;;;;;;;;KA0BY,wBAAwB,aAAa,gBAAgB,YAAY;KAEjE;WACD;WACA;IACP;KAEQ,8BAA8B;WAC/B,eAAe;;cAGb,uBAAqB,OAAA;;;;;cAMrB,sBAAoB,OAAA;;;;;;cAOpB,iBAAe,OAAA,gBAAA,OAAA;;;;;;;;;;KAChB,yBAAyB,gBAAgB;cAexC,yBAAuB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqBxB,iCAAiC,wBAAwB;cAExD,cAAY,OAAA;KACb,sBAAsB,aAAa;cAElC,oBAAkB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoBnB,4BAA4B,mBAAmB;cAE9C,wBAAsB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;KAsBvB,gCAAgC,uBAAuB;cAEtD,qBAAmB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;KAoBpB,6BAA6B,oBAAoB;KAEjD,mCAAmC;WACpC,OAAO;WACP,QAAQ;WACR,WAAW;WACX,cAAc;WACd,UAAU,cAAc;WACxB;WACA,WAAW;;cAGT,wBAAsB,OAAA;;;;;;KAMvB,gCAAgC,uBAAuB;cAEtD,kBAAgB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;KA0BjB,0BAA0B,iBAAiB;cAE1C,kBAAgB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsBjB,0BAA0B,iBAAiB;UAEtC;WACN,YAAY;;UAGN;WACN;WACA;;KAGN,wCAAwC,KAC3C;KAIU,iCAAiC;WAClC,eAAe;WACf;;UAGD;WACC,eAAe;WACf,UAAU,UAAU;WACpB,OAAO;WACP,eAAe;;KAGd,yBAAyB,KAAK,oDACxC;WACW,eAAe;WACf;WACA,UAAU,cAAc;WACxB,SAAS;;KAGV,6BAA6B,QAAQ;EAA2B;;UAE3D;WACN;WACA,MAAM;WACN,iBAAiB,YAAY;WAC7B,YAAY;WACZ;WACA;WACA;WACA;WACA;WACA,OAAO;WACP,OAAO;WACP,YAAY;;KAGX,+BAA+B,KACzC;UAIe,gCAAgC;WACtC,eAAe,cAAc;WAC7B,SAAS;;UAGH;WACN;WACA,eAAe,cAAc;WAC7B;;KAGC,yBAAyB;KACzB,0BAA0B;KAC1B,0BAA0B,eACpC,yBACA;KAGU;WACD;WACA;WACA,eAAe;WACf;WACA,WAAW;;UAGL;WACN;WACA;WACA;WACA;;KAGC,sBAAsB,0BAChC;WACW,SAAS;;UAGL;WACN;WACA,SAAS;WACT,OAAO;WACP;;UAGM;WACN;WACA,MAAM;WACN,iBAAiB,YAAY;WAC7B,OAAO;WACP;WACA;WACA;WACA;WACA,UAAU;WACV,UAAU;WACV,OAAO;WACP,YAAY;;UAGN,wBAAwB,UACvC,qBACA,iBACA;WAES,OACP,YAAY,4BACT,eAAe,qBAAqB;;KAG/B,4BAA4B;UAEvB,6BAA6B;WACnC,UAAU,cAAc;WACxB;WACA,SAAS;;UAGH;WACN;WACA,UAAU,cACjB,KAAK;aACM;aACA,YAAY;;WAGhB,WAAW,cAAc;WACzB;WACA,OAAO"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/actions/registration/types.ts"],"mappings":";;;;;;;;;;;;;;;;;;;KA0BY,wBAAwB,aAAa,gBAAgB,YAAY;KAEjE;WACD;WACA;IACP;KAEQ,8BAA8B;WAC/B,eAAe;;cAGb,uBAAqB,OAAA;;;;;cAMrB,sBAAoB,OAAA;;;;;;cAOpB,iBAAe,OAAA,gBAAA,OAAA;;;;;;;;;;KAChB,yBAAyB,gBAAgB;cAexC,yBAAuB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqBxB,iCAAiC,wBAAwB;cAExD,cAAY,OAAA;KACb,sBAAsB,aAAa;cAElC,oBAAkB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoBnB,4BAA4B,mBAAmB;cAE9C,wBAAsB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;KAsBvB,gCAAgC,uBAAuB;cAEtD,qBAAmB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;KAoBpB,6BAA6B,oBAAoB;KAEjD,mCAAmC;WACpC,OAAO;WACP,QAAQ;WACR,WAAW;WACX,cAAc;WACd,UAAU,cAAc;WACxB;WACA,WAAW;;cAGT,wBAAsB,OAAA;;;;;;KAMvB,gCAAgC,uBAAuB;cAEtD,kBAAgB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;KA0BjB,0BAA0B,iBAAiB;cAE1C,kBAAgB,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsBjB,0BAA0B,iBAAiB;UAEtC;WACN,YAAY;;UAGN;WACN;WACA;;KAGN,wCAAwC,KAC3C;KAIU,iCAAiC;WAClC,eAAe;WACf;;UAGM;WACN,eAAe;WACf,UAAU,UAAU;WACpB,OAAO;WACP,eAAe;;KAGd,yBAAyB,KAAK,oDACxC;WACW,eAAe;WACf;WACA,UAAU,cAAc;WACxB,SAAS;;KAGV,6BAA6B,QAAQ;EAA2B;;UAE3D;WACN;WACA,MAAM;WACN,iBAAiB,YAAY;WAC7B,YAAY;WACZ;WACA;WACA;WACA;WACA;WACA,OAAO;WACP,OAAO;WACP,YAAY;;KAGX,+BAA+B,KACzC;UAIe,gCAAgC;WACtC,eAAe,cAAc;WAC7B,SAAS;;UAGH;WACN;WACA,eAAe,cAAc;WAC7B;;KAGC,yBAAyB;KACzB,0BAA0B;KAC1B,0BAA0B,eACpC,yBACA;KAGU;WACD;WACA;WACA,eAAe;WACf;WACA,WAAW;;UAGL;WACN;WACA;WACA;WACA;;KAGC,sBAAsB,0BAChC;WACW,SAAS;;UAGL;WACN;WACA,SAAS;WACT,OAAO;WACP;;UAGM;WACN;WACA,MAAM;WACN,iBAAiB,YAAY;WAC7B,OAAO;WACP;WACA;WACA;WACA;WACA,UAAU;WACV,UAAU;WACV,OAAO;WACP,YAAY;;UAGN,wBAAwB,UACvC,qBACA,iBACA;WAES,OACP,YAAY,4BACT,eAAe,qBAAqB;;KAG/B,4BAA4B;UAEvB,6BAA6B;WACnC,UAAU,cAAc;WACxB;WACA,SAAS;;UAGH;WACN;WACA,UAAU,cACjB,KAAK;aACM;aACA,YAAY;;WAGhB,WAAW,cAAc;WACzB;WACA,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/actions/registration/types.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { Account, Address, WalletClient } from \"viem\";\n\nimport type { EnsAction } from \"../../action/action.js\";\nimport type { BlockParameters } from \"../../action/block.js\";\nimport type { EnsWriteIntent } from \"../../action/write-intent.js\";\nimport type { CodecError } from \"../../errors/codec-error.js\";\nimport type { ContractError } from \"../../errors/contract-error.js\";\nimport type { NameError } from \"../../errors/name-error.js\";\nimport type { RpcError } from \"../../errors/rpc-error.js\";\nimport { Bytes32 } from \"../../schemas/hash.js\";\nimport type { Hex } from \"../../schemas/hex.js\";\nimport { EthereumAddress } from \"../../schemas/identity.js\";\nimport { NormalizedName } from \"../../schemas/name.js\";\nimport { EnsProtocol } from \"../../schemas/protocol.js\";\nimport type {\n CallExecutionResult,\n ConfirmationPolicy,\n WriteError,\n WriteMode,\n WritePlanProgress,\n} from \"../../write/types.js\";\nimport type { NameState } from \"../name/get-name-state/types.js\";\nimport type { SetRecordInput } from \"../records/set-records/types.js\";\n\nexport type RegistrationReadError = CodecError | ContractError | NameError | RpcError;\n\nexport type RegistrationNameParameters = {\n readonly name: string;\n readonly duration: bigint;\n} & BlockParameters;\n\nexport type RegistrationPriceParameters = RegistrationNameParameters & {\n readonly paymentToken?: EthereumAddress;\n};\n\nexport const NativePaymentCurrency = Schema.Struct({\n kind: Schema.Literal(\"native\"),\n symbol: Schema.Literal(\"ETH\"),\n decimals: Schema.Literal(18),\n});\n\nexport const Erc20PaymentCurrency = Schema.Struct({\n kind: Schema.Literal(\"erc20\"),\n address: EthereumAddress,\n symbol: Schema.String,\n decimals: Schema.Int,\n});\n\nexport const PaymentCurrency = Schema.Union([NativePaymentCurrency, Erc20PaymentCurrency]);\nexport type PaymentCurrency = typeof PaymentCurrency.Type;\n\nconst PaymentTokenRequired = Schema.Struct({\n status: Schema.Literal(\"payment-token-required\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n});\n\nconst UnsupportedPaymentToken = Schema.Struct({\n status: Schema.Literal(\"unsupported-payment-token\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n paymentToken: EthereumAddress,\n});\n\nexport const RegistrationPriceResult = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"available\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n registrar: EthereumAddress,\n duration: Schema.BigInt,\n base: Schema.BigInt,\n premium: Schema.BigInt,\n total: Schema.BigInt,\n currency: PaymentCurrency,\n }),\n Schema.Struct({\n status: Schema.Literal(\"unavailable\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n reason: Schema.Literal(\"NAME_UNAVAILABLE\"),\n }),\n PaymentTokenRequired,\n UnsupportedPaymentToken,\n]);\nexport type RegistrationPriceResult = typeof RegistrationPriceResult.Type;\n\nexport const RenewalRoute = Schema.Literals([\"v1-controller\", \"v2-registrar\", \"v1-renewer\"]);\nexport type RenewalRoute = typeof RenewalRoute.Type;\n\nexport const RenewalPriceResult = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"renewable\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n route: RenewalRoute,\n renewer: EthereumAddress,\n duration: Schema.BigInt,\n price: Schema.BigInt,\n currency: PaymentCurrency,\n }),\n Schema.Struct({\n status: Schema.Literal(\"not-renewable\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n reason: Schema.Literal(\"NAME_NOT_RENEWABLE\"),\n }),\n PaymentTokenRequired,\n UnsupportedPaymentToken,\n]);\nexport type RenewalPriceResult = typeof RenewalPriceResult.Type;\n\nexport const RegistrationParameters = Schema.Union([\n Schema.Struct({\n protocol: Schema.Literal(\"v1\"),\n registrar: EthereumAddress,\n priceOracle: EthereumAddress,\n minimumRegistrationDuration: Schema.BigInt,\n minimumRenewalDuration: Schema.BigInt,\n minimumCommitmentAge: Schema.BigInt,\n maximumCommitmentAge: Schema.BigInt,\n payment: Schema.Struct({ kind: Schema.Literal(\"native\") }),\n }),\n Schema.Struct({\n protocol: Schema.Literal(\"v2\"),\n registrar: EthereumAddress,\n priceOracle: EthereumAddress,\n minimumRegistrationDuration: Schema.BigInt,\n minimumRenewalDuration: Schema.BigInt,\n minimumCommitmentAge: Schema.BigInt,\n maximumCommitmentAge: Schema.BigInt,\n payment: Schema.Struct({ kind: Schema.Literal(\"erc20\"), enumerable: Schema.Literal(false) }),\n }),\n]);\nexport type RegistrationParameters = typeof RegistrationParameters.Type;\n\nexport const PaymentTokenSupport = Schema.Union([\n Schema.Struct({\n protocol: Schema.Literal(\"v1\"),\n supported: Schema.Literal(false),\n reason: Schema.Literal(\"NATIVE_PAYMENT_ONLY\"),\n }),\n Schema.Struct({\n protocol: Schema.Literal(\"v2\"),\n supported: Schema.Literal(false),\n token: EthereumAddress,\n reason: Schema.Literal(\"PAYMENT_TOKEN_NOT_SUPPORTED\"),\n }),\n Schema.Struct({\n protocol: Schema.Literal(\"v2\"),\n supported: Schema.Literal(true),\n token: EthereumAddress,\n symbol: Schema.String,\n decimals: Schema.Int,\n }),\n]);\nexport type PaymentTokenSupport = typeof PaymentTokenSupport.Type;\n\nexport type RegistrationCommitmentParameters = RegistrationNameParameters & {\n readonly owner: EthereumAddress;\n readonly secret: Bytes32;\n readonly resolver?: EthereumAddress;\n readonly subregistry?: EthereumAddress;\n readonly records?: ReadonlyArray<Hex>;\n readonly reverseRecord?: 0 | 1 | 2;\n readonly referrer?: Bytes32;\n};\n\nexport const RegistrationCommitment = Schema.Struct({\n name: NormalizedName,\n protocol: EnsProtocol,\n registrar: EthereumAddress,\n commitment: Bytes32,\n});\nexport type RegistrationCommitment = typeof RegistrationCommitment.Type;\n\nexport const CommitmentStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"not-found\"), protocol: EnsProtocol }),\n Schema.Struct({\n status: Schema.Literal(\"pending\"),\n protocol: EnsProtocol,\n submittedAt: Schema.BigInt,\n readyAt: Schema.BigInt,\n expiresAt: Schema.BigInt,\n remainingSeconds: Schema.BigInt,\n }),\n Schema.Struct({\n status: Schema.Literal(\"ready\"),\n protocol: EnsProtocol,\n submittedAt: Schema.BigInt,\n readyAt: Schema.BigInt,\n expiresAt: Schema.BigInt,\n remainingSeconds: Schema.BigInt,\n }),\n Schema.Struct({\n status: Schema.Literal(\"expired\"),\n protocol: EnsProtocol,\n submittedAt: Schema.BigInt,\n readyAt: Schema.BigInt,\n expiresAt: Schema.BigInt,\n }),\n]);\nexport type CommitmentStatus = typeof CommitmentStatus.Type;\n\nexport const RegistrationPlan = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"unavailable\"), name: NormalizedName }),\n Schema.Struct({ status: Schema.Literal(\"payment-token-required\"), name: NormalizedName }),\n Schema.Struct({\n status: Schema.Literal(\"unsupported-payment-token\"),\n name: NormalizedName,\n paymentToken: EthereumAddress,\n }),\n Schema.Struct({\n status: Schema.Literals([\n \"commitment-required\",\n \"commitment-pending\",\n \"ready\",\n \"commitment-expired\",\n ]),\n name: NormalizedName,\n parameters: RegistrationParameters,\n price: RegistrationPriceResult,\n commitment: RegistrationCommitment,\n commitmentStatus: CommitmentStatus,\n }),\n]);\nexport type RegistrationPlan = typeof RegistrationPlan.Type;\n\nexport interface CommitNameParameters {\n readonly commitment: Bytes32;\n}\n\nexport interface ApprovePaymentTokenParameters {\n readonly paymentToken: string;\n readonly amount: bigint;\n}\n\ntype RegistrationCommitmentWriteParameters = Omit<\n RegistrationCommitmentParameters,\n \"blockNumber\" | \"blockTag\"\n>;\n\nexport type CompleteRegistrationParameters = RegistrationCommitmentWriteParameters & {\n readonly paymentToken?: EthereumAddress;\n readonly maxPrice?: bigint;\n};\n\ninterface RegistrationWalletParameters {\n readonly walletClient?: WalletClient;\n readonly account?: Account | Address;\n readonly mode?: WriteMode;\n readonly confirmation?: ConfirmationPolicy;\n}\n\nexport type RegisterNameParameters = Omit<RegistrationCommitmentWriteParameters, \"records\"> &\n RegistrationWalletParameters & {\n readonly paymentToken?: EthereumAddress;\n readonly maxPrice?: bigint;\n readonly records?: ReadonlyArray<SetRecordInput>;\n readonly resume?: RegisterNameResult;\n };\n\nexport type AvailableRegistrationPrice = Extract<RegistrationPriceResult, { status: \"available\" }>;\n\nexport interface RegisterNameResult {\n readonly status: \"waiting\" | \"partial\" | \"submitted\" | \"completed\";\n readonly name: NormalizedName;\n readonly protocol: typeof EnsProtocol.Type;\n readonly commitment: Bytes32;\n readonly committedByWorkflow: boolean;\n readonly paymentApprovalIncluded: boolean;\n readonly readyAt: bigint | null;\n readonly expiresAt: bigint | null;\n readonly nextActionAt: bigint | null;\n readonly price: AvailableRegistrationPrice;\n readonly write: WritePlanProgress;\n readonly finalState: NameState | null;\n}\n\nexport type RegisterNamesEntryParameters = Omit<\n RegisterNameParameters,\n \"resume\" | \"walletClient\" | \"account\" | \"mode\" | \"confirmation\"\n>;\n\nexport interface RegisterNamesParameters extends RegistrationWalletParameters {\n readonly registrations: ReadonlyArray<RegisterNamesEntryParameters>;\n readonly resume?: RegisterNamesResult;\n}\n\nexport interface RegisterNamesResult {\n readonly status: \"waiting\" | \"partial\" | \"submitted\" | \"completed\";\n readonly registrations: ReadonlyArray<RegisterNameResult>;\n readonly nextActionAt: bigint | null;\n}\n\nexport type RegistrationWriteError = WriteError;\nexport type RegistrationWriteResult = CallExecutionResult;\nexport type RegistrationWriteIntent = EnsWriteIntent<\n RegistrationWriteResult,\n RegistrationWriteError\n>;\n\nexport type RenewNameCallParameters = {\n readonly name: string;\n readonly duration: bigint;\n readonly paymentToken?: EthereumAddress;\n readonly maxPrice?: bigint;\n readonly referrer?: Bytes32;\n};\n\nexport interface ApproveRenewalPaymentParameters {\n readonly name: string;\n readonly duration: bigint;\n readonly paymentToken: string;\n readonly amount: bigint;\n}\n\nexport type RenewNameParameters = RenewNameCallParameters &\n RegistrationWalletParameters & {\n readonly resume?: RenewNameResult;\n };\n\nexport interface RenewalApproval {\n readonly required: boolean;\n readonly spender: EthereumAddress | null;\n readonly token: EthereumAddress | null;\n readonly amount: bigint;\n}\n\nexport interface RenewNameResult {\n readonly status: \"completed\" | \"partial\";\n readonly name: NormalizedName;\n readonly protocol: typeof EnsProtocol.Type;\n readonly route: RenewalRoute;\n readonly duration: bigint;\n readonly previousExpiry: bigint | null;\n readonly newExpiry: bigint | null;\n readonly price: bigint;\n readonly currency: PaymentCurrency;\n readonly approval: RenewalApproval;\n readonly write: WritePlanProgress;\n readonly finalState: NameState | null;\n}\n\nexport interface RenewNameAction extends EnsAction<\n RenewNameParameters,\n RenewNameResult,\n WriteError\n> {\n readonly call: (\n parameters: RenewNameCallParameters,\n ) => EnsWriteIntent<CallExecutionResult, WriteError>;\n}\n\nexport type RenewNamesEntryParameters = RenewNameCallParameters;\n\nexport interface RenewNamesParameters extends RegistrationWalletParameters {\n readonly renewals: ReadonlyArray<RenewNamesEntryParameters>;\n readonly maxTotalPrice?: bigint;\n readonly resume?: RenewNamesResult;\n}\n\nexport interface RenewNamesResult {\n readonly status: \"completed\" | \"partial\";\n readonly renewals: ReadonlyArray<\n Omit<RenewNameResult, \"write\" | \"status\" | \"approval\" | \"finalState\"> & {\n readonly newExpiry: bigint | null;\n readonly finalState: NameState | null;\n }\n >;\n readonly approvals: ReadonlyArray<RenewalApproval>;\n readonly totalPrice: bigint;\n readonly write: WritePlanProgress;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/actions/registration/types.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { Account, Address, WalletClient } from \"viem\";\n\nimport type { EnsAction } from \"../../action/action.js\";\nimport type { BlockParameters } from \"../../action/block.js\";\nimport type { EnsWriteIntent } from \"../../action/write-intent.js\";\nimport type { CodecError } from \"../../errors/codec-error.js\";\nimport type { ContractError } from \"../../errors/contract-error.js\";\nimport type { NameError } from \"../../errors/name-error.js\";\nimport type { RpcError } from \"../../errors/rpc-error.js\";\nimport { Bytes32 } from \"../../schemas/hash.js\";\nimport type { Hex } from \"../../schemas/hex.js\";\nimport { EthereumAddress } from \"../../schemas/identity.js\";\nimport { NormalizedName } from \"../../schemas/name.js\";\nimport { EnsProtocol } from \"../../schemas/protocol.js\";\nimport type {\n CallExecutionResult,\n ConfirmationPolicy,\n WriteError,\n WriteMode,\n WritePlanProgress,\n} from \"../../write/types.js\";\nimport type { NameState } from \"../name/get-name-state/types.js\";\nimport type { SetRecordInput } from \"../records/set-records/types.js\";\n\nexport type RegistrationReadError = CodecError | ContractError | NameError | RpcError;\n\nexport type RegistrationNameParameters = {\n readonly name: string;\n readonly duration: bigint;\n} & BlockParameters;\n\nexport type RegistrationPriceParameters = RegistrationNameParameters & {\n readonly paymentToken?: EthereumAddress;\n};\n\nexport const NativePaymentCurrency = Schema.Struct({\n kind: Schema.Literal(\"native\"),\n symbol: Schema.Literal(\"ETH\"),\n decimals: Schema.Literal(18),\n});\n\nexport const Erc20PaymentCurrency = Schema.Struct({\n kind: Schema.Literal(\"erc20\"),\n address: EthereumAddress,\n symbol: Schema.String,\n decimals: Schema.Int,\n});\n\nexport const PaymentCurrency = Schema.Union([NativePaymentCurrency, Erc20PaymentCurrency]);\nexport type PaymentCurrency = typeof PaymentCurrency.Type;\n\nconst PaymentTokenRequired = Schema.Struct({\n status: Schema.Literal(\"payment-token-required\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n});\n\nconst UnsupportedPaymentToken = Schema.Struct({\n status: Schema.Literal(\"unsupported-payment-token\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n paymentToken: EthereumAddress,\n});\n\nexport const RegistrationPriceResult = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"available\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n registrar: EthereumAddress,\n duration: Schema.BigInt,\n base: Schema.BigInt,\n premium: Schema.BigInt,\n total: Schema.BigInt,\n currency: PaymentCurrency,\n }),\n Schema.Struct({\n status: Schema.Literal(\"unavailable\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n reason: Schema.Literal(\"NAME_UNAVAILABLE\"),\n }),\n PaymentTokenRequired,\n UnsupportedPaymentToken,\n]);\nexport type RegistrationPriceResult = typeof RegistrationPriceResult.Type;\n\nexport const RenewalRoute = Schema.Literals([\"v1-controller\", \"v2-registrar\", \"v1-renewer\"]);\nexport type RenewalRoute = typeof RenewalRoute.Type;\n\nexport const RenewalPriceResult = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"renewable\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n route: RenewalRoute,\n renewer: EthereumAddress,\n duration: Schema.BigInt,\n price: Schema.BigInt,\n currency: PaymentCurrency,\n }),\n Schema.Struct({\n status: Schema.Literal(\"not-renewable\"),\n name: NormalizedName,\n protocol: EnsProtocol,\n reason: Schema.Literal(\"NAME_NOT_RENEWABLE\"),\n }),\n PaymentTokenRequired,\n UnsupportedPaymentToken,\n]);\nexport type RenewalPriceResult = typeof RenewalPriceResult.Type;\n\nexport const RegistrationParameters = Schema.Union([\n Schema.Struct({\n protocol: Schema.Literal(\"v1\"),\n registrar: EthereumAddress,\n priceOracle: EthereumAddress,\n minimumRegistrationDuration: Schema.BigInt,\n minimumRenewalDuration: Schema.BigInt,\n minimumCommitmentAge: Schema.BigInt,\n maximumCommitmentAge: Schema.BigInt,\n payment: Schema.Struct({ kind: Schema.Literal(\"native\") }),\n }),\n Schema.Struct({\n protocol: Schema.Literal(\"v2\"),\n registrar: EthereumAddress,\n priceOracle: EthereumAddress,\n minimumRegistrationDuration: Schema.BigInt,\n minimumRenewalDuration: Schema.BigInt,\n minimumCommitmentAge: Schema.BigInt,\n maximumCommitmentAge: Schema.BigInt,\n payment: Schema.Struct({ kind: Schema.Literal(\"erc20\"), enumerable: Schema.Literal(false) }),\n }),\n]);\nexport type RegistrationParameters = typeof RegistrationParameters.Type;\n\nexport const PaymentTokenSupport = Schema.Union([\n Schema.Struct({\n protocol: Schema.Literal(\"v1\"),\n supported: Schema.Literal(false),\n reason: Schema.Literal(\"NATIVE_PAYMENT_ONLY\"),\n }),\n Schema.Struct({\n protocol: Schema.Literal(\"v2\"),\n supported: Schema.Literal(false),\n token: EthereumAddress,\n reason: Schema.Literal(\"PAYMENT_TOKEN_NOT_SUPPORTED\"),\n }),\n Schema.Struct({\n protocol: Schema.Literal(\"v2\"),\n supported: Schema.Literal(true),\n token: EthereumAddress,\n symbol: Schema.String,\n decimals: Schema.Int,\n }),\n]);\nexport type PaymentTokenSupport = typeof PaymentTokenSupport.Type;\n\nexport type RegistrationCommitmentParameters = RegistrationNameParameters & {\n readonly owner: EthereumAddress;\n readonly secret: Bytes32;\n readonly resolver?: EthereumAddress;\n readonly subregistry?: EthereumAddress;\n readonly records?: ReadonlyArray<Hex>;\n readonly reverseRecord?: 0 | 1 | 2;\n readonly referrer?: Bytes32;\n};\n\nexport const RegistrationCommitment = Schema.Struct({\n name: NormalizedName,\n protocol: EnsProtocol,\n registrar: EthereumAddress,\n commitment: Bytes32,\n});\nexport type RegistrationCommitment = typeof RegistrationCommitment.Type;\n\nexport const CommitmentStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"not-found\"), protocol: EnsProtocol }),\n Schema.Struct({\n status: Schema.Literal(\"pending\"),\n protocol: EnsProtocol,\n submittedAt: Schema.BigInt,\n readyAt: Schema.BigInt,\n expiresAt: Schema.BigInt,\n remainingSeconds: Schema.BigInt,\n }),\n Schema.Struct({\n status: Schema.Literal(\"ready\"),\n protocol: EnsProtocol,\n submittedAt: Schema.BigInt,\n readyAt: Schema.BigInt,\n expiresAt: Schema.BigInt,\n remainingSeconds: Schema.BigInt,\n }),\n Schema.Struct({\n status: Schema.Literal(\"expired\"),\n protocol: EnsProtocol,\n submittedAt: Schema.BigInt,\n readyAt: Schema.BigInt,\n expiresAt: Schema.BigInt,\n }),\n]);\nexport type CommitmentStatus = typeof CommitmentStatus.Type;\n\nexport const RegistrationPlan = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"unavailable\"), name: NormalizedName }),\n Schema.Struct({ status: Schema.Literal(\"payment-token-required\"), name: NormalizedName }),\n Schema.Struct({\n status: Schema.Literal(\"unsupported-payment-token\"),\n name: NormalizedName,\n paymentToken: EthereumAddress,\n }),\n Schema.Struct({\n status: Schema.Literals([\n \"commitment-required\",\n \"commitment-pending\",\n \"ready\",\n \"commitment-expired\",\n ]),\n name: NormalizedName,\n parameters: RegistrationParameters,\n price: RegistrationPriceResult,\n commitment: RegistrationCommitment,\n commitmentStatus: CommitmentStatus,\n }),\n]);\nexport type RegistrationPlan = typeof RegistrationPlan.Type;\n\nexport interface CommitNameParameters {\n readonly commitment: Bytes32;\n}\n\nexport interface ApprovePaymentTokenParameters {\n readonly paymentToken: string;\n readonly amount: bigint;\n}\n\ntype RegistrationCommitmentWriteParameters = Omit<\n RegistrationCommitmentParameters,\n \"blockNumber\" | \"blockTag\"\n>;\n\nexport type CompleteRegistrationParameters = RegistrationCommitmentWriteParameters & {\n readonly paymentToken?: EthereumAddress;\n readonly maxPrice?: bigint;\n};\n\nexport interface RegistrationWalletParameters {\n readonly walletClient?: WalletClient;\n readonly account?: Account | Address;\n readonly mode?: WriteMode;\n readonly confirmation?: ConfirmationPolicy;\n}\n\nexport type RegisterNameParameters = Omit<RegistrationCommitmentWriteParameters, \"records\"> &\n RegistrationWalletParameters & {\n readonly paymentToken?: EthereumAddress;\n readonly maxPrice?: bigint;\n readonly records?: ReadonlyArray<SetRecordInput>;\n readonly resume?: RegisterNameResult;\n };\n\nexport type AvailableRegistrationPrice = Extract<RegistrationPriceResult, { status: \"available\" }>;\n\nexport interface RegisterNameResult {\n readonly status: \"waiting\" | \"partial\" | \"submitted\" | \"completed\";\n readonly name: NormalizedName;\n readonly protocol: typeof EnsProtocol.Type;\n readonly commitment: Bytes32;\n readonly committedByWorkflow: boolean;\n readonly paymentApprovalIncluded: boolean;\n readonly readyAt: bigint | null;\n readonly expiresAt: bigint | null;\n readonly nextActionAt: bigint | null;\n readonly price: AvailableRegistrationPrice;\n readonly write: WritePlanProgress;\n readonly finalState: NameState | null;\n}\n\nexport type RegisterNamesEntryParameters = Omit<\n RegisterNameParameters,\n \"resume\" | \"walletClient\" | \"account\" | \"mode\" | \"confirmation\"\n>;\n\nexport interface RegisterNamesParameters extends RegistrationWalletParameters {\n readonly registrations: ReadonlyArray<RegisterNamesEntryParameters>;\n readonly resume?: RegisterNamesResult;\n}\n\nexport interface RegisterNamesResult {\n readonly status: \"waiting\" | \"partial\" | \"submitted\" | \"completed\";\n readonly registrations: ReadonlyArray<RegisterNameResult>;\n readonly nextActionAt: bigint | null;\n}\n\nexport type RegistrationWriteError = WriteError;\nexport type RegistrationWriteResult = CallExecutionResult;\nexport type RegistrationWriteIntent = EnsWriteIntent<\n RegistrationWriteResult,\n RegistrationWriteError\n>;\n\nexport type RenewNameCallParameters = {\n readonly name: string;\n readonly duration: bigint;\n readonly paymentToken?: EthereumAddress;\n readonly maxPrice?: bigint;\n readonly referrer?: Bytes32;\n};\n\nexport interface ApproveRenewalPaymentParameters {\n readonly name: string;\n readonly duration: bigint;\n readonly paymentToken: string;\n readonly amount: bigint;\n}\n\nexport type RenewNameParameters = RenewNameCallParameters &\n RegistrationWalletParameters & {\n readonly resume?: RenewNameResult;\n };\n\nexport interface RenewalApproval {\n readonly required: boolean;\n readonly spender: EthereumAddress | null;\n readonly token: EthereumAddress | null;\n readonly amount: bigint;\n}\n\nexport interface RenewNameResult {\n readonly status: \"completed\" | \"partial\";\n readonly name: NormalizedName;\n readonly protocol: typeof EnsProtocol.Type;\n readonly route: RenewalRoute;\n readonly duration: bigint;\n readonly previousExpiry: bigint | null;\n readonly newExpiry: bigint | null;\n readonly price: bigint;\n readonly currency: PaymentCurrency;\n readonly approval: RenewalApproval;\n readonly write: WritePlanProgress;\n readonly finalState: NameState | null;\n}\n\nexport interface RenewNameAction extends EnsAction<\n RenewNameParameters,\n RenewNameResult,\n WriteError\n> {\n readonly call: (\n parameters: RenewNameCallParameters,\n ) => EnsWriteIntent<CallExecutionResult, WriteError>;\n}\n\nexport type RenewNamesEntryParameters = RenewNameCallParameters;\n\nexport interface RenewNamesParameters extends RegistrationWalletParameters {\n readonly renewals: ReadonlyArray<RenewNamesEntryParameters>;\n readonly maxTotalPrice?: bigint;\n readonly resume?: RenewNamesResult;\n}\n\nexport interface RenewNamesResult {\n readonly status: \"completed\" | \"partial\";\n readonly renewals: ReadonlyArray<\n Omit<RenewNameResult, \"write\" | \"status\" | \"approval\" | \"finalState\"> & {\n readonly newExpiry: bigint | null;\n readonly finalState: NameState | null;\n }\n >;\n readonly approvals: ReadonlyArray<RenewalApproval>;\n readonly totalPrice: bigint;\n readonly write: WritePlanProgress;\n}\n"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import "../../../config/config.js";
2
2
  import { EnsAction } from "../../../action/action.js";
3
+ import "../../../internal/errors/viem-error.js";
4
+ import "../../../errors/write-plan-error.js";
3
5
  import { WriteError } from "../../../write/types.js";
4
6
  import { CreateResolverError, CreateResolverIntent, CreateResolverParameters, CreateResolverResult } from "./types.js";
5
7
  import { createResolverIntent } from "./prepare.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/actions/resolution/create-resolver/index.ts"],"mappings":";;;;;;;;cAsDa,wBAAsB,UAAA,yCAAA;cA0C7B,QAAM,UAAA,0BAAA,sBAAA;cAMC,uBAOD;WAAoB,aAAa"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/actions/resolution/create-resolver/index.ts"],"mappings":";;;;;;;;;;cA4Ea,wBAAsB,UAAA,yCAAA;cA0C7B,QAAM,UAAA,0BAAA,sBAAA;cAMC,uBAOD;WAAoB,aAAa"}
@@ -1,36 +1,54 @@
1
1
  import { defineAction, defineExtendedAction } from "../../../action/action.js";
2
+ import { provideConfig } from "../../../internal/config/context.js";
2
3
  import { ContractError } from "../../../errors/contract-error.js";
3
4
  import { WritePlanError } from "../../../errors/write-plan-error.js";
5
+ import { resolveWalletContext } from "../../../internal/services/wallet-client.js";
4
6
  import { executeSequential } from "../../../internal/write/execute-sequential.js";
5
- import { simulateCalls } from "../../batch/simulate-calls.js";
6
- import { EthereumAddress } from "../../../schemas/identity.js";
7
+ import { EthereumClient } from "../../../internal/client/ethereum-client.js";
7
8
  import { createResolverIntent, prepareCreateResolver } from "./prepare.js";
8
- import { Effect, Schema } from "effect";
9
- import { decodeFunctionResult } from "viem";
10
- import { verifiableFactoryV2DeployProxyAbi } from "@ensforge/contracts/v2";
9
+ import { Effect } from "effect";
10
+ import { concatHex, encodeAbiParameters, getCreate2Address, keccak256 } from "viem";
11
+ import { verifiableFactoryV2ProxyLogicAbi } from "@ensforge/contracts/v2";
11
12
 
12
13
  //#region src/actions/resolution/create-resolver/index.ts
13
14
  const predictResolverAddressEffect = Effect.fn("ensforge.predictResolverAddress")(function* (config, parameters) {
14
- const simulation = yield* simulateCalls.effect(config, {
15
- calls: [createResolverIntent(parameters)],
15
+ const deployment = config.deployments;
16
+ if (deployment.protocol !== "v2") return yield* new WritePlanError({
17
+ code: "INVALID_CALL_PLAN",
18
+ message: "Permissioned Resolver prediction requires an ENSv2 deployment",
19
+ cause: deployment
20
+ });
21
+ const wallet = yield* provideConfig(config, resolveWalletContext({
16
22
  ...parameters.walletClient === void 0 ? {} : { walletClient: parameters.walletClient },
17
23
  ...parameters.account === void 0 ? {} : { account: parameters.account }
18
- });
19
- const raw = simulation[0]?.result;
20
- if (raw === void 0) return yield* new ContractError({
21
- code: "DECODE_FAILED",
22
- message: "Resolver deployment simulation returned no address",
23
- cause: simulation
24
- });
24
+ }));
25
+ const sender = typeof wallet.account === "string" ? wallet.account : wallet.account.address;
26
+ const factory = deployment.v2.contracts.verifiableFactory;
27
+ const proxyLogic = yield* provideConfig(config, Effect.gen(function* () {
28
+ return yield* (yield* EthereumClient).readContractDirect({
29
+ address: factory,
30
+ abi: verifiableFactoryV2ProxyLogicAbi,
31
+ functionName: "proxyLogic"
32
+ });
33
+ }));
25
34
  return yield* Effect.try({
26
- try: () => Schema.decodeUnknownSync(EthereumAddress)(decodeFunctionResult({
27
- abi: verifiableFactoryV2DeployProxyAbi,
28
- functionName: "deployProxy",
29
- data: raw
30
- })),
35
+ try: () => {
36
+ const salt = keccak256(encodeAbiParameters([{ type: "address" }, { type: "uint256" }], [sender, parameters.salt]));
37
+ const bytecode = concatHex([
38
+ "0x3d604d80600a3d3981f3363d3d373d3d3d363d73",
39
+ proxyLogic,
40
+ "0x5af43d82803e903d91602b57fd5bf3",
41
+ salt
42
+ ]);
43
+ return getCreate2Address({
44
+ from: factory,
45
+ salt,
46
+ bytecode
47
+ });
48
+ },
31
49
  catch: (cause) => new ContractError({
32
- code: "DECODE_FAILED",
33
- message: "Unable to decode the predicted Permissioned Resolver address",
50
+ code: "ENCODE_FAILED",
51
+ message: "Unable to derive the Permissioned Resolver proxy address",
34
52
  cause
35
53
  })
36
54
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/actions/resolution/create-resolver/index.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport { verifiableFactoryV2DeployProxyAbi } from \"@ensforge/contracts/v2\";\nimport { decodeFunctionResult } from \"viem\";\n\nimport { defineAction, defineExtendedAction } from \"../../../action/action.js\";\nimport type { EnsforgeConfig } from \"../../../config/config.js\";\nimport { ContractError } from \"../../../errors/contract-error.js\";\nimport { WritePlanError } from \"../../../errors/write-plan-error.js\";\nimport { executeSequential } from \"../../../internal/write/execute-sequential.js\";\nimport { EthereumAddress } from \"../../../schemas/identity.js\";\nimport { simulateCalls } from \"../../batch/simulate-calls.js\";\nimport { createResolverIntent } from \"./prepare.js\";\nimport type {\n CreateResolverError,\n CreateResolverParameters,\n CreateResolverResult,\n} from \"./types.js\";\n\nexport const predictResolverAddressEffect = Effect.fn(\"ensforge.predictResolverAddress\")(function* (\n config: EnsforgeConfig,\n parameters: CreateResolverParameters,\n) {\n const simulation = yield* simulateCalls.effect(config, {\n calls: [createResolverIntent(parameters)],\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n });\n const raw = simulation[0]?.result;\n if (raw === undefined) {\n return yield* new ContractError({\n code: \"DECODE_FAILED\",\n message: \"Resolver deployment simulation returned no address\",\n cause: simulation,\n });\n }\n return yield* Effect.try({\n try: () =>\n Schema.decodeUnknownSync(EthereumAddress)(\n decodeFunctionResult({\n abi: verifiableFactoryV2DeployProxyAbi,\n functionName: \"deployProxy\",\n data: raw,\n }),\n ),\n catch: (cause) =>\n new ContractError({\n code: \"DECODE_FAILED\",\n message: \"Unable to decode the predicted Permissioned Resolver address\",\n cause,\n }),\n });\n});\n\nexport const predictResolverAddress = defineAction<\n CreateResolverParameters,\n typeof EthereumAddress.Type,\n CreateResolverError\n>(predictResolverAddressEffect);\n\nconst implementation = Effect.fn(\"ensforge.createResolver\")(function* (\n config: EnsforgeConfig,\n parameters: CreateResolverParameters,\n) {\n const resolver = yield* predictResolverAddressEffect(config, parameters);\n const result = yield* executeSequential(config, {\n calls: [createResolverIntent(parameters)],\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n ...(parameters.confirmation === undefined ? {} : { confirmation: parameters.confirmation }),\n });\n const call = result.calls[0];\n if (call === undefined) {\n return yield* new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"createResolver did not produce an execution result\",\n cause: result,\n });\n }\n const deployment = config.deployments;\n if (deployment.protocol !== \"v2\") {\n return yield* new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Permissioned Resolver creation requires an ENSv2 deployment\",\n cause: deployment,\n });\n }\n return {\n status: \"deployed\",\n resolver,\n implementation: deployment.v2.implementations.permissionedResolver,\n factory: deployment.v2.contracts.verifiableFactory,\n call,\n } satisfies CreateResolverResult;\n});\n\nconst action = defineExtendedAction<\n CreateResolverParameters,\n CreateResolverResult,\n CreateResolverError\n>(implementation);\n\nexport const createResolver = Object.freeze(\n Object.defineProperty(action, \"call\", {\n value: createResolverIntent,\n enumerable: true,\n configurable: false,\n writable: false,\n }),\n) as typeof action & { readonly call: typeof createResolverIntent };\n\nexport { prepareCreateResolver } from \"./prepare.js\";\nexport type {\n CreateResolverError,\n CreateResolverIntent,\n CreateResolverParameters,\n CreateResolverResult,\n} from \"./types.js\";\n"],"mappings":";;;;;;;;;;;;AAmBA,MAAa,+BAA+B,OAAO,GAAG,iCAAiC,CAAC,CAAC,WACvF,QACA,YACA;CACA,MAAM,aAAa,OAAO,cAAc,OAAO,QAAQ;EACrD,OAAO,CAAC,qBAAqB,UAAU,CAAC;EACxC,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;EACzF,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;CAC5E,CAAC;CACD,MAAM,MAAM,WAAW,EAAE,EAAE;CAC3B,IAAI,QAAQ,QACV,OAAO,OAAO,IAAI,cAAc;EAC9B,MAAM;EACN,SAAS;EACT,OAAO;CACT,CAAC;CAEH,OAAO,OAAO,OAAO,IAAI;EACvB,WACE,OAAO,kBAAkB,eAAe,CAAC,CACvC,qBAAqB;GACnB,KAAK;GACL,cAAc;GACd,MAAM;EACR,CAAC,CACH;EACF,QAAQ,UACN,IAAI,cAAc;GAChB,MAAM;GACN,SAAS;GACT;EACF,CAAC;CACL,CAAC;AACH,CAAC;AAED,MAAa,yBAAyB,aAIpC,4BAA4B;AAE9B,MAAM,iBAAiB,OAAO,GAAG,yBAAyB,CAAC,CAAC,WAC1D,QACA,YACA;CACA,MAAM,WAAW,OAAO,6BAA6B,QAAQ,UAAU;CACvE,MAAM,SAAS,OAAO,kBAAkB,QAAQ;EAC9C,OAAO,CAAC,qBAAqB,UAAU,CAAC;EACxC,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;EACzF,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;EAC1E,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;CAC3F,CAAC;CACD,MAAM,OAAO,OAAO,MAAM;CAC1B,IAAI,SAAS,QACX,OAAO,OAAO,IAAI,eAAe;EAC/B,MAAM;EACN,SAAS;EACT,OAAO;CACT,CAAC;CAEH,MAAM,aAAa,OAAO;CAC1B,IAAI,WAAW,aAAa,MAC1B,OAAO,OAAO,IAAI,eAAe;EAC/B,MAAM;EACN,SAAS;EACT,OAAO;CACT,CAAC;CAEH,OAAO;EACL,QAAQ;EACR;EACA,gBAAgB,WAAW,GAAG,gBAAgB;EAC9C,SAAS,WAAW,GAAG,UAAU;EACjC;CACF;AACF,CAAC;AAED,MAAM,SAAS,qBAIb,cAAc;AAEhB,MAAa,iBAAiB,OAAO,OACnC,OAAO,eAAe,QAAQ,QAAQ;CACpC,OAAO;CACP,YAAY;CACZ,cAAc;CACd,UAAU;AACZ,CAAC,CACH"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/actions/resolution/create-resolver/index.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { verifiableFactoryV2ProxyLogicAbi } from \"@ensforge/contracts/v2\";\nimport { concatHex, encodeAbiParameters, getCreate2Address, keccak256 } from \"viem\";\n\nimport { defineAction, defineExtendedAction } from \"../../../action/action.js\";\nimport type { EnsforgeConfig } from \"../../../config/config.js\";\nimport { ContractError } from \"../../../errors/contract-error.js\";\nimport { WritePlanError } from \"../../../errors/write-plan-error.js\";\nimport { EthereumClient } from \"../../../internal/client/ethereum-client.js\";\nimport { provideConfig } from \"../../../internal/config/context.js\";\nimport { resolveWalletContext } from \"../../../internal/services/wallet-client.js\";\nimport { executeSequential } from \"../../../internal/write/execute-sequential.js\";\nimport type { EthereumAddress } from \"../../../schemas/identity.js\";\nimport { createResolverIntent } from \"./prepare.js\";\nimport type {\n CreateResolverError,\n CreateResolverParameters,\n CreateResolverResult,\n} from \"./types.js\";\n\nexport const predictResolverAddressEffect = Effect.fn(\"ensforge.predictResolverAddress\")(function* (\n config: EnsforgeConfig,\n parameters: CreateResolverParameters,\n) {\n const deployment = config.deployments;\n if (deployment.protocol !== \"v2\") {\n return yield* new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Permissioned Resolver prediction requires an ENSv2 deployment\",\n cause: deployment,\n });\n }\n const wallet = yield* provideConfig(\n config,\n resolveWalletContext({\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n }),\n );\n const sender = typeof wallet.account === \"string\" ? wallet.account : wallet.account.address;\n const factory = deployment.v2.contracts.verifiableFactory;\n const proxyLogic = yield* provideConfig(\n config,\n Effect.gen(function* () {\n const ethereum = yield* EthereumClient;\n return yield* ethereum.readContractDirect({\n address: factory,\n abi: verifiableFactoryV2ProxyLogicAbi,\n functionName: \"proxyLogic\",\n });\n }),\n );\n\n return yield* Effect.try({\n try: () => {\n const salt = keccak256(\n encodeAbiParameters([{ type: \"address\" }, { type: \"uint256\" }], [sender, parameters.salt]),\n );\n const bytecode = concatHex([\n \"0x3d604d80600a3d3981f3363d3d373d3d3d363d73\",\n proxyLogic,\n \"0x5af43d82803e903d91602b57fd5bf3\",\n salt,\n ]);\n return getCreate2Address({ from: factory, salt, bytecode });\n },\n catch: (cause) =>\n new ContractError({\n code: \"ENCODE_FAILED\",\n message: \"Unable to derive the Permissioned Resolver proxy address\",\n cause,\n }),\n });\n});\n\nexport const predictResolverAddress = defineAction<\n CreateResolverParameters,\n typeof EthereumAddress.Type,\n CreateResolverError\n>(predictResolverAddressEffect);\n\nconst implementation = Effect.fn(\"ensforge.createResolver\")(function* (\n config: EnsforgeConfig,\n parameters: CreateResolverParameters,\n) {\n const resolver = yield* predictResolverAddressEffect(config, parameters);\n const result = yield* executeSequential(config, {\n calls: [createResolverIntent(parameters)],\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n ...(parameters.confirmation === undefined ? {} : { confirmation: parameters.confirmation }),\n });\n const call = result.calls[0];\n if (call === undefined) {\n return yield* new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"createResolver did not produce an execution result\",\n cause: result,\n });\n }\n const deployment = config.deployments;\n if (deployment.protocol !== \"v2\") {\n return yield* new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Permissioned Resolver creation requires an ENSv2 deployment\",\n cause: deployment,\n });\n }\n return {\n status: \"deployed\",\n resolver,\n implementation: deployment.v2.implementations.permissionedResolver,\n factory: deployment.v2.contracts.verifiableFactory,\n call,\n } satisfies CreateResolverResult;\n});\n\nconst action = defineExtendedAction<\n CreateResolverParameters,\n CreateResolverResult,\n CreateResolverError\n>(implementation);\n\nexport const createResolver = Object.freeze(\n Object.defineProperty(action, \"call\", {\n value: createResolverIntent,\n enumerable: true,\n configurable: false,\n writable: false,\n }),\n) as typeof action & { readonly call: typeof createResolverIntent };\n\nexport { prepareCreateResolver } from \"./prepare.js\";\nexport type {\n CreateResolverError,\n CreateResolverIntent,\n CreateResolverParameters,\n CreateResolverResult,\n} from \"./types.js\";\n"],"mappings":";;;;;;;;;;;;;AAqBA,MAAa,+BAA+B,OAAO,GAAG,iCAAiC,CAAC,CAAC,WACvF,QACA,YACA;CACA,MAAM,aAAa,OAAO;CAC1B,IAAI,WAAW,aAAa,MAC1B,OAAO,OAAO,IAAI,eAAe;EAC/B,MAAM;EACN,SAAS;EACT,OAAO;CACT,CAAC;CAEH,MAAM,SAAS,OAAO,cACpB,QACA,qBAAqB;EACnB,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;EACzF,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;CAC5E,CAAC,CACH;CACA,MAAM,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,OAAO,QAAQ;CACpF,MAAM,UAAU,WAAW,GAAG,UAAU;CACxC,MAAM,aAAa,OAAO,cACxB,QACA,OAAO,IAAI,aAAa;EAEtB,OAAO,QAAO,OADU,eACF,CAAC,mBAAmB;GACxC,SAAS;GACT,KAAK;GACL,cAAc;EAChB,CAAC;CACH,CAAC,CACH;CAEA,OAAO,OAAO,OAAO,IAAI;EACvB,WAAW;GACT,MAAM,OAAO,UACX,oBAAoB,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,QAAQ,WAAW,IAAI,CAAC,CAC3F;GACA,MAAM,WAAW,UAAU;IACzB;IACA;IACA;IACA;GACF,CAAC;GACD,OAAO,kBAAkB;IAAE,MAAM;IAAS;IAAM;GAAS,CAAC;EAC5D;EACA,QAAQ,UACN,IAAI,cAAc;GAChB,MAAM;GACN,SAAS;GACT;EACF,CAAC;CACL,CAAC;AACH,CAAC;AAED,MAAa,yBAAyB,aAIpC,4BAA4B;AAE9B,MAAM,iBAAiB,OAAO,GAAG,yBAAyB,CAAC,CAAC,WAC1D,QACA,YACA;CACA,MAAM,WAAW,OAAO,6BAA6B,QAAQ,UAAU;CACvE,MAAM,SAAS,OAAO,kBAAkB,QAAQ;EAC9C,OAAO,CAAC,qBAAqB,UAAU,CAAC;EACxC,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;EACzF,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;EAC1E,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;CAC3F,CAAC;CACD,MAAM,OAAO,OAAO,MAAM;CAC1B,IAAI,SAAS,QACX,OAAO,OAAO,IAAI,eAAe;EAC/B,MAAM;EACN,SAAS;EACT,OAAO;CACT,CAAC;CAEH,MAAM,aAAa,OAAO;CAC1B,IAAI,WAAW,aAAa,MAC1B,OAAO,OAAO,IAAI,eAAe;EAC/B,MAAM;EACN,SAAS;EACT,OAAO;CACT,CAAC;CAEH,OAAO;EACL,QAAQ;EACR;EACA,gBAAgB,WAAW,GAAG,gBAAgB;EAC9C,SAAS,WAAW,GAAG,UAAU;EACjC;CACF;AACF,CAAC;AAED,MAAM,SAAS,qBAIb,cAAc;AAEhB,MAAa,iBAAiB,OAAO,OACnC,OAAO,eAAe,QAAQ,QAAQ;CACpC,OAAO;CACP,YAAY;CACZ,cAAc;CACd,UAAU;AACZ,CAAC,CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"prepare.d.ts","names":[],"sources":["../../../../src/actions/resolution/create-resolver/prepare.ts"],"mappings":";;;;;cAgFa,uBAAwB,YAAY,6BAAwB,eAAA,qBAAA"}
1
+ {"version":3,"file":"prepare.d.ts","names":[],"sources":["../../../../src/actions/resolution/create-resolver/prepare.ts"],"mappings":";;;;;cAyEa,uBAAwB,YAAY,6BAAwB,eAAA,qBAAA"}