ethagent 2.1.1 → 2.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 (60) hide show
  1. package/package.json +1 -1
  2. package/src/auth/openaiOAuth/credentials.ts +47 -0
  3. package/src/auth/openaiOAuth/crypto.ts +23 -0
  4. package/src/auth/openaiOAuth/index.ts +238 -0
  5. package/src/auth/openaiOAuth/landingPage.ts +125 -0
  6. package/src/auth/openaiOAuth/listener.ts +151 -0
  7. package/src/auth/openaiOAuth/refresh.ts +70 -0
  8. package/src/auth/openaiOAuth/shared.ts +115 -0
  9. package/src/chat/chatSessionState.ts +2 -1
  10. package/src/chat/commands.ts +2 -1
  11. package/src/identity/ens/agentRecords.ts +5 -19
  12. package/src/identity/ens/ensAutomation/setup.ts +0 -1
  13. package/src/identity/ens/ensAutomation/types.ts +0 -1
  14. package/src/identity/hub/OperationalRoutes.tsx +2 -11
  15. package/src/identity/hub/components/IdentitySummary.tsx +8 -3
  16. package/src/identity/hub/components/MenuScreen.tsx +1 -2
  17. package/src/identity/hub/components/menuFlagsFromReconciliation.ts +1 -3
  18. package/src/identity/hub/effects/ens/transactions.ts +15 -15
  19. package/src/identity/hub/effects/index.ts +0 -1
  20. package/src/identity/hub/effects/profile/profileState.ts +12 -4
  21. package/src/identity/hub/effects/publicProfile/runPublicProfileSave.ts +37 -159
  22. package/src/identity/hub/effects/rebackup/runRebackup.ts +2 -2
  23. package/src/identity/hub/effects/restoreAdmin.ts +2 -61
  24. package/src/identity/hub/effects/shared/sync.ts +3 -44
  25. package/src/identity/hub/flows/custody/CustodyEditFlow.tsx +1 -39
  26. package/src/identity/hub/flows/custody/custodyFlowActions.ts +5 -3
  27. package/src/identity/hub/flows/custody/custodyFlowTypes.ts +1 -1
  28. package/src/identity/hub/flows/ens/EnsEditAdvancedScreens.tsx +80 -175
  29. package/src/identity/hub/flows/ens/EnsEditFlow.tsx +20 -75
  30. package/src/identity/hub/flows/ens/EnsEditMaintenanceScreens.tsx +16 -56
  31. package/src/identity/hub/flows/ens/EnsEditReviewScreens.tsx +0 -18
  32. package/src/identity/hub/flows/ens/EnsEditRunners.tsx +0 -136
  33. package/src/identity/hub/flows/ens/EnsEditShared.tsx +5 -4
  34. package/src/identity/hub/flows/ens/EnsEditSimpleScreens.tsx +56 -205
  35. package/src/identity/hub/flows/ens/IdentityHubEnsFlow.tsx +7 -0
  36. package/src/identity/hub/flows/ens/OperatorWalletsScreen.tsx +0 -31
  37. package/src/identity/hub/flows/ens/ensEditCopy.ts +1 -1
  38. package/src/identity/hub/flows/ens/ensEditTypes.ts +6 -20
  39. package/src/identity/hub/flows/profile/EditProfileFlow.tsx +7 -0
  40. package/src/identity/hub/flows/restore/RestoreFlow.tsx +5 -5
  41. package/src/identity/hub/reconciliation/agentReconciliation/hook.ts +0 -1
  42. package/src/identity/hub/reconciliation/agentReconciliation/run.ts +1 -34
  43. package/src/identity/hub/reconciliation/agentReconciliation/types.ts +0 -4
  44. package/src/identity/hub/reconciliation/index.ts +0 -7
  45. package/src/identity/hub/reconciliation/walletSetup.ts +1 -194
  46. package/src/identity/wallet/browserWallet/types.ts +0 -5
  47. package/src/identity/wallet/page/copy.ts +1 -31
  48. package/src/identity/wallet/walletPurposeCompat.ts +0 -2
  49. package/src/models/ModelPicker.tsx +246 -8
  50. package/src/models/catalog.ts +28 -1
  51. package/src/models/modelPickerOptions.ts +15 -1
  52. package/src/providers/openai-responses-format.ts +156 -0
  53. package/src/providers/openai-responses.ts +276 -0
  54. package/src/providers/registry.ts +85 -8
  55. package/src/runtime/systemPrompt.ts +1 -1
  56. package/src/runtime/turn.ts +0 -1
  57. package/src/storage/secrets.ts +4 -1
  58. package/src/tools/privateContinuityEditTool.ts +6 -0
  59. package/src/utils/openExternal.ts +20 -10
  60. package/src/identity/ens/ensRegistration.ts +0 -199
@@ -8,7 +8,6 @@ import {
8
8
  import { isAgentInVault, resolveConfiguredVaultAddress } from '../../../registry/vault.js'
9
9
  import type { EthagentConfig, EthagentIdentity } from '../../../../storage/config.js'
10
10
  import { readVaultAddressField } from '../../../identityCompat.js'
11
- import { reconcileWalletSetup, type RecordsFixPlan } from '../walletSetup.js'
12
11
  import { readCustodyMode } from '../../model/custody.js'
13
12
  import { continuityWorkingTreeStatus, type ContinuityWorkingTreeStatus } from '../../../continuity/storage.js'
14
13
  import type { AgentReconciliation } from './types.js'
@@ -18,7 +17,6 @@ export function emptyReconciliation(): AgentReconciliation {
18
17
  token: 'no-agent',
19
18
  custody: 'unknown',
20
19
  agentUri: 'unknown',
21
- ensRecords: 'unset',
22
20
  vault: 'unset',
23
21
  workingTree: 'unknown',
24
22
  rpc: 'reachable',
@@ -52,7 +50,6 @@ export async function runReconciliation(
52
50
  tokenDetail: `no rpcUrl configured for chain ${identity.chainId}`,
53
51
  custody: 'unknown',
54
52
  agentUri: 'unknown',
55
- ensRecords: 'unknown',
56
53
  vault: vaultAddress ? 'unknown' : 'unset',
57
54
  workingTree: 'unknown',
58
55
  rpc: 'failing',
@@ -67,14 +64,12 @@ export async function runReconciliation(
67
64
  tokenResult,
68
65
  custodyResult,
69
66
  agentUriResult,
70
- ensReconcileResult,
71
67
  vaultResult,
72
68
  workingTreeResult,
73
69
  ] = await Promise.allSettled([
74
70
  probeToken({ registry, agentId, expectedOwner, operatorVaults }),
75
71
  probeCustody({ client, registry, agentId, expectedOwner, vaultAddress, identity }),
76
72
  probeAgentUri({ client, registry, agentId, identity }),
77
- probeEnsRecords({ identity, registry, client }),
78
73
  probeVault({ client, vaultAddress }),
79
74
  probeWorkingTree(identity),
80
75
  ])
@@ -82,11 +77,10 @@ export async function runReconciliation(
82
77
  const token = unwrap(tokenResult, fallbackToken)
83
78
  const custody = unwrap(custodyResult, () => ({ kind: 'unknown' as const }))
84
79
  const agentUri = unwrap(agentUriResult, () => ({ kind: 'unknown' as const }))
85
- const ensRecords = unwrap(ensReconcileResult, () => ({ kind: 'unknown' as const }))
86
80
  const vault = unwrap(vaultResult, () => ({ kind: vaultAddress ? 'unknown' as const : 'unset' as const }))
87
81
  const workingTree = unwrap(workingTreeResult, () => ({ kind: 'unknown' as const }))
88
82
 
89
- const allFailed = [tokenResult, custodyResult, agentUriResult, ensReconcileResult, vaultResult]
83
+ const allFailed = [tokenResult, custodyResult, agentUriResult, vaultResult]
90
84
  .every(r => r.status === 'rejected')
91
85
  const rpc: 'reachable' | 'failing' = allFailed ? 'failing' : 'reachable'
92
86
 
@@ -99,8 +93,6 @@ export async function runReconciliation(
99
93
  ...(token.kind === 'unknown' && token.detail ? { tokenDetail: token.detail } : {}),
100
94
  custody: custody.kind,
101
95
  agentUri: agentUri.kind,
102
- ensRecords: ensRecords.kind,
103
- ...(ensRecords.kind === 'drift' || ensRecords.kind === 'aligned' ? { ensRecordsPlan: ensRecords.plan } : {}),
104
96
  vault: vault.kind,
105
97
  workingTree: workingTree.kind,
106
98
  rpc,
@@ -232,30 +224,6 @@ async function probeAgentUri(args: {
232
224
  }
233
225
  }
234
226
 
235
- type EnsRecordsProbe =
236
- | { kind: 'aligned'; plan: RecordsFixPlan }
237
- | { kind: 'drift'; plan: RecordsFixPlan }
238
- | { kind: 'unset' }
239
- | { kind: 'unknown' }
240
-
241
- async function probeEnsRecords(args: {
242
- identity: EthagentIdentity
243
- registry: Erc8004RegistryConfig
244
- client: PublicClient
245
- }): Promise<EnsRecordsProbe> {
246
- const baseState = (args.identity.state ?? {}) as Record<string, unknown>
247
- const ensName = typeof baseState.ensName === 'string' ? baseState.ensName.trim() : ''
248
- const custody = readCustodyMode(baseState)
249
- if (!ensName || custody !== 'advanced') return { kind: 'unset' }
250
- try {
251
- const plan = await reconcileWalletSetup({ identity: args.identity, registry: args.registry })
252
- if (plan.items.length === 0) return { kind: 'aligned', plan }
253
- const actionable = plan.items.some(item => item.kind === 'missing-approval' || item.kind === 'stale-approval')
254
- return actionable ? { kind: 'drift', plan } : { kind: 'aligned', plan }
255
- } catch {
256
- return { kind: 'unknown' }
257
- }
258
- }
259
227
 
260
228
  type VaultProbe = { kind: 'confirmed' | 'missing' | 'unset' | 'unknown' }
261
229
 
@@ -295,7 +263,6 @@ function computeDriftCount(r: AgentReconciliation): number {
295
263
  if (r.token === 'unlinked') n++
296
264
  if (r.custody === 'mid-flow-uri-pending') n++
297
265
  if (r.agentUri === 'local-newer' || r.agentUri === 'chain-newer') n++
298
- if (r.ensRecords === 'drift') n++
299
266
  if (r.vault === 'missing') n++
300
267
  if (r.workingTree === 'dirty') n++
301
268
  return n
@@ -1,5 +1,3 @@
1
- import type { RecordsFixPlan } from '../walletSetup.js'
2
-
3
1
  export type AgentReconciliation = {
4
2
  token: 'linked' | 'unlinked' | 'unknown' | 'no-agent'
5
3
  tokenDetail?: string
@@ -7,8 +5,6 @@ export type AgentReconciliation = {
7
5
  onChainOwner?: string
8
6
  custody: 'simple' | 'advanced' | 'withdrawn' | 'mid-flow-uri-pending' | 'unknown'
9
7
  agentUri: 'in-sync' | 'chain-newer' | 'local-newer' | 'unknown'
10
- ensRecords: 'aligned' | 'drift' | 'unset' | 'unknown'
11
- ensRecordsPlan?: RecordsFixPlan
12
8
  vault: 'confirmed' | 'missing' | 'unset' | 'unknown'
13
9
  workingTree: 'clean' | 'dirty' | 'unknown'
14
10
  rpc: 'reachable' | 'failing'
@@ -8,14 +8,7 @@ export type {
8
8
  } from './useAgentReconciliation.js'
9
9
  export {
10
10
  computeApprovalDiff,
11
- describeFixPlanItem,
12
- encodeResolverApprovalChanges,
13
- fixPlanRequiresOwnerWallet,
14
- reconcileWalletSetup,
15
- verifyResolverApprovalsLanded,
16
11
  } from './walletSetup.js'
17
12
  export type {
18
13
  ApprovalDiff,
19
- RecordsFixPlan,
20
- RecordsFixPlanItem,
21
14
  } from './walletSetup.js'
@@ -1,23 +1,4 @@
1
- import {
2
- createPublicClient,
3
- encodeFunctionData,
4
- fallback,
5
- getAddress,
6
- http,
7
- namehash,
8
- type Address,
9
- type Hex,
10
- type PublicClient,
11
- } from 'viem'
12
- import { mainnet } from 'viem/chains'
13
- import type { EthagentIdentity } from '../../../storage/config.js'
14
- import type { Erc8004RegistryConfig } from '../../registry/erc8004.js'
15
- import { ENS_AUTOMATION_RESOLVER_ABI } from '../../ens/ensAutomation.js'
16
- import { encodeApprove, encodeApprovalRevoke, readDelegation } from '../../ens/resolverDelegation.js'
17
- import { readResolverAddress } from '../../ens/ensLookup.js'
18
- import { normalizeApprovedOperatorWallets } from '../operatorWallets.js'
19
- import { readCustodyMode } from '../model/custody.js'
20
- import { readOwnerAddressField } from '../../identityCompat.js'
1
+ import { getAddress, type Address } from 'viem'
21
2
 
22
3
  export type ApprovalDiff = {
23
4
  added: Address[]
@@ -44,177 +25,3 @@ export function computeApprovalDiff(
44
25
  }
45
26
  return { added, removed }
46
27
  }
47
-
48
- type ResolverApprovalCalls = {
49
- resolverAddress: Address
50
- data: Hex
51
- calls: Hex[]
52
- added: Address[]
53
- removed: Address[]
54
- }
55
-
56
- export async function encodeResolverApprovalChanges(args: {
57
- ensName: string
58
- diff: ApprovalDiff
59
- }): Promise<ResolverApprovalCalls | null> {
60
- if (args.diff.added.length === 0 && args.diff.removed.length === 0) return null
61
- const resolverAddress = await readResolverAddress(args.ensName)
62
- if (!resolverAddress) {
63
- throw new Error(`no resolver set on ${args.ensName} - finish ENS subdomain setup first`)
64
- }
65
- const node = namehash(args.ensName)
66
- const calls: Hex[] = []
67
- for (const address of args.diff.added) calls.push(encodeApprove(node, address))
68
- for (const address of args.diff.removed) calls.push(encodeApprovalRevoke(node, address))
69
- const data = calls.length === 1
70
- ? calls[0]!
71
- : encodeFunctionData({
72
- abi: ENS_AUTOMATION_RESOLVER_ABI,
73
- functionName: 'multicall',
74
- args: [calls],
75
- })
76
- return {
77
- resolverAddress,
78
- data,
79
- calls,
80
- added: args.diff.added,
81
- removed: args.diff.removed,
82
- }
83
- }
84
-
85
- export type RecordsFixPlanItem =
86
- | { kind: 'missing-approval'; address: Address }
87
- | { kind: 'stale-approval'; address: Address }
88
- | { kind: 'no-resolver' }
89
- | { kind: 'no-ens' }
90
-
91
- export type RecordsFixPlan = {
92
- identityAgentId: string
93
- ensName: string | undefined
94
- items: RecordsFixPlanItem[]
95
- }
96
-
97
- type ReconcileArgs = {
98
- identity: EthagentIdentity
99
- registry: Erc8004RegistryConfig
100
- client?: Pick<PublicClient, 'readContract'>
101
- }
102
-
103
- export async function reconcileWalletSetup(
104
- args: ReconcileArgs,
105
- ): Promise<RecordsFixPlan> {
106
- const baseState = (args.identity.state ?? {}) as Record<string, unknown>
107
- const ensName = typeof baseState.ensName === 'string' ? baseState.ensName.trim() : ''
108
- const custodyMode = readCustodyMode(baseState)
109
- const approved = normalizeApprovedOperatorWallets(baseState.approvedOperatorWallets)
110
- const items: RecordsFixPlanItem[] = []
111
-
112
- if (custodyMode !== 'advanced' || approved.length === 0) {
113
- return { identityAgentId: String(args.identity.agentId ?? ''), ensName: ensName || undefined, items }
114
- }
115
- if (!ensName) {
116
- items.push({ kind: 'no-ens' })
117
- return { identityAgentId: String(args.identity.agentId ?? ''), ensName: undefined, items }
118
- }
119
-
120
- let resolverAddress: Address | null
121
- try {
122
- resolverAddress = await readResolverAddress(ensName)
123
- } catch {
124
- resolverAddress = null
125
- }
126
- if (!resolverAddress) {
127
- items.push({ kind: 'no-resolver' })
128
- return { identityAgentId: String(args.identity.agentId ?? ''), ensName, items }
129
- }
130
-
131
- const ownerAddress = readOwnerAddressField(baseState) ?? args.identity.ownerAddress ?? args.identity.address
132
- const node = namehash(ensName)
133
-
134
- for (const record of approved) {
135
- const isApproved = await readDelegation({
136
- client: args.client ?? createReadClient(),
137
- resolverAddress,
138
- ownerAddress: getAddress(ownerAddress),
139
- node,
140
- delegateAddress: getAddress(record.address),
141
- })
142
- if (!isApproved) {
143
- items.push({ kind: 'missing-approval', address: getAddress(record.address) })
144
- }
145
- }
146
-
147
- return { identityAgentId: String(args.identity.agentId ?? ''), ensName, items }
148
- }
149
-
150
- function createReadClient(): Pick<PublicClient, 'readContract'> {
151
- const transports = [
152
- http('https://ethereum.publicnode.com', { retryCount: 0, timeout: 8_000 }),
153
- http('https://eth.llamarpc.com', { retryCount: 0, timeout: 8_000 }),
154
- ]
155
- return createPublicClient({
156
- chain: mainnet,
157
- transport: fallback(transports, { retryCount: 0 }),
158
- })
159
- }
160
-
161
- type VerifyResolverApprovalsArgs = {
162
- ensName: string
163
- ownerAddress: Address
164
- resolverAddress: Address
165
- added: ReadonlyArray<Address>
166
- removed: ReadonlyArray<Address>
167
- client?: Pick<PublicClient, 'readContract'>
168
- }
169
-
170
- export async function verifyResolverApprovalsLanded(args: VerifyResolverApprovalsArgs): Promise<void> {
171
- if (args.added.length === 0 && args.removed.length === 0) return
172
- const client = args.client ?? createReadClient()
173
- const node = namehash(args.ensName)
174
- const owner = getAddress(args.ownerAddress)
175
- for (const address of args.added) {
176
- const delegate = getAddress(address)
177
- const isApproved = await readDelegation({
178
- client,
179
- resolverAddress: args.resolverAddress,
180
- ownerAddress: owner,
181
- node,
182
- delegateAddress: delegate,
183
- })
184
- if (!isApproved) {
185
- throw new Error(`Resolver delegation didn't land for operator wallet ${delegate}. Your wallet may have rejected the inner operation; retry by selecting Fix Records again.`)
186
- }
187
- }
188
- for (const address of args.removed) {
189
- const delegate = getAddress(address)
190
- const isApproved = await readDelegation({
191
- client,
192
- resolverAddress: args.resolverAddress,
193
- ownerAddress: owner,
194
- node,
195
- delegateAddress: delegate,
196
- })
197
- if (isApproved) {
198
- throw new Error(`Resolver revocation didn't land for operator wallet ${delegate}. Your wallet may have rejected the inner operation; retry by selecting Fix Records again.`)
199
- }
200
- }
201
- }
202
-
203
- export function fixPlanRequiresOwnerWallet(plan: RecordsFixPlan): boolean {
204
- return plan.items.some(item =>
205
- item.kind === 'missing-approval' || item.kind === 'stale-approval',
206
- )
207
- }
208
-
209
- export function describeFixPlanItem(item: RecordsFixPlanItem): string {
210
- switch (item.kind) {
211
- case 'missing-approval':
212
- return `operator wallet ${item.address} has no onchain resolver approval, record writes will be rejected`
213
- case 'stale-approval':
214
- return `operator wallet ${item.address} has an onchain approval that no longer matches the operator set`
215
- case 'no-resolver':
216
- return 'ENS subdomain has no resolver set yet, finish ENS setup before authorizing operator wallets onchain'
217
- case 'no-ens':
218
- return 'advanced mode requires an ENS subdomain so operator wallets can sign profile updates onchain'
219
- }
220
- }
@@ -27,9 +27,6 @@ export type WalletPurpose =
27
27
  | 'set-agent-ens-records'
28
28
  | 'update-operators'
29
29
  | 'operator-proof'
30
- | 'authorize-operator-wallet-resolver'
31
- | 'revoke-operator-wallet-resolver'
32
- | 'reconcile-resolver-approvals'
33
30
  | 'sync-operator-vault'
34
31
  | 'refetch-snapshot'
35
32
  | 'prepare-transfer-sender'
@@ -41,8 +38,6 @@ export type WalletPurpose =
41
38
  | 'rotate-agent-uri-vault-owner'
42
39
  | 'rotate-agent-uri-vault-operator'
43
40
  | 'withdraw-vault'
44
- | 'register-root-commit'
45
- | 'register-root-tx'
46
41
  | 'delete-ens-subdomain'
47
42
 
48
43
  export type SignatureRequest = {
@@ -123,7 +123,7 @@ export const PURPOSE_COPY: Record<string, PurposeCopyEntry> = {
123
123
  flowTitle: "Operator Wallet Profile Update",
124
124
  sign: { text: "Sign With Operator Wallet", hint: "Signs the encrypted snapshot for restore access." },
125
125
  prepare: { text: "Preparing Profile Update...", hint: "Keep this page open." },
126
- transaction: { text: "Use Operator Wallet", hint: "Publishes the updated agent-card pointer to the ENS profile record on Ethereum Mainnet." },
126
+ transaction: { text: "Use Operator Wallet", hint: "Rotates the agent URI through the Vault. No ENS write." },
127
127
  },
128
128
  "update-profile-connected": {
129
129
  flowTitle: "Update Public Profile",
@@ -178,21 +178,6 @@ export const PURPOSE_COPY: Record<string, PurposeCopyEntry> = {
178
178
  sign: { text: "Sign With Operator Wallet", hint: "Creates restore access. No token approval." },
179
179
  prepare: { text: "Verifying Operator Wallet...", hint: "Return to the terminal." },
180
180
  },
181
- "authorize-operator-wallet-resolver": {
182
- flowTitle: "Owner Wallet Required",
183
- prepare: { text: "Preparing Resolver Approval...", hint: "Keep this page open." },
184
- transaction: { text: "Use Owner Wallet", hint: "Approves the operator wallet to write ENS records for this name. No token approval." },
185
- },
186
- "revoke-operator-wallet-resolver": {
187
- flowTitle: "Owner Wallet Required",
188
- prepare: { text: "Preparing Resolver Revocation...", hint: "Keep this page open." },
189
- transaction: { text: "Use Owner Wallet", hint: "Revokes the operator wallet's ENS record write access for this name." },
190
- },
191
- "reconcile-resolver-approvals": {
192
- flowTitle: "Owner Wallet Required",
193
- prepare: { text: "Preparing Records Fix...", hint: "Keep this page open." },
194
- transaction: { text: "Use Owner Wallet", hint: "Brings ENS resolver approvals in sync with the authorized operator wallet list." },
195
- },
196
181
  "sync-operator-vault": {
197
182
  flowTitle: "Owner Wallet Required",
198
183
  prepare: { text: "Preparing Vault Operator Update...", hint: "Keep this page open." },
@@ -253,18 +238,6 @@ export const PURPOSE_COPY: Record<string, PurposeCopyEntry> = {
253
238
  transaction: { text: "Use Owner Wallet", hint: "Temporarily returns the agent token from the vault to your owner wallet. Vault stays configured so you can redeposit later." },
254
239
  errorContext: "While submitting the Vault withdraw",
255
240
  },
256
- "register-root-commit": {
257
- flowTitle: "Commit ENS Name",
258
- prepare: { text: "Preparing ENS Commit...", hint: "Keep this page open." },
259
- transaction: { text: "Use Connected Wallet", hint: "Submits an ENS commitment, the first of two transactions. The actual registration runs about 60 seconds later." },
260
- errorContext: "While committing the ENS name registration",
261
- },
262
- "register-root-tx": {
263
- flowTitle: "Register ENS Name",
264
- prepare: { text: "Preparing ENS Registration...", hint: "Keep this page open." },
265
- transaction: { text: "Use Connected Wallet", hint: "Pays the 1-year rent and registers the name. The connected wallet becomes the owner." },
266
- errorContext: "While registering the ENS name",
267
- },
268
241
  "delete-ens-subdomain": {
269
242
  flowTitle: "Delete ENS Subdomain",
270
243
  prepare: { text: "Preparing Subdomain Deletion...", hint: "Keep this page open." },
@@ -301,9 +274,6 @@ export const ENS_PURPOSES: ReadonlySet<string> = new Set([
301
274
  "set-agent-ens-records",
302
275
  "update-ens-records",
303
276
  "clear-ens-records",
304
- "authorize-operator-wallet-resolver",
305
- "revoke-operator-wallet-resolver",
306
- "reconcile-resolver-approvals",
307
277
  ]);
308
278
  export function isEnsPurpose(purpose: string | undefined): boolean {
309
279
  return !!purpose && ENS_PURPOSES.has(purpose);
@@ -9,8 +9,6 @@ export const LEGACY_WALLET_PURPOSE_ALIASES: Record<string, string> = {
9
9
  [legacyWalletPurpose('connect', legacyOperatorRole)]: 'connect-operator-wallet',
10
10
  [legacyWalletPurpose('restore', legacyOwnerRole)]: 'restore-owner-wallet',
11
11
  [legacyWalletPurpose('restore', legacyOperatorRole)]: 'restore-operator-wallet',
12
- [legacyWalletPurpose('authorize', legacyOperatorRole, 'wallet-resolver')]: 'authorize-operator-wallet-resolver',
13
- [legacyWalletPurpose('revoke', legacyOperatorRole, 'wallet-resolver')]: 'revoke-operator-wallet-resolver',
14
12
  }
15
13
 
16
14
  export function normalizeWalletPurposeValue(value: unknown): string | undefined {