ethagent 2.1.0 → 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.
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/auth/openaiOAuth/credentials.ts +47 -0
- package/src/auth/openaiOAuth/crypto.ts +23 -0
- package/src/auth/openaiOAuth/index.ts +238 -0
- package/src/auth/openaiOAuth/landingPage.ts +125 -0
- package/src/auth/openaiOAuth/listener.ts +151 -0
- package/src/auth/openaiOAuth/refresh.ts +70 -0
- package/src/auth/openaiOAuth/shared.ts +115 -0
- package/src/chat/chatSessionState.ts +2 -1
- package/src/chat/commands.ts +2 -1
- package/src/identity/ens/agentRecords.ts +5 -19
- package/src/identity/ens/ensAutomation/setup.ts +0 -1
- package/src/identity/ens/ensAutomation/types.ts +0 -1
- package/src/identity/hub/OperationalRoutes.tsx +2 -11
- package/src/identity/hub/components/IdentitySummary.tsx +8 -3
- package/src/identity/hub/components/MenuScreen.tsx +1 -2
- package/src/identity/hub/components/menuFlagsFromReconciliation.ts +1 -3
- package/src/identity/hub/effects/ens/transactions.ts +15 -15
- package/src/identity/hub/effects/index.ts +0 -1
- package/src/identity/hub/effects/profile/profileState.ts +12 -4
- package/src/identity/hub/effects/publicProfile/runPublicProfileSave.ts +37 -159
- package/src/identity/hub/effects/rebackup/runRebackup.ts +2 -2
- package/src/identity/hub/effects/restoreAdmin.ts +2 -61
- package/src/identity/hub/effects/shared/sync.ts +3 -44
- package/src/identity/hub/flows/custody/CustodyEditFlow.tsx +1 -39
- package/src/identity/hub/flows/custody/custodyFlowActions.ts +5 -3
- package/src/identity/hub/flows/custody/custodyFlowTypes.ts +1 -1
- package/src/identity/hub/flows/ens/EnsEditAdvancedScreens.tsx +80 -175
- package/src/identity/hub/flows/ens/EnsEditFlow.tsx +20 -75
- package/src/identity/hub/flows/ens/EnsEditMaintenanceScreens.tsx +16 -56
- package/src/identity/hub/flows/ens/EnsEditReviewScreens.tsx +0 -18
- package/src/identity/hub/flows/ens/EnsEditRunners.tsx +0 -136
- package/src/identity/hub/flows/ens/EnsEditShared.tsx +5 -4
- package/src/identity/hub/flows/ens/EnsEditSimpleScreens.tsx +56 -205
- package/src/identity/hub/flows/ens/IdentityHubEnsFlow.tsx +7 -0
- package/src/identity/hub/flows/ens/OperatorWalletsScreen.tsx +0 -31
- package/src/identity/hub/flows/ens/ensEditCopy.ts +1 -1
- package/src/identity/hub/flows/ens/ensEditTypes.ts +6 -20
- package/src/identity/hub/flows/profile/EditProfileFlow.tsx +7 -0
- package/src/identity/hub/flows/restore/RestoreFlow.tsx +5 -5
- package/src/identity/hub/reconciliation/agentReconciliation/hook.ts +0 -1
- package/src/identity/hub/reconciliation/agentReconciliation/run.ts +1 -34
- package/src/identity/hub/reconciliation/agentReconciliation/types.ts +0 -4
- package/src/identity/hub/reconciliation/index.ts +0 -7
- package/src/identity/hub/reconciliation/walletSetup.ts +1 -194
- package/src/identity/wallet/browserWallet/types.ts +0 -5
- package/src/identity/wallet/page/copy.ts +1 -31
- package/src/identity/wallet/walletPurposeCompat.ts +0 -2
- package/src/models/ModelPicker.tsx +246 -8
- package/src/models/catalog.ts +28 -1
- package/src/models/modelPickerOptions.ts +15 -1
- package/src/providers/openai-responses-format.ts +156 -0
- package/src/providers/openai-responses.ts +276 -0
- package/src/providers/registry.ts +85 -8
- package/src/runtime/systemPrompt.ts +1 -1
- package/src/runtime/turn.ts +0 -1
- package/src/storage/secrets.ts +4 -1
- package/src/tools/privateContinuityEditTool.ts +6 -0
- package/src/utils/openExternal.ts +20 -10
- 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,
|
|
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: "
|
|
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 {
|