@elizaos/plugin-wallet 2.0.0-beta.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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/auto-enable.ts +76 -0
  4. package/dist/LpManagementService-BWrQ5-cO.mjs +353 -0
  5. package/dist/MockLpService-D_Apn4Fd.mjs +99 -0
  6. package/dist/aerodrome-CfnESC32.mjs +890 -0
  7. package/dist/chunk-hT5z_Zn9.mjs +35 -0
  8. package/dist/index.d.mts +34727 -0
  9. package/dist/index.mjs +21590 -0
  10. package/dist/lib/server-wallet-trade.d.mts +34 -0
  11. package/dist/lib/server-wallet-trade.mjs +306 -0
  12. package/dist/meteora-BPX39hZo.mjs +22640 -0
  13. package/dist/orca-Bybp1HXO.mjs +249 -0
  14. package/dist/pancakeswp-CkEXlXti.mjs +604 -0
  15. package/dist/plugin-ZO_MTyd0.mjs +529 -0
  16. package/dist/raydium-rfaM9yEf.mjs +539 -0
  17. package/dist/sdk/index.d.mts +32492 -0
  18. package/dist/sdk/index.mjs +6415 -0
  19. package/dist/types-D5252NZk.mjs +487 -0
  20. package/dist/uniswap-CReXgXVN.mjs +573 -0
  21. package/dist/wallet-action.d.mts +6 -0
  22. package/dist/wallet-action.mjs +820 -0
  23. package/package.json +152 -0
  24. package/src/actions/failure-codes.ts +79 -0
  25. package/src/actions/index.ts +1 -0
  26. package/src/analytics/birdeye/actions/wallet-search-address.ts +9 -0
  27. package/src/analytics/birdeye/birdeye-task.ts +175 -0
  28. package/src/analytics/birdeye/birdeye.ts +813 -0
  29. package/src/analytics/birdeye/constants.ts +74 -0
  30. package/src/analytics/birdeye/providers/agent-portfolio-provider.ts +18 -0
  31. package/src/analytics/birdeye/providers/market.ts +227 -0
  32. package/src/analytics/birdeye/providers/portfolio-factory.test.ts +138 -0
  33. package/src/analytics/birdeye/providers/portfolio-factory.ts +252 -0
  34. package/src/analytics/birdeye/providers/trending.ts +365 -0
  35. package/src/analytics/birdeye/providers/wallet.ts +14 -0
  36. package/src/analytics/birdeye/search-category.test.ts +207 -0
  37. package/src/analytics/birdeye/search-category.ts +506 -0
  38. package/src/analytics/birdeye/service.ts +992 -0
  39. package/src/analytics/birdeye/tasks/birdeye.ts +232 -0
  40. package/src/analytics/birdeye/types/api/common.ts +305 -0
  41. package/src/analytics/birdeye/types/api/defi.ts +220 -0
  42. package/src/analytics/birdeye/types/api/pair.ts +200 -0
  43. package/src/analytics/birdeye/types/api/search.ts +86 -0
  44. package/src/analytics/birdeye/types/api/token.ts +635 -0
  45. package/src/analytics/birdeye/types/api/trader.ts +76 -0
  46. package/src/analytics/birdeye/types/api/wallet.ts +181 -0
  47. package/src/analytics/birdeye/types/shared.ts +106 -0
  48. package/src/analytics/birdeye/utils.ts +700 -0
  49. package/src/analytics/dexscreener/errors.ts +28 -0
  50. package/src/analytics/dexscreener/index.ts +3 -0
  51. package/src/analytics/dexscreener/search-category.test.ts +49 -0
  52. package/src/analytics/dexscreener/search-category.ts +42 -0
  53. package/src/analytics/dexscreener/service.ts +595 -0
  54. package/src/analytics/dexscreener/types.ts +128 -0
  55. package/src/analytics/lpinfo/index.d.ts +7 -0
  56. package/src/analytics/lpinfo/index.ts +52 -0
  57. package/src/analytics/lpinfo/kamino/README.md +102 -0
  58. package/src/analytics/lpinfo/kamino/index.ts +24 -0
  59. package/src/analytics/lpinfo/kamino/providers/kaminoLiquidityProvider.ts +422 -0
  60. package/src/analytics/lpinfo/kamino/providers/kaminoPoolProvider.ts +365 -0
  61. package/src/analytics/lpinfo/kamino/providers/kaminoProvider.ts +496 -0
  62. package/src/analytics/lpinfo/kamino/services/kaminoLiquidityService.ts +1123 -0
  63. package/src/analytics/lpinfo/kamino/services/kaminoService.ts +758 -0
  64. package/src/analytics/lpinfo/steer/README.md +169 -0
  65. package/src/analytics/lpinfo/steer/index.ts +23 -0
  66. package/src/analytics/lpinfo/steer/providers/steerLiquidityProvider.ts +544 -0
  67. package/src/analytics/lpinfo/steer/services/steerLiquidityService.ts +1690 -0
  68. package/src/analytics/lpinfo/steer/steer-display-types.ts +99 -0
  69. package/src/analytics/news/index.ts +52 -0
  70. package/src/analytics/news/interfaces/types.ts +222 -0
  71. package/src/analytics/news/providers/defiNewsProvider.ts +734 -0
  72. package/src/analytics/news/services/newsDataService.ts +332 -0
  73. package/src/analytics/news/utils/formatters.ts +151 -0
  74. package/src/analytics/token-info/action.ts +240 -0
  75. package/src/analytics/token-info/index.ts +3 -0
  76. package/src/analytics/token-info/params.ts +215 -0
  77. package/src/analytics/token-info/providers.ts +681 -0
  78. package/src/analytics/token-info/service.ts +168 -0
  79. package/src/analytics/token-info/types.ts +74 -0
  80. package/src/audit/audit-log.ts +45 -0
  81. package/src/browser-shim/build-shim.ts +123 -0
  82. package/src/browser-shim/index.ts +5 -0
  83. package/src/browser-shim/shim.template.js +563 -0
  84. package/src/chains/evm/.github/workflows/npm-deploy.yml +112 -0
  85. package/src/chains/evm/LICENSE +21 -0
  86. package/src/chains/evm/README.md +106 -0
  87. package/src/chains/evm/actions/helpers.ts +147 -0
  88. package/src/chains/evm/actions/swap.ts +839 -0
  89. package/src/chains/evm/actions/transfer.ts +254 -0
  90. package/src/chains/evm/biome.json +61 -0
  91. package/src/chains/evm/bridge-router.ts +660 -0
  92. package/src/chains/evm/build.ts +89 -0
  93. package/src/chains/evm/chain-handler.ts +416 -0
  94. package/src/chains/evm/constants.ts +23 -0
  95. package/src/chains/evm/contracts/artifacts/OZGovernor.json +1707 -0
  96. package/src/chains/evm/contracts/artifacts/TimelockController.json +1007 -0
  97. package/src/chains/evm/contracts/artifacts/VoteToken.json +895 -0
  98. package/src/chains/evm/dex/aerodrome/index.ts +34 -0
  99. package/src/chains/evm/dex/aerodrome/services/AerodromeLpService.ts +558 -0
  100. package/src/chains/evm/dex/aerodrome/types.ts +318 -0
  101. package/src/chains/evm/dex/pancakeswp/index.ts +35 -0
  102. package/src/chains/evm/dex/pancakeswp/services/PancakeSwapV3LpService.ts +743 -0
  103. package/src/chains/evm/dex/pancakeswp/types.ts +65 -0
  104. package/src/chains/evm/dex/uniswap/index.ts +35 -0
  105. package/src/chains/evm/dex/uniswap/services/UniswapV3LpService.ts +759 -0
  106. package/src/chains/evm/dex/uniswap/types.ts +390 -0
  107. package/src/chains/evm/generated/specs/spec-helpers.ts +73 -0
  108. package/src/chains/evm/generated/specs/specs.ts +151 -0
  109. package/src/chains/evm/gov-router.ts +250 -0
  110. package/src/chains/evm/index.browser.ts +16 -0
  111. package/src/chains/evm/index.ts +31 -0
  112. package/src/chains/evm/prompts.ts +193 -0
  113. package/src/chains/evm/providers/get-balance.ts +123 -0
  114. package/src/chains/evm/providers/wallet.ts +715 -0
  115. package/src/chains/evm/routes/sign.ts +333 -0
  116. package/src/chains/evm/rpc-providers.ts +410 -0
  117. package/src/chains/evm/service.ts +140 -0
  118. package/src/chains/evm/templates/index.ts +10 -0
  119. package/src/chains/evm/types/index.ts +432 -0
  120. package/src/chains/evm/vitest.config.ts +18 -0
  121. package/src/chains/registry.ts +668 -0
  122. package/src/chains/solana/README.md +367 -0
  123. package/src/chains/wallet-action.ts +533 -0
  124. package/src/chains/wallet-router.test.ts +296 -0
  125. package/src/contracts.ts +65 -0
  126. package/src/core-augmentation.ts +10 -0
  127. package/src/index.ts +71 -0
  128. package/src/lib/server-wallet-trade.ts +192 -0
  129. package/src/lib/wallet-export-guard.ts +330 -0
  130. package/src/lp/actions/liquidity.ts +827 -0
  131. package/src/lp/e2e/real-token-tests.ts +428 -0
  132. package/src/lp/e2e/scenarios.ts +470 -0
  133. package/src/lp/e2e/test-utils.ts +145 -0
  134. package/src/lp/lp-manager-entry.ts +303 -0
  135. package/src/lp/services/ConcentratedLiquidityService.ts +120 -0
  136. package/src/lp/services/DexInteractionService.ts +226 -0
  137. package/src/lp/services/LpManagementService.test.ts +148 -0
  138. package/src/lp/services/LpManagementService.ts +632 -0
  139. package/src/lp/services/UserLpProfileService.ts +163 -0
  140. package/src/lp/services/VaultService.ts +153 -0
  141. package/src/lp/services/YieldOptimizationService.ts +344 -0
  142. package/src/lp/services/__tests__/MockLpService.ts +146 -0
  143. package/src/lp/tasks/LpAutoRebalanceTask.ts +117 -0
  144. package/src/lp/tasks/__tests__/LpAutoRebalanceTask.test.ts +370 -0
  145. package/src/lp/types.ts +582 -0
  146. package/src/lp/utils/solanaClient.ts +143 -0
  147. package/src/plugin.ts +125 -0
  148. package/src/policy/policy.ts +19 -0
  149. package/src/providers/canonical-provider.ts +27 -0
  150. package/src/providers/unified-wallet-provider.ts +79 -0
  151. package/src/register-routes.ts +11 -0
  152. package/src/routes/plugin.ts +47 -0
  153. package/src/routes/wallet-market-overview-route.ts +869 -0
  154. package/src/sdk/abi.ts +258 -0
  155. package/src/sdk/bridge/abis.ts +126 -0
  156. package/src/sdk/bridge/client.ts +518 -0
  157. package/src/sdk/bridge/index.ts +56 -0
  158. package/src/sdk/bridge/solana.ts +604 -0
  159. package/src/sdk/bridge/types.ts +202 -0
  160. package/src/sdk/convenience.ts +347 -0
  161. package/src/sdk/escrow/MutualStakeEscrow.ts +480 -0
  162. package/src/sdk/escrow/types.ts +64 -0
  163. package/src/sdk/escrow/verifiers.ts +73 -0
  164. package/src/sdk/identity/erc8004.ts +692 -0
  165. package/src/sdk/identity/reputation.ts +449 -0
  166. package/src/sdk/identity/uaid.ts +497 -0
  167. package/src/sdk/identity/validation.ts +372 -0
  168. package/src/sdk/index.ts +763 -0
  169. package/src/sdk/policy/SpendingPolicy.ts +260 -0
  170. package/src/sdk/policy/UptoBillingPolicy.ts +320 -0
  171. package/src/sdk/router/PaymentRouter.ts +215 -0
  172. package/src/sdk/router/index.ts +8 -0
  173. package/src/sdk/swap/SwapModule.ts +310 -0
  174. package/src/sdk/swap/abi.ts +117 -0
  175. package/src/sdk/swap/index.ts +34 -0
  176. package/src/sdk/swap/types.ts +135 -0
  177. package/src/sdk/tokens/decimals.ts +140 -0
  178. package/src/sdk/tokens/registry.ts +911 -0
  179. package/src/sdk/tokens/solana.ts +419 -0
  180. package/src/sdk/tokens/transfers.ts +327 -0
  181. package/src/sdk/types.ts +158 -0
  182. package/src/sdk/wallet-core.ts +115 -0
  183. package/src/sdk/x402/budget.ts +168 -0
  184. package/src/sdk/x402/chains/abstract/index.ts +280 -0
  185. package/src/sdk/x402/client.ts +320 -0
  186. package/src/sdk/x402/index.ts +46 -0
  187. package/src/sdk/x402/middleware.ts +92 -0
  188. package/src/sdk/x402/multi-asset.ts +144 -0
  189. package/src/sdk/x402/types.ts +156 -0
  190. package/src/services/wallet-backend-service.ts +328 -0
  191. package/src/types/wallet-router.ts +227 -0
  192. package/src/utils/intent-trajectory.ts +106 -0
  193. package/src/wallet/backend.ts +62 -0
  194. package/src/wallet/errors.ts +49 -0
  195. package/src/wallet/index.ts +27 -0
  196. package/src/wallet/local-eoa-backend.ts +201 -0
  197. package/src/wallet/pending.ts +60 -0
  198. package/src/wallet/select-backend.ts +47 -0
  199. package/src/wallet/steward-backend.ts +161 -0
  200. package/src/wallet-action.ts +1 -0
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Browser-facing EVM signing endpoints (Ethereum / Base / BSC and any other
3
+ * viem-supported chain). Mirrors the Solana endpoint shape and shares the
4
+ * same shared-secret bearer token gate (`WALLET_BROWSER_SIGN_TOKEN`).
5
+ *
6
+ * The companion JS shim assigns `window.ethereum` to an EIP-1193 provider that
7
+ * forwards `personal_sign`, `eth_signTypedData_v4`, and `eth_sendTransaction`
8
+ * to these endpoints. Read-only RPC calls (`eth_call`, `eth_getBalance`, etc.)
9
+ * are forwarded by the shim straight to a public RPC for the active chain —
10
+ * we only sign here.
11
+ */
12
+
13
+ import type { IAgentRuntime, Route, RouteRequest, RouteResponse } from "@elizaos/core";
14
+ import { logger } from "@elizaos/core";
15
+ import {
16
+ type Address,
17
+ type Chain,
18
+ createWalletClient,
19
+ type Hex,
20
+ http,
21
+ publicActions,
22
+ type TypedDataDefinition,
23
+ } from "viem";
24
+ import * as viemChains from "viem/chains";
25
+ import { resolveWalletBackend } from "../../../wallet/select-backend";
26
+
27
+ type RouteHandler = NonNullable<Route["handler"]>;
28
+
29
+ interface JsonResponse {
30
+ setHeader?: (name: string, value: string) => void;
31
+ }
32
+
33
+ function setCorsHeaders(req: RouteRequest, res: RouteResponse): void {
34
+ const origin = (req.headers?.origin as string | undefined) ?? "*";
35
+ const r = res as unknown as JsonResponse;
36
+ r.setHeader?.("Access-Control-Allow-Origin", origin);
37
+ r.setHeader?.("Vary", "Origin");
38
+ r.setHeader?.("Access-Control-Allow-Methods", "POST, OPTIONS");
39
+ r.setHeader?.(
40
+ "Access-Control-Allow-Headers",
41
+ "Authorization, Content-Type, X-Wallet-Sign-Token",
42
+ );
43
+ r.setHeader?.("Access-Control-Allow-Credentials", "true");
44
+ r.setHeader?.("Access-Control-Max-Age", "600");
45
+ }
46
+
47
+ function readSignToken(runtime: IAgentRuntime): string | null {
48
+ const fromRuntime = runtime.getSetting("WALLET_BROWSER_SIGN_TOKEN");
49
+ if (typeof fromRuntime === "string" && fromRuntime.trim().length >= 16) {
50
+ return fromRuntime.trim();
51
+ }
52
+ const fromEnv = process.env.WALLET_BROWSER_SIGN_TOKEN?.trim();
53
+ if (fromEnv && fromEnv.length >= 16) return fromEnv;
54
+ return null;
55
+ }
56
+
57
+ function readBearer(req: RouteRequest): string | null {
58
+ const auth = req.headers?.authorization as string | undefined;
59
+ if (auth?.startsWith("Bearer ")) return auth.slice("Bearer ".length).trim();
60
+ const x = req.headers?.["x-wallet-sign-token"] as string | undefined;
61
+ if (typeof x === "string" && x.length > 0) return x.trim();
62
+ return null;
63
+ }
64
+
65
+ function authorize(
66
+ req: RouteRequest,
67
+ res: RouteResponse,
68
+ runtime: IAgentRuntime,
69
+ ): boolean {
70
+ setCorsHeaders(req, res);
71
+ if ((req as unknown as { method?: string }).method === "OPTIONS") {
72
+ res.status(204).json({});
73
+ return false;
74
+ }
75
+ const expected = readSignToken(runtime);
76
+ if (!expected) {
77
+ res.status(503).json({ error: "WALLET_BROWSER_SIGN_TOKEN not configured" });
78
+ return false;
79
+ }
80
+ if (readBearer(req) !== expected) {
81
+ res.status(401).json({ error: "invalid sign token" });
82
+ return false;
83
+ }
84
+ return true;
85
+ }
86
+
87
+ function chainFromId(chainId: number): Chain {
88
+ const all = Object.values(viemChains) as Chain[];
89
+ const hit = all.find((c) => typeof c?.id === "number" && c.id === chainId);
90
+ if (!hit) {
91
+ throw new Error(`unsupported EVM chainId: ${chainId}`);
92
+ }
93
+ return hit;
94
+ }
95
+
96
+ function rpcUrlForChain(runtime: IAgentRuntime, chain: Chain): string {
97
+ const explicit =
98
+ (runtime.getSetting(`EVM_RPC_URL_${chain.id}`) as string | undefined) ??
99
+ process.env[`EVM_RPC_URL_${chain.id}`] ??
100
+ null;
101
+ if (explicit && explicit.length > 0) return explicit;
102
+ const def = chain.rpcUrls?.default?.http?.[0];
103
+ if (def) return def;
104
+ throw new Error(`no RPC URL configured for chain ${chain.id} (${chain.name})`);
105
+ }
106
+
107
+ function readChainId(body: unknown): number {
108
+ if (typeof body !== "object" || body === null) {
109
+ throw new Error("chainId required");
110
+ }
111
+ const c = (body as { chainId?: unknown }).chainId;
112
+ if (typeof c === "number") return c;
113
+ if (typeof c === "string") {
114
+ const n = c.startsWith("0x") ? Number.parseInt(c.slice(2), 16) : Number(c);
115
+ if (Number.isFinite(n)) return n;
116
+ }
117
+ throw new Error("chainId must be a number or hex string");
118
+ }
119
+
120
+ const addressHandler: RouteHandler = async (req, res, runtime) => {
121
+ if (!authorize(req, res, runtime)) return;
122
+ try {
123
+ const backend = await resolveWalletBackend(runtime);
124
+ const addrs = backend.getAddresses();
125
+ if (!addrs.evm) {
126
+ res.status(404).json({ error: "no EVM key configured" });
127
+ return;
128
+ }
129
+ res.status(200).json({ address: addrs.evm });
130
+ } catch (err) {
131
+ logger.error({ err }, "[wallet/evm/address] failed");
132
+ res.status(500).json({ error: (err as Error).message });
133
+ }
134
+ };
135
+
136
+ const personalSignHandler: RouteHandler = async (req, res, runtime) => {
137
+ if (!authorize(req, res, runtime)) return;
138
+ try {
139
+ const body = (req.body ?? {}) as { message?: unknown };
140
+ if (typeof body.message !== "string") {
141
+ res.status(400).json({ error: "message (hex or utf8 string) required" });
142
+ return;
143
+ }
144
+ const backend = await resolveWalletBackend(runtime);
145
+ const account = backend.getEvmAccount(1);
146
+ const messageInput: { raw: Hex } | string = body.message.startsWith("0x")
147
+ ? { raw: body.message as Hex }
148
+ : body.message;
149
+ const signature = await account.signMessage!({
150
+ message: typeof messageInput === "string" ? messageInput : messageInput,
151
+ });
152
+ res.status(200).json({ signature, address: account.address });
153
+ } catch (err) {
154
+ logger.error({ err }, "[wallet/evm/personal-sign] failed");
155
+ res.status(500).json({ error: (err as Error).message });
156
+ }
157
+ };
158
+
159
+ const signTypedDataHandler: RouteHandler = async (req, res, runtime) => {
160
+ if (!authorize(req, res, runtime)) return;
161
+ try {
162
+ const body = (req.body ?? {}) as { typedData?: unknown };
163
+ if (!body.typedData || typeof body.typedData !== "object") {
164
+ res
165
+ .status(400)
166
+ .json({ error: "typedData (EIP-712 TypedDataDefinition) required" });
167
+ return;
168
+ }
169
+ const backend = await resolveWalletBackend(runtime);
170
+ const account = backend.getEvmAccount(1);
171
+ const signature = await account.signTypedData!(
172
+ body.typedData as TypedDataDefinition,
173
+ );
174
+ res.status(200).json({ signature, address: account.address });
175
+ } catch (err) {
176
+ logger.error({ err }, "[wallet/evm/sign-typed-data] failed");
177
+ res.status(500).json({ error: (err as Error).message });
178
+ }
179
+ };
180
+
181
+ interface EvmTxRequest {
182
+ to?: Address;
183
+ from?: Address;
184
+ value?: Hex | string;
185
+ data?: Hex;
186
+ gas?: Hex | string;
187
+ maxFeePerGas?: Hex | string;
188
+ maxPriorityFeePerGas?: Hex | string;
189
+ nonce?: Hex | string | number;
190
+ }
191
+
192
+ function hexOrIntToBigInt(value: unknown): bigint | undefined {
193
+ if (value === undefined || value === null) return undefined;
194
+ if (typeof value === "bigint") return value;
195
+ if (typeof value === "number") return BigInt(value);
196
+ if (typeof value === "string") {
197
+ if (value.length === 0) return undefined;
198
+ return value.startsWith("0x") ? BigInt(value) : BigInt(value);
199
+ }
200
+ return undefined;
201
+ }
202
+
203
+ const sendTransactionHandler: RouteHandler = async (req, res, runtime) => {
204
+ if (!authorize(req, res, runtime)) return;
205
+ try {
206
+ const body = (req.body ?? {}) as { tx?: EvmTxRequest };
207
+ const chainId = readChainId(req.body);
208
+ if (!body.tx || typeof body.tx !== "object") {
209
+ res.status(400).json({ error: "tx (EVM transaction) required" });
210
+ return;
211
+ }
212
+ const chain = chainFromId(chainId);
213
+ const backend = await resolveWalletBackend(runtime);
214
+ const account = backend.getEvmAccount(chainId);
215
+
216
+ const rpcUrl = rpcUrlForChain(runtime, chain);
217
+ const wallet = createWalletClient({
218
+ account,
219
+ chain,
220
+ transport: http(rpcUrl),
221
+ }).extend(publicActions);
222
+
223
+ const tx = body.tx;
224
+ const hash = await wallet.sendTransaction({
225
+ account,
226
+ chain,
227
+ to: tx.to,
228
+ value: hexOrIntToBigInt(tx.value),
229
+ data: tx.data,
230
+ gas: hexOrIntToBigInt(tx.gas),
231
+ maxFeePerGas: hexOrIntToBigInt(tx.maxFeePerGas),
232
+ maxPriorityFeePerGas: hexOrIntToBigInt(tx.maxPriorityFeePerGas),
233
+ nonce:
234
+ typeof tx.nonce === "number"
235
+ ? tx.nonce
236
+ : tx.nonce
237
+ ? Number(hexOrIntToBigInt(tx.nonce))
238
+ : undefined,
239
+ });
240
+ res.status(200).json({ hash, address: account.address, chainId });
241
+ } catch (err) {
242
+ logger.error({ err }, "[wallet/evm/send-transaction] failed");
243
+ res.status(500).json({ error: (err as Error).message });
244
+ }
245
+ };
246
+
247
+ const signTransactionHandler: RouteHandler = async (req, res, runtime) => {
248
+ if (!authorize(req, res, runtime)) return;
249
+ try {
250
+ const body = (req.body ?? {}) as { tx?: EvmTxRequest };
251
+ const chainId = readChainId(req.body);
252
+ if (!body.tx || typeof body.tx !== "object") {
253
+ res.status(400).json({ error: "tx required" });
254
+ return;
255
+ }
256
+ const chain = chainFromId(chainId);
257
+ const backend = await resolveWalletBackend(runtime);
258
+ const account = backend.getEvmAccount(chainId);
259
+
260
+ const rpcUrl = rpcUrlForChain(runtime, chain);
261
+ const wallet = createWalletClient({
262
+ account,
263
+ chain,
264
+ transport: http(rpcUrl),
265
+ }).extend(publicActions);
266
+
267
+ const tx = body.tx;
268
+ const request = await wallet.prepareTransactionRequest({
269
+ account,
270
+ chain,
271
+ to: tx.to,
272
+ value: hexOrIntToBigInt(tx.value),
273
+ data: tx.data,
274
+ gas: hexOrIntToBigInt(tx.gas),
275
+ maxFeePerGas: hexOrIntToBigInt(tx.maxFeePerGas),
276
+ maxPriorityFeePerGas: hexOrIntToBigInt(tx.maxPriorityFeePerGas),
277
+ });
278
+ const serialized = await wallet.signTransaction(request);
279
+ res.status(200).json({
280
+ signedTransaction: serialized,
281
+ address: account.address,
282
+ chainId,
283
+ });
284
+ } catch (err) {
285
+ logger.error({ err }, "[wallet/evm/sign-transaction] failed");
286
+ res.status(500).json({ error: (err as Error).message });
287
+ }
288
+ };
289
+
290
+ export const evmSignRoutes: Route[] = [
291
+ {
292
+ type: "GET",
293
+ path: "/wallet/evm/address",
294
+ public: true,
295
+ name: "wallet-evm-address",
296
+ handler: addressHandler,
297
+ },
298
+ {
299
+ type: "POST",
300
+ path: "/wallet/evm/address",
301
+ public: true,
302
+ name: "wallet-evm-address-post",
303
+ handler: addressHandler,
304
+ },
305
+ {
306
+ type: "POST",
307
+ path: "/wallet/evm/personal-sign",
308
+ public: true,
309
+ name: "wallet-evm-personal-sign",
310
+ handler: personalSignHandler,
311
+ },
312
+ {
313
+ type: "POST",
314
+ path: "/wallet/evm/sign-typed-data",
315
+ public: true,
316
+ name: "wallet-evm-sign-typed-data",
317
+ handler: signTypedDataHandler,
318
+ },
319
+ {
320
+ type: "POST",
321
+ path: "/wallet/evm/sign-transaction",
322
+ public: true,
323
+ name: "wallet-evm-sign-transaction",
324
+ handler: signTransactionHandler,
325
+ },
326
+ {
327
+ type: "POST",
328
+ path: "/wallet/evm/send-transaction",
329
+ public: true,
330
+ name: "wallet-evm-send-transaction",
331
+ handler: sendTransactionHandler,
332
+ },
333
+ ];