@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
package/README.md CHANGED
@@ -34,11 +34,13 @@ const owner = await getOwner(config, { name: "ens.eth" });
34
34
  const address = await getAddress(config, { name: "ens.eth" });
35
35
  ```
36
36
 
37
- Every action uses the same config and returns typed results. For applications already using Wagmi,
38
- pass its config directly:
37
+ Every action uses the same config and returns typed results. Wagmi support is isolated in an
38
+ optional entrypoint, so viem-only applications do not need to install Wagmi:
39
39
 
40
40
  ```ts
41
- const config = createConfig({
41
+ import { createWagmiConfig } from "@ensforge/core/wagmi";
42
+
43
+ const config = createWagmiConfig({
42
44
  network: "mainnet",
43
45
  wagmiConfig,
44
46
  });
@@ -1,5 +1,5 @@
1
1
  import { EnsAction, EnsActionEffect, defineAction } from "./action.js";
2
- import { BlockParameters } from "./block.js";
3
2
  import { EnsReadAction, EnsReadRequest, defineReadAction } from "./read-request.js";
3
+ import { BlockParameters } from "./block.js";
4
4
  import { EnsWriteAction, EnsWriteIntent, EnsWriteIntentPreparer, PreparedWriteCallDetails, WritePreparationContext, defineWriteAction } from "./write-intent.js";
5
5
  export { type BlockParameters, type EnsAction, type EnsActionEffect, type EnsReadAction, type EnsReadRequest, type EnsWriteAction, type EnsWriteIntent, type EnsWriteIntentPreparer, type PreparedWriteCallDetails, type WritePreparationContext, defineAction, defineReadAction, defineWriteAction };
@@ -1 +1 @@
1
- {"version":3,"file":"execute-write-plan.d.ts","names":[],"sources":["../../../src/actions/batch/execute-write-plan.ts"],"mappings":";;;;cAgNa,kBAAgB,UAAA,4BAAA,mBAAA"}
1
+ {"version":3,"file":"execute-write-plan.d.ts","names":[],"sources":["../../../src/actions/batch/execute-write-plan.ts"],"mappings":";;;;cAsOa,kBAAgB,UAAA,4BAAA,mBAAA"}
@@ -4,6 +4,7 @@ import { viemErrorToEffectError } from "../../internal/errors/viem-error.js";
4
4
  import { WritePlanError } from "../../errors/write-plan-error.js";
5
5
  import { PublicClientService } from "../../internal/services/public-client.js";
6
6
  import { executeSequential } from "../../internal/write/execute-sequential.js";
7
+ import { resumeSequentialConfirmations } from "../../internal/write/resume-sequential.js";
7
8
  import { resumeCalls } from "./resume-calls.js";
8
9
  import { sendCalls } from "./send-calls.js";
9
10
  import { Effect, Result } from "effect";
@@ -76,14 +77,31 @@ const executeWritePlanEffect = Effect.fn("ensforge.executeWritePlan")(function*
76
77
  const previous = previousIndex === -1 ? void 0 : completed[previousIndex];
77
78
  const partial = previous?.result.mode === "sequential" && previous.result.status === "partial" ? previous.result : void 0;
78
79
  const submittedBatch = previous?.result.mode === "batch" && previous.result.status === "submitted" ? previous.result : void 0;
79
- const confirmed = partial?.calls.filter((call) => call.status !== "not-started") ?? [];
80
+ const resumedPartial = partial === void 0 ? void 0 : yield* resumeSequentialConfirmations(config, partial, stage.confirmation ?? config.writes.confirmation);
81
+ if (resumedPartial?.failure !== null && resumedPartial?.failure !== void 0) {
82
+ const resumedStage = {
83
+ id: stage.id,
84
+ result: resumedPartial
85
+ };
86
+ if (previousIndex === -1) completed.push(resumedStage);
87
+ else completed[previousIndex] = resumedStage;
88
+ return {
89
+ planId: parameters.plan.id,
90
+ status: "partial",
91
+ completedStages: completed,
92
+ currentStage: stage.id,
93
+ nextActionAt: null,
94
+ failure: resumedPartial.failure
95
+ };
96
+ }
97
+ const confirmed = resumedPartial?.calls.filter((call) => call.status === "confirmed") ?? [];
80
98
  const remainingCalls = stage.calls.slice(confirmed.length);
81
99
  const execution = yield* Effect.result(submittedBatch !== void 0 ? resumeCalls.effect(config, {
82
100
  batch: submittedBatch,
83
101
  confirmation: stage.confirmation ?? config.writes.confirmation,
84
102
  ...parameters.walletClient === void 0 ? {} : { walletClient: parameters.walletClient },
85
103
  ...parameters.account === void 0 ? {} : { account: parameters.account }
86
- }) : partial === void 0 ? sendCalls.effect(config, stageParameters(stage, parameters)) : executeSequential(config, {
104
+ }) : resumedPartial === void 0 ? sendCalls.effect(config, stageParameters(stage, parameters)) : executeSequential(config, {
87
105
  ...stageParameters(stage, parameters),
88
106
  calls: remainingCalls,
89
107
  mode: "sequential"
@@ -1 +1 @@
1
- {"version":3,"file":"execute-write-plan.js","names":[],"sources":["../../../src/actions/batch/execute-write-plan.ts"],"sourcesContent":["import { Effect, Result } from \"effect\";\n\nimport { defineAction } from \"../../action/action.js\";\nimport type { EnsforgeConfig } from \"../../config/config.js\";\nimport { WritePlanError } from \"../../errors/write-plan-error.js\";\nimport { provideConfig } from \"../../internal/config/context.js\";\nimport { viemErrorToEffectError } from \"../../internal/errors/viem-error.js\";\nimport { PublicClientService } from \"../../internal/services/public-client.js\";\nimport { executeSequential } from \"../../internal/write/execute-sequential.js\";\nimport type {\n CallExecutionResult,\n ExecuteWritePlanParameters,\n WriteError,\n WritePlanProgress,\n WriteStage,\n WriteStageResult,\n WriteWaitCondition,\n} from \"../../write/types.js\";\nimport { resumeCalls } from \"./resume-calls.js\";\nimport { sendCalls } from \"./send-calls.js\";\n\nconst waitIsComplete = Effect.fn(\"waitIsComplete\")(function* (condition: WriteWaitCondition) {\n const { client } = yield* PublicClientService;\n const block = yield* Effect.tryPromise({\n try: () => client.getBlock({ blockTag: \"latest\" }),\n catch: (cause) => viemErrorToEffectError(cause, \"getBlock\"),\n });\n return condition.type === \"block\"\n ? block.number !== null && block.number >= condition.target\n : block.timestamp >= condition.target;\n});\n\nconst validatePlan = (parameters: ExecuteWritePlanParameters): WritePlanError | undefined => {\n if (parameters.plan.stages.length === 0) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"A write plan must contain at least one stage\",\n cause: parameters.plan,\n });\n }\n const ids = new Set(parameters.plan.stages.map((stage) => stage.id));\n if (ids.size !== parameters.plan.stages.length) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Write plan stage identifiers must be unique\",\n cause: parameters.plan,\n });\n }\n if (parameters.resume !== undefined && parameters.resume.planId !== parameters.plan.id) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Write progress belongs to a different plan\",\n cause: parameters.resume,\n });\n }\n const callStageIds = parameters.plan.stages\n .filter((stage) => stage.type === \"calls\")\n .map((stage) => stage.id);\n for (const [index, completed] of (parameters.resume?.completedStages ?? []).entries()) {\n if (callStageIds[index] !== completed.id) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Write progress is not a valid prefix of the supplied plan\",\n cause: parameters.resume,\n });\n }\n }\n return undefined;\n};\n\nconst stageParameters = (\n stage: Extract<WriteStage, { readonly type: \"calls\" }>,\n parameters: ExecuteWritePlanParameters,\n) => ({\n calls: stage.calls,\n mode: stage.mode ?? \"auto\",\n atomicity: stage.atomicity ?? \"preferred\",\n ...(stage.confirmation === undefined ? {} : { confirmation: stage.confirmation }),\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n});\n\nconst executeWritePlanEffect = Effect.fn(\"ensforge.executeWritePlan\")(function* (\n config: EnsforgeConfig,\n parameters: ExecuteWritePlanParameters,\n): Effect.fn.Return<WritePlanProgress, WriteError> {\n const invalid = validatePlan(parameters);\n if (invalid !== undefined) return yield* invalid;\n yield* Effect.annotateCurrentSpan({\n \"ens.network\": config.network,\n \"ens.write.operation\": \"execute-plan\",\n \"ens.write.stage_count\": parameters.plan.stages.length,\n \"ens.write.resumed\": parameters.resume !== undefined,\n });\n\n const completed = [...(parameters.resume?.completedStages ?? [])];\n const completedIds = new Set(\n completed\n .filter(\n (stage) =>\n (stage.result.mode !== \"sequential\" || stage.result.status !== \"partial\") &&\n (stage.result.mode !== \"batch\" || stage.result.status !== \"submitted\"),\n )\n .map((stage) => stage.id),\n );\n\n for (const stage of parameters.plan.stages) {\n if (stage.type === \"wait\") {\n const ready = yield* provideConfig(config, waitIsComplete(stage.condition));\n if (!ready) {\n return {\n planId: parameters.plan.id,\n status: \"waiting\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: stage.condition.target,\n failure: null,\n };\n }\n continue;\n }\n if (completedIds.has(stage.id)) continue;\n\n const previousIndex = completed.findIndex((result) => result.id === stage.id);\n const previous = previousIndex === -1 ? undefined : completed[previousIndex];\n const partial =\n previous?.result.mode === \"sequential\" && previous.result.status === \"partial\"\n ? previous.result\n : undefined;\n const submittedBatch =\n previous?.result.mode === \"batch\" && previous.result.status === \"submitted\"\n ? previous.result\n : undefined;\n const confirmed = partial?.calls.filter((call) => call.status !== \"not-started\") ?? [];\n const remainingCalls = stage.calls.slice(confirmed.length);\n const execution = yield* Effect.result(\n submittedBatch !== undefined\n ? resumeCalls.effect(config, {\n batch: submittedBatch,\n confirmation: stage.confirmation ?? config.writes.confirmation,\n ...(parameters.walletClient === undefined\n ? {}\n : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n })\n : partial === undefined\n ? sendCalls.effect(config, stageParameters(stage, parameters))\n : executeSequential(\n config,\n { ...stageParameters(stage, parameters), calls: remainingCalls, mode: \"sequential\" },\n confirmed.length,\n ).pipe(\n Effect.map((resumed) => ({\n mode: \"sequential\" as const,\n atomic: false as const,\n status: resumed.status,\n calls: [...confirmed, ...resumed.calls] as ReadonlyArray<CallExecutionResult>,\n failure: resumed.failure,\n })),\n ),\n );\n if (Result.isFailure(execution)) {\n if (completed.length === 0) return yield* execution.failure;\n return {\n planId: parameters.plan.id,\n status: \"partial\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: null,\n failure: execution.failure,\n };\n }\n const result = execution.success;\n const stageResult = { id: stage.id, result } satisfies WriteStageResult;\n if (previousIndex === -1) completed.push(stageResult);\n else completed[previousIndex] = stageResult;\n if (result.mode === \"sequential\" && result.status === \"partial\") {\n return {\n planId: parameters.plan.id,\n status: \"partial\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: null,\n failure: result.failure,\n };\n }\n if (result.mode === \"batch\" && result.status === \"submitted\") {\n return {\n planId: parameters.plan.id,\n status: \"submitted\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: null,\n failure: null,\n };\n }\n }\n\n return {\n planId: parameters.plan.id,\n status: \"completed\",\n completedStages: completed,\n currentStage: null,\n nextActionAt: null,\n failure: null,\n };\n});\n\nexport const executeWritePlan = defineAction<\n ExecuteWritePlanParameters,\n WritePlanProgress,\n WriteError\n>(executeWritePlanEffect);\n"],"mappings":";;;;;;;;;;;AAqBA,MAAM,iBAAiB,OAAO,GAAG,gBAAgB,CAAC,CAAC,WAAW,WAA+B;CAC3F,MAAM,EAAE,WAAW,OAAO;CAC1B,MAAM,QAAQ,OAAO,OAAO,WAAW;EACrC,WAAW,OAAO,SAAS,EAAE,UAAU,SAAS,CAAC;EACjD,QAAQ,UAAU,uBAAuB,OAAO,UAAU;CAC5D,CAAC;CACD,OAAO,UAAU,SAAS,UACtB,MAAM,WAAW,QAAQ,MAAM,UAAU,UAAU,SACnD,MAAM,aAAa,UAAU;AACnC,CAAC;AAED,MAAM,gBAAgB,eAAuE;CAC3F,IAAI,WAAW,KAAK,OAAO,WAAW,GACpC,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;CAGH,IAAI,IADY,IAAI,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,EAAE,CAC5D,CAAC,CAAC,SAAS,WAAW,KAAK,OAAO,QACtC,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;CAEH,IAAI,WAAW,WAAW,UAAa,WAAW,OAAO,WAAW,WAAW,KAAK,IAClF,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;CAEH,MAAM,eAAe,WAAW,KAAK,OAClC,QAAQ,UAAU,MAAM,SAAS,OAAO,CAAC,CACzC,KAAK,UAAU,MAAM,EAAE;CAC1B,KAAK,MAAM,CAAC,OAAO,eAAe,WAAW,QAAQ,mBAAmB,CAAC,EAAC,CAAE,QAAQ,GAClF,IAAI,aAAa,WAAW,UAAU,IACpC,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;AAIP;AAEA,MAAM,mBACJ,OACA,gBACI;CACJ,OAAO,MAAM;CACb,MAAM,MAAM,QAAQ;CACpB,WAAW,MAAM,aAAa;CAC9B,GAAI,MAAM,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,MAAM,aAAa;CAC/E,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;CACzF,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;AAC5E;AAEA,MAAM,yBAAyB,OAAO,GAAG,2BAA2B,CAAC,CAAC,WACpE,QACA,YACiD;CACjD,MAAM,UAAU,aAAa,UAAU;CACvC,IAAI,YAAY,QAAW,OAAO,OAAO;CACzC,OAAO,OAAO,oBAAoB;EAChC,eAAe,OAAO;EACtB,uBAAuB;EACvB,yBAAyB,WAAW,KAAK,OAAO;EAChD,qBAAqB,WAAW,WAAW;CAC7C,CAAC;CAED,MAAM,YAAY,CAAC,GAAI,WAAW,QAAQ,mBAAmB,CAAC,CAAE;CAChE,MAAM,eAAe,IAAI,IACvB,UACG,QACE,WACE,MAAM,OAAO,SAAS,gBAAgB,MAAM,OAAO,WAAW,eAC9D,MAAM,OAAO,SAAS,WAAW,MAAM,OAAO,WAAW,YAC9D,CAAC,CACA,KAAK,UAAU,MAAM,EAAE,CAC5B;CAEA,KAAK,MAAM,SAAS,WAAW,KAAK,QAAQ;EAC1C,IAAI,MAAM,SAAS,QAAQ;GAEzB,IAAI,EAAC,OADgB,cAAc,QAAQ,eAAe,MAAM,SAAS,CAAC,IAExE,OAAO;IACL,QAAQ,WAAW,KAAK;IACxB,QAAQ;IACR,iBAAiB;IACjB,cAAc,MAAM;IACpB,cAAc,MAAM,UAAU;IAC9B,SAAS;GACX;GAEF;EACF;EACA,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG;EAEhC,MAAM,gBAAgB,UAAU,WAAW,WAAW,OAAO,OAAO,MAAM,EAAE;EAC5E,MAAM,WAAW,kBAAkB,KAAK,SAAY,UAAU;EAC9D,MAAM,UACJ,UAAU,OAAO,SAAS,gBAAgB,SAAS,OAAO,WAAW,YACjE,SAAS,SACT;EACN,MAAM,iBACJ,UAAU,OAAO,SAAS,WAAW,SAAS,OAAO,WAAW,cAC5D,SAAS,SACT;EACN,MAAM,YAAY,SAAS,MAAM,QAAQ,SAAS,KAAK,WAAW,aAAa,KAAK,CAAC;EACrF,MAAM,iBAAiB,MAAM,MAAM,MAAM,UAAU,MAAM;EACzD,MAAM,YAAY,OAAO,OAAO,OAC9B,mBAAmB,SACf,YAAY,OAAO,QAAQ;GACzB,OAAO;GACP,cAAc,MAAM,gBAAgB,OAAO,OAAO;GAClD,GAAI,WAAW,iBAAiB,SAC5B,CAAC,IACD,EAAE,cAAc,WAAW,aAAa;GAC5C,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;EAC5E,CAAC,IACD,YAAY,SACV,UAAU,OAAO,QAAQ,gBAAgB,OAAO,UAAU,CAAC,IAC3D,kBACE,QACA;GAAE,GAAG,gBAAgB,OAAO,UAAU;GAAG,OAAO;GAAgB,MAAM;EAAa,GACnF,UAAU,MACZ,CAAC,CAAC,KACA,OAAO,KAAK,aAAa;GACvB,MAAM;GACN,QAAQ;GACR,QAAQ,QAAQ;GAChB,OAAO,CAAC,GAAG,WAAW,GAAG,QAAQ,KAAK;GACtC,SAAS,QAAQ;EACnB,EAAE,CACJ,CACR;EACA,IAAI,OAAO,UAAU,SAAS,GAAG;GAC/B,IAAI,UAAU,WAAW,GAAG,OAAO,OAAO,UAAU;GACpD,OAAO;IACL,QAAQ,WAAW,KAAK;IACxB,QAAQ;IACR,iBAAiB;IACjB,cAAc,MAAM;IACpB,cAAc;IACd,SAAS,UAAU;GACrB;EACF;EACA,MAAM,SAAS,UAAU;EACzB,MAAM,cAAc;GAAE,IAAI,MAAM;GAAI;EAAO;EAC3C,IAAI,kBAAkB,IAAI,UAAU,KAAK,WAAW;OAC/C,UAAU,iBAAiB;EAChC,IAAI,OAAO,SAAS,gBAAgB,OAAO,WAAW,WACpD,OAAO;GACL,QAAQ,WAAW,KAAK;GACxB,QAAQ;GACR,iBAAiB;GACjB,cAAc,MAAM;GACpB,cAAc;GACd,SAAS,OAAO;EAClB;EAEF,IAAI,OAAO,SAAS,WAAW,OAAO,WAAW,aAC/C,OAAO;GACL,QAAQ,WAAW,KAAK;GACxB,QAAQ;GACR,iBAAiB;GACjB,cAAc,MAAM;GACpB,cAAc;GACd,SAAS;EACX;CAEJ;CAEA,OAAO;EACL,QAAQ,WAAW,KAAK;EACxB,QAAQ;EACR,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,SAAS;CACX;AACF,CAAC;AAED,MAAa,mBAAmB,aAI9B,sBAAsB"}
1
+ {"version":3,"file":"execute-write-plan.js","names":[],"sources":["../../../src/actions/batch/execute-write-plan.ts"],"sourcesContent":["import { Effect, Result } from \"effect\";\n\nimport { defineAction } from \"../../action/action.js\";\nimport type { EnsforgeConfig } from \"../../config/config.js\";\nimport { WritePlanError } from \"../../errors/write-plan-error.js\";\nimport { provideConfig } from \"../../internal/config/context.js\";\nimport { viemErrorToEffectError } from \"../../internal/errors/viem-error.js\";\nimport { PublicClientService } from \"../../internal/services/public-client.js\";\nimport { executeSequential } from \"../../internal/write/execute-sequential.js\";\nimport { resumeSequentialConfirmations } from \"../../internal/write/resume-sequential.js\";\nimport type {\n CallExecutionResult,\n ExecuteWritePlanParameters,\n WriteError,\n WritePlanProgress,\n WriteStage,\n WriteStageResult,\n WriteWaitCondition,\n} from \"../../write/types.js\";\nimport { resumeCalls } from \"./resume-calls.js\";\nimport { sendCalls } from \"./send-calls.js\";\n\nconst waitIsComplete = Effect.fn(\"waitIsComplete\")(function* (condition: WriteWaitCondition) {\n const { client } = yield* PublicClientService;\n const block = yield* Effect.tryPromise({\n try: () => client.getBlock({ blockTag: \"latest\" }),\n catch: (cause) => viemErrorToEffectError(cause, \"getBlock\"),\n });\n return condition.type === \"block\"\n ? block.number !== null && block.number >= condition.target\n : block.timestamp >= condition.target;\n});\n\nconst validatePlan = (parameters: ExecuteWritePlanParameters): WritePlanError | undefined => {\n if (parameters.plan.stages.length === 0) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"A write plan must contain at least one stage\",\n cause: parameters.plan,\n });\n }\n const ids = new Set(parameters.plan.stages.map((stage) => stage.id));\n if (ids.size !== parameters.plan.stages.length) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Write plan stage identifiers must be unique\",\n cause: parameters.plan,\n });\n }\n if (parameters.resume !== undefined && parameters.resume.planId !== parameters.plan.id) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Write progress belongs to a different plan\",\n cause: parameters.resume,\n });\n }\n const callStageIds = parameters.plan.stages\n .filter((stage) => stage.type === \"calls\")\n .map((stage) => stage.id);\n for (const [index, completed] of (parameters.resume?.completedStages ?? []).entries()) {\n if (callStageIds[index] !== completed.id) {\n return new WritePlanError({\n code: \"INVALID_CALL_PLAN\",\n message: \"Write progress is not a valid prefix of the supplied plan\",\n cause: parameters.resume,\n });\n }\n }\n return undefined;\n};\n\nconst stageParameters = (\n stage: Extract<WriteStage, { readonly type: \"calls\" }>,\n parameters: ExecuteWritePlanParameters,\n) => ({\n calls: stage.calls,\n mode: stage.mode ?? \"auto\",\n atomicity: stage.atomicity ?? \"preferred\",\n ...(stage.confirmation === undefined ? {} : { confirmation: stage.confirmation }),\n ...(parameters.walletClient === undefined ? {} : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n});\n\nconst executeWritePlanEffect = Effect.fn(\"ensforge.executeWritePlan\")(function* (\n config: EnsforgeConfig,\n parameters: ExecuteWritePlanParameters,\n): Effect.fn.Return<WritePlanProgress, WriteError> {\n const invalid = validatePlan(parameters);\n if (invalid !== undefined) return yield* invalid;\n yield* Effect.annotateCurrentSpan({\n \"ens.network\": config.network,\n \"ens.write.operation\": \"execute-plan\",\n \"ens.write.stage_count\": parameters.plan.stages.length,\n \"ens.write.resumed\": parameters.resume !== undefined,\n });\n\n const completed = [...(parameters.resume?.completedStages ?? [])];\n const completedIds = new Set(\n completed\n .filter(\n (stage) =>\n (stage.result.mode !== \"sequential\" || stage.result.status !== \"partial\") &&\n (stage.result.mode !== \"batch\" || stage.result.status !== \"submitted\"),\n )\n .map((stage) => stage.id),\n );\n\n for (const stage of parameters.plan.stages) {\n if (stage.type === \"wait\") {\n const ready = yield* provideConfig(config, waitIsComplete(stage.condition));\n if (!ready) {\n return {\n planId: parameters.plan.id,\n status: \"waiting\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: stage.condition.target,\n failure: null,\n };\n }\n continue;\n }\n if (completedIds.has(stage.id)) continue;\n\n const previousIndex = completed.findIndex((result) => result.id === stage.id);\n const previous = previousIndex === -1 ? undefined : completed[previousIndex];\n const partial =\n previous?.result.mode === \"sequential\" && previous.result.status === \"partial\"\n ? previous.result\n : undefined;\n const submittedBatch =\n previous?.result.mode === \"batch\" && previous.result.status === \"submitted\"\n ? previous.result\n : undefined;\n const resumedPartial =\n partial === undefined\n ? undefined\n : yield* resumeSequentialConfirmations(\n config,\n partial,\n stage.confirmation ?? config.writes.confirmation,\n );\n if (resumedPartial?.failure !== null && resumedPartial?.failure !== undefined) {\n const resumedStage = { id: stage.id, result: resumedPartial } satisfies WriteStageResult;\n if (previousIndex === -1) completed.push(resumedStage);\n else completed[previousIndex] = resumedStage;\n return {\n planId: parameters.plan.id,\n status: \"partial\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: null,\n failure: resumedPartial.failure,\n };\n }\n const confirmed = resumedPartial?.calls.filter((call) => call.status === \"confirmed\") ?? [];\n const remainingCalls = stage.calls.slice(confirmed.length);\n const execution = yield* Effect.result(\n submittedBatch !== undefined\n ? resumeCalls.effect(config, {\n batch: submittedBatch,\n confirmation: stage.confirmation ?? config.writes.confirmation,\n ...(parameters.walletClient === undefined\n ? {}\n : { walletClient: parameters.walletClient }),\n ...(parameters.account === undefined ? {} : { account: parameters.account }),\n })\n : resumedPartial === undefined\n ? sendCalls.effect(config, stageParameters(stage, parameters))\n : executeSequential(\n config,\n { ...stageParameters(stage, parameters), calls: remainingCalls, mode: \"sequential\" },\n confirmed.length,\n ).pipe(\n Effect.map((resumed) => ({\n mode: \"sequential\" as const,\n atomic: false as const,\n status: resumed.status,\n calls: [...confirmed, ...resumed.calls] as ReadonlyArray<CallExecutionResult>,\n failure: resumed.failure,\n })),\n ),\n );\n if (Result.isFailure(execution)) {\n if (completed.length === 0) return yield* execution.failure;\n return {\n planId: parameters.plan.id,\n status: \"partial\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: null,\n failure: execution.failure,\n };\n }\n const result = execution.success;\n const stageResult = { id: stage.id, result } satisfies WriteStageResult;\n if (previousIndex === -1) completed.push(stageResult);\n else completed[previousIndex] = stageResult;\n if (result.mode === \"sequential\" && result.status === \"partial\") {\n return {\n planId: parameters.plan.id,\n status: \"partial\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: null,\n failure: result.failure,\n };\n }\n if (result.mode === \"batch\" && result.status === \"submitted\") {\n return {\n planId: parameters.plan.id,\n status: \"submitted\",\n completedStages: completed,\n currentStage: stage.id,\n nextActionAt: null,\n failure: null,\n };\n }\n }\n\n return {\n planId: parameters.plan.id,\n status: \"completed\",\n completedStages: completed,\n currentStage: null,\n nextActionAt: null,\n failure: null,\n };\n});\n\nexport const executeWritePlan = defineAction<\n ExecuteWritePlanParameters,\n WritePlanProgress,\n WriteError\n>(executeWritePlanEffect);\n"],"mappings":";;;;;;;;;;;;AAsBA,MAAM,iBAAiB,OAAO,GAAG,gBAAgB,CAAC,CAAC,WAAW,WAA+B;CAC3F,MAAM,EAAE,WAAW,OAAO;CAC1B,MAAM,QAAQ,OAAO,OAAO,WAAW;EACrC,WAAW,OAAO,SAAS,EAAE,UAAU,SAAS,CAAC;EACjD,QAAQ,UAAU,uBAAuB,OAAO,UAAU;CAC5D,CAAC;CACD,OAAO,UAAU,SAAS,UACtB,MAAM,WAAW,QAAQ,MAAM,UAAU,UAAU,SACnD,MAAM,aAAa,UAAU;AACnC,CAAC;AAED,MAAM,gBAAgB,eAAuE;CAC3F,IAAI,WAAW,KAAK,OAAO,WAAW,GACpC,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;CAGH,IAAI,IADY,IAAI,WAAW,KAAK,OAAO,KAAK,UAAU,MAAM,EAAE,CAC5D,CAAC,CAAC,SAAS,WAAW,KAAK,OAAO,QACtC,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;CAEH,IAAI,WAAW,WAAW,UAAa,WAAW,OAAO,WAAW,WAAW,KAAK,IAClF,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;CAEH,MAAM,eAAe,WAAW,KAAK,OAClC,QAAQ,UAAU,MAAM,SAAS,OAAO,CAAC,CACzC,KAAK,UAAU,MAAM,EAAE;CAC1B,KAAK,MAAM,CAAC,OAAO,eAAe,WAAW,QAAQ,mBAAmB,CAAC,EAAC,CAAE,QAAQ,GAClF,IAAI,aAAa,WAAW,UAAU,IACpC,OAAO,IAAI,eAAe;EACxB,MAAM;EACN,SAAS;EACT,OAAO,WAAW;CACpB,CAAC;AAIP;AAEA,MAAM,mBACJ,OACA,gBACI;CACJ,OAAO,MAAM;CACb,MAAM,MAAM,QAAQ;CACpB,WAAW,MAAM,aAAa;CAC9B,GAAI,MAAM,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,MAAM,aAAa;CAC/E,GAAI,WAAW,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,WAAW,aAAa;CACzF,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;AAC5E;AAEA,MAAM,yBAAyB,OAAO,GAAG,2BAA2B,CAAC,CAAC,WACpE,QACA,YACiD;CACjD,MAAM,UAAU,aAAa,UAAU;CACvC,IAAI,YAAY,QAAW,OAAO,OAAO;CACzC,OAAO,OAAO,oBAAoB;EAChC,eAAe,OAAO;EACtB,uBAAuB;EACvB,yBAAyB,WAAW,KAAK,OAAO;EAChD,qBAAqB,WAAW,WAAW;CAC7C,CAAC;CAED,MAAM,YAAY,CAAC,GAAI,WAAW,QAAQ,mBAAmB,CAAC,CAAE;CAChE,MAAM,eAAe,IAAI,IACvB,UACG,QACE,WACE,MAAM,OAAO,SAAS,gBAAgB,MAAM,OAAO,WAAW,eAC9D,MAAM,OAAO,SAAS,WAAW,MAAM,OAAO,WAAW,YAC9D,CAAC,CACA,KAAK,UAAU,MAAM,EAAE,CAC5B;CAEA,KAAK,MAAM,SAAS,WAAW,KAAK,QAAQ;EAC1C,IAAI,MAAM,SAAS,QAAQ;GAEzB,IAAI,EAAC,OADgB,cAAc,QAAQ,eAAe,MAAM,SAAS,CAAC,IAExE,OAAO;IACL,QAAQ,WAAW,KAAK;IACxB,QAAQ;IACR,iBAAiB;IACjB,cAAc,MAAM;IACpB,cAAc,MAAM,UAAU;IAC9B,SAAS;GACX;GAEF;EACF;EACA,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG;EAEhC,MAAM,gBAAgB,UAAU,WAAW,WAAW,OAAO,OAAO,MAAM,EAAE;EAC5E,MAAM,WAAW,kBAAkB,KAAK,SAAY,UAAU;EAC9D,MAAM,UACJ,UAAU,OAAO,SAAS,gBAAgB,SAAS,OAAO,WAAW,YACjE,SAAS,SACT;EACN,MAAM,iBACJ,UAAU,OAAO,SAAS,WAAW,SAAS,OAAO,WAAW,cAC5D,SAAS,SACT;EACN,MAAM,iBACJ,YAAY,SACR,SACA,OAAO,8BACL,QACA,SACA,MAAM,gBAAgB,OAAO,OAAO,YACtC;EACN,IAAI,gBAAgB,YAAY,QAAQ,gBAAgB,YAAY,QAAW;GAC7E,MAAM,eAAe;IAAE,IAAI,MAAM;IAAI,QAAQ;GAAe;GAC5D,IAAI,kBAAkB,IAAI,UAAU,KAAK,YAAY;QAChD,UAAU,iBAAiB;GAChC,OAAO;IACL,QAAQ,WAAW,KAAK;IACxB,QAAQ;IACR,iBAAiB;IACjB,cAAc,MAAM;IACpB,cAAc;IACd,SAAS,eAAe;GAC1B;EACF;EACA,MAAM,YAAY,gBAAgB,MAAM,QAAQ,SAAS,KAAK,WAAW,WAAW,KAAK,CAAC;EAC1F,MAAM,iBAAiB,MAAM,MAAM,MAAM,UAAU,MAAM;EACzD,MAAM,YAAY,OAAO,OAAO,OAC9B,mBAAmB,SACf,YAAY,OAAO,QAAQ;GACzB,OAAO;GACP,cAAc,MAAM,gBAAgB,OAAO,OAAO;GAClD,GAAI,WAAW,iBAAiB,SAC5B,CAAC,IACD,EAAE,cAAc,WAAW,aAAa;GAC5C,GAAI,WAAW,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,WAAW,QAAQ;EAC5E,CAAC,IACD,mBAAmB,SACjB,UAAU,OAAO,QAAQ,gBAAgB,OAAO,UAAU,CAAC,IAC3D,kBACE,QACA;GAAE,GAAG,gBAAgB,OAAO,UAAU;GAAG,OAAO;GAAgB,MAAM;EAAa,GACnF,UAAU,MACZ,CAAC,CAAC,KACA,OAAO,KAAK,aAAa;GACvB,MAAM;GACN,QAAQ;GACR,QAAQ,QAAQ;GAChB,OAAO,CAAC,GAAG,WAAW,GAAG,QAAQ,KAAK;GACtC,SAAS,QAAQ;EACnB,EAAE,CACJ,CACR;EACA,IAAI,OAAO,UAAU,SAAS,GAAG;GAC/B,IAAI,UAAU,WAAW,GAAG,OAAO,OAAO,UAAU;GACpD,OAAO;IACL,QAAQ,WAAW,KAAK;IACxB,QAAQ;IACR,iBAAiB;IACjB,cAAc,MAAM;IACpB,cAAc;IACd,SAAS,UAAU;GACrB;EACF;EACA,MAAM,SAAS,UAAU;EACzB,MAAM,cAAc;GAAE,IAAI,MAAM;GAAI;EAAO;EAC3C,IAAI,kBAAkB,IAAI,UAAU,KAAK,WAAW;OAC/C,UAAU,iBAAiB;EAChC,IAAI,OAAO,SAAS,gBAAgB,OAAO,WAAW,WACpD,OAAO;GACL,QAAQ,WAAW,KAAK;GACxB,QAAQ;GACR,iBAAiB;GACjB,cAAc,MAAM;GACpB,cAAc;GACd,SAAS,OAAO;EAClB;EAEF,IAAI,OAAO,SAAS,WAAW,OAAO,WAAW,aAC/C,OAAO;GACL,QAAQ,WAAW,KAAK;GACxB,QAAQ;GACR,iBAAiB;GACjB,cAAc,MAAM;GACpB,cAAc;GACd,SAAS;EACX;CAEJ;CAEA,OAAO;EACL,QAAQ,WAAW,KAAK;EACxB,QAAQ;EACR,iBAAiB;EACjB,cAAc;EACd,cAAc;EACd,SAAS;CACX;AACF,CAAC;AAED,MAAa,mBAAmB,aAI9B,sBAAsB"}
@@ -4,7 +4,7 @@ import { WalletError } from "../../errors/wallet-error.js";
4
4
  import { GetWalletCapabilitiesParameters, WalletCapabilitiesResult } from "../../write/types.js";
5
5
  import "../../index.js";
6
6
  //#region src/actions/batch/get-wallet-capabilities.d.ts
7
- declare const getWalletCapabilities: EnsAction<GetWalletCapabilitiesParameters, WalletCapabilitiesResult, WalletError | ConfigError>;
7
+ declare const getWalletCapabilities: EnsAction<GetWalletCapabilitiesParameters, WalletCapabilitiesResult, ConfigError | WalletError>;
8
8
  //#endregion
9
9
  export { getWalletCapabilities };
10
10
  //# sourceMappingURL=get-wallet-capabilities.d.ts.map
@@ -33,7 +33,7 @@ declare const getNameCapabilities: EnsReadAction<GetNameCapabilitiesParameters,
33
33
  readonly inherited: boolean;
34
34
  readonly extended: boolean;
35
35
  readonly permissioned: boolean;
36
- readonly authorization: "none" | "role" | "unknown" | "owner-delegate";
36
+ readonly authorization: "none" | "unknown" | "role" | "owner-delegate";
37
37
  readonly profiles: {
38
38
  readonly address: boolean;
39
39
  readonly text: boolean;
@@ -13,7 +13,7 @@ declare const getOperatorApproval: EnsReadAction<GetOperatorApprovalParameters,
13
13
  readonly owner: `0x${string}`;
14
14
  readonly operator: `0x${string}`;
15
15
  readonly targets: readonly {
16
- readonly kind: "registry" | "resolver" | "registrar" | "wrapper";
16
+ readonly kind: "resolver" | "registrar" | "registry" | "wrapper";
17
17
  readonly address: `0x${string}`;
18
18
  readonly supported: boolean;
19
19
  readonly approved: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/actions/capabilities/get-record-permissions/index.ts"],"mappings":";;;;;;;KA+BY,iCAAiC;WAClC,SAAS;WACT,SAAS,cAAc;;cAqMrB,sBAIgB,cAJI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/actions/capabilities/get-record-permissions/index.ts"],"mappings":";;;;;;;KAkCY,iCAAiC;WAClC,SAAS;WACT,SAAS,cAAc;;cAoNrB,sBAIgB,cAJI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAA"}
@@ -8,7 +8,7 @@ import { getManager } from "../../name/get-manager/index.js";
8
8
  import { getResolverCapabilities } from "../get-resolver-capabilities/index.js";
9
9
  import { Effect } from "effect";
10
10
  import { publicResolverV1IsApprovedForAbi, publicResolverV1IsApprovedForAllAbi } from "@ensforge/contracts/v1";
11
- import { permissionedResolverV2InterfaceHasRolesAbi } from "@ensforge/contracts/v2";
11
+ import { permissionedResolverV2InterfaceHasRolesAbi, publicResolverV2CanModifyNameAbi } from "@ensforge/contracts/v2";
12
12
 
13
13
  //#region src/actions/capabilities/get-record-permissions/index.ts
14
14
  const profileSupported = (profiles, record) => {
@@ -70,6 +70,18 @@ const getRecordPermissionsEffect = Effect.fn("ensforge.getRecordPermissions")(fu
70
70
  parameters.account
71
71
  ]
72
72
  }).pipe(Effect.catchTag("ContractError", () => Effect.succeed(false)))], { concurrency: "unbounded" });
73
+ const profile = config.deployments;
74
+ if (profile.protocol === "v2" && resolverAddress.toLowerCase() === profile.v2.contracts.publicResolver.toLowerCase()) {
75
+ const canModify = yield* ethereum.readContract({
76
+ address: resolverAddress,
77
+ abi: publicResolverV2CanModifyNameAbi,
78
+ functionName: "canModifyName",
79
+ args: [namehash(name), parameters.account]
80
+ });
81
+ ownerAuthorized &&= canModify;
82
+ operatorAuthorized &&= canModify;
83
+ delegateAuthorized &&= canModify;
84
+ }
73
85
  }
74
86
  const records = yield* Effect.forEach(parameters.records, Effect.fn("ensforge.getRecordPermissions.record")(function* (record) {
75
87
  const supported = record.type === "alias" ? resolver.permissioned : profileSupported(resolver.profiles, record);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/actions/capabilities/get-record-permissions/index.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport {\n publicResolverV1IsApprovedForAbi,\n publicResolverV1IsApprovedForAllAbi,\n} from \"@ensforge/contracts/v1\";\nimport { permissionedResolverV2InterfaceHasRolesAbi } from \"@ensforge/contracts/v2\";\n\nimport { defineReadAction } from \"../../../action/read-request.js\";\nimport type { EnsforgeConfig } from \"../../../config/config.js\";\nimport {\n resolverRecordPart,\n resolverRecordRole,\n resolverResource,\n} from \"../../../internal/capabilities/resolver-resource.js\";\nimport { EthereumClient } from \"../../../internal/client/ethereum-client.js\";\nimport { executeRead } from \"../../../internal/read/execute-read.js\";\nimport { namehash } from \"../../../names/hashes.js\";\nimport { normalizeName } from \"../../../names/normalize.js\";\nimport type { EthereumAddress } from \"../../../schemas/identity.js\";\nimport { getManager } from \"../../name/get-manager/index.js\";\nimport { getResolverCapabilities } from \"../get-resolver-capabilities/index.js\";\nimport type {\n CapabilityError,\n NameCapabilityParameters,\n RecordOperation,\n RecordPermission,\n RecordPermissionsResult,\n ResolverProfiles,\n} from \"../types.js\";\n\nexport type GetRecordPermissionsParameters = NameCapabilityParameters & {\n readonly account: EthereumAddress;\n readonly records: ReadonlyArray<RecordOperation>;\n};\n\nconst profileSupported = (profiles: ResolverProfiles, record: RecordOperation): boolean => {\n switch (record.type) {\n case \"address\":\n return profiles.address;\n case \"text\":\n return profiles.text;\n case \"contentHash\":\n return profiles.contentHash;\n case \"abi\":\n return profiles.abi;\n case \"pubkey\":\n return profiles.pubkey;\n case \"interface\":\n return profiles.interface;\n case \"name\":\n return profiles.name;\n case \"data\":\n return profiles.data;\n case \"dnsRecord\":\n return profiles.dnsRecord;\n case \"dnsZone\":\n return profiles.dnsZone;\n case \"alias\":\n return false;\n case \"clear\":\n return true;\n }\n};\n\nconst getRecordPermissionsEffect = Effect.fn(\"ensforge.getRecordPermissions\")(function* (\n config: EnsforgeConfig,\n parameters: GetRecordPermissionsParameters,\n) {\n const name = yield* normalizeName.effect(parameters.name);\n return yield* executeRead(\n config,\n parameters,\n Effect.gen(function* () {\n const resolver = yield* getResolverCapabilities.effect(config, parameters);\n if (resolver.address === null) {\n return {\n resolver: null,\n inherited: false,\n account: parameters.account,\n records: parameters.records.map((record): RecordPermission => ({\n record,\n supported: false,\n authorization: {\n status: \"unauthorized\",\n requirement: { kind: \"unsupported\" },\n },\n requiredRole: resolverRecordRole(record),\n resource: null,\n })),\n } satisfies RecordPermissionsResult;\n }\n\n const ethereum = yield* EthereumClient;\n const resolverAddress = resolver.address;\n const permissioned = resolver.authorization === \"role\";\n const manager =\n resolver.authorization === \"owner-delegate\"\n ? yield* getManager.effect(config, parameters)\n : null;\n let ownerAuthorized = false;\n let operatorAuthorized = false;\n let delegateAuthorized = false;\n if (resolver.authorization === \"owner-delegate\" && manager !== null) {\n ownerAuthorized = manager.toLowerCase() === parameters.account.toLowerCase();\n [operatorAuthorized, delegateAuthorized] = yield* Effect.all(\n [\n ethereum\n .readContract({\n address: resolverAddress,\n abi: publicResolverV1IsApprovedForAllAbi,\n functionName: \"isApprovedForAll\",\n args: [manager, parameters.account],\n })\n .pipe(Effect.catchTag(\"ContractError\", () => Effect.succeed(false))),\n ethereum\n .readContract({\n address: resolverAddress,\n abi: publicResolverV1IsApprovedForAbi,\n functionName: \"isApprovedFor\",\n args: [manager, namehash(name), parameters.account],\n })\n .pipe(Effect.catchTag(\"ContractError\", () => Effect.succeed(false))),\n ] as const,\n { concurrency: \"unbounded\" },\n );\n }\n\n const records = yield* Effect.forEach(\n parameters.records,\n Effect.fn(\"ensforge.getRecordPermissions.record\")(function* (record) {\n const supported =\n record.type === \"alias\"\n ? resolver.permissioned\n : profileSupported(resolver.profiles, record);\n const requiredRole = resolverRecordRole(record);\n if (!supported) {\n return {\n record,\n supported,\n authorization: {\n status: \"unauthorized\",\n requirement: { kind: \"unsupported\" },\n },\n requiredRole,\n resource: null,\n } as const satisfies RecordPermission;\n }\n if (resolver.authorization === \"unknown\") {\n return {\n record,\n supported,\n authorization: { status: \"unknown\", reason: \"CUSTOM_RESOLVER\" },\n requiredRole,\n resource: null,\n } as const satisfies RecordPermission;\n }\n if (!permissioned) {\n const source = ownerAuthorized\n ? \"owner\"\n : operatorAuthorized\n ? \"operator-approval\"\n : delegateAuthorized\n ? \"resolver-delegate\"\n : \"none\";\n return {\n record,\n supported,\n authorization:\n source === \"none\"\n ? {\n status: \"unauthorized\",\n requirement: { kind: \"resolver-delegate\" },\n }\n : { status: \"authorized\", source },\n requiredRole,\n resource: null,\n } as const satisfies RecordPermission;\n }\n\n const part = resolverRecordPart(record);\n const node = namehash(name);\n const exact = record.type === \"alias\" ? 0n : resolverResource(node, part);\n const resources =\n record.type === \"alias\"\n ? [0n]\n : BigInt(part) === 0n\n ? [exact]\n : [\n exact,\n resolverResource(namehash(\"\"), part),\n resolverResource(node, resolverRecordPart({ type: \"clear\" })),\n ];\n const checks = yield* Effect.all(\n resources.map((resource) =>\n ethereum.readContract({\n address: resolverAddress,\n abi: permissionedResolverV2InterfaceHasRolesAbi,\n functionName: \"hasRoles\",\n args: [resource, requiredRole, parameters.account],\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n const authorized = checks.some(Boolean);\n return {\n record,\n supported,\n authorization: authorized\n ? { status: \"authorized\", source: \"resolver-role\" }\n : {\n status: \"unauthorized\",\n requirement: { kind: \"resolver-role\", roles: requiredRole, resource: exact },\n },\n requiredRole,\n resource: exact,\n } as const satisfies RecordPermission;\n }),\n { concurrency: \"unbounded\" },\n );\n return {\n resolver: resolverAddress,\n inherited: resolver.inherited,\n account: parameters.account,\n records,\n } satisfies RecordPermissionsResult;\n }),\n );\n});\n\nexport const getRecordPermissions = defineReadAction<\n GetRecordPermissionsParameters,\n RecordPermissionsResult,\n CapabilityError\n>(getRecordPermissionsEffect);\n\nexport type {\n CapabilityError as GetRecordPermissionsError,\n RecordPermission,\n RecordPermissionsResult,\n} from \"../types.js\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/actions/capabilities/get-record-permissions/index.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport {\n publicResolverV1IsApprovedForAbi,\n publicResolverV1IsApprovedForAllAbi,\n} from \"@ensforge/contracts/v1\";\nimport {\n permissionedResolverV2InterfaceHasRolesAbi,\n publicResolverV2CanModifyNameAbi,\n} from \"@ensforge/contracts/v2\";\n\nimport { defineReadAction } from \"../../../action/read-request.js\";\nimport type { EnsforgeConfig } from \"../../../config/config.js\";\nimport {\n resolverRecordPart,\n resolverRecordRole,\n resolverResource,\n} from \"../../../internal/capabilities/resolver-resource.js\";\nimport { EthereumClient } from \"../../../internal/client/ethereum-client.js\";\nimport { executeRead } from \"../../../internal/read/execute-read.js\";\nimport { namehash } from \"../../../names/hashes.js\";\nimport { normalizeName } from \"../../../names/normalize.js\";\nimport type { EthereumAddress } from \"../../../schemas/identity.js\";\nimport { getManager } from \"../../name/get-manager/index.js\";\nimport { getResolverCapabilities } from \"../get-resolver-capabilities/index.js\";\nimport type {\n CapabilityError,\n NameCapabilityParameters,\n RecordOperation,\n RecordPermission,\n RecordPermissionsResult,\n ResolverProfiles,\n} from \"../types.js\";\n\nexport type GetRecordPermissionsParameters = NameCapabilityParameters & {\n readonly account: EthereumAddress;\n readonly records: ReadonlyArray<RecordOperation>;\n};\n\nconst profileSupported = (profiles: ResolverProfiles, record: RecordOperation): boolean => {\n switch (record.type) {\n case \"address\":\n return profiles.address;\n case \"text\":\n return profiles.text;\n case \"contentHash\":\n return profiles.contentHash;\n case \"abi\":\n return profiles.abi;\n case \"pubkey\":\n return profiles.pubkey;\n case \"interface\":\n return profiles.interface;\n case \"name\":\n return profiles.name;\n case \"data\":\n return profiles.data;\n case \"dnsRecord\":\n return profiles.dnsRecord;\n case \"dnsZone\":\n return profiles.dnsZone;\n case \"alias\":\n return false;\n case \"clear\":\n return true;\n }\n};\n\nconst getRecordPermissionsEffect = Effect.fn(\"ensforge.getRecordPermissions\")(function* (\n config: EnsforgeConfig,\n parameters: GetRecordPermissionsParameters,\n) {\n const name = yield* normalizeName.effect(parameters.name);\n return yield* executeRead(\n config,\n parameters,\n Effect.gen(function* () {\n const resolver = yield* getResolverCapabilities.effect(config, parameters);\n if (resolver.address === null) {\n return {\n resolver: null,\n inherited: false,\n account: parameters.account,\n records: parameters.records.map((record): RecordPermission => ({\n record,\n supported: false,\n authorization: {\n status: \"unauthorized\",\n requirement: { kind: \"unsupported\" },\n },\n requiredRole: resolverRecordRole(record),\n resource: null,\n })),\n } satisfies RecordPermissionsResult;\n }\n\n const ethereum = yield* EthereumClient;\n const resolverAddress = resolver.address;\n const permissioned = resolver.authorization === \"role\";\n const manager =\n resolver.authorization === \"owner-delegate\"\n ? yield* getManager.effect(config, parameters)\n : null;\n let ownerAuthorized = false;\n let operatorAuthorized = false;\n let delegateAuthorized = false;\n if (resolver.authorization === \"owner-delegate\" && manager !== null) {\n ownerAuthorized = manager.toLowerCase() === parameters.account.toLowerCase();\n [operatorAuthorized, delegateAuthorized] = yield* Effect.all(\n [\n ethereum\n .readContract({\n address: resolverAddress,\n abi: publicResolverV1IsApprovedForAllAbi,\n functionName: \"isApprovedForAll\",\n args: [manager, parameters.account],\n })\n .pipe(Effect.catchTag(\"ContractError\", () => Effect.succeed(false))),\n ethereum\n .readContract({\n address: resolverAddress,\n abi: publicResolverV1IsApprovedForAbi,\n functionName: \"isApprovedFor\",\n args: [manager, namehash(name), parameters.account],\n })\n .pipe(Effect.catchTag(\"ContractError\", () => Effect.succeed(false))),\n ] as const,\n { concurrency: \"unbounded\" },\n );\n const profile = config.deployments;\n if (\n profile.protocol === \"v2\" &&\n resolverAddress.toLowerCase() === profile.v2.contracts.publicResolver.toLowerCase()\n ) {\n const canModify = yield* ethereum.readContract({\n address: resolverAddress,\n abi: publicResolverV2CanModifyNameAbi,\n functionName: \"canModifyName\",\n args: [namehash(name), parameters.account],\n });\n ownerAuthorized &&= canModify;\n operatorAuthorized &&= canModify;\n delegateAuthorized &&= canModify;\n }\n }\n\n const records = yield* Effect.forEach(\n parameters.records,\n Effect.fn(\"ensforge.getRecordPermissions.record\")(function* (record) {\n const supported =\n record.type === \"alias\"\n ? resolver.permissioned\n : profileSupported(resolver.profiles, record);\n const requiredRole = resolverRecordRole(record);\n if (!supported) {\n return {\n record,\n supported,\n authorization: {\n status: \"unauthorized\",\n requirement: { kind: \"unsupported\" },\n },\n requiredRole,\n resource: null,\n } as const satisfies RecordPermission;\n }\n if (resolver.authorization === \"unknown\") {\n return {\n record,\n supported,\n authorization: { status: \"unknown\", reason: \"CUSTOM_RESOLVER\" },\n requiredRole,\n resource: null,\n } as const satisfies RecordPermission;\n }\n if (!permissioned) {\n const source = ownerAuthorized\n ? \"owner\"\n : operatorAuthorized\n ? \"operator-approval\"\n : delegateAuthorized\n ? \"resolver-delegate\"\n : \"none\";\n return {\n record,\n supported,\n authorization:\n source === \"none\"\n ? {\n status: \"unauthorized\",\n requirement: { kind: \"resolver-delegate\" },\n }\n : { status: \"authorized\", source },\n requiredRole,\n resource: null,\n } as const satisfies RecordPermission;\n }\n\n const part = resolverRecordPart(record);\n const node = namehash(name);\n const exact = record.type === \"alias\" ? 0n : resolverResource(node, part);\n const resources =\n record.type === \"alias\"\n ? [0n]\n : BigInt(part) === 0n\n ? [exact]\n : [\n exact,\n resolverResource(namehash(\"\"), part),\n resolverResource(node, resolverRecordPart({ type: \"clear\" })),\n ];\n const checks = yield* Effect.all(\n resources.map((resource) =>\n ethereum.readContract({\n address: resolverAddress,\n abi: permissionedResolverV2InterfaceHasRolesAbi,\n functionName: \"hasRoles\",\n args: [resource, requiredRole, parameters.account],\n }),\n ),\n { concurrency: \"unbounded\" },\n );\n const authorized = checks.some(Boolean);\n return {\n record,\n supported,\n authorization: authorized\n ? { status: \"authorized\", source: \"resolver-role\" }\n : {\n status: \"unauthorized\",\n requirement: { kind: \"resolver-role\", roles: requiredRole, resource: exact },\n },\n requiredRole,\n resource: exact,\n } as const satisfies RecordPermission;\n }),\n { concurrency: \"unbounded\" },\n );\n return {\n resolver: resolverAddress,\n inherited: resolver.inherited,\n account: parameters.account,\n records,\n } satisfies RecordPermissionsResult;\n }),\n );\n});\n\nexport const getRecordPermissions = defineReadAction<\n GetRecordPermissionsParameters,\n RecordPermissionsResult,\n CapabilityError\n>(getRecordPermissionsEffect);\n\nexport type {\n CapabilityError as GetRecordPermissionsError,\n RecordPermission,\n RecordPermissionsResult,\n} from \"../types.js\";\n"],"mappings":"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"}
@@ -60,7 +60,7 @@ declare const getRequiredAuthorization: EnsReadAction<GetRequiredAuthorizationPa
60
60
  } | {
61
61
  readonly available: true;
62
62
  readonly protocol: "v1" | "v2";
63
- readonly kind: "registry" | "resolver" | "registrar" | "name-wrapper" | "wrapper-registry";
63
+ readonly kind: "resolver" | "registrar" | "registry" | "name-wrapper" | "wrapper-registry";
64
64
  readonly address: `0x${string}`;
65
65
  readonly operation: {
66
66
  readonly type: "address";
@@ -10,7 +10,7 @@ declare const getResolverCapabilities: EnsReadAction<NameCapabilityParameters, {
10
10
  readonly inherited: boolean;
11
11
  readonly extended: boolean;
12
12
  readonly permissioned: boolean;
13
- readonly authorization: "none" | "role" | "unknown" | "owner-delegate";
13
+ readonly authorization: "none" | "unknown" | "role" | "owner-delegate";
14
14
  readonly profiles: {
15
15
  readonly address: boolean;
16
16
  readonly text: boolean;
@@ -14,7 +14,7 @@ declare const getWriteTarget: EnsReadAction<GetWriteTargetParameters, {
14
14
  } | {
15
15
  readonly available: true;
16
16
  readonly protocol: "v1" | "v2";
17
- readonly kind: "registry" | "resolver" | "registrar" | "name-wrapper" | "wrapper-registry";
17
+ readonly kind: "resolver" | "registrar" | "registry" | "name-wrapper" | "wrapper-registry";
18
18
  readonly address: `0x${string}`;
19
19
  readonly operation: {
20
20
  readonly type: "address";
@@ -1,5 +1,5 @@
1
- import { BlockParameters } from "../../../action/block.js";
2
1
  import { EnsReadAction } from "../../../action/read-request.js";
2
+ import { BlockParameters } from "../../../action/block.js";
3
3
  import { DnsClaimStatus, DnsReadError } from "../types.js";
4
4
  import "../../../index.js";
5
5
  //#region src/actions/dns/get-dns-claim-status/index.d.ts
@@ -1,5 +1,5 @@
1
- import { BlockParameters } from "../../../action/block.js";
2
1
  import { EnsReadAction } from "../../../action/read-request.js";
2
+ import { BlockParameters } from "../../../action/block.js";
3
3
  import { DnsImportPlan, DnsReadError } from "../types.js";
4
4
  import "../../../index.js";
5
5
  //#region src/actions/dns/get-dns-import-plan/index.d.ts
@@ -1,5 +1,5 @@
1
- import { BlockParameters } from "../../../action/block.js";
2
1
  import { EnsReadAction } from "../../../action/read-request.js";
2
+ import { BlockParameters } from "../../../action/block.js";
3
3
  import { DnsReadError, ZoneHashResult } from "../types.js";
4
4
  import "../../../index.js";
5
5
  //#region src/actions/dns/get-zone-hash/index.d.ts
@@ -1,5 +1,5 @@
1
- import { BlockParameters } from "../../../action/block.js";
2
1
  import { EnsReadAction } from "../../../action/read-request.js";
2
+ import { BlockParameters } from "../../../action/block.js";
3
3
  import { DnsReadError, DnsRecordsExistence } from "../types.js";
4
4
  import "../../../index.js";
5
5
  //#region src/actions/dns/has-dns-records/index.d.ts
@@ -1,9 +1,9 @@
1
1
  import { ConfirmationPolicy } from "../../config/write-options.js";
2
+ import { RpcError } from "../../errors/rpc-error.js";
2
3
  import { BlockParameters } from "../../action/block.js";
3
- import { CodecError } from "../../errors/codec-error.js";
4
4
  import { ContractError } from "../../errors/contract-error.js";
5
+ import { CodecError } from "../../errors/codec-error.js";
5
6
  import { NameError } from "../../errors/name-error.js";
6
- import { RpcError } from "../../errors/rpc-error.js";
7
7
  import { CallExecutionResult, WriteError, WriteMode, WritePlanProgress } from "../../write/types.js";
8
8
  import { EnsWriteIntent } from "../../action/write-intent.js";
9
9
  import { EthereumAddress } from "../../schemas/identity.js";
@@ -141,5 +141,5 @@ declare const DnsImportPlan: Schema.Union<readonly [Schema.Struct<{
141
141
  }>]>;
142
142
  type DnsImportPlan = typeof DnsImportPlan.Type;
143
143
  //#endregion
144
- export { ClaimDnsNameError, ClaimDnsNameIntent, ClaimDnsNameParameters, ClaimDnsNameResult, DnsClaimStatus, DnsImportPlan, DnsReadError, DnsRecordQuery, DnsRecordResult, DnsRecordsExistence, DnsRecordsResult, DnsResource, DnssecProof, DnssecProofChain, GetDnsRecordParameters, GetDnsRecordsParameters, ImportDnsNameError, ImportDnsNameParameters, ImportDnsNameResult, ZoneHashResult };
144
+ export { ClaimDnsNameError, ClaimDnsNameIntent, ClaimDnsNameParameters, ClaimDnsNameResult, DnsClaimStatus, DnsImportPlan, DnsReadError, DnsRecordQuery, DnsRecordResult, DnsRecordsExistence, DnsRecordsResult, DnsResource, DnsWriteWalletParameters, DnssecProof, DnssecProofChain, GetDnsRecordParameters, GetDnsRecordsParameters, ImportDnsNameError, ImportDnsNameParameters, ImportDnsNameResult, ZoneHashResult };
145
145
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/actions/dns/types.ts"],"mappings":";;;;;;;;;;;;;KAsBY,eAAe,aAAa,gBAAgB,YAAY;cAEvD,aAAW,OAAA;;;;KAIZ,qBAAqB,YAAY;cAEhC,kBAAgB,OAAA,OAAA,OAAA;;;;KAGjB,0BAA0B,iBAAiB;UAE7C;WACC,eAAe;WACf,UAAU,UAAU;WACpB,OAAO;WACP,eAAe;;UAGT;WACN;WACA,OAAO,cAAc;WACrB;WACA;;KAGC,qBAAqB;KACrB,oBAAoB;KACpB,qBAAqB,eAAe,oBAAoB;KAExD,0BAA0B,yBACpC;WACW,SAAS;;KAGV;WAEG;WACA,MAAM;WACN,OAAO;WACP,UAAU;WACV,OAAO;;WAGP;WACA,MAAM;WACN;WACA;WACA,OAAO;;KAGV,qBAAqB;cAEpB,aAAW,OAAA;KAQZ,qBAAqB,YAAY;KAEjC;WAA4B;WAA6B,UAAU;;KAEnE;WACD;WACA;WACA,UAAU;IACjB;cAES,iBAAe,OAAA;;;;;;;KAOhB,yBAAyB,gBAAgB;KAEzC;WACD;WACA,SAAS,cAAc;IAC9B;cAES,kBAAgB,OAAA;;;;;;;;;;;KAKjB,0BAA0B,iBAAiB;cAE1C,qBAAmB,OAAA;;;;;;KAMpB,6BAA6B,oBAAoB;cAEhD,gBAAc,OAAA;;;;;KAKf,wBAAwB,eAAe;cAEtC,gBAAc,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;KAmBf,wBAAwB,eAAe;cAEtC,eAAa,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;KAyBd,uBAAuB,cAAc"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/actions/dns/types.ts"],"mappings":";;;;;;;;;;;;;KAsBY,eAAe,aAAa,gBAAgB,YAAY;cAEvD,aAAW,OAAA;;;;KAIZ,qBAAqB,YAAY;cAEhC,kBAAgB,OAAA,OAAA,OAAA;;;;KAGjB,0BAA0B,iBAAiB;UAEtC;WACN,eAAe;WACf,UAAU,UAAU;WACpB,OAAO;WACP,eAAe;;UAGT;WACN;WACA,OAAO,cAAc;WACrB;WACA;;KAGC,qBAAqB;KACrB,oBAAoB;KACpB,qBAAqB,eAAe,oBAAoB;KAExD,0BAA0B,yBACpC;WACW,SAAS;;KAGV;WAEG;WACA,MAAM;WACN,OAAO;WACP,UAAU;WACV,OAAO;;WAGP;WACA,MAAM;WACN;WACA;WACA,OAAO;;KAGV,qBAAqB;cAEpB,aAAW,OAAA;KAQZ,qBAAqB,YAAY;KAEjC;WAA4B;WAA6B,UAAU;;KAEnE;WACD;WACA;WACA,UAAU;IACjB;cAES,iBAAe,OAAA;;;;;;;KAOhB,yBAAyB,gBAAgB;KAEzC;WACD;WACA,SAAS,cAAc;IAC9B;cAES,kBAAgB,OAAA;;;;;;;;;;;KAKjB,0BAA0B,iBAAiB;cAE1C,qBAAmB,OAAA;;;;;;KAMpB,6BAA6B,oBAAoB;cAEhD,gBAAc,OAAA;;;;;KAKf,wBAAwB,eAAe;cAEtC,gBAAc,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;KAmBf,wBAAwB,eAAe;cAEtC,eAAa,OAAA,gBAAA,OAAA;;;;;;;;;;;;;;;;;;;;;KAyBd,uBAAuB,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/actions/dns/types.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { Account, Address, WalletClient } from \"viem\";\n\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 { DnsEncodedName } from \"../../schemas/dns.js\";\nimport { Hex } from \"../../schemas/hex.js\";\nimport { EthereumAddress } from \"../../schemas/identity.js\";\nimport { NormalizedName } from \"../../schemas/name.js\";\nimport type {\n CallExecutionResult,\n ConfirmationPolicy,\n WriteError,\n WriteMode,\n WritePlanProgress,\n} from \"../../write/types.js\";\n\nexport type DnsReadError = CodecError | ContractError | NameError | RpcError;\n\nexport const DnssecProof = Schema.Struct({\n rrset: Hex,\n sig: Hex,\n});\nexport type DnssecProof = typeof DnssecProof.Type;\n\nexport const DnssecProofChain = Schema.Array(DnssecProof).pipe(\n Schema.check(Schema.isMinLength(1, { message: \"Expected at least one signed DNS RRSET\" })),\n);\nexport type DnssecProofChain = typeof DnssecProofChain.Type;\n\ninterface DnsWriteWalletParameters {\n readonly walletClient?: WalletClient;\n readonly account?: Account | Address;\n readonly mode?: WriteMode;\n readonly confirmation?: ConfirmationPolicy;\n}\n\nexport interface ClaimDnsNameParameters {\n readonly name: string;\n readonly proof: ReadonlyArray<DnssecProof>;\n readonly resolver?: string;\n readonly address?: string;\n}\n\nexport type ClaimDnsNameResult = CallExecutionResult;\nexport type ClaimDnsNameError = WriteError;\nexport type ClaimDnsNameIntent = EnsWriteIntent<ClaimDnsNameResult, ClaimDnsNameError>;\n\nexport type ImportDnsNameParameters = ClaimDnsNameParameters &\n DnsWriteWalletParameters & {\n readonly resume?: ImportDnsNameResult;\n };\n\nexport type ImportDnsNameResult =\n | {\n readonly status: \"completed\" | \"not-required\";\n readonly name: NormalizedName;\n readonly owner: EthereumAddress;\n readonly resolver: EthereumAddress | null;\n readonly write: WritePlanProgress | null;\n }\n | {\n readonly status: \"partial\";\n readonly name: NormalizedName;\n readonly owner: null;\n readonly resolver: null;\n readonly write: WritePlanProgress;\n };\n\nexport type ImportDnsNameError = WriteError;\n\nexport const DnsResource = Schema.Int.pipe(\n Schema.check(\n Schema.isBetween(\n { minimum: 0, maximum: 65_535 },\n { message: \"Expected a uint16 DNS resource\" },\n ),\n ),\n);\nexport type DnsResource = typeof DnsResource.Type;\n\nexport type DnsRecordQuery = { readonly recordName: string; readonly resource: DnsResource };\n\nexport type GetDnsRecordParameters = {\n readonly name: string;\n readonly recordName: string;\n readonly resource: DnsResource;\n} & BlockParameters;\n\nexport const DnsRecordResult = Schema.Struct({\n name: NormalizedName,\n recordName: NormalizedName,\n resource: DnsResource,\n resolver: Schema.NullOr(EthereumAddress),\n value: Schema.NullOr(Hex),\n});\nexport type DnsRecordResult = typeof DnsRecordResult.Type;\n\nexport type GetDnsRecordsParameters = {\n readonly name: string;\n readonly records: ReadonlyArray<DnsRecordQuery>;\n} & BlockParameters;\n\nexport const DnsRecordsResult = Schema.Struct({\n name: NormalizedName,\n resolver: Schema.NullOr(EthereumAddress),\n records: Schema.Array(DnsRecordResult),\n});\nexport type DnsRecordsResult = typeof DnsRecordsResult.Type;\n\nexport const DnsRecordsExistence = Schema.Struct({\n name: NormalizedName,\n recordName: NormalizedName,\n resolver: Schema.NullOr(EthereumAddress),\n exists: Schema.Boolean,\n});\nexport type DnsRecordsExistence = typeof DnsRecordsExistence.Type;\n\nexport const ZoneHashResult = Schema.Struct({\n name: NormalizedName,\n resolver: Schema.NullOr(EthereumAddress),\n value: Schema.NullOr(Hex),\n});\nexport type ZoneHashResult = typeof ZoneHashResult.Type;\n\nexport const DnsClaimStatus = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"unsupported\"),\n name: NormalizedName,\n reason: Schema.Literal(\"DNS_REGISTRAR_UNAVAILABLE\"),\n }),\n Schema.Struct({\n status: Schema.Literal(\"claimed\"),\n name: NormalizedName,\n owner: EthereumAddress,\n resolver: Schema.NullOr(EthereumAddress),\n previousInception: Schema.BigInt,\n }),\n Schema.Struct({\n status: Schema.Literal(\"proof-required\"),\n name: NormalizedName,\n previousInception: Schema.BigInt,\n }),\n]);\nexport type DnsClaimStatus = typeof DnsClaimStatus.Type;\n\nexport const DnsImportPlan = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"unsupported\"),\n name: NormalizedName,\n reason: Schema.Literal(\"DNS_REGISTRAR_UNAVAILABLE\"),\n }),\n Schema.Struct({\n status: Schema.Literal(\"already-claimed\"),\n name: NormalizedName,\n registrar: EthereumAddress,\n oracle: EthereumAddress,\n owner: EthereumAddress,\n resolver: Schema.NullOr(EthereumAddress),\n }),\n Schema.Struct({\n status: Schema.Literal(\"proof-required\"),\n name: NormalizedName,\n registrar: EthereumAddress,\n oracle: EthereumAddress,\n proofRequest: Schema.Struct({\n name: DnsEncodedName,\n previousInception: Schema.BigInt,\n }),\n }),\n]);\nexport type DnsImportPlan = typeof DnsImportPlan.Type;\n"],"mappings":";;;;;;;AAwBA,MAAa,cAAc,OAAO,OAAO;CACvC,OAAO;CACP,KAAK;AACP,CAAC;AAGD,MAAa,mBAAmB,OAAO,MAAM,WAAW,CAAC,CAAC,KACxD,OAAO,MAAM,OAAO,YAAY,GAAG,EAAE,SAAS,yCAAyC,CAAC,CAAC,CAC3F;AA4CA,MAAa,cAAc,OAAO,IAAI,KACpC,OAAO,MACL,OAAO,UACL;CAAE,SAAS;CAAG,SAAS;AAAO,GAC9B,EAAE,SAAS,iCAAiC,CAC9C,CACF,CACF;AAWA,MAAa,kBAAkB,OAAO,OAAO;CAC3C,MAAM;CACN,YAAY;CACZ,UAAU;CACV,UAAU,OAAO,OAAO,eAAe;CACvC,OAAO,OAAO,OAAO,GAAG;AAC1B,CAAC;AAQD,MAAa,mBAAmB,OAAO,OAAO;CAC5C,MAAM;CACN,UAAU,OAAO,OAAO,eAAe;CACvC,SAAS,OAAO,MAAM,eAAe;AACvC,CAAC;AAGD,MAAa,sBAAsB,OAAO,OAAO;CAC/C,MAAM;CACN,YAAY;CACZ,UAAU,OAAO,OAAO,eAAe;CACvC,QAAQ,OAAO;AACjB,CAAC;AAGD,MAAa,iBAAiB,OAAO,OAAO;CAC1C,MAAM;CACN,UAAU,OAAO,OAAO,eAAe;CACvC,OAAO,OAAO,OAAO,GAAG;AAC1B,CAAC;AAGD,MAAa,iBAAiB,OAAO,MAAM;CACzC,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,aAAa;EACpC,MAAM;EACN,QAAQ,OAAO,QAAQ,2BAA2B;CACpD,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,SAAS;EAChC,MAAM;EACN,OAAO;EACP,UAAU,OAAO,OAAO,eAAe;EACvC,mBAAmB,OAAO;CAC5B,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,gBAAgB;EACvC,MAAM;EACN,mBAAmB,OAAO;CAC5B,CAAC;AACH,CAAC;AAGD,MAAa,gBAAgB,OAAO,MAAM;CACxC,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,aAAa;EACpC,MAAM;EACN,QAAQ,OAAO,QAAQ,2BAA2B;CACpD,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,iBAAiB;EACxC,MAAM;EACN,WAAW;EACX,QAAQ;EACR,OAAO;EACP,UAAU,OAAO,OAAO,eAAe;CACzC,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,gBAAgB;EACvC,MAAM;EACN,WAAW;EACX,QAAQ;EACR,cAAc,OAAO,OAAO;GAC1B,MAAM;GACN,mBAAmB,OAAO;EAC5B,CAAC;CACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/actions/dns/types.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { Account, Address, WalletClient } from \"viem\";\n\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 { DnsEncodedName } from \"../../schemas/dns.js\";\nimport { Hex } from \"../../schemas/hex.js\";\nimport { EthereumAddress } from \"../../schemas/identity.js\";\nimport { NormalizedName } from \"../../schemas/name.js\";\nimport type {\n CallExecutionResult,\n ConfirmationPolicy,\n WriteError,\n WriteMode,\n WritePlanProgress,\n} from \"../../write/types.js\";\n\nexport type DnsReadError = CodecError | ContractError | NameError | RpcError;\n\nexport const DnssecProof = Schema.Struct({\n rrset: Hex,\n sig: Hex,\n});\nexport type DnssecProof = typeof DnssecProof.Type;\n\nexport const DnssecProofChain = Schema.Array(DnssecProof).pipe(\n Schema.check(Schema.isMinLength(1, { message: \"Expected at least one signed DNS RRSET\" })),\n);\nexport type DnssecProofChain = typeof DnssecProofChain.Type;\n\nexport interface DnsWriteWalletParameters {\n readonly walletClient?: WalletClient;\n readonly account?: Account | Address;\n readonly mode?: WriteMode;\n readonly confirmation?: ConfirmationPolicy;\n}\n\nexport interface ClaimDnsNameParameters {\n readonly name: string;\n readonly proof: ReadonlyArray<DnssecProof>;\n readonly resolver?: string;\n readonly address?: string;\n}\n\nexport type ClaimDnsNameResult = CallExecutionResult;\nexport type ClaimDnsNameError = WriteError;\nexport type ClaimDnsNameIntent = EnsWriteIntent<ClaimDnsNameResult, ClaimDnsNameError>;\n\nexport type ImportDnsNameParameters = ClaimDnsNameParameters &\n DnsWriteWalletParameters & {\n readonly resume?: ImportDnsNameResult;\n };\n\nexport type ImportDnsNameResult =\n | {\n readonly status: \"completed\" | \"not-required\";\n readonly name: NormalizedName;\n readonly owner: EthereumAddress;\n readonly resolver: EthereumAddress | null;\n readonly write: WritePlanProgress | null;\n }\n | {\n readonly status: \"partial\";\n readonly name: NormalizedName;\n readonly owner: null;\n readonly resolver: null;\n readonly write: WritePlanProgress;\n };\n\nexport type ImportDnsNameError = WriteError;\n\nexport const DnsResource = Schema.Int.pipe(\n Schema.check(\n Schema.isBetween(\n { minimum: 0, maximum: 65_535 },\n { message: \"Expected a uint16 DNS resource\" },\n ),\n ),\n);\nexport type DnsResource = typeof DnsResource.Type;\n\nexport type DnsRecordQuery = { readonly recordName: string; readonly resource: DnsResource };\n\nexport type GetDnsRecordParameters = {\n readonly name: string;\n readonly recordName: string;\n readonly resource: DnsResource;\n} & BlockParameters;\n\nexport const DnsRecordResult = Schema.Struct({\n name: NormalizedName,\n recordName: NormalizedName,\n resource: DnsResource,\n resolver: Schema.NullOr(EthereumAddress),\n value: Schema.NullOr(Hex),\n});\nexport type DnsRecordResult = typeof DnsRecordResult.Type;\n\nexport type GetDnsRecordsParameters = {\n readonly name: string;\n readonly records: ReadonlyArray<DnsRecordQuery>;\n} & BlockParameters;\n\nexport const DnsRecordsResult = Schema.Struct({\n name: NormalizedName,\n resolver: Schema.NullOr(EthereumAddress),\n records: Schema.Array(DnsRecordResult),\n});\nexport type DnsRecordsResult = typeof DnsRecordsResult.Type;\n\nexport const DnsRecordsExistence = Schema.Struct({\n name: NormalizedName,\n recordName: NormalizedName,\n resolver: Schema.NullOr(EthereumAddress),\n exists: Schema.Boolean,\n});\nexport type DnsRecordsExistence = typeof DnsRecordsExistence.Type;\n\nexport const ZoneHashResult = Schema.Struct({\n name: NormalizedName,\n resolver: Schema.NullOr(EthereumAddress),\n value: Schema.NullOr(Hex),\n});\nexport type ZoneHashResult = typeof ZoneHashResult.Type;\n\nexport const DnsClaimStatus = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"unsupported\"),\n name: NormalizedName,\n reason: Schema.Literal(\"DNS_REGISTRAR_UNAVAILABLE\"),\n }),\n Schema.Struct({\n status: Schema.Literal(\"claimed\"),\n name: NormalizedName,\n owner: EthereumAddress,\n resolver: Schema.NullOr(EthereumAddress),\n previousInception: Schema.BigInt,\n }),\n Schema.Struct({\n status: Schema.Literal(\"proof-required\"),\n name: NormalizedName,\n previousInception: Schema.BigInt,\n }),\n]);\nexport type DnsClaimStatus = typeof DnsClaimStatus.Type;\n\nexport const DnsImportPlan = Schema.Union([\n Schema.Struct({\n status: Schema.Literal(\"unsupported\"),\n name: NormalizedName,\n reason: Schema.Literal(\"DNS_REGISTRAR_UNAVAILABLE\"),\n }),\n Schema.Struct({\n status: Schema.Literal(\"already-claimed\"),\n name: NormalizedName,\n registrar: EthereumAddress,\n oracle: EthereumAddress,\n owner: EthereumAddress,\n resolver: Schema.NullOr(EthereumAddress),\n }),\n Schema.Struct({\n status: Schema.Literal(\"proof-required\"),\n name: NormalizedName,\n registrar: EthereumAddress,\n oracle: EthereumAddress,\n proofRequest: Schema.Struct({\n name: DnsEncodedName,\n previousInception: Schema.BigInt,\n }),\n }),\n]);\nexport type DnsImportPlan = typeof DnsImportPlan.Type;\n"],"mappings":";;;;;;;AAwBA,MAAa,cAAc,OAAO,OAAO;CACvC,OAAO;CACP,KAAK;AACP,CAAC;AAGD,MAAa,mBAAmB,OAAO,MAAM,WAAW,CAAC,CAAC,KACxD,OAAO,MAAM,OAAO,YAAY,GAAG,EAAE,SAAS,yCAAyC,CAAC,CAAC,CAC3F;AA4CA,MAAa,cAAc,OAAO,IAAI,KACpC,OAAO,MACL,OAAO,UACL;CAAE,SAAS;CAAG,SAAS;AAAO,GAC9B,EAAE,SAAS,iCAAiC,CAC9C,CACF,CACF;AAWA,MAAa,kBAAkB,OAAO,OAAO;CAC3C,MAAM;CACN,YAAY;CACZ,UAAU;CACV,UAAU,OAAO,OAAO,eAAe;CACvC,OAAO,OAAO,OAAO,GAAG;AAC1B,CAAC;AAQD,MAAa,mBAAmB,OAAO,OAAO;CAC5C,MAAM;CACN,UAAU,OAAO,OAAO,eAAe;CACvC,SAAS,OAAO,MAAM,eAAe;AACvC,CAAC;AAGD,MAAa,sBAAsB,OAAO,OAAO;CAC/C,MAAM;CACN,YAAY;CACZ,UAAU,OAAO,OAAO,eAAe;CACvC,QAAQ,OAAO;AACjB,CAAC;AAGD,MAAa,iBAAiB,OAAO,OAAO;CAC1C,MAAM;CACN,UAAU,OAAO,OAAO,eAAe;CACvC,OAAO,OAAO,OAAO,GAAG;AAC1B,CAAC;AAGD,MAAa,iBAAiB,OAAO,MAAM;CACzC,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,aAAa;EACpC,MAAM;EACN,QAAQ,OAAO,QAAQ,2BAA2B;CACpD,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,SAAS;EAChC,MAAM;EACN,OAAO;EACP,UAAU,OAAO,OAAO,eAAe;EACvC,mBAAmB,OAAO;CAC5B,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,gBAAgB;EACvC,MAAM;EACN,mBAAmB,OAAO;CAC5B,CAAC;AACH,CAAC;AAGD,MAAa,gBAAgB,OAAO,MAAM;CACxC,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,aAAa;EACpC,MAAM;EACN,QAAQ,OAAO,QAAQ,2BAA2B;CACpD,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,iBAAiB;EACxC,MAAM;EACN,WAAW;EACX,QAAQ;EACR,OAAO;EACP,UAAU,OAAO,OAAO,eAAe;CACzC,CAAC;CACD,OAAO,OAAO;EACZ,QAAQ,OAAO,QAAQ,gBAAgB;EACvC,MAAM;EACN,WAAW;EACX,QAAQ;EACR,cAAc,OAAO,OAAO;GAC1B,MAAM;GACN,mBAAmB,OAAO;EAC5B,CAAC;CACH,CAAC;AACH,CAAC"}
@@ -3,9 +3,8 @@ import { EnsEvent, EnsEventError, GetEnsEventsParameters } from "../types.js";
3
3
  import "../../../index.js";
4
4
  //#region src/actions/events/get-ens-events/index.d.ts
5
5
  declare const getEnsEvents: EnsAction<GetEnsEventsParameters, readonly {
6
- readonly transactionHash: `0x${string}` | null;
7
- readonly protocol: "v1" | "v2";
8
6
  readonly blockNumber: bigint | null;
7
+ readonly transactionHash: `0x${string}` | null;
9
8
  readonly transactionIndex: number | null;
10
9
  readonly logIndex: number | null;
11
10
  readonly raw: {
@@ -14,13 +13,14 @@ declare const getEnsEvents: EnsAction<GetEnsEventsParameters, readonly {
14
13
  readonly args: unknown;
15
14
  };
16
15
  readonly kind: "commitment" | "registration" | "renewal" | "ownership" | "manager" | "resolver" | "records" | "subname" | "migration" | "other";
17
- readonly contractKind: "registry" | "resolver" | "registrar" | "name-wrapper" | "migration-controller";
16
+ readonly protocol: "v1" | "v2";
17
+ readonly contractKind: "resolver" | "registrar" | "registry" | "name-wrapper" | "migration-controller";
18
18
  readonly eventName: string;
19
19
  readonly contract: `0x${string}`;
20
20
  readonly removed: boolean;
21
- readonly name?: (string & import("effect/Brand").Brand<"NormalizedName">) | undefined;
22
21
  readonly commitment?: `0x${string}` | undefined;
23
22
  readonly resolver?: `0x${string}` | undefined;
23
+ readonly name?: (string & import("effect/Brand").Brand<"NormalizedName">) | undefined;
24
24
  readonly label?: string | undefined;
25
25
  readonly node?: `0x${string}` | undefined;
26
26
  readonly owner?: `0x${string}` | undefined;
@@ -5,9 +5,8 @@ import "../../../index.js";
5
5
  declare const getNameHistory: EnsAction<GetNameHistoryParameters, {
6
6
  readonly name: string & import("effect/Brand").Brand<"NormalizedName">;
7
7
  readonly events: readonly {
8
- readonly transactionHash: `0x${string}` | null;
9
- readonly protocol: "v1" | "v2";
10
8
  readonly blockNumber: bigint | null;
9
+ readonly transactionHash: `0x${string}` | null;
11
10
  readonly transactionIndex: number | null;
12
11
  readonly logIndex: number | null;
13
12
  readonly raw: {
@@ -16,13 +15,14 @@ declare const getNameHistory: EnsAction<GetNameHistoryParameters, {
16
15
  readonly args: unknown;
17
16
  };
18
17
  readonly kind: "commitment" | "registration" | "renewal" | "ownership" | "manager" | "resolver" | "records" | "subname" | "migration" | "other";
19
- readonly contractKind: "registry" | "resolver" | "registrar" | "name-wrapper" | "migration-controller";
18
+ readonly protocol: "v1" | "v2";
19
+ readonly contractKind: "resolver" | "registrar" | "registry" | "name-wrapper" | "migration-controller";
20
20
  readonly eventName: string;
21
21
  readonly contract: `0x${string}`;
22
22
  readonly removed: boolean;
23
- readonly name?: (string & import("effect/Brand").Brand<"NormalizedName">) | undefined;
24
23
  readonly commitment?: `0x${string}` | undefined;
25
24
  readonly resolver?: `0x${string}` | undefined;
25
+ readonly name?: (string & import("effect/Brand").Brand<"NormalizedName">) | undefined;
26
26
  readonly label?: string | undefined;
27
27
  readonly node?: `0x${string}` | undefined;
28
28
  readonly owner?: `0x${string}` | undefined;
@@ -1,6 +1,6 @@
1
+ import { RpcError } from "../../errors/rpc-error.js";
1
2
  import { ContractError } from "../../errors/contract-error.js";
2
3
  import { NameError } from "../../errors/name-error.js";
3
- import { RpcError } from "../../errors/rpc-error.js";
4
4
  import { EthereumAddress } from "../../schemas/identity.js";
5
5
  import { Bytes32 } from "../../schemas/hash.js";
6
6
  import { Schema } from "effect";