@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,168 @@
1
+ import { type IAgentRuntime, Service } from "@elizaos/core";
2
+ import {
3
+ createBirdeyeTokenInfoProvider,
4
+ createCoinGeckoTokenInfoProvider,
5
+ createDexScreenerTokenInfoProvider,
6
+ } from "./providers";
7
+ import type {
8
+ TokenInfoDispatchContext,
9
+ TokenInfoProvider,
10
+ TokenInfoProviderMetadata,
11
+ TokenInfoRouteResult,
12
+ TokenInfoSubaction,
13
+ } from "./types";
14
+
15
+ export const TOKEN_INFO_SERVICE_TYPE = "token-info" as const;
16
+
17
+ const DEFAULT_PROVIDER_BY_SUBACTION: Record<TokenInfoSubaction, string> = {
18
+ search: "dexscreener",
19
+ token: "dexscreener",
20
+ trending: "dexscreener",
21
+ "new-pairs": "dexscreener",
22
+ "chain-pairs": "dexscreener",
23
+ boosted: "dexscreener",
24
+ profiles: "dexscreener",
25
+ wallet: "birdeye",
26
+ };
27
+
28
+ function normalizeProviderKey(value: string): string {
29
+ return value
30
+ .trim()
31
+ .toLowerCase()
32
+ .replace(/[\s_-]+/g, "");
33
+ }
34
+
35
+ export class TokenInfoService extends Service {
36
+ static override serviceType = TOKEN_INFO_SERVICE_TYPE;
37
+
38
+ override capabilityDescription =
39
+ "Token information provider registry for DexScreener, Birdeye, CoinGecko, and future crypto data sources";
40
+
41
+ private readonly providers = new Map<string, TokenInfoProvider>();
42
+ private readonly aliases = new Map<string, string>();
43
+
44
+ static override async start(
45
+ runtime: IAgentRuntime,
46
+ ): Promise<TokenInfoService> {
47
+ const service = new TokenInfoService(runtime);
48
+ service.registerProvider(createDexScreenerTokenInfoProvider());
49
+ service.registerProvider(createBirdeyeTokenInfoProvider());
50
+ service.registerProvider(createCoinGeckoTokenInfoProvider());
51
+ return service;
52
+ }
53
+
54
+ registerProvider(provider: TokenInfoProvider): void {
55
+ const key = normalizeProviderKey(provider.name);
56
+ this.providers.set(key, provider);
57
+ for (const alias of [provider.name, ...provider.aliases]) {
58
+ this.aliases.set(normalizeProviderKey(alias), key);
59
+ }
60
+ }
61
+
62
+ listProviders(): TokenInfoProviderMetadata[] {
63
+ return [...this.providers.values()].map((provider) =>
64
+ this.toMetadata(provider),
65
+ );
66
+ }
67
+
68
+ getCapabilities(): {
69
+ readonly providers: readonly TokenInfoProviderMetadata[];
70
+ } {
71
+ return {
72
+ providers: this.listProviders(),
73
+ };
74
+ }
75
+
76
+ async route(
77
+ context: TokenInfoDispatchContext,
78
+ ): Promise<TokenInfoRouteResult> {
79
+ const providerResult = this.resolveProvider(
80
+ context.params.target,
81
+ context.params.subaction,
82
+ );
83
+ if (!providerResult.ok) {
84
+ return providerResult;
85
+ }
86
+
87
+ try {
88
+ return {
89
+ ok: true,
90
+ provider: this.toMetadata(providerResult.provider),
91
+ result: await providerResult.provider.execute(context),
92
+ };
93
+ } catch (error) {
94
+ return {
95
+ ok: false,
96
+ error: "EXECUTION_FAILED",
97
+ detail: error instanceof Error ? error.message : String(error),
98
+ providers: [this.toMetadata(providerResult.provider)],
99
+ };
100
+ }
101
+ }
102
+
103
+ override async stop(): Promise<void> {
104
+ this.providers.clear();
105
+ this.aliases.clear();
106
+ }
107
+
108
+ private resolveProvider(
109
+ target: string | undefined,
110
+ subaction: TokenInfoSubaction,
111
+ ):
112
+ | { readonly ok: true; readonly provider: TokenInfoProvider }
113
+ | Extract<TokenInfoRouteResult, { readonly ok: false }> {
114
+ if (target) {
115
+ const key = this.aliases.get(normalizeProviderKey(target));
116
+ const provider = key ? this.providers.get(key) : undefined;
117
+ if (!provider) {
118
+ return {
119
+ ok: false,
120
+ error: "UNSUPPORTED_PROVIDER",
121
+ detail: `Unsupported token info provider "${target}".`,
122
+ providers: this.listProviders(),
123
+ };
124
+ }
125
+ if (!provider.supportedSubactions.includes(subaction)) {
126
+ return {
127
+ ok: false,
128
+ error: "UNSUPPORTED_SUBACTION",
129
+ detail: `${provider.name} does not support ${subaction}.`,
130
+ providers: [this.toMetadata(provider)],
131
+ };
132
+ }
133
+ return { ok: true, provider };
134
+ }
135
+
136
+ const preferred = DEFAULT_PROVIDER_BY_SUBACTION[subaction];
137
+ const provider = this.providers.get(preferred);
138
+ if (provider?.supportedSubactions.includes(subaction)) {
139
+ return { ok: true, provider };
140
+ }
141
+
142
+ const candidates = [...this.providers.values()].filter((candidate) =>
143
+ candidate.supportedSubactions.includes(subaction),
144
+ );
145
+ if (candidates.length === 1) {
146
+ return { ok: true, provider: candidates[0] };
147
+ }
148
+
149
+ return {
150
+ ok: false,
151
+ error: "UNSUPPORTED_SUBACTION",
152
+ detail:
153
+ candidates.length === 0
154
+ ? `No token info provider supports ${subaction}.`
155
+ : `Choose a token info provider for ${subaction}.`,
156
+ providers: candidates.map((candidate) => this.toMetadata(candidate)),
157
+ };
158
+ }
159
+
160
+ private toMetadata(provider: TokenInfoProvider): TokenInfoProviderMetadata {
161
+ return {
162
+ name: provider.name,
163
+ aliases: [...provider.aliases],
164
+ supportedSubactions: [...provider.supportedSubactions],
165
+ description: provider.description,
166
+ };
167
+ }
168
+ }
@@ -0,0 +1,74 @@
1
+ import type {
2
+ ActionResult,
3
+ HandlerCallback,
4
+ HandlerOptions,
5
+ IAgentRuntime,
6
+ Memory,
7
+ State,
8
+ } from "@elizaos/core";
9
+
10
+ export const TOKEN_INFO_SUBACTIONS = [
11
+ "search",
12
+ "token",
13
+ "trending",
14
+ "new-pairs",
15
+ "chain-pairs",
16
+ "boosted",
17
+ "profiles",
18
+ "wallet",
19
+ ] as const;
20
+
21
+ export type TokenInfoSubaction = (typeof TOKEN_INFO_SUBACTIONS)[number];
22
+
23
+ export interface TokenInfoParams {
24
+ readonly target?: string;
25
+ readonly subaction: TokenInfoSubaction;
26
+ readonly query?: string;
27
+ readonly address?: string;
28
+ readonly tokenAddress?: string;
29
+ readonly chain?: string;
30
+ readonly timeframe?: "1h" | "6h" | "24h";
31
+ readonly limit?: number;
32
+ readonly offset?: number;
33
+ readonly sortBy?: "volume" | "liquidity" | "priceChange" | "txns";
34
+ readonly top?: boolean;
35
+ readonly kind?: "wallet-address" | "token-address" | "token-symbol";
36
+ readonly id?: string;
37
+ }
38
+
39
+ export interface TokenInfoProviderMetadata {
40
+ readonly name: string;
41
+ readonly aliases: readonly string[];
42
+ readonly supportedSubactions: readonly TokenInfoSubaction[];
43
+ readonly description?: string;
44
+ }
45
+
46
+ export interface TokenInfoProvider extends TokenInfoProviderMetadata {
47
+ execute(context: TokenInfoDispatchContext): Promise<ActionResult>;
48
+ }
49
+
50
+ export interface TokenInfoDispatchContext {
51
+ readonly runtime: IAgentRuntime;
52
+ readonly message: Memory;
53
+ readonly state?: State;
54
+ readonly options?: HandlerOptions | Record<string, unknown>;
55
+ readonly params: TokenInfoParams;
56
+ readonly callback?: HandlerCallback;
57
+ }
58
+
59
+ export type TokenInfoRouteResult =
60
+ | {
61
+ readonly ok: true;
62
+ readonly provider: TokenInfoProviderMetadata;
63
+ readonly result: ActionResult;
64
+ }
65
+ | {
66
+ readonly ok: false;
67
+ readonly error:
68
+ | "UNSUPPORTED_PROVIDER"
69
+ | "UNSUPPORTED_SUBACTION"
70
+ | "INVALID_PARAMS"
71
+ | "EXECUTION_FAILED";
72
+ readonly detail: string;
73
+ readonly providers?: readonly TokenInfoProviderMetadata[];
74
+ };
@@ -0,0 +1,45 @@
1
+ import type {
2
+ ActionFailureCode,
3
+ ValidateFailureCode,
4
+ } from "../actions/failure-codes.js";
5
+ import type { SignScope } from "../wallet/pending.js";
6
+
7
+ export type AuditKind =
8
+ | "action_validate_start"
9
+ | "action_validate_end"
10
+ | "action_handler_start"
11
+ | "action_handler_end"
12
+ | "wallet_sign_request"
13
+ | "wallet_sign_result"
14
+ | "approval_requested"
15
+ | "approval_resolved"
16
+ | "automation_trigger_fired"
17
+ | "automation_trigger_skipped";
18
+
19
+ export type AuditOutcome =
20
+ | "ok"
21
+ | "validate_fail"
22
+ | "handler_fail"
23
+ | "pending_approval"
24
+ | "approved"
25
+ | "rejected";
26
+
27
+ /**
28
+ * Row shape for the append-only audit log (hash-chained at rest).
29
+ * Implementation + SQL migration land with Phase 1 runtime wiring.
30
+ */
31
+ export interface AuditLogRow {
32
+ readonly id: bigint;
33
+ readonly ts: number;
34
+ readonly actor: "agent" | "user" | "automation";
35
+ readonly kind: AuditKind;
36
+ readonly scope: SignScope | null;
37
+ readonly actionName: string | null;
38
+ readonly paramsHash: string;
39
+ readonly approvalId: string | null;
40
+ readonly outcome: AuditOutcome;
41
+ readonly failureCode: ValidateFailureCode | ActionFailureCode | null;
42
+ readonly detail: string | null;
43
+ readonly prevHash: string;
44
+ readonly rowHash: string;
45
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Build a self-contained JS string that, when evaluated in a page's MAIN
3
+ * world, registers the agent as a Wallet-Standard Solana wallet and an
4
+ * EIP-1193 EVM provider. All signing requests are forwarded to the wallet
5
+ * plugin's HTTP sign endpoints (gated by the bearer token).
6
+ *
7
+ * Consumers:
8
+ * - browser-bridge extension content script (MAIN world, document_start)
9
+ * - Playwright `page.addInitScript(buildWalletShim({...}))`
10
+ * - plugin-browser `BROWSER eval` (post-load fallback)
11
+ */
12
+
13
+ import * as fs from "node:fs";
14
+ import * as path from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+
17
+ export interface WalletShimConfig {
18
+ /** Base URL of the wallet HTTP API (e.g. `http://127.0.0.1:31337`). */
19
+ apiBase: string;
20
+ /** Shared bearer token (matches `WALLET_BROWSER_SIGN_TOKEN`). */
21
+ signToken: string;
22
+ /** Display name shown to dApps. */
23
+ walletName?: string;
24
+ /** Optional data URL icon. */
25
+ walletIcon?: string;
26
+ /** Active Solana public key (base58). Pass null to disable Solana surface. */
27
+ solanaPublicKey: string | null;
28
+ /** Active EVM address (0x…). Pass null to disable EVM surface. */
29
+ evmAddress: string | null;
30
+ /** Default EVM chain id the provider reports until a switch is requested. */
31
+ evmChainId?: number;
32
+ /** Public RPC URLs the shim uses for read-only EVM calls, keyed by chainId. */
33
+ evmRpcByChainId?: Record<string, string>;
34
+ }
35
+
36
+ const DEFAULT_EVM_RPCS: Record<string, string> = {
37
+ // Ethereum mainnet
38
+ "1": "https://eth.llamarpc.com",
39
+ // Base
40
+ "8453": "https://mainnet.base.org",
41
+ // BSC
42
+ "56": "https://bsc-dataseed.bnbchain.org",
43
+ // Optimism
44
+ "10": "https://mainnet.optimism.io",
45
+ // Arbitrum
46
+ "42161": "https://arb1.arbitrum.io/rpc",
47
+ // Polygon
48
+ "137": "https://polygon-rpc.com",
49
+ };
50
+
51
+ const DEFAULT_ICON =
52
+ "data:image/svg+xml;base64," +
53
+ Buffer.from(
54
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="8" fill="#9b87f5"/><text x="16" y="22" font-family="Arial,sans-serif" font-size="18" fill="#fff" text-anchor="middle" font-weight="700">E</text></svg>',
55
+ ).toString("base64");
56
+
57
+ let cachedTemplate: string | null = null;
58
+
59
+ function readTemplate(): string {
60
+ if (cachedTemplate) return cachedTemplate;
61
+ const here = path.dirname(fileURLToPath(import.meta.url));
62
+ // When loaded from src/ during dev, template lives next to this file.
63
+ // When loaded from dist/, the build copies it alongside.
64
+ const candidates = [
65
+ path.join(here, "shim.template.js"),
66
+ path.join(here, "..", "..", "src", "browser-shim", "shim.template.js"),
67
+ ];
68
+ for (const candidate of candidates) {
69
+ try {
70
+ cachedTemplate = fs.readFileSync(candidate, "utf8");
71
+ return cachedTemplate;
72
+ } catch {
73
+ // try next
74
+ }
75
+ }
76
+ throw new Error(
77
+ "wallet shim template not found in any of: " + candidates.join(", "),
78
+ );
79
+ }
80
+
81
+ export function buildWalletShim(config: WalletShimConfig): string {
82
+ if (!config.apiBase) throw new Error("buildWalletShim: apiBase required");
83
+ if (!config.signToken || config.signToken.length < 16) {
84
+ throw new Error(
85
+ "buildWalletShim: signToken must be ≥16 chars (WALLET_BROWSER_SIGN_TOKEN)",
86
+ );
87
+ }
88
+ const template = readTemplate();
89
+ const baked = {
90
+ apiBase: config.apiBase.replace(/\/+$/, ""),
91
+ signToken: config.signToken,
92
+ walletName: config.walletName ?? "Eliza Wallet",
93
+ walletIcon: config.walletIcon ?? DEFAULT_ICON,
94
+ solanaPublicKey: config.solanaPublicKey,
95
+ evmAddress: config.evmAddress,
96
+ evmChainId: config.evmChainId ?? 1,
97
+ evmRpcByChainId: { ...DEFAULT_EVM_RPCS, ...(config.evmRpcByChainId ?? {}) },
98
+ };
99
+ return template.replace(
100
+ "/*ELIZA_WALLET_SHIM_CONFIG_INSERT*/ null",
101
+ JSON.stringify(baked),
102
+ );
103
+ }
104
+
105
+ export function buildWalletShimFromTemplate(
106
+ template: string,
107
+ config: WalletShimConfig,
108
+ ): string {
109
+ const baked = {
110
+ apiBase: config.apiBase.replace(/\/+$/, ""),
111
+ signToken: config.signToken,
112
+ walletName: config.walletName ?? "Eliza Wallet",
113
+ walletIcon: config.walletIcon ?? DEFAULT_ICON,
114
+ solanaPublicKey: config.solanaPublicKey,
115
+ evmAddress: config.evmAddress,
116
+ evmChainId: config.evmChainId ?? 1,
117
+ evmRpcByChainId: { ...DEFAULT_EVM_RPCS, ...(config.evmRpcByChainId ?? {}) },
118
+ };
119
+ return template.replace(
120
+ "/*ELIZA_WALLET_SHIM_CONFIG_INSERT*/ null",
121
+ JSON.stringify(baked),
122
+ );
123
+ }
@@ -0,0 +1,5 @@
1
+ export {
2
+ buildWalletShim,
3
+ buildWalletShimFromTemplate,
4
+ type WalletShimConfig,
5
+ } from "./build-shim";