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.
Files changed (320) hide show
  1. package/README.md +41 -516
  2. package/dist/bridge/abis.d.ts +48 -171
  3. package/dist/bridge/abis.d.ts.map +1 -1
  4. package/dist/bridge/abis.js.map +1 -1
  5. package/dist/bridge/client.d.ts +2 -41
  6. package/dist/bridge/client.d.ts.map +1 -1
  7. package/dist/bridge/client.js +35 -168
  8. package/dist/bridge/client.js.map +1 -1
  9. package/dist/bridge/index.d.ts +2 -4
  10. package/dist/bridge/index.d.ts.map +1 -1
  11. package/dist/bridge/index.js +1 -8
  12. package/dist/bridge/index.js.map +1 -1
  13. package/dist/bridge/types.d.ts +15 -134
  14. package/dist/bridge/types.d.ts.map +1 -1
  15. package/dist/bridge/types.js +16 -170
  16. package/dist/bridge/types.js.map +1 -1
  17. package/dist/identity/erc8004.d.ts +2 -240
  18. package/dist/identity/erc8004.d.ts.map +1 -1
  19. package/dist/identity/erc8004.js +58 -334
  20. package/dist/identity/erc8004.js.map +1 -1
  21. package/dist/index.d.ts +313 -136
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +11 -59
  24. package/dist/index.js.map +1 -1
  25. package/dist/swap/SwapModule.d.ts +6 -50
  26. package/dist/swap/SwapModule.d.ts.map +1 -1
  27. package/dist/swap/SwapModule.js +25 -153
  28. package/dist/swap/SwapModule.js.map +1 -1
  29. package/dist/swap/abi.d.ts +47 -165
  30. package/dist/swap/abi.d.ts.map +1 -1
  31. package/dist/swap/abi.js.map +1 -1
  32. package/dist/swap/index.d.ts +2 -3
  33. package/dist/swap/index.d.ts.map +1 -1
  34. package/dist/swap/index.js +1 -4
  35. package/dist/swap/index.js.map +1 -1
  36. package/dist/swap/types.d.ts +6 -36
  37. package/dist/swap/types.d.ts.map +1 -1
  38. package/dist/swap/types.js +0 -1
  39. package/dist/swap/types.js.map +1 -1
  40. package/dist/types.d.ts +1 -2
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/types.js +0 -1
  43. package/dist/types.js.map +1 -1
  44. package/dist/x402/__tests__/budget.test.d.ts +2 -0
  45. package/dist/x402/__tests__/budget.test.d.ts.map +1 -0
  46. package/dist/x402/__tests__/budget.test.js +114 -0
  47. package/dist/x402/__tests__/budget.test.js.map +1 -0
  48. package/dist/x402/__tests__/client.test.d.ts +2 -0
  49. package/dist/x402/__tests__/client.test.d.ts.map +1 -0
  50. package/dist/x402/__tests__/client.test.js +107 -0
  51. package/dist/x402/__tests__/client.test.js.map +1 -0
  52. package/dist/x402/chains/abstract/index.d.ts +135 -0
  53. package/dist/x402/chains/abstract/index.d.ts.map +1 -0
  54. package/dist/x402/chains/abstract/index.js +190 -0
  55. package/dist/x402/chains/abstract/index.js.map +1 -0
  56. package/dist/x402/client.d.ts +1 -4
  57. package/dist/x402/client.d.ts.map +1 -1
  58. package/dist/x402/client.js +2 -16
  59. package/dist/x402/client.js.map +1 -1
  60. package/dist/x402/index.d.ts +3 -1
  61. package/dist/x402/index.d.ts.map +1 -1
  62. package/dist/x402/index.js +3 -1
  63. package/dist/x402/index.js.map +1 -1
  64. package/dist/x402/types.d.ts +3 -5
  65. package/dist/x402/types.d.ts.map +1 -1
  66. package/dist/x402/types.js +2 -17
  67. package/dist/x402/types.js.map +1 -1
  68. package/package.json +12 -32
  69. package/dist/ap2/index.d.ts +0 -185
  70. package/dist/ap2/index.d.ts.map +0 -1
  71. package/dist/ap2/index.js +0 -255
  72. package/dist/ap2/index.js.map +0 -1
  73. package/dist/bridge/unified.d.ts +0 -101
  74. package/dist/bridge/unified.d.ts.map +0 -1
  75. package/dist/bridge/unified.js +0 -284
  76. package/dist/bridge/unified.js.map +0 -1
  77. package/dist/chains.d.ts +0 -62
  78. package/dist/chains.d.ts.map +0 -1
  79. package/dist/chains.js +0 -108
  80. package/dist/chains.js.map +0 -1
  81. package/dist/fiat/index.d.ts +0 -10
  82. package/dist/fiat/index.d.ts.map +0 -1
  83. package/dist/fiat/index.js +0 -9
  84. package/dist/fiat/index.js.map +0 -1
  85. package/dist/fiat/onramp.d.ts +0 -101
  86. package/dist/fiat/onramp.d.ts.map +0 -1
  87. package/dist/fiat/onramp.js +0 -155
  88. package/dist/fiat/onramp.js.map +0 -1
  89. package/dist/fiat/providers/index.d.ts +0 -16
  90. package/dist/fiat/providers/index.d.ts.map +0 -1
  91. package/dist/fiat/providers/index.js +0 -30
  92. package/dist/fiat/providers/index.js.map +0 -1
  93. package/dist/fiat/providers/moonpay.d.ts +0 -22
  94. package/dist/fiat/providers/moonpay.d.ts.map +0 -1
  95. package/dist/fiat/providers/moonpay.js +0 -107
  96. package/dist/fiat/providers/moonpay.js.map +0 -1
  97. package/dist/fiat/providers/stripe.d.ts +0 -26
  98. package/dist/fiat/providers/stripe.d.ts.map +0 -1
  99. package/dist/fiat/providers/stripe.js +0 -135
  100. package/dist/fiat/providers/stripe.js.map +0 -1
  101. package/dist/fiat/providers/transak.d.ts +0 -26
  102. package/dist/fiat/providers/transak.d.ts.map +0 -1
  103. package/dist/fiat/providers/transak.js +0 -119
  104. package/dist/fiat/providers/transak.js.map +0 -1
  105. package/dist/fiat/types.d.ts +0 -106
  106. package/dist/fiat/types.d.ts.map +0 -1
  107. package/dist/fiat/types.js +0 -13
  108. package/dist/fiat/types.js.map +0 -1
  109. package/dist/flash/executor.d.ts +0 -119
  110. package/dist/flash/executor.d.ts.map +0 -1
  111. package/dist/flash/executor.js +0 -195
  112. package/dist/flash/executor.js.map +0 -1
  113. package/dist/flash/index.d.ts +0 -28
  114. package/dist/flash/index.d.ts.map +0 -1
  115. package/dist/flash/index.js +0 -25
  116. package/dist/flash/index.js.map +0 -1
  117. package/dist/flash/scanner.d.ts +0 -133
  118. package/dist/flash/scanner.d.ts.map +0 -1
  119. package/dist/flash/scanner.js +0 -212
  120. package/dist/flash/scanner.js.map +0 -1
  121. package/dist/flash/types.d.ts +0 -136
  122. package/dist/flash/types.d.ts.map +0 -1
  123. package/dist/flash/types.js +0 -23
  124. package/dist/flash/types.js.map +0 -1
  125. package/dist/gas/index.d.ts +0 -4
  126. package/dist/gas/index.d.ts.map +0 -1
  127. package/dist/gas/index.js +0 -3
  128. package/dist/gas/index.js.map +0 -1
  129. package/dist/gas/sponsor.d.ts +0 -70
  130. package/dist/gas/sponsor.d.ts.map +0 -1
  131. package/dist/gas/sponsor.js +0 -193
  132. package/dist/gas/sponsor.js.map +0 -1
  133. package/dist/gas/types.d.ts +0 -76
  134. package/dist/gas/types.d.ts.map +0 -1
  135. package/dist/gas/types.js +0 -21
  136. package/dist/gas/types.js.map +0 -1
  137. package/dist/identity/agent-identity.d.ts +0 -276
  138. package/dist/identity/agent-identity.d.ts.map +0 -1
  139. package/dist/identity/agent-identity.js +0 -300
  140. package/dist/identity/agent-identity.js.map +0 -1
  141. package/dist/identity/erc6551.d.ts +0 -441
  142. package/dist/identity/erc6551.d.ts.map +0 -1
  143. package/dist/identity/erc6551.js +0 -517
  144. package/dist/identity/erc6551.js.map +0 -1
  145. package/dist/mev/index.d.ts +0 -4
  146. package/dist/mev/index.d.ts.map +0 -1
  147. package/dist/mev/index.js +0 -4
  148. package/dist/mev/index.js.map +0 -1
  149. package/dist/mev/protection.d.ts +0 -54
  150. package/dist/mev/protection.d.ts.map +0 -1
  151. package/dist/mev/protection.js +0 -185
  152. package/dist/mev/protection.js.map +0 -1
  153. package/dist/mev/risk.d.ts +0 -19
  154. package/dist/mev/risk.d.ts.map +0 -1
  155. package/dist/mev/risk.js +0 -95
  156. package/dist/mev/risk.js.map +0 -1
  157. package/dist/mev/types.d.ts +0 -49
  158. package/dist/mev/types.d.ts.map +0 -1
  159. package/dist/mev/types.js +0 -2
  160. package/dist/mev/types.js.map +0 -1
  161. package/dist/settlement/index.d.ts +0 -4
  162. package/dist/settlement/index.d.ts.map +0 -1
  163. package/dist/settlement/index.js +0 -3
  164. package/dist/settlement/index.js.map +0 -1
  165. package/dist/settlement/types.d.ts +0 -66
  166. package/dist/settlement/types.d.ts.map +0 -1
  167. package/dist/settlement/types.js +0 -37
  168. package/dist/settlement/types.js.map +0 -1
  169. package/dist/settlement/verifier.d.ts +0 -75
  170. package/dist/settlement/verifier.d.ts.map +0 -1
  171. package/dist/settlement/verifier.js +0 -354
  172. package/dist/settlement/verifier.js.map +0 -1
  173. package/dist/solana/bridge.d.ts +0 -144
  174. package/dist/solana/bridge.d.ts.map +0 -1
  175. package/dist/solana/bridge.js +0 -352
  176. package/dist/solana/bridge.js.map +0 -1
  177. package/dist/solana/index.d.ts +0 -8
  178. package/dist/solana/index.d.ts.map +0 -1
  179. package/dist/solana/index.js +0 -6
  180. package/dist/solana/index.js.map +0 -1
  181. package/dist/solana/swap.d.ts +0 -85
  182. package/dist/solana/swap.d.ts.map +0 -1
  183. package/dist/solana/swap.js +0 -173
  184. package/dist/solana/swap.js.map +0 -1
  185. package/dist/solana/types.d.ts +0 -126
  186. package/dist/solana/types.d.ts.map +0 -1
  187. package/dist/solana/types.js +0 -10
  188. package/dist/solana/types.js.map +0 -1
  189. package/dist/solana/wallet.d.ts +0 -83
  190. package/dist/solana/wallet.d.ts.map +0 -1
  191. package/dist/solana/wallet.js +0 -164
  192. package/dist/solana/wallet.js.map +0 -1
  193. package/dist/solana/x402.d.ts +0 -69
  194. package/dist/solana/x402.d.ts.map +0 -1
  195. package/dist/solana/x402.js +0 -154
  196. package/dist/solana/x402.js.map +0 -1
  197. package/dist/solver/adapter.d.ts +0 -47
  198. package/dist/solver/adapter.d.ts.map +0 -1
  199. package/dist/solver/adapter.js +0 -138
  200. package/dist/solver/adapter.js.map +0 -1
  201. package/dist/solver/analyzer.d.ts +0 -48
  202. package/dist/solver/analyzer.d.ts.map +0 -1
  203. package/dist/solver/analyzer.js +0 -89
  204. package/dist/solver/analyzer.js.map +0 -1
  205. package/dist/solver/builder.d.ts +0 -31
  206. package/dist/solver/builder.d.ts.map +0 -1
  207. package/dist/solver/builder.js +0 -60
  208. package/dist/solver/builder.js.map +0 -1
  209. package/dist/solver/index.d.ts +0 -22
  210. package/dist/solver/index.d.ts.map +0 -1
  211. package/dist/solver/index.js +0 -21
  212. package/dist/solver/index.js.map +0 -1
  213. package/dist/solver/types.d.ts +0 -115
  214. package/dist/solver/types.d.ts.map +0 -1
  215. package/dist/solver/types.js +0 -10
  216. package/dist/solver/types.js.map +0 -1
  217. package/dist/spend-guard/index.d.ts +0 -125
  218. package/dist/spend-guard/index.d.ts.map +0 -1
  219. package/dist/spend-guard/index.js +0 -150
  220. package/dist/spend-guard/index.js.map +0 -1
  221. package/dist/swap/router/cache.d.ts +0 -13
  222. package/dist/swap/router/cache.d.ts.map +0 -1
  223. package/dist/swap/router/cache.js +0 -30
  224. package/dist/swap/router/cache.js.map +0 -1
  225. package/dist/swap/router/flashbots.d.ts +0 -10
  226. package/dist/swap/router/flashbots.d.ts.map +0 -1
  227. package/dist/swap/router/flashbots.js +0 -43
  228. package/dist/swap/router/flashbots.js.map +0 -1
  229. package/dist/swap/router/health.d.ts +0 -17
  230. package/dist/swap/router/health.d.ts.map +0 -1
  231. package/dist/swap/router/health.js +0 -38
  232. package/dist/swap/router/health.js.map +0 -1
  233. package/dist/swap/router/index.d.ts +0 -10
  234. package/dist/swap/router/index.d.ts.map +0 -1
  235. package/dist/swap/router/index.js +0 -10
  236. package/dist/swap/router/index.js.map +0 -1
  237. package/dist/swap/router/providers/cowswap.d.ts +0 -11
  238. package/dist/swap/router/providers/cowswap.d.ts.map +0 -1
  239. package/dist/swap/router/providers/cowswap.js +0 -79
  240. package/dist/swap/router/providers/cowswap.js.map +0 -1
  241. package/dist/swap/router/providers/index.d.ts +0 -20
  242. package/dist/swap/router/providers/index.d.ts.map +0 -1
  243. package/dist/swap/router/providers/index.js +0 -32
  244. package/dist/swap/router/providers/index.js.map +0 -1
  245. package/dist/swap/router/providers/jupiter.d.ts +0 -12
  246. package/dist/swap/router/providers/jupiter.d.ts.map +0 -1
  247. package/dist/swap/router/providers/jupiter.js +0 -73
  248. package/dist/swap/router/providers/jupiter.js.map +0 -1
  249. package/dist/swap/router/providers/lifi.d.ts +0 -11
  250. package/dist/swap/router/providers/lifi.d.ts.map +0 -1
  251. package/dist/swap/router/providers/lifi.js +0 -123
  252. package/dist/swap/router/providers/lifi.js.map +0 -1
  253. package/dist/swap/router/providers/oneinch.d.ts +0 -13
  254. package/dist/swap/router/providers/oneinch.d.ts.map +0 -1
  255. package/dist/swap/router/providers/oneinch.js +0 -71
  256. package/dist/swap/router/providers/oneinch.js.map +0 -1
  257. package/dist/swap/router/providers/paraswap.d.ts +0 -11
  258. package/dist/swap/router/providers/paraswap.d.ts.map +0 -1
  259. package/dist/swap/router/providers/paraswap.js +0 -73
  260. package/dist/swap/router/providers/paraswap.js.map +0 -1
  261. package/dist/swap/router/providers/uniswap.d.ts +0 -31
  262. package/dist/swap/router/providers/uniswap.d.ts.map +0 -1
  263. package/dist/swap/router/providers/uniswap.js +0 -116
  264. package/dist/swap/router/providers/uniswap.js.map +0 -1
  265. package/dist/swap/router/providers/zerox.d.ts +0 -13
  266. package/dist/swap/router/providers/zerox.d.ts.map +0 -1
  267. package/dist/swap/router/providers/zerox.js +0 -94
  268. package/dist/swap/router/providers/zerox.js.map +0 -1
  269. package/dist/swap/router/router.d.ts +0 -86
  270. package/dist/swap/router/router.d.ts.map +0 -1
  271. package/dist/swap/router/router.js +0 -224
  272. package/dist/swap/router/router.js.map +0 -1
  273. package/dist/swap/router/rsi/engine.d.ts +0 -60
  274. package/dist/swap/router/rsi/engine.d.ts.map +0 -1
  275. package/dist/swap/router/rsi/engine.js +0 -483
  276. package/dist/swap/router/rsi/engine.js.map +0 -1
  277. package/dist/swap/router/rsi/index.d.ts +0 -3
  278. package/dist/swap/router/rsi/index.d.ts.map +0 -1
  279. package/dist/swap/router/rsi/index.js +0 -3
  280. package/dist/swap/router/rsi/index.js.map +0 -1
  281. package/dist/swap/router/rsi/types.d.ts +0 -106
  282. package/dist/swap/router/rsi/types.d.ts.map +0 -1
  283. package/dist/swap/router/rsi/types.js +0 -3
  284. package/dist/swap/router/rsi/types.js.map +0 -1
  285. package/dist/swap/router/types.d.ts +0 -120
  286. package/dist/swap/router/types.d.ts.map +0 -1
  287. package/dist/swap/router/types.js +0 -16
  288. package/dist/swap/router/types.js.map +0 -1
  289. package/dist/tax/engine.d.ts +0 -131
  290. package/dist/tax/engine.d.ts.map +0 -1
  291. package/dist/tax/engine.js +0 -307
  292. package/dist/tax/engine.js.map +0 -1
  293. package/dist/tax/index.d.ts +0 -9
  294. package/dist/tax/index.d.ts.map +0 -1
  295. package/dist/tax/index.js +0 -8
  296. package/dist/tax/index.js.map +0 -1
  297. package/dist/tax/lots.d.ts +0 -60
  298. package/dist/tax/lots.d.ts.map +0 -1
  299. package/dist/tax/lots.js +0 -129
  300. package/dist/tax/lots.js.map +0 -1
  301. package/dist/tax/types.d.ts +0 -113
  302. package/dist/tax/types.d.ts.map +0 -1
  303. package/dist/tax/types.js +0 -18
  304. package/dist/tax/types.js.map +0 -1
  305. package/dist/yield/index.d.ts +0 -26
  306. package/dist/yield/index.d.ts.map +0 -1
  307. package/dist/yield/index.js +0 -25
  308. package/dist/yield/index.js.map +0 -1
  309. package/dist/yield/rates.d.ts +0 -114
  310. package/dist/yield/rates.d.ts.map +0 -1
  311. package/dist/yield/rates.js +0 -351
  312. package/dist/yield/rates.js.map +0 -1
  313. package/dist/yield/types.d.ts +0 -134
  314. package/dist/yield/types.d.ts.map +0 -1
  315. package/dist/yield/types.js +0 -24
  316. package/dist/yield/types.js.map +0 -1
  317. package/dist/yield/vault.d.ts +0 -112
  318. package/dist/yield/vault.d.ts.map +0 -1
  319. package/dist/yield/vault.js +0 -264
  320. package/dist/yield/vault.js.map +0 -1
@@ -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
- * registry address is configurable per deployment.
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: 'function',
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: 'function',
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: 'function',
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: 'newWallet', type: 'address' },
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: 'function',
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
- // ─── Reserved metadata keys (per spec) ───────────────────────────────────────
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
- type: REGISTRATION_FILE_TYPE,
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; caller can use lookupAgentsByOwner after confirmation
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
- owner,
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
- owner: ownerAddress,
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
- // Check if any model metadata is set
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], { account: walletClient.account, chain: this.chain });
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. Pin to IPFS or use data URI: ${uri}`);
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
- if (!file.name || typeof file.name !== 'string' || file.name.trim() === '') {
602
- errors.push('name is required and must be a non-empty string');
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) {