agentwallet-sdk 3.3.0 → 3.4.1
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 +41 -516
- package/dist/bridge/abis.d.ts +48 -171
- package/dist/bridge/abis.d.ts.map +1 -1
- package/dist/bridge/abis.js.map +1 -1
- package/dist/bridge/client.d.ts +2 -41
- package/dist/bridge/client.d.ts.map +1 -1
- package/dist/bridge/client.js +35 -168
- package/dist/bridge/client.js.map +1 -1
- package/dist/bridge/index.d.ts +2 -4
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +1 -8
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/types.d.ts +15 -134
- package/dist/bridge/types.d.ts.map +1 -1
- package/dist/bridge/types.js +16 -170
- package/dist/bridge/types.js.map +1 -1
- package/dist/identity/erc8004.d.ts +2 -240
- package/dist/identity/erc8004.d.ts.map +1 -1
- package/dist/identity/erc8004.js +58 -334
- package/dist/identity/erc8004.js.map +1 -1
- package/dist/index.d.ts +313 -136
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -59
- package/dist/index.js.map +1 -1
- package/dist/swap/SwapModule.d.ts +6 -50
- package/dist/swap/SwapModule.d.ts.map +1 -1
- package/dist/swap/SwapModule.js +25 -153
- package/dist/swap/SwapModule.js.map +1 -1
- package/dist/swap/abi.d.ts +47 -165
- package/dist/swap/abi.d.ts.map +1 -1
- package/dist/swap/abi.js.map +1 -1
- package/dist/swap/index.d.ts +2 -3
- package/dist/swap/index.d.ts.map +1 -1
- package/dist/swap/index.js +1 -4
- package/dist/swap/index.js.map +1 -1
- package/dist/swap/types.d.ts +6 -36
- package/dist/swap/types.d.ts.map +1 -1
- package/dist/swap/types.js +0 -1
- package/dist/swap/types.js.map +1 -1
- package/dist/types.d.ts +1 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/x402/__tests__/budget.test.d.ts +2 -0
- package/dist/x402/__tests__/budget.test.d.ts.map +1 -0
- package/dist/x402/__tests__/budget.test.js +114 -0
- package/dist/x402/__tests__/budget.test.js.map +1 -0
- package/dist/x402/__tests__/client.test.d.ts +2 -0
- package/dist/x402/__tests__/client.test.d.ts.map +1 -0
- package/dist/x402/__tests__/client.test.js +107 -0
- package/dist/x402/__tests__/client.test.js.map +1 -0
- package/dist/x402/chains/abstract/index.d.ts +135 -0
- package/dist/x402/chains/abstract/index.d.ts.map +1 -0
- package/dist/x402/chains/abstract/index.js +190 -0
- package/dist/x402/chains/abstract/index.js.map +1 -0
- package/dist/x402/client.d.ts +1 -4
- package/dist/x402/client.d.ts.map +1 -1
- package/dist/x402/client.js +2 -16
- package/dist/x402/client.js.map +1 -1
- package/dist/x402/index.d.ts +3 -1
- package/dist/x402/index.d.ts.map +1 -1
- package/dist/x402/index.js +3 -1
- package/dist/x402/index.js.map +1 -1
- package/dist/x402/types.d.ts +3 -5
- package/dist/x402/types.d.ts.map +1 -1
- package/dist/x402/types.js +2 -17
- package/dist/x402/types.js.map +1 -1
- package/package.json +12 -32
- package/dist/ap2/index.d.ts +0 -185
- package/dist/ap2/index.d.ts.map +0 -1
- package/dist/ap2/index.js +0 -255
- package/dist/ap2/index.js.map +0 -1
- package/dist/bridge/unified.d.ts +0 -101
- package/dist/bridge/unified.d.ts.map +0 -1
- package/dist/bridge/unified.js +0 -284
- package/dist/bridge/unified.js.map +0 -1
- package/dist/chains.d.ts +0 -62
- package/dist/chains.d.ts.map +0 -1
- package/dist/chains.js +0 -108
- package/dist/chains.js.map +0 -1
- package/dist/fiat/index.d.ts +0 -10
- package/dist/fiat/index.d.ts.map +0 -1
- package/dist/fiat/index.js +0 -9
- package/dist/fiat/index.js.map +0 -1
- package/dist/fiat/onramp.d.ts +0 -101
- package/dist/fiat/onramp.d.ts.map +0 -1
- package/dist/fiat/onramp.js +0 -155
- package/dist/fiat/onramp.js.map +0 -1
- package/dist/fiat/providers/index.d.ts +0 -16
- package/dist/fiat/providers/index.d.ts.map +0 -1
- package/dist/fiat/providers/index.js +0 -30
- package/dist/fiat/providers/index.js.map +0 -1
- package/dist/fiat/providers/moonpay.d.ts +0 -22
- package/dist/fiat/providers/moonpay.d.ts.map +0 -1
- package/dist/fiat/providers/moonpay.js +0 -107
- package/dist/fiat/providers/moonpay.js.map +0 -1
- package/dist/fiat/providers/stripe.d.ts +0 -26
- package/dist/fiat/providers/stripe.d.ts.map +0 -1
- package/dist/fiat/providers/stripe.js +0 -135
- package/dist/fiat/providers/stripe.js.map +0 -1
- package/dist/fiat/providers/transak.d.ts +0 -26
- package/dist/fiat/providers/transak.d.ts.map +0 -1
- package/dist/fiat/providers/transak.js +0 -119
- package/dist/fiat/providers/transak.js.map +0 -1
- package/dist/fiat/types.d.ts +0 -106
- package/dist/fiat/types.d.ts.map +0 -1
- package/dist/fiat/types.js +0 -13
- package/dist/fiat/types.js.map +0 -1
- package/dist/flash/executor.d.ts +0 -119
- package/dist/flash/executor.d.ts.map +0 -1
- package/dist/flash/executor.js +0 -195
- package/dist/flash/executor.js.map +0 -1
- package/dist/flash/index.d.ts +0 -28
- package/dist/flash/index.d.ts.map +0 -1
- package/dist/flash/index.js +0 -25
- package/dist/flash/index.js.map +0 -1
- package/dist/flash/scanner.d.ts +0 -133
- package/dist/flash/scanner.d.ts.map +0 -1
- package/dist/flash/scanner.js +0 -212
- package/dist/flash/scanner.js.map +0 -1
- package/dist/flash/types.d.ts +0 -136
- package/dist/flash/types.d.ts.map +0 -1
- package/dist/flash/types.js +0 -23
- package/dist/flash/types.js.map +0 -1
- package/dist/gas/index.d.ts +0 -4
- package/dist/gas/index.d.ts.map +0 -1
- package/dist/gas/index.js +0 -3
- package/dist/gas/index.js.map +0 -1
- package/dist/gas/sponsor.d.ts +0 -70
- package/dist/gas/sponsor.d.ts.map +0 -1
- package/dist/gas/sponsor.js +0 -193
- package/dist/gas/sponsor.js.map +0 -1
- package/dist/gas/types.d.ts +0 -76
- package/dist/gas/types.d.ts.map +0 -1
- package/dist/gas/types.js +0 -21
- package/dist/gas/types.js.map +0 -1
- package/dist/identity/agent-identity.d.ts +0 -276
- package/dist/identity/agent-identity.d.ts.map +0 -1
- package/dist/identity/agent-identity.js +0 -300
- package/dist/identity/agent-identity.js.map +0 -1
- package/dist/identity/erc6551.d.ts +0 -441
- package/dist/identity/erc6551.d.ts.map +0 -1
- package/dist/identity/erc6551.js +0 -517
- package/dist/identity/erc6551.js.map +0 -1
- package/dist/mev/index.d.ts +0 -4
- package/dist/mev/index.d.ts.map +0 -1
- package/dist/mev/index.js +0 -4
- package/dist/mev/index.js.map +0 -1
- package/dist/mev/protection.d.ts +0 -54
- package/dist/mev/protection.d.ts.map +0 -1
- package/dist/mev/protection.js +0 -185
- package/dist/mev/protection.js.map +0 -1
- package/dist/mev/risk.d.ts +0 -19
- package/dist/mev/risk.d.ts.map +0 -1
- package/dist/mev/risk.js +0 -95
- package/dist/mev/risk.js.map +0 -1
- package/dist/mev/types.d.ts +0 -49
- package/dist/mev/types.d.ts.map +0 -1
- package/dist/mev/types.js +0 -2
- package/dist/mev/types.js.map +0 -1
- package/dist/settlement/index.d.ts +0 -4
- package/dist/settlement/index.d.ts.map +0 -1
- package/dist/settlement/index.js +0 -3
- package/dist/settlement/index.js.map +0 -1
- package/dist/settlement/types.d.ts +0 -66
- package/dist/settlement/types.d.ts.map +0 -1
- package/dist/settlement/types.js +0 -37
- package/dist/settlement/types.js.map +0 -1
- package/dist/settlement/verifier.d.ts +0 -75
- package/dist/settlement/verifier.d.ts.map +0 -1
- package/dist/settlement/verifier.js +0 -354
- package/dist/settlement/verifier.js.map +0 -1
- package/dist/solana/bridge.d.ts +0 -144
- package/dist/solana/bridge.d.ts.map +0 -1
- package/dist/solana/bridge.js +0 -352
- package/dist/solana/bridge.js.map +0 -1
- package/dist/solana/index.d.ts +0 -8
- package/dist/solana/index.d.ts.map +0 -1
- package/dist/solana/index.js +0 -6
- package/dist/solana/index.js.map +0 -1
- package/dist/solana/swap.d.ts +0 -85
- package/dist/solana/swap.d.ts.map +0 -1
- package/dist/solana/swap.js +0 -173
- package/dist/solana/swap.js.map +0 -1
- package/dist/solana/types.d.ts +0 -126
- package/dist/solana/types.d.ts.map +0 -1
- package/dist/solana/types.js +0 -10
- package/dist/solana/types.js.map +0 -1
- package/dist/solana/wallet.d.ts +0 -83
- package/dist/solana/wallet.d.ts.map +0 -1
- package/dist/solana/wallet.js +0 -164
- package/dist/solana/wallet.js.map +0 -1
- package/dist/solana/x402.d.ts +0 -69
- package/dist/solana/x402.d.ts.map +0 -1
- package/dist/solana/x402.js +0 -154
- package/dist/solana/x402.js.map +0 -1
- package/dist/solver/adapter.d.ts +0 -47
- package/dist/solver/adapter.d.ts.map +0 -1
- package/dist/solver/adapter.js +0 -138
- package/dist/solver/adapter.js.map +0 -1
- package/dist/solver/analyzer.d.ts +0 -48
- package/dist/solver/analyzer.d.ts.map +0 -1
- package/dist/solver/analyzer.js +0 -89
- package/dist/solver/analyzer.js.map +0 -1
- package/dist/solver/builder.d.ts +0 -31
- package/dist/solver/builder.d.ts.map +0 -1
- package/dist/solver/builder.js +0 -60
- package/dist/solver/builder.js.map +0 -1
- package/dist/solver/index.d.ts +0 -22
- package/dist/solver/index.d.ts.map +0 -1
- package/dist/solver/index.js +0 -21
- package/dist/solver/index.js.map +0 -1
- package/dist/solver/types.d.ts +0 -115
- package/dist/solver/types.d.ts.map +0 -1
- package/dist/solver/types.js +0 -10
- package/dist/solver/types.js.map +0 -1
- package/dist/spend-guard/index.d.ts +0 -125
- package/dist/spend-guard/index.d.ts.map +0 -1
- package/dist/spend-guard/index.js +0 -150
- package/dist/spend-guard/index.js.map +0 -1
- package/dist/swap/router/cache.d.ts +0 -13
- package/dist/swap/router/cache.d.ts.map +0 -1
- package/dist/swap/router/cache.js +0 -30
- package/dist/swap/router/cache.js.map +0 -1
- package/dist/swap/router/flashbots.d.ts +0 -10
- package/dist/swap/router/flashbots.d.ts.map +0 -1
- package/dist/swap/router/flashbots.js +0 -43
- package/dist/swap/router/flashbots.js.map +0 -1
- package/dist/swap/router/health.d.ts +0 -17
- package/dist/swap/router/health.d.ts.map +0 -1
- package/dist/swap/router/health.js +0 -38
- package/dist/swap/router/health.js.map +0 -1
- package/dist/swap/router/index.d.ts +0 -10
- package/dist/swap/router/index.d.ts.map +0 -1
- package/dist/swap/router/index.js +0 -10
- package/dist/swap/router/index.js.map +0 -1
- package/dist/swap/router/providers/cowswap.d.ts +0 -11
- package/dist/swap/router/providers/cowswap.d.ts.map +0 -1
- package/dist/swap/router/providers/cowswap.js +0 -79
- package/dist/swap/router/providers/cowswap.js.map +0 -1
- package/dist/swap/router/providers/index.d.ts +0 -20
- package/dist/swap/router/providers/index.d.ts.map +0 -1
- package/dist/swap/router/providers/index.js +0 -32
- package/dist/swap/router/providers/index.js.map +0 -1
- package/dist/swap/router/providers/jupiter.d.ts +0 -12
- package/dist/swap/router/providers/jupiter.d.ts.map +0 -1
- package/dist/swap/router/providers/jupiter.js +0 -73
- package/dist/swap/router/providers/jupiter.js.map +0 -1
- package/dist/swap/router/providers/lifi.d.ts +0 -11
- package/dist/swap/router/providers/lifi.d.ts.map +0 -1
- package/dist/swap/router/providers/lifi.js +0 -123
- package/dist/swap/router/providers/lifi.js.map +0 -1
- package/dist/swap/router/providers/oneinch.d.ts +0 -13
- package/dist/swap/router/providers/oneinch.d.ts.map +0 -1
- package/dist/swap/router/providers/oneinch.js +0 -71
- package/dist/swap/router/providers/oneinch.js.map +0 -1
- package/dist/swap/router/providers/paraswap.d.ts +0 -11
- package/dist/swap/router/providers/paraswap.d.ts.map +0 -1
- package/dist/swap/router/providers/paraswap.js +0 -73
- package/dist/swap/router/providers/paraswap.js.map +0 -1
- package/dist/swap/router/providers/uniswap.d.ts +0 -31
- package/dist/swap/router/providers/uniswap.d.ts.map +0 -1
- package/dist/swap/router/providers/uniswap.js +0 -116
- package/dist/swap/router/providers/uniswap.js.map +0 -1
- package/dist/swap/router/providers/zerox.d.ts +0 -13
- package/dist/swap/router/providers/zerox.d.ts.map +0 -1
- package/dist/swap/router/providers/zerox.js +0 -94
- package/dist/swap/router/providers/zerox.js.map +0 -1
- package/dist/swap/router/router.d.ts +0 -86
- package/dist/swap/router/router.d.ts.map +0 -1
- package/dist/swap/router/router.js +0 -224
- package/dist/swap/router/router.js.map +0 -1
- package/dist/swap/router/rsi/engine.d.ts +0 -60
- package/dist/swap/router/rsi/engine.d.ts.map +0 -1
- package/dist/swap/router/rsi/engine.js +0 -483
- package/dist/swap/router/rsi/engine.js.map +0 -1
- package/dist/swap/router/rsi/index.d.ts +0 -3
- package/dist/swap/router/rsi/index.d.ts.map +0 -1
- package/dist/swap/router/rsi/index.js +0 -3
- package/dist/swap/router/rsi/index.js.map +0 -1
- package/dist/swap/router/rsi/types.d.ts +0 -106
- package/dist/swap/router/rsi/types.d.ts.map +0 -1
- package/dist/swap/router/rsi/types.js +0 -3
- package/dist/swap/router/rsi/types.js.map +0 -1
- package/dist/swap/router/types.d.ts +0 -120
- package/dist/swap/router/types.d.ts.map +0 -1
- package/dist/swap/router/types.js +0 -16
- package/dist/swap/router/types.js.map +0 -1
- package/dist/tax/engine.d.ts +0 -131
- package/dist/tax/engine.d.ts.map +0 -1
- package/dist/tax/engine.js +0 -307
- package/dist/tax/engine.js.map +0 -1
- package/dist/tax/index.d.ts +0 -9
- package/dist/tax/index.d.ts.map +0 -1
- package/dist/tax/index.js +0 -8
- package/dist/tax/index.js.map +0 -1
- package/dist/tax/lots.d.ts +0 -60
- package/dist/tax/lots.d.ts.map +0 -1
- package/dist/tax/lots.js +0 -129
- package/dist/tax/lots.js.map +0 -1
- package/dist/tax/types.d.ts +0 -113
- package/dist/tax/types.d.ts.map +0 -1
- package/dist/tax/types.js +0 -18
- package/dist/tax/types.js.map +0 -1
- package/dist/yield/index.d.ts +0 -26
- package/dist/yield/index.d.ts.map +0 -1
- package/dist/yield/index.js +0 -25
- package/dist/yield/index.js.map +0 -1
- package/dist/yield/rates.d.ts +0 -114
- package/dist/yield/rates.d.ts.map +0 -1
- package/dist/yield/rates.js +0 -351
- package/dist/yield/rates.js.map +0 -1
- package/dist/yield/types.d.ts +0 -134
- package/dist/yield/types.d.ts.map +0 -1
- package/dist/yield/types.js +0 -24
- package/dist/yield/types.js.map +0 -1
- package/dist/yield/vault.d.ts +0 -112
- package/dist/yield/vault.d.ts.map +0 -1
- package/dist/yield/vault.js +0 -264
- package/dist/yield/vault.js.map +0 -1
package/dist/identity/erc8004.js
CHANGED
|
@@ -6,85 +6,50 @@
|
|
|
6
6
|
* with URIStorage extension.
|
|
7
7
|
*
|
|
8
8
|
* Spec: https://eips.ethereum.org/EIPS/eip-8004
|
|
9
|
-
* Status: DRAFT (August 2025). No official mainnet singleton deployed yet
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Key Principle: Non-custodial. All signing happens locally via the caller's
|
|
13
|
-
* WalletClient. Keys never leave the device.
|
|
9
|
+
* Status: DRAFT (August 2025). No official mainnet singleton deployed yet.
|
|
10
|
+
* Key Principle: Non-custodial. All signing happens locally via WalletClient.
|
|
14
11
|
*/
|
|
15
12
|
import { createPublicClient, getContract, http, } from 'viem';
|
|
16
13
|
import { base, baseSepolia, mainnet, arbitrum, polygon } from 'viem/chains';
|
|
17
14
|
// ─── ABI ─────────────────────────────────────────────────────────────────────
|
|
18
|
-
/**
|
|
19
|
-
* Minimal ABI for the ERC-8004 Identity Registry.
|
|
20
|
-
* Extends ERC-721 with agent-specific registration functions.
|
|
21
|
-
*/
|
|
22
15
|
export const ERC8004IdentityRegistryAbi = [
|
|
23
|
-
// Registration
|
|
24
16
|
{
|
|
25
|
-
name: 'register',
|
|
26
|
-
type: 'function',
|
|
27
|
-
stateMutability: 'nonpayable',
|
|
17
|
+
name: 'register', type: 'function', stateMutability: 'nonpayable',
|
|
28
18
|
inputs: [{ name: 'agentURI', type: 'string' }],
|
|
29
19
|
outputs: [{ name: 'agentId', type: 'uint256' }],
|
|
30
20
|
},
|
|
31
21
|
{
|
|
32
|
-
name: 'registerWithMetadata',
|
|
33
|
-
type: 'function',
|
|
34
|
-
stateMutability: 'nonpayable',
|
|
22
|
+
name: 'registerWithMetadata', type: 'function', stateMutability: 'nonpayable',
|
|
35
23
|
inputs: [
|
|
36
24
|
{ name: 'agentURI', type: 'string' },
|
|
37
|
-
{
|
|
38
|
-
name: 'metadata',
|
|
39
|
-
type: 'tuple[]',
|
|
40
|
-
components: [
|
|
25
|
+
{ name: 'metadata', type: 'tuple[]', components: [
|
|
41
26
|
{ name: 'metadataKey', type: 'string' },
|
|
42
27
|
{ name: 'metadataValue', type: 'bytes' },
|
|
43
|
-
],
|
|
44
|
-
},
|
|
28
|
+
] },
|
|
45
29
|
],
|
|
46
30
|
outputs: [{ name: 'agentId', type: 'uint256' }],
|
|
47
31
|
},
|
|
48
32
|
{
|
|
49
|
-
name: 'registerEmpty',
|
|
50
|
-
type: '
|
|
51
|
-
stateMutability: 'nonpayable',
|
|
52
|
-
inputs: [],
|
|
53
|
-
outputs: [{ name: 'agentId', type: 'uint256' }],
|
|
33
|
+
name: 'registerEmpty', type: 'function', stateMutability: 'nonpayable',
|
|
34
|
+
inputs: [], outputs: [{ name: 'agentId', type: 'uint256' }],
|
|
54
35
|
},
|
|
55
|
-
// URI management
|
|
56
36
|
{
|
|
57
|
-
name: 'setAgentURI',
|
|
58
|
-
type: '
|
|
59
|
-
stateMutability: 'nonpayable',
|
|
60
|
-
inputs: [
|
|
61
|
-
{ name: 'agentId', type: 'uint256' },
|
|
62
|
-
{ name: 'newURI', type: 'string' },
|
|
63
|
-
],
|
|
37
|
+
name: 'setAgentURI', type: 'function', stateMutability: 'nonpayable',
|
|
38
|
+
inputs: [{ name: 'agentId', type: 'uint256' }, { name: 'newURI', type: 'string' }],
|
|
64
39
|
outputs: [],
|
|
65
40
|
},
|
|
66
41
|
{
|
|
67
|
-
name: 'tokenURI',
|
|
68
|
-
type: 'function',
|
|
69
|
-
stateMutability: 'view',
|
|
42
|
+
name: 'tokenURI', type: 'function', stateMutability: 'view',
|
|
70
43
|
inputs: [{ name: 'agentId', type: 'uint256' }],
|
|
71
44
|
outputs: [{ name: '', type: 'string' }],
|
|
72
45
|
},
|
|
73
|
-
// On-chain metadata
|
|
74
46
|
{
|
|
75
|
-
name: 'getMetadata',
|
|
76
|
-
type: '
|
|
77
|
-
stateMutability: 'view',
|
|
78
|
-
inputs: [
|
|
79
|
-
{ name: 'agentId', type: 'uint256' },
|
|
80
|
-
{ name: 'metadataKey', type: 'string' },
|
|
81
|
-
],
|
|
47
|
+
name: 'getMetadata', type: 'function', stateMutability: 'view',
|
|
48
|
+
inputs: [{ name: 'agentId', type: 'uint256' }, { name: 'metadataKey', type: 'string' }],
|
|
82
49
|
outputs: [{ name: '', type: 'bytes' }],
|
|
83
50
|
},
|
|
84
51
|
{
|
|
85
|
-
name: 'setMetadata',
|
|
86
|
-
type: 'function',
|
|
87
|
-
stateMutability: 'nonpayable',
|
|
52
|
+
name: 'setMetadata', type: 'function', stateMutability: 'nonpayable',
|
|
88
53
|
inputs: [
|
|
89
54
|
{ name: 'agentId', type: 'uint256' },
|
|
90
55
|
{ name: 'metadataKey', type: 'string' },
|
|
@@ -92,64 +57,44 @@ export const ERC8004IdentityRegistryAbi = [
|
|
|
92
57
|
],
|
|
93
58
|
outputs: [],
|
|
94
59
|
},
|
|
95
|
-
// Agent wallet (payment address)
|
|
96
60
|
{
|
|
97
|
-
name: 'getAgentWallet',
|
|
98
|
-
type: 'function',
|
|
99
|
-
stateMutability: 'view',
|
|
61
|
+
name: 'getAgentWallet', type: 'function', stateMutability: 'view',
|
|
100
62
|
inputs: [{ name: 'agentId', type: 'uint256' }],
|
|
101
63
|
outputs: [{ name: '', type: 'address' }],
|
|
102
64
|
},
|
|
103
65
|
{
|
|
104
|
-
name: 'setAgentWallet',
|
|
105
|
-
type: 'function',
|
|
106
|
-
stateMutability: 'nonpayable',
|
|
66
|
+
name: 'setAgentWallet', type: 'function', stateMutability: 'nonpayable',
|
|
107
67
|
inputs: [
|
|
108
|
-
{ name: 'agentId', type: 'uint256' },
|
|
109
|
-
{ name: '
|
|
110
|
-
{ name: 'deadline', type: 'uint256' },
|
|
111
|
-
{ name: 'signature', type: 'bytes' },
|
|
68
|
+
{ name: 'agentId', type: 'uint256' }, { name: 'newWallet', type: 'address' },
|
|
69
|
+
{ name: 'deadline', type: 'uint256' }, { name: 'signature', type: 'bytes' },
|
|
112
70
|
],
|
|
113
71
|
outputs: [],
|
|
114
72
|
},
|
|
115
73
|
{
|
|
116
|
-
name: 'unsetAgentWallet',
|
|
117
|
-
type: '
|
|
118
|
-
stateMutability: 'nonpayable',
|
|
119
|
-
inputs: [{ name: 'agentId', type: 'uint256' }],
|
|
120
|
-
outputs: [],
|
|
74
|
+
name: 'unsetAgentWallet', type: 'function', stateMutability: 'nonpayable',
|
|
75
|
+
inputs: [{ name: 'agentId', type: 'uint256' }], outputs: [],
|
|
121
76
|
},
|
|
122
|
-
// ERC-721 ownership
|
|
123
77
|
{
|
|
124
|
-
name: 'ownerOf',
|
|
125
|
-
type: 'function',
|
|
126
|
-
stateMutability: 'view',
|
|
78
|
+
name: 'ownerOf', type: 'function', stateMutability: 'view',
|
|
127
79
|
inputs: [{ name: 'tokenId', type: 'uint256' }],
|
|
128
80
|
outputs: [{ name: '', type: 'address' }],
|
|
129
81
|
},
|
|
130
|
-
// Events
|
|
131
82
|
{
|
|
132
|
-
name: 'Registered',
|
|
133
|
-
type: 'event',
|
|
134
|
-
inputs: [
|
|
83
|
+
name: 'Registered', type: 'event', inputs: [
|
|
135
84
|
{ name: 'agentId', type: 'uint256', indexed: true },
|
|
136
85
|
{ name: 'agentURI', type: 'string', indexed: false },
|
|
137
86
|
{ name: 'owner', type: 'address', indexed: true },
|
|
138
87
|
],
|
|
139
88
|
},
|
|
140
89
|
{
|
|
141
|
-
name: 'URIUpdated',
|
|
142
|
-
type: 'event',
|
|
143
|
-
inputs: [
|
|
90
|
+
name: 'URIUpdated', type: 'event', inputs: [
|
|
144
91
|
{ name: 'agentId', type: 'uint256', indexed: true },
|
|
145
92
|
{ name: 'newURI', type: 'string', indexed: false },
|
|
146
93
|
{ name: 'updatedBy', type: 'address', indexed: true },
|
|
147
94
|
],
|
|
148
95
|
},
|
|
149
96
|
{
|
|
150
|
-
name: 'MetadataSet',
|
|
151
|
-
type: 'event',
|
|
152
|
-
inputs: [
|
|
97
|
+
name: 'MetadataSet', type: 'event', inputs: [
|
|
153
98
|
{ name: 'agentId', type: 'uint256', indexed: true },
|
|
154
99
|
{ name: 'indexedMetadataKey', type: 'string', indexed: true },
|
|
155
100
|
{ name: 'metadataKey', type: 'string', indexed: false },
|
|
@@ -157,73 +102,24 @@ export const ERC8004IdentityRegistryAbi = [
|
|
|
157
102
|
],
|
|
158
103
|
},
|
|
159
104
|
];
|
|
160
|
-
// ───
|
|
105
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
161
106
|
export const METADATA_KEYS = {
|
|
162
|
-
/** Reserved by spec — set via setAgentWallet(), not setMetadata() */
|
|
163
107
|
AGENT_WALLET: 'agentWallet',
|
|
164
|
-
/** Optional: AI model identifier */
|
|
165
108
|
MODEL: 'agentModel',
|
|
166
|
-
/** Optional: model provider */
|
|
167
109
|
MODEL_PROVIDER: 'agentModelProvider',
|
|
168
|
-
/** Optional: agent version string */
|
|
169
110
|
VERSION: 'agentVersion',
|
|
170
|
-
/** Optional: JSON-encoded capability tags */
|
|
171
111
|
CAPABILITIES: 'agentCapabilities',
|
|
172
|
-
/** Optional: agent framework name */
|
|
173
112
|
FRAMEWORK: 'agentFramework',
|
|
174
113
|
};
|
|
175
|
-
/** ERC-8004 registration file type string (MUST match this exactly) */
|
|
176
114
|
export const REGISTRATION_FILE_TYPE = 'https://eips.ethereum.org/EIPS/eip-8004#registration-v1';
|
|
177
|
-
/**
|
|
178
|
-
* Known testnet deployments of ERC-8004 Identity Registry.
|
|
179
|
-
* Mainnet singleton not yet deployed (spec is DRAFT as of Feb 2026).
|
|
180
|
-
* Update these addresses once official deployments are announced.
|
|
181
|
-
*/
|
|
182
115
|
export const KNOWN_REGISTRY_ADDRESSES = {
|
|
183
|
-
// Placeholder — replace with official addresses once deployed
|
|
184
116
|
'base-sepolia': '0x0000000000000000000000000000000000000000',
|
|
185
117
|
};
|
|
186
|
-
// ─── Chain map (mirrors index.ts) ─────────────────────────────────────────────
|
|
187
118
|
const CHAINS = {
|
|
188
|
-
base,
|
|
189
|
-
'base-sepolia': baseSepolia,
|
|
190
|
-
ethereum: mainnet,
|
|
191
|
-
arbitrum,
|
|
192
|
-
polygon,
|
|
119
|
+
base, 'base-sepolia': baseSepolia, ethereum: mainnet, arbitrum, polygon,
|
|
193
120
|
};
|
|
121
|
+
const REGISTERED_TOPIC = '0x6f3c9b7e8c3a5a5f2c3f9b7e8c3a5a5f2c3f9b7e8c3a5a5f2c3f9b7e8c3a5a';
|
|
194
122
|
// ─── Client ──────────────────────────────────────────────────────────────────
|
|
195
|
-
/**
|
|
196
|
-
* ERC-8004 Identity Registry client.
|
|
197
|
-
*
|
|
198
|
-
* Provides type-safe, non-custodial access to the ERC-8004 Identity Registry.
|
|
199
|
-
* All write operations require a WalletClient — keys never leave the caller's device.
|
|
200
|
-
*
|
|
201
|
-
* @example
|
|
202
|
-
* ```typescript
|
|
203
|
-
* import { ERC8004Client } from '@agentwallet/sdk';
|
|
204
|
-
*
|
|
205
|
-
* const identity = new ERC8004Client({
|
|
206
|
-
* registryAddress: '0xYOUR_REGISTRY',
|
|
207
|
-
* chain: 'base',
|
|
208
|
-
* });
|
|
209
|
-
*
|
|
210
|
-
* // Register a new agent identity
|
|
211
|
-
* const { txHash, agentId } = await identity.registerAgent(
|
|
212
|
-
* walletClient,
|
|
213
|
-
* {
|
|
214
|
-
* name: 'MyTradingAgent',
|
|
215
|
-
* description: 'Autonomous DeFi trading agent',
|
|
216
|
-
* services: [{ name: 'A2A', endpoint: 'https://agent.example/.well-known/agent-card.json' }],
|
|
217
|
-
* x402Support: true,
|
|
218
|
-
* active: true,
|
|
219
|
-
* },
|
|
220
|
-
* 'ipfs://QmYourCID'
|
|
221
|
-
* );
|
|
222
|
-
*
|
|
223
|
-
* // Lookup an agent
|
|
224
|
-
* const agentIdentity = await identity.lookupAgentIdentity(walletClient.account!.address);
|
|
225
|
-
* ```
|
|
226
|
-
*/
|
|
227
123
|
export class ERC8004Client {
|
|
228
124
|
constructor(config) {
|
|
229
125
|
this.config = config;
|
|
@@ -231,12 +127,8 @@ export class ERC8004Client {
|
|
|
231
127
|
if (!chain)
|
|
232
128
|
throw new Error(`ERC8004Client: Unsupported chain "${config.chain}"`);
|
|
233
129
|
this.chain = chain;
|
|
234
|
-
this.publicClient = createPublicClient({
|
|
235
|
-
chain,
|
|
236
|
-
transport: http(config.rpcUrl),
|
|
237
|
-
});
|
|
130
|
+
this.publicClient = createPublicClient({ chain, transport: http(config.rpcUrl) });
|
|
238
131
|
}
|
|
239
|
-
/** @internal Get a viem contract instance for read operations */
|
|
240
132
|
getReadContract() {
|
|
241
133
|
return getContract({
|
|
242
134
|
address: this.config.registryAddress,
|
|
@@ -244,7 +136,6 @@ export class ERC8004Client {
|
|
|
244
136
|
client: this.publicClient,
|
|
245
137
|
});
|
|
246
138
|
}
|
|
247
|
-
/** @internal Get a viem contract instance for read+write operations */
|
|
248
139
|
getWriteContract(walletClient) {
|
|
249
140
|
return getContract({
|
|
250
141
|
address: this.config.registryAddress,
|
|
@@ -252,50 +143,24 @@ export class ERC8004Client {
|
|
|
252
143
|
client: { public: this.publicClient, wallet: walletClient },
|
|
253
144
|
});
|
|
254
145
|
}
|
|
255
|
-
// ─── Registration ───────────────────────────────────────────────────────
|
|
256
|
-
/**
|
|
257
|
-
* Register a new agent identity on-chain.
|
|
258
|
-
*
|
|
259
|
-
* Builds a spec-compliant registration file JSON and registers it via
|
|
260
|
-
* the Identity Registry. The URI can be:
|
|
261
|
-
* - An IPFS URI you've already pinned: "ipfs://QmYourCID"
|
|
262
|
-
* - A base64 data URI for fully on-chain storage (auto-generated if not provided)
|
|
263
|
-
* - An HTTPS URI pointing to a static JSON file
|
|
264
|
-
*
|
|
265
|
-
* Non-custodial: the walletClient signs the transaction locally.
|
|
266
|
-
*
|
|
267
|
-
* @param walletClient - WalletClient controlling the agent owner key
|
|
268
|
-
* @param metadata - Agent metadata to include in the registration file
|
|
269
|
-
* @param agentURI - URI for the registration file (auto-builds data URI if omitted)
|
|
270
|
-
* @param onChainMetadata - Optional extra on-chain key/value pairs
|
|
271
|
-
* @returns txHash and agentId (from Registered event)
|
|
272
|
-
*/
|
|
273
146
|
async registerAgent(walletClient, metadata, agentURI, onChainMetadata) {
|
|
274
147
|
if (!walletClient.account)
|
|
275
148
|
throw new Error('ERC8004Client: WalletClient has no account');
|
|
276
|
-
const registrationFile = {
|
|
277
|
-
|
|
278
|
-
...metadata,
|
|
279
|
-
};
|
|
280
|
-
// Build data URI if no external URI provided
|
|
281
|
-
const resolvedURI = agentURI ??
|
|
282
|
-
buildDataURI(registrationFile);
|
|
149
|
+
const registrationFile = { type: REGISTRATION_FILE_TYPE, ...metadata };
|
|
150
|
+
const resolvedURI = agentURI ?? buildDataURI(registrationFile);
|
|
283
151
|
const contract = this.getWriteContract(walletClient);
|
|
284
152
|
let txHash;
|
|
285
153
|
if (onChainMetadata && Object.keys(onChainMetadata).length > 0) {
|
|
286
154
|
const entries = encodeMetadataEntries(onChainMetadata);
|
|
287
155
|
txHash = await contract.write.registerWithMetadata([resolvedURI, entries], {
|
|
288
|
-
account: walletClient.account,
|
|
289
|
-
chain: this.chain,
|
|
156
|
+
account: walletClient.account, chain: this.chain,
|
|
290
157
|
});
|
|
291
158
|
}
|
|
292
159
|
else {
|
|
293
160
|
txHash = await contract.write.register([resolvedURI], {
|
|
294
|
-
account: walletClient.account,
|
|
295
|
-
chain: this.chain,
|
|
161
|
+
account: walletClient.account, chain: this.chain,
|
|
296
162
|
});
|
|
297
163
|
}
|
|
298
|
-
// Extract agentId from Registered event in receipt
|
|
299
164
|
let agentId = null;
|
|
300
165
|
try {
|
|
301
166
|
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
@@ -306,19 +171,10 @@ export class ERC8004Client {
|
|
|
306
171
|
}
|
|
307
172
|
}
|
|
308
173
|
catch {
|
|
309
|
-
// agentId remains null
|
|
174
|
+
// agentId remains null
|
|
310
175
|
}
|
|
311
176
|
return { txHash, agentId };
|
|
312
177
|
}
|
|
313
|
-
// ─── Lookup ─────────────────────────────────────────────────────────────
|
|
314
|
-
/**
|
|
315
|
-
* Look up an agent's full identity by their on-chain token ID.
|
|
316
|
-
*
|
|
317
|
-
* Fetches: owner, URI, payment wallet, and attempts to parse the
|
|
318
|
-
* registration file. Also reads standard on-chain model metadata if present.
|
|
319
|
-
*
|
|
320
|
-
* @param agentId - The ERC-721 tokenId assigned during registration
|
|
321
|
-
*/
|
|
322
178
|
async lookupAgentIdentity(agentId) {
|
|
323
179
|
const contract = this.getReadContract();
|
|
324
180
|
const [owner, agentURI, agentWallet] = await Promise.all([
|
|
@@ -326,97 +182,50 @@ export class ERC8004Client {
|
|
|
326
182
|
contract.read.tokenURI([agentId]),
|
|
327
183
|
contract.read.getAgentWallet([agentId]),
|
|
328
184
|
]);
|
|
329
|
-
// Attempt to parse registration file from URI
|
|
330
185
|
let registrationFile = null;
|
|
331
186
|
try {
|
|
332
187
|
registrationFile = await resolveAgentURI(agentURI);
|
|
333
188
|
}
|
|
334
|
-
catch {
|
|
335
|
-
// URI may be an external HTTPS/IPFS that's unavailable in this context
|
|
336
|
-
}
|
|
337
|
-
// Read optional on-chain model metadata
|
|
189
|
+
catch { /* unavailable */ }
|
|
338
190
|
const modelMetadata = await this.readModelMetadata(agentId);
|
|
339
191
|
return {
|
|
340
|
-
agentId,
|
|
341
|
-
|
|
342
|
-
agentURI,
|
|
343
|
-
agentWallet,
|
|
344
|
-
registrationFile,
|
|
345
|
-
modelMetadata,
|
|
192
|
+
agentId, owner: owner, agentURI: agentURI,
|
|
193
|
+
agentWallet: agentWallet, registrationFile, modelMetadata,
|
|
346
194
|
};
|
|
347
195
|
}
|
|
348
|
-
/**
|
|
349
|
-
* Look up an agent's identity by their wallet/owner address.
|
|
350
|
-
* Scans the Registered event log to find the most recent agentId for this owner.
|
|
351
|
-
*
|
|
352
|
-
* @param ownerAddress - The agent owner's Ethereum address
|
|
353
|
-
* @param fromBlock - Start scanning from this block (default: 0)
|
|
354
|
-
*/
|
|
355
196
|
async lookupAgentByOwner(ownerAddress, fromBlock = 0n) {
|
|
356
197
|
const logs = await this.publicClient.getLogs({
|
|
357
198
|
address: this.config.registryAddress,
|
|
358
199
|
event: {
|
|
359
|
-
type: 'event',
|
|
360
|
-
name: 'Registered',
|
|
200
|
+
type: 'event', name: 'Registered',
|
|
361
201
|
inputs: [
|
|
362
202
|
{ name: 'agentId', type: 'uint256', indexed: true },
|
|
363
203
|
{ name: 'agentURI', type: 'string', indexed: false },
|
|
364
204
|
{ name: 'owner', type: 'address', indexed: true },
|
|
365
205
|
],
|
|
366
206
|
},
|
|
367
|
-
args: {
|
|
368
|
-
|
|
369
|
-
},
|
|
370
|
-
fromBlock,
|
|
371
|
-
toBlock: 'latest',
|
|
207
|
+
args: { owner: ownerAddress },
|
|
208
|
+
fromBlock, toBlock: 'latest',
|
|
372
209
|
});
|
|
373
210
|
if (logs.length === 0)
|
|
374
211
|
return null;
|
|
375
|
-
// Use the most recently registered agentId
|
|
376
212
|
const latestLog = logs[logs.length - 1];
|
|
377
213
|
const agentId = BigInt(latestLog.args?.agentId ?? 0);
|
|
378
214
|
return this.lookupAgentIdentity(agentId);
|
|
379
215
|
}
|
|
380
|
-
// ─── URI Management ─────────────────────────────────────────────────────
|
|
381
|
-
/**
|
|
382
|
-
* Update the agent's registration file URI.
|
|
383
|
-
* Only callable by the NFT owner or an approved operator.
|
|
384
|
-
*
|
|
385
|
-
* @param walletClient - Owner/operator WalletClient
|
|
386
|
-
* @param agentId - The agent's tokenId
|
|
387
|
-
* @param newURI - New URI pointing to updated registration file
|
|
388
|
-
*/
|
|
389
216
|
async updateAgentURI(walletClient, agentId, newURI) {
|
|
390
217
|
if (!walletClient.account)
|
|
391
218
|
throw new Error('ERC8004Client: WalletClient has no account');
|
|
392
219
|
const contract = this.getWriteContract(walletClient);
|
|
393
220
|
return contract.write.setAgentURI([agentId, newURI], {
|
|
394
|
-
account: walletClient.account,
|
|
395
|
-
chain: this.chain,
|
|
221
|
+
account: walletClient.account, chain: this.chain,
|
|
396
222
|
});
|
|
397
223
|
}
|
|
398
|
-
// ─── On-chain Metadata ──────────────────────────────────────────────────
|
|
399
|
-
/**
|
|
400
|
-
* Read a single on-chain metadata value for an agent.
|
|
401
|
-
*
|
|
402
|
-
* @param agentId - The agent's tokenId
|
|
403
|
-
* @param key - Metadata key (see METADATA_KEYS for standard keys)
|
|
404
|
-
* @returns Raw bytes value, or null if not set
|
|
405
|
-
*/
|
|
406
224
|
async getOnChainMetadata(agentId, key) {
|
|
407
225
|
const contract = this.getReadContract();
|
|
408
226
|
const value = await contract.read.getMetadata([agentId, key]);
|
|
409
227
|
return value === '0x' || value === null ? null : value;
|
|
410
228
|
}
|
|
411
|
-
/**
|
|
412
|
-
* Write a single on-chain metadata value for an agent.
|
|
413
|
-
* Note: the reserved 'agentWallet' key cannot be set via this method.
|
|
414
|
-
*
|
|
415
|
-
* @param walletClient - Owner/operator WalletClient
|
|
416
|
-
* @param agentId - The agent's tokenId
|
|
417
|
-
* @param key - Metadata key
|
|
418
|
-
* @param value - UTF-8 string value (will be hex-encoded)
|
|
419
|
-
*/
|
|
420
229
|
async setOnChainMetadata(walletClient, agentId, key, value) {
|
|
421
230
|
if (!walletClient.account)
|
|
422
231
|
throw new Error('ERC8004Client: WalletClient has no account');
|
|
@@ -426,18 +235,9 @@ export class ERC8004Client {
|
|
|
426
235
|
const contract = this.getWriteContract(walletClient);
|
|
427
236
|
const hexValue = stringToHex(value);
|
|
428
237
|
return contract.write.setMetadata([agentId, key, hexValue], {
|
|
429
|
-
account: walletClient.account,
|
|
430
|
-
chain: this.chain,
|
|
238
|
+
account: walletClient.account, chain: this.chain,
|
|
431
239
|
});
|
|
432
240
|
}
|
|
433
|
-
/**
|
|
434
|
-
* Write model metadata on-chain for an agent.
|
|
435
|
-
* Uses the standard METADATA_KEYS constants.
|
|
436
|
-
*
|
|
437
|
-
* @param walletClient - Owner/operator WalletClient
|
|
438
|
-
* @param agentId - The agent's tokenId
|
|
439
|
-
* @param model - Model metadata object
|
|
440
|
-
*/
|
|
441
241
|
async setModelMetadata(walletClient, agentId, model) {
|
|
442
242
|
const hashes = [];
|
|
443
243
|
const entries = [];
|
|
@@ -449,33 +249,20 @@ export class ERC8004Client {
|
|
|
449
249
|
entries.push([METADATA_KEYS.VERSION, model.version]);
|
|
450
250
|
if (model.framework)
|
|
451
251
|
entries.push([METADATA_KEYS.FRAMEWORK, model.framework]);
|
|
452
|
-
if (model.capabilities?.length)
|
|
252
|
+
if (model.capabilities?.length)
|
|
453
253
|
entries.push([METADATA_KEYS.CAPABILITIES, JSON.stringify(model.capabilities)]);
|
|
454
|
-
}
|
|
455
254
|
for (const [key, val] of entries) {
|
|
456
255
|
const hash = await this.setOnChainMetadata(walletClient, agentId, key, val);
|
|
457
256
|
hashes.push(hash);
|
|
458
257
|
}
|
|
459
258
|
return hashes;
|
|
460
259
|
}
|
|
461
|
-
/**
|
|
462
|
-
* Read all standard model metadata for an agent.
|
|
463
|
-
* Returns null if no model metadata has been set.
|
|
464
|
-
*/
|
|
465
260
|
async readModelMetadata(agentId) {
|
|
466
|
-
const keys = [
|
|
467
|
-
METADATA_KEYS.MODEL,
|
|
468
|
-
METADATA_KEYS.MODEL_PROVIDER,
|
|
469
|
-
METADATA_KEYS.VERSION,
|
|
470
|
-
METADATA_KEYS.FRAMEWORK,
|
|
471
|
-
METADATA_KEYS.CAPABILITIES,
|
|
472
|
-
];
|
|
261
|
+
const keys = [METADATA_KEYS.MODEL, METADATA_KEYS.MODEL_PROVIDER, METADATA_KEYS.VERSION, METADATA_KEYS.FRAMEWORK, METADATA_KEYS.CAPABILITIES];
|
|
473
262
|
const values = await Promise.all(keys.map((k) => this.getOnChainMetadata(agentId, k)));
|
|
474
263
|
const [modelHex, providerHex, versionHex, frameworkHex, capabilitiesHex] = values;
|
|
475
|
-
|
|
476
|
-
if (!modelHex && !providerHex && !versionHex && !frameworkHex && !capabilitiesHex) {
|
|
264
|
+
if (!modelHex && !providerHex && !versionHex && !frameworkHex && !capabilitiesHex)
|
|
477
265
|
return null;
|
|
478
|
-
}
|
|
479
266
|
const result = {};
|
|
480
267
|
if (modelHex)
|
|
481
268
|
result.model = hexToString(modelHex);
|
|
@@ -495,115 +282,63 @@ export class ERC8004Client {
|
|
|
495
282
|
}
|
|
496
283
|
return result;
|
|
497
284
|
}
|
|
498
|
-
// ─── Agent Wallet ────────────────────────────────────────────────────────
|
|
499
|
-
/**
|
|
500
|
-
* Get the configured payment wallet for an agent.
|
|
501
|
-
* Returns zero address if not set (payment defaults to NFT owner).
|
|
502
|
-
*
|
|
503
|
-
* @param agentId - The agent's tokenId
|
|
504
|
-
*/
|
|
505
285
|
async getAgentWallet(agentId) {
|
|
506
286
|
const contract = this.getReadContract();
|
|
507
287
|
return contract.read.getAgentWallet([agentId]);
|
|
508
288
|
}
|
|
509
|
-
/**
|
|
510
|
-
* Set the payment wallet for an agent.
|
|
511
|
-
* Requires an EIP-712 signature from the new wallet to prove control.
|
|
512
|
-
* This prevents draining payments to an attacker-controlled address.
|
|
513
|
-
*
|
|
514
|
-
* Non-custodial: the signature is generated locally by the walletClient.
|
|
515
|
-
*
|
|
516
|
-
* @param walletClient - Owner WalletClient (must own the agent NFT)
|
|
517
|
-
* @param agentId - The agent's tokenId
|
|
518
|
-
* @param newWallet - New payment wallet address
|
|
519
|
-
* @param deadline - Signature deadline (Unix timestamp)
|
|
520
|
-
* @param signature - EIP-712 or ERC-1271 signature from newWallet proving control
|
|
521
|
-
*/
|
|
522
289
|
async setAgentWallet(walletClient, agentId, newWallet, deadline, signature) {
|
|
523
290
|
if (!walletClient.account)
|
|
524
291
|
throw new Error('ERC8004Client: WalletClient has no account');
|
|
525
292
|
const contract = this.getWriteContract(walletClient);
|
|
526
|
-
return contract.write.setAgentWallet([agentId, newWallet, deadline, signature], {
|
|
293
|
+
return contract.write.setAgentWallet([agentId, newWallet, deadline, signature], {
|
|
294
|
+
account: walletClient.account, chain: this.chain,
|
|
295
|
+
});
|
|
527
296
|
}
|
|
528
|
-
/**
|
|
529
|
-
* Clear the agent wallet (resets payment address to NFT owner).
|
|
530
|
-
*
|
|
531
|
-
* @param walletClient - Owner WalletClient
|
|
532
|
-
* @param agentId - The agent's tokenId
|
|
533
|
-
*/
|
|
534
297
|
async unsetAgentWallet(walletClient, agentId) {
|
|
535
298
|
if (!walletClient.account)
|
|
536
299
|
throw new Error('ERC8004Client: WalletClient has no account');
|
|
537
300
|
const contract = this.getWriteContract(walletClient);
|
|
538
301
|
return contract.write.unsetAgentWallet([agentId], {
|
|
539
|
-
account: walletClient.account,
|
|
540
|
-
chain: this.chain,
|
|
302
|
+
account: walletClient.account, chain: this.chain,
|
|
541
303
|
});
|
|
542
304
|
}
|
|
543
305
|
}
|
|
544
306
|
// ─── Standalone helpers ───────────────────────────────────────────────────────
|
|
545
|
-
/**
|
|
546
|
-
* Build a base64 data URI from an agent registration file.
|
|
547
|
-
* Enables fully on-chain metadata storage without IPFS or HTTPS dependencies.
|
|
548
|
-
*
|
|
549
|
-
* @example
|
|
550
|
-
* const uri = buildDataURI({ name: 'MyAgent', description: '...', ... });
|
|
551
|
-
* // → "data:application/json;base64,eyJ0..."
|
|
552
|
-
*/
|
|
553
307
|
export function buildDataURI(registrationFile) {
|
|
554
|
-
// Ensure type field isn't duplicated if registrationFile already has it
|
|
555
308
|
const payload = { ...registrationFile, type: REGISTRATION_FILE_TYPE };
|
|
556
309
|
const json = JSON.stringify(payload);
|
|
557
|
-
// btoa requires Latin1 — use encodeURIComponent to handle UTF-8 safely
|
|
558
310
|
const b64 = btoa(unescape(encodeURIComponent(json)));
|
|
559
311
|
return `data:application/json;base64,${b64}`;
|
|
560
312
|
}
|
|
561
|
-
/**
|
|
562
|
-
* Parse a data URI or plain JSON string into an AgentRegistrationFile.
|
|
563
|
-
* For HTTPS/IPFS URIs, use resolveAgentURI() instead.
|
|
564
|
-
*/
|
|
565
313
|
export function parseDataURI(uri) {
|
|
566
314
|
if (uri.startsWith('data:application/json;base64,')) {
|
|
567
315
|
const b64 = uri.replace('data:application/json;base64,', '');
|
|
568
316
|
const json = decodeURIComponent(escape(atob(b64)));
|
|
569
317
|
return JSON.parse(json);
|
|
570
318
|
}
|
|
571
|
-
if (uri.startsWith('{'))
|
|
319
|
+
if (uri.startsWith('{'))
|
|
572
320
|
return JSON.parse(uri);
|
|
573
|
-
}
|
|
574
|
-
throw new Error(`parseDataURI: Cannot parse URI scheme — use resolveAgentURI for HTTP/IPFS: ${uri.substring(0, 50)}`);
|
|
321
|
+
throw new Error(`parseDataURI: Cannot parse URI scheme: ${uri.substring(0, 50)}`);
|
|
575
322
|
}
|
|
576
|
-
/**
|
|
577
|
-
* Resolve an agentURI to its registration file.
|
|
578
|
-
* Supports: data URIs (inline), HTTPS (fetch), IPFS (not fetched — throws).
|
|
579
|
-
*/
|
|
580
323
|
export async function resolveAgentURI(uri) {
|
|
581
|
-
if (uri.startsWith('data:'))
|
|
324
|
+
if (uri.startsWith('data:'))
|
|
582
325
|
return parseDataURI(uri);
|
|
583
|
-
}
|
|
584
326
|
if (uri.startsWith('https://') || uri.startsWith('http://')) {
|
|
585
327
|
const response = await fetch(uri);
|
|
586
328
|
if (!response.ok)
|
|
587
329
|
throw new Error(`resolveAgentURI: HTTP ${response.status} for ${uri}`);
|
|
588
330
|
return response.json();
|
|
589
331
|
}
|
|
590
|
-
throw new Error(`resolveAgentURI: Unsupported URI scheme
|
|
332
|
+
throw new Error(`resolveAgentURI: Unsupported URI scheme: ${uri}`);
|
|
591
333
|
}
|
|
592
|
-
/**
|
|
593
|
-
* Validate an AgentRegistrationFile against ERC-8004 requirements.
|
|
594
|
-
* Returns an array of validation errors (empty = valid).
|
|
595
|
-
*/
|
|
596
334
|
export function validateRegistrationFile(file) {
|
|
597
335
|
const errors = [];
|
|
598
|
-
if (file.type !== REGISTRATION_FILE_TYPE)
|
|
336
|
+
if (file.type !== REGISTRATION_FILE_TYPE)
|
|
599
337
|
errors.push(`type must be "${REGISTRATION_FILE_TYPE}"`);
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
}
|
|
604
|
-
if (!file.description || typeof file.description !== 'string') {
|
|
338
|
+
if (!file.name || typeof file.name !== 'string' || file.name.trim() === '')
|
|
339
|
+
errors.push('name is required');
|
|
340
|
+
if (!file.description || typeof file.description !== 'string')
|
|
605
341
|
errors.push('description is required');
|
|
606
|
-
}
|
|
607
342
|
if (file.services) {
|
|
608
343
|
file.services.forEach((svc, i) => {
|
|
609
344
|
if (!svc.name)
|
|
@@ -622,29 +357,18 @@ export function validateRegistrationFile(file) {
|
|
|
622
357
|
}
|
|
623
358
|
return errors;
|
|
624
359
|
}
|
|
625
|
-
/**
|
|
626
|
-
* Format an agent registry identifier per ERC-8004 spec.
|
|
627
|
-
*
|
|
628
|
-
* @param chainId - Chain ID (e.g. 8453 for Base)
|
|
629
|
-
* @param registryAddress - Identity Registry contract address
|
|
630
|
-
* @returns "{namespace}:{chainId}:{identityRegistry}" e.g. "eip155:8453:0x742..."
|
|
631
|
-
*/
|
|
632
360
|
export function formatAgentRegistry(chainId, registryAddress) {
|
|
633
361
|
return `eip155:${chainId}:${registryAddress}`;
|
|
634
362
|
}
|
|
635
363
|
// ─── Internal utilities ───────────────────────────────────────────────────────
|
|
636
|
-
/** keccak256 topic for Registered(uint256 indexed, string, address indexed) */
|
|
637
|
-
const REGISTERED_TOPIC = '0x6f3c9b7e8c3a5a5f2c3f9b7e8c3a5a5f2c3f9b7e8c3a5a5f2c3f9b7e8c3a5a';
|
|
638
364
|
function stringToHex(str) {
|
|
639
365
|
const bytes = new TextEncoder().encode(str);
|
|
640
|
-
const hexStr = Array.from(bytes)
|
|
641
|
-
.map((b) => b.toString(16).padStart(2, '0'))
|
|
642
|
-
.join('');
|
|
366
|
+
const hexStr = Array.from(bytes).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
643
367
|
return ('0x' + hexStr);
|
|
644
368
|
}
|
|
645
369
|
function hexToString(hex) {
|
|
646
370
|
const stripped = hex.startsWith('0x') ? hex.slice(2) : hex;
|
|
647
|
-
const bytes = new Uint8Array(stripped.match(/.{1,2}/g).map(byte => parseInt(byte, 16)));
|
|
371
|
+
const bytes = new Uint8Array(stripped.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
|
648
372
|
return new TextDecoder('utf-8').decode(bytes);
|
|
649
373
|
}
|
|
650
374
|
function encodeMetadataEntries(entries) {
|