@elizaos/plugin-steward-app 2.0.3-beta.6 → 2.0.3-beta.7

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 (219) hide show
  1. package/dist/ApprovalQueue.d.ts +18 -0
  2. package/dist/ApprovalQueue.d.ts.map +1 -0
  3. package/dist/ApprovalQueue.js +420 -0
  4. package/dist/ApprovalQueue.js.map +1 -0
  5. package/dist/StewardLogo.d.ts +11 -0
  6. package/dist/StewardLogo.d.ts.map +1 -0
  7. package/dist/StewardLogo.js +36 -0
  8. package/dist/StewardLogo.js.map +1 -0
  9. package/dist/StewardView.d.ts +13 -0
  10. package/dist/StewardView.d.ts.map +1 -0
  11. package/dist/StewardView.helpers.d.ts +15 -0
  12. package/dist/StewardView.helpers.d.ts.map +1 -0
  13. package/dist/StewardView.helpers.js +45 -0
  14. package/dist/StewardView.helpers.js.map +1 -0
  15. package/dist/StewardView.interact.d.ts +2 -0
  16. package/dist/StewardView.interact.d.ts.map +1 -0
  17. package/dist/StewardView.interact.js +54 -0
  18. package/dist/StewardView.interact.js.map +1 -0
  19. package/dist/StewardView.js +249 -0
  20. package/dist/StewardView.js.map +1 -0
  21. package/dist/TransactionHistory.d.ts +22 -0
  22. package/dist/TransactionHistory.d.ts.map +1 -0
  23. package/dist/TransactionHistory.js +361 -0
  24. package/dist/TransactionHistory.js.map +1 -0
  25. package/dist/__fixtures__/steward-sdk-fixtures.d.ts +10 -0
  26. package/dist/__fixtures__/steward-sdk-fixtures.d.ts.map +1 -0
  27. package/dist/__fixtures__/steward-sdk-fixtures.js +60 -0
  28. package/dist/__fixtures__/steward-sdk-fixtures.js.map +1 -0
  29. package/dist/actions/wallet-action-shared.d.ts +15 -0
  30. package/dist/actions/wallet-action-shared.d.ts.map +1 -0
  31. package/dist/actions/wallet-action-shared.js +16 -0
  32. package/dist/actions/wallet-action-shared.js.map +1 -0
  33. package/dist/api/binance-skill-helpers.d.ts +21 -0
  34. package/dist/api/binance-skill-helpers.d.ts.map +1 -0
  35. package/dist/api/binance-skill-helpers.js +790 -0
  36. package/dist/api/binance-skill-helpers.js.map +1 -0
  37. package/dist/api/bsc-trade.d.ts +36 -0
  38. package/dist/api/bsc-trade.d.ts.map +1 -0
  39. package/dist/api/bsc-trade.js +796 -0
  40. package/dist/api/bsc-trade.js.map +1 -0
  41. package/dist/api/trade-safety.d.ts +35 -0
  42. package/dist/api/trade-safety.d.ts.map +1 -0
  43. package/dist/api/trade-safety.js +56 -0
  44. package/dist/api/trade-safety.js.map +1 -0
  45. package/dist/api/tx-service.d.ts +53 -0
  46. package/dist/api/tx-service.d.ts.map +1 -0
  47. package/dist/api/tx-service.js +206 -0
  48. package/dist/api/tx-service.js.map +1 -0
  49. package/dist/api/wallet-bsc-routes.d.ts +63 -0
  50. package/dist/api/wallet-bsc-routes.d.ts.map +1 -0
  51. package/dist/api/wallet-bsc-routes.js +337 -0
  52. package/dist/api/wallet-bsc-routes.js.map +1 -0
  53. package/dist/api/wallet-capability.d.ts +2 -0
  54. package/dist/api/wallet-capability.d.ts.map +1 -0
  55. package/dist/api/wallet-capability.js +15 -0
  56. package/dist/api/wallet-capability.js.map +1 -0
  57. package/dist/api/wallet-dex-prices.d.ts +43 -0
  58. package/dist/api/wallet-dex-prices.d.ts.map +1 -0
  59. package/dist/api/wallet-dex-prices.js +132 -0
  60. package/dist/api/wallet-dex-prices.js.map +1 -0
  61. package/dist/api/wallet-evm-balance.d.ts +72 -0
  62. package/dist/api/wallet-evm-balance.d.ts.map +1 -0
  63. package/dist/api/wallet-evm-balance.js +697 -0
  64. package/dist/api/wallet-evm-balance.js.map +1 -0
  65. package/dist/api/wallet-routes.d.ts +27 -0
  66. package/dist/api/wallet-routes.d.ts.map +1 -0
  67. package/dist/api/wallet-routes.js +556 -0
  68. package/dist/api/wallet-routes.js.map +1 -0
  69. package/dist/api/wallet-rpc.d.ts +73 -0
  70. package/dist/api/wallet-rpc.d.ts.map +1 -0
  71. package/dist/api/wallet-rpc.js +460 -0
  72. package/dist/api/wallet-rpc.js.map +1 -0
  73. package/dist/api/wallet-trade-routes.d.ts +104 -0
  74. package/dist/api/wallet-trade-routes.d.ts.map +1 -0
  75. package/dist/api/wallet-trade-routes.js +353 -0
  76. package/dist/api/wallet-trade-routes.js.map +1 -0
  77. package/dist/api/wallet-trading-profile.d.ts +31 -0
  78. package/dist/api/wallet-trading-profile.d.ts.map +1 -0
  79. package/dist/api/wallet-trading-profile.js +500 -0
  80. package/dist/api/wallet-trading-profile.js.map +1 -0
  81. package/dist/api/wallet.d.ts +60 -0
  82. package/dist/api/wallet.d.ts.map +1 -0
  83. package/dist/api/wallet.js +617 -0
  84. package/dist/api/wallet.js.map +1 -0
  85. package/dist/chain-utils.d.ts +10 -0
  86. package/dist/chain-utils.d.ts.map +1 -0
  87. package/dist/chain-utils.js +81 -0
  88. package/dist/chain-utils.js.map +1 -0
  89. package/dist/components/StewardSpatialView.d.ts +74 -0
  90. package/dist/components/StewardSpatialView.d.ts.map +1 -0
  91. package/dist/components/StewardSpatialView.js +309 -0
  92. package/dist/components/StewardSpatialView.js.map +1 -0
  93. package/dist/index.d.ts +20 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +77 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/plugin.d.ts +21 -0
  98. package/dist/plugin.d.ts.map +1 -0
  99. package/dist/plugin.js +319 -0
  100. package/dist/plugin.js.map +1 -0
  101. package/dist/providers/steward-balance.d.ts +12 -0
  102. package/dist/providers/steward-balance.d.ts.map +1 -0
  103. package/dist/providers/steward-balance.js +85 -0
  104. package/dist/providers/steward-balance.js.map +1 -0
  105. package/dist/providers/steward-receive-address.d.ts +12 -0
  106. package/dist/providers/steward-receive-address.d.ts.map +1 -0
  107. package/dist/providers/steward-receive-address.js +47 -0
  108. package/dist/providers/steward-receive-address.js.map +1 -0
  109. package/dist/register-routes.d.ts +2 -0
  110. package/dist/register-routes.d.ts.map +1 -0
  111. package/dist/register-routes.js +6 -0
  112. package/dist/register-routes.js.map +1 -0
  113. package/dist/register-terminal-view.d.ts +15 -0
  114. package/dist/register-terminal-view.d.ts.map +1 -0
  115. package/dist/register-terminal-view.js +34 -0
  116. package/dist/register-terminal-view.js.map +1 -0
  117. package/dist/routes/steward-bridge.d.ts +202 -0
  118. package/dist/routes/steward-bridge.d.ts.map +1 -0
  119. package/dist/routes/steward-bridge.js +776 -0
  120. package/dist/routes/steward-bridge.js.map +1 -0
  121. package/dist/routes/steward-compat-routes.d.ts +21 -0
  122. package/dist/routes/steward-compat-routes.d.ts.map +1 -0
  123. package/dist/routes/steward-compat-routes.js +350 -0
  124. package/dist/routes/steward-compat-routes.js.map +1 -0
  125. package/dist/routes/wallet-browser-compat-routes.d.ts +6 -0
  126. package/dist/routes/wallet-browser-compat-routes.d.ts.map +1 -0
  127. package/dist/routes/wallet-browser-compat-routes.js +402 -0
  128. package/dist/routes/wallet-browser-compat-routes.js.map +1 -0
  129. package/dist/routes/wallet-bsc-core-routes.d.ts +15 -0
  130. package/dist/routes/wallet-bsc-core-routes.d.ts.map +1 -0
  131. package/dist/routes/wallet-bsc-core-routes.js +59 -0
  132. package/dist/routes/wallet-bsc-core-routes.js.map +1 -0
  133. package/dist/routes/wallet-compat-routes.d.ts +13 -0
  134. package/dist/routes/wallet-compat-routes.d.ts.map +1 -0
  135. package/dist/routes/wallet-compat-routes.js +206 -0
  136. package/dist/routes/wallet-compat-routes.js.map +1 -0
  137. package/dist/routes/wallet-core-routes.d.ts +16 -0
  138. package/dist/routes/wallet-core-routes.d.ts.map +1 -0
  139. package/dist/routes/wallet-core-routes.js +48 -0
  140. package/dist/routes/wallet-core-routes.js.map +1 -0
  141. package/dist/routes/wallet-trade-compat-routes.d.ts +11 -0
  142. package/dist/routes/wallet-trade-compat-routes.d.ts.map +1 -0
  143. package/dist/routes/wallet-trade-compat-routes.js +570 -0
  144. package/dist/routes/wallet-trade-compat-routes.js.map +1 -0
  145. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts +7 -0
  146. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -0
  147. package/dist/security/hydrate-wallet-keys-from-platform-store.js +43 -0
  148. package/dist/security/hydrate-wallet-keys-from-platform-store.js.map +1 -0
  149. package/dist/security/wallet-os-store-actions.d.ts +14 -0
  150. package/dist/security/wallet-os-store-actions.d.ts.map +1 -0
  151. package/dist/security/wallet-os-store-actions.js +63 -0
  152. package/dist/security/wallet-os-store-actions.js.map +1 -0
  153. package/dist/services/steward-credentials.d.ts +2 -0
  154. package/dist/services/steward-credentials.d.ts.map +1 -0
  155. package/dist/services/steward-credentials.js +2 -0
  156. package/dist/services/steward-credentials.js.map +1 -0
  157. package/dist/services/steward-evm-account.d.ts +75 -0
  158. package/dist/services/steward-evm-account.d.ts.map +1 -0
  159. package/dist/services/steward-evm-account.js +279 -0
  160. package/dist/services/steward-evm-account.js.map +1 -0
  161. package/dist/services/steward-evm-bridge.d.ts +36 -0
  162. package/dist/services/steward-evm-bridge.d.ts.map +1 -0
  163. package/dist/services/steward-evm-bridge.js +78 -0
  164. package/dist/services/steward-evm-bridge.js.map +1 -0
  165. package/dist/services/steward-sidecar/health-check.d.ts +2 -0
  166. package/dist/services/steward-sidecar/health-check.d.ts.map +1 -0
  167. package/dist/services/steward-sidecar/health-check.js +2 -0
  168. package/dist/services/steward-sidecar/health-check.js.map +1 -0
  169. package/dist/services/steward-sidecar/helpers.d.ts +2 -0
  170. package/dist/services/steward-sidecar/helpers.d.ts.map +1 -0
  171. package/dist/services/steward-sidecar/helpers.js +2 -0
  172. package/dist/services/steward-sidecar/helpers.js.map +1 -0
  173. package/dist/services/steward-sidecar/process-management.d.ts +2 -0
  174. package/dist/services/steward-sidecar/process-management.d.ts.map +1 -0
  175. package/dist/services/steward-sidecar/process-management.js +2 -0
  176. package/dist/services/steward-sidecar/process-management.js.map +1 -0
  177. package/dist/services/steward-sidecar/types.d.ts +2 -0
  178. package/dist/services/steward-sidecar/types.d.ts.map +1 -0
  179. package/dist/services/steward-sidecar/types.js +2 -0
  180. package/dist/services/steward-sidecar/types.js.map +1 -0
  181. package/dist/services/steward-sidecar/wallet-setup.d.ts +2 -0
  182. package/dist/services/steward-sidecar/wallet-setup.d.ts.map +1 -0
  183. package/dist/services/steward-sidecar/wallet-setup.js +2 -0
  184. package/dist/services/steward-sidecar/wallet-setup.js.map +1 -0
  185. package/dist/services/steward-sidecar.d.ts +2 -0
  186. package/dist/services/steward-sidecar.d.ts.map +1 -0
  187. package/dist/services/steward-sidecar.js +2 -0
  188. package/dist/services/steward-sidecar.js.map +1 -0
  189. package/dist/services/steward-wallet.d.ts +25 -0
  190. package/dist/services/steward-wallet.d.ts.map +1 -0
  191. package/dist/services/steward-wallet.js +333 -0
  192. package/dist/services/steward-wallet.js.map +1 -0
  193. package/dist/steward-ui-state.d.ts +14 -0
  194. package/dist/steward-ui-state.d.ts.map +1 -0
  195. package/dist/steward-ui-state.js +46 -0
  196. package/dist/steward-ui-state.js.map +1 -0
  197. package/dist/steward-view-bundle.d.ts +3 -0
  198. package/dist/steward-view-bundle.d.ts.map +1 -0
  199. package/dist/steward-view-bundle.js +7 -0
  200. package/dist/steward-view-bundle.js.map +1 -0
  201. package/dist/types/bsc-trade.d.ts +180 -0
  202. package/dist/types/bsc-trade.d.ts.map +1 -0
  203. package/dist/types/bsc-trade.js +1 -0
  204. package/dist/types/bsc-trade.js.map +1 -0
  205. package/dist/types/index.d.ts +3 -0
  206. package/dist/types/index.d.ts.map +1 -0
  207. package/dist/types/index.js +3 -0
  208. package/dist/types/index.js.map +1 -0
  209. package/dist/types/steward.d.ts +83 -0
  210. package/dist/types/steward.d.ts.map +1 -0
  211. package/dist/types/steward.js +1 -0
  212. package/dist/types/steward.js.map +1 -0
  213. package/dist/ui.d.ts +7 -0
  214. package/dist/ui.d.ts.map +1 -0
  215. package/dist/ui.js +7 -0
  216. package/dist/ui.js.map +1 -0
  217. package/dist/views/bundle.js +601 -0
  218. package/dist/views/bundle.js.map +1 -0
  219. package/package.json +8 -8
@@ -0,0 +1,617 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { logger, resolveStateDir } from "@elizaos/core";
5
+ import { secp256k1 } from "@noble/curves/secp256k1.js";
6
+ import * as ethers from "ethers";
7
+ function isRecord(value) {
8
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
9
+ }
10
+ function readStringField(record, key) {
11
+ const value = record[key];
12
+ return typeof value === "string" ? value : void 0;
13
+ }
14
+ function readStewardAgentWalletPayload(value) {
15
+ const envelope = isRecord(value) ? value : {};
16
+ const payload = isRecord(envelope.data) ? envelope.data : envelope;
17
+ const walletAddresses = isRecord(payload.walletAddresses) ? {
18
+ evm: readStringField(payload.walletAddresses, "evm"),
19
+ solana: readStringField(payload.walletAddresses, "solana")
20
+ } : void 0;
21
+ return {
22
+ walletAddress: readStringField(payload, "walletAddress"),
23
+ walletAddresses
24
+ };
25
+ }
26
+ import {
27
+ computeValueUsd,
28
+ DEX_PRICE_TIMEOUT_MS,
29
+ DEXPAPRIKA_CHAIN_MAP,
30
+ DEXSCREENER_CHAIN_MAP,
31
+ fetchDexPaprikaPrices,
32
+ fetchDexPrices,
33
+ fetchDexScreenerPrices,
34
+ WRAPPED_NATIVE
35
+ } from "./wallet-dex-prices.js";
36
+ import {
37
+ DEFAULT_EVM_CHAINS,
38
+ fetchEvmBalances,
39
+ resolveEvmProviderKeys
40
+ } from "./wallet-evm-balance.js";
41
+ const FETCH_TIMEOUT_MS = 15e3;
42
+ const MANAGED_EVM_ADDRESS_ENV_KEY = "ELIZA_MANAGED_EVM_ADDRESS";
43
+ const MANAGED_SOLANA_ADDRESS_ENV_KEY = "ELIZA_MANAGED_SOLANA_ADDRESS";
44
+ let stewardAddressCache = null;
45
+ function generateEvmPrivateKey() {
46
+ return `0x${crypto.randomBytes(32).toString("hex")}`;
47
+ }
48
+ function deriveEvmAddress(privateKeyHex) {
49
+ const cleaned = privateKeyHex.startsWith("0x") ? privateKeyHex.slice(2) : privateKeyHex;
50
+ const pubKey = secp256k1.getPublicKey(Buffer.from(cleaned, "hex"), false);
51
+ const pubNoPrefix = pubKey.subarray(1);
52
+ const hash = ethers.keccak256(pubNoPrefix);
53
+ const raw = hash.slice(26);
54
+ return ethers.getAddress(`0x${raw}`);
55
+ }
56
+ function generateSolanaKeypair() {
57
+ const { privateKey, publicKey } = crypto.generateKeyPairSync("ed25519");
58
+ const privBytes = privateKey.export({ type: "pkcs8", format: "der" });
59
+ const pubBytes = publicKey.export({ type: "spki", format: "der" });
60
+ const seed = privBytes.subarray(16, 48);
61
+ const pubRaw = pubBytes.subarray(12, 44);
62
+ return {
63
+ privateKey: base58Encode(Buffer.concat([seed, pubRaw])),
64
+ publicKey: base58Encode(pubRaw)
65
+ };
66
+ }
67
+ function deriveSolanaAddress(privateKeyString) {
68
+ const secretBytes = decodeSolanaPrivateKey(privateKeyString);
69
+ if (secretBytes.length === 64) return base58Encode(secretBytes.subarray(32));
70
+ if (secretBytes.length === 32) {
71
+ const keyObj = crypto.createPrivateKey({
72
+ key: Buffer.concat([
73
+ Buffer.from("302e020100300506032b657004220420", "hex"),
74
+ secretBytes
75
+ ]),
76
+ format: "der",
77
+ type: "pkcs8"
78
+ });
79
+ const pubDer = crypto.createPublicKey(keyObj).export({ type: "spki", format: "der" });
80
+ return base58Encode(pubDer.subarray(12, 44));
81
+ }
82
+ throw new Error(`Invalid Solana secret key length: ${secretBytes.length}`);
83
+ }
84
+ const B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
85
+ function base58Encode(data) {
86
+ let num = BigInt(`0x${Buffer.from(data).toString("hex")}`);
87
+ const chars = [];
88
+ while (num > 0n) {
89
+ chars.unshift(B58[Number(num % 58n)]);
90
+ num /= 58n;
91
+ }
92
+ for (const byte of data) {
93
+ if (byte === 0) chars.unshift("1");
94
+ else break;
95
+ }
96
+ return chars.join("") || "1";
97
+ }
98
+ function base58Decode(str) {
99
+ if (str.length === 0) return Buffer.alloc(0);
100
+ let num = 0n;
101
+ for (const c of str) {
102
+ const i = B58.indexOf(c);
103
+ if (i === -1) throw new Error(`Invalid base58: ${c}`);
104
+ num = num * 58n + BigInt(i);
105
+ }
106
+ const hex = num.toString(16).padStart(2, "0");
107
+ const bytes = Buffer.from(hex.length % 2 ? `0${hex}` : hex, "hex");
108
+ let zeros = 0;
109
+ for (const c of str) {
110
+ if (c === "1") zeros++;
111
+ else break;
112
+ }
113
+ return zeros > 0 ? Buffer.concat([Buffer.alloc(zeros), bytes]) : bytes;
114
+ }
115
+ const ENV_SENTINEL_RE = /^\[?\s*(REDACTED|PLACEHOLDER|T(?:O)D(?:O)|CHANGEME|EMPTY)\s*]?$/i;
116
+ function decodeSolanaPrivateKey(key) {
117
+ if (ENV_SENTINEL_RE.test(key)) {
118
+ throw new Error("sentinel env value");
119
+ }
120
+ if (key.startsWith("[") && key.endsWith("]") && /^\[\s*\d/.test(key)) {
121
+ try {
122
+ const parsed = JSON.parse(key);
123
+ if (!Array.isArray(parsed) || !parsed.every((v) => typeof v === "number")) {
124
+ throw new Error("not a numeric array");
125
+ }
126
+ return Buffer.from(parsed);
127
+ } catch {
128
+ throw new Error("Invalid JSON byte-array format");
129
+ }
130
+ }
131
+ return base58Decode(key);
132
+ }
133
+ const HEX_RE = /^[0-9a-fA-F]+$/;
134
+ function validateEvmPrivateKey(key) {
135
+ const cleaned = key.startsWith("0x") ? key.slice(2) : key;
136
+ if (cleaned.length !== 64)
137
+ return {
138
+ valid: false,
139
+ chain: "evm",
140
+ address: null,
141
+ error: "Must be 64 hex characters"
142
+ };
143
+ if (!HEX_RE.test(cleaned))
144
+ return {
145
+ valid: false,
146
+ chain: "evm",
147
+ address: null,
148
+ error: "Invalid hex characters"
149
+ };
150
+ try {
151
+ return {
152
+ valid: true,
153
+ chain: "evm",
154
+ address: deriveEvmAddress(key),
155
+ error: null
156
+ };
157
+ } catch (err) {
158
+ return {
159
+ valid: false,
160
+ chain: "evm",
161
+ address: null,
162
+ error: `Derivation failed: ${String(err)}`
163
+ };
164
+ }
165
+ }
166
+ function validateSolanaPrivateKey(key) {
167
+ try {
168
+ const bytes = decodeSolanaPrivateKey(key);
169
+ if (bytes.length !== 64 && bytes.length !== 32) {
170
+ return {
171
+ valid: false,
172
+ chain: "solana",
173
+ address: null,
174
+ error: `Must be 32 or 64 bytes, got ${bytes.length}`
175
+ };
176
+ }
177
+ return {
178
+ valid: true,
179
+ chain: "solana",
180
+ address: deriveSolanaAddress(key),
181
+ error: null
182
+ };
183
+ } catch (err) {
184
+ return {
185
+ valid: false,
186
+ chain: "solana",
187
+ address: null,
188
+ error: `Invalid key: ${String(err)}`
189
+ };
190
+ }
191
+ }
192
+ function validatePrivateKey(key) {
193
+ const trimmed = key.trim();
194
+ if (trimmed.startsWith("0x") || trimmed.length === 64 && HEX_RE.test(trimmed))
195
+ return validateEvmPrivateKey(trimmed);
196
+ return validateSolanaPrivateKey(trimmed);
197
+ }
198
+ function maskSecret(value) {
199
+ if (!value || value.length <= 8) return "****";
200
+ return `${value.slice(0, 4)}...${value.slice(-4)}`;
201
+ }
202
+ function generateWalletKeys() {
203
+ const evmPrivateKey = generateEvmPrivateKey();
204
+ const solana = generateSolanaKeypair();
205
+ return {
206
+ evmPrivateKey,
207
+ evmAddress: deriveEvmAddress(evmPrivateKey),
208
+ solanaPrivateKey: solana.privateKey,
209
+ solanaAddress: solana.publicKey
210
+ };
211
+ }
212
+ function generateWalletForChain(chain) {
213
+ if (chain === "evm") {
214
+ const pk = generateEvmPrivateKey();
215
+ return { chain, address: deriveEvmAddress(pk), privateKey: pk };
216
+ }
217
+ const sol = generateSolanaKeypair();
218
+ return {
219
+ chain: "solana",
220
+ address: sol.publicKey,
221
+ privateKey: sol.privateKey
222
+ };
223
+ }
224
+ function syncSolanaPublicKeyEnv(privateKey = process.env.SOLANA_PRIVATE_KEY) {
225
+ const trimmed = privateKey?.trim();
226
+ if (!trimmed || ENV_SENTINEL_RE.test(trimmed)) {
227
+ return null;
228
+ }
229
+ try {
230
+ const publicKey = deriveSolanaAddress(trimmed);
231
+ process.env.SOLANA_PUBLIC_KEY = publicKey;
232
+ process.env.WALLET_PUBLIC_KEY = publicKey;
233
+ return publicKey;
234
+ } catch {
235
+ return null;
236
+ }
237
+ }
238
+ function setSolanaWalletEnv(privateKey) {
239
+ const trimmed = privateKey.trim();
240
+ process.env.SOLANA_PRIVATE_KEY = trimmed;
241
+ return syncSolanaPublicKeyEnv(trimmed);
242
+ }
243
+ function importWallet(chain, privateKey) {
244
+ const trimmed = privateKey.trim();
245
+ if (chain === "evm") {
246
+ const v2 = validateEvmPrivateKey(trimmed);
247
+ if (!v2.valid)
248
+ return { success: false, chain, address: null, error: v2.error };
249
+ process.env.EVM_PRIVATE_KEY = trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
250
+ logger.info(`[wallet] Imported EVM wallet: ${v2.address}`);
251
+ return { success: true, chain, address: v2.address, error: null };
252
+ }
253
+ const v = validateSolanaPrivateKey(trimmed);
254
+ if (!v.valid) return { success: false, chain, address: null, error: v.error };
255
+ setSolanaWalletEnv(trimmed);
256
+ logger.info(`[wallet] Imported Solana wallet: ${v.address}`);
257
+ return { success: true, chain, address: v.address, error: null };
258
+ }
259
+ const STEWARD_EVM_ADDRESS_ENV_KEY = "STEWARD_EVM_ADDRESS";
260
+ const STEWARD_SOLANA_ADDRESS_ENV_KEY = "STEWARD_SOLANA_ADDRESS";
261
+ function resolveStewardCredentialsPath() {
262
+ return path.join(resolveStateDir(), "steward-credentials.json");
263
+ }
264
+ function normalizeOptionalString(value) {
265
+ if (typeof value !== "string") {
266
+ return null;
267
+ }
268
+ const trimmed = value.trim();
269
+ return trimmed.length > 0 ? trimmed : null;
270
+ }
271
+ function readPersistedStewardCredentials() {
272
+ const credentialsPath = resolveStewardCredentialsPath();
273
+ try {
274
+ if (!fs.existsSync(credentialsPath)) {
275
+ return null;
276
+ }
277
+ const parsed = JSON.parse(
278
+ fs.readFileSync(credentialsPath, "utf8")
279
+ );
280
+ return {
281
+ apiUrl: normalizeOptionalString(parsed.apiUrl),
282
+ tenantId: normalizeOptionalString(parsed.tenantId),
283
+ agentId: normalizeOptionalString(parsed.agentId),
284
+ apiKey: normalizeOptionalString(parsed.apiKey),
285
+ agentToken: normalizeOptionalString(parsed.agentToken)
286
+ };
287
+ } catch {
288
+ return null;
289
+ }
290
+ }
291
+ async function initStewardWalletCache() {
292
+ const persisted = readPersistedStewardCredentials();
293
+ const stewardApiUrl = normalizeOptionalString(process.env.STEWARD_API_URL) ?? persisted?.apiUrl;
294
+ if (!stewardApiUrl) return;
295
+ const agentId = normalizeOptionalString(process.env.STEWARD_AGENT_ID) || normalizeOptionalString(process.env.ELIZA_STEWARD_AGENT_ID) || persisted?.agentId || null;
296
+ if (!agentId) return;
297
+ try {
298
+ const headers = { Accept: "application/json" };
299
+ const bearerToken = normalizeOptionalString(process.env.STEWARD_AGENT_TOKEN) ?? persisted?.agentToken;
300
+ const apiKey = normalizeOptionalString(process.env.STEWARD_API_KEY) ?? persisted?.apiKey;
301
+ const tenantId = normalizeOptionalString(process.env.STEWARD_TENANT_ID) ?? persisted?.tenantId;
302
+ if (bearerToken) {
303
+ headers.Authorization = `Bearer ${bearerToken}`;
304
+ } else if (apiKey) {
305
+ headers["X-Steward-Key"] = apiKey;
306
+ }
307
+ if (tenantId) {
308
+ headers["X-Steward-Tenant"] = tenantId;
309
+ }
310
+ const res = await fetch(
311
+ `${stewardApiUrl}/agents/${encodeURIComponent(agentId)}`,
312
+ { headers, signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) }
313
+ );
314
+ if (!res.ok) {
315
+ logger.warn(
316
+ `[wallet] Steward wallet cache init: agent lookup returned ${res.status}`
317
+ );
318
+ return;
319
+ }
320
+ const agent = readStewardAgentWalletPayload(await res.json());
321
+ const stewardEvm = agent?.walletAddresses?.evm?.trim() || agent?.walletAddress?.trim() || null;
322
+ const stewardSolana = agent?.walletAddresses?.solana?.trim() || null;
323
+ stewardAddressCache = { evm: stewardEvm, solana: stewardSolana };
324
+ if (stewardEvm) {
325
+ process.env[STEWARD_EVM_ADDRESS_ENV_KEY] = stewardEvm;
326
+ } else {
327
+ delete process.env[STEWARD_EVM_ADDRESS_ENV_KEY];
328
+ }
329
+ if (stewardSolana) {
330
+ process.env[STEWARD_SOLANA_ADDRESS_ENV_KEY] = stewardSolana;
331
+ if (!process.env.SOLANA_PUBLIC_KEY?.trim()) {
332
+ process.env.SOLANA_PUBLIC_KEY = stewardSolana;
333
+ }
334
+ if (!process.env.WALLET_PUBLIC_KEY?.trim()) {
335
+ process.env.WALLET_PUBLIC_KEY = stewardSolana;
336
+ }
337
+ } else {
338
+ delete process.env[STEWARD_SOLANA_ADDRESS_ENV_KEY];
339
+ }
340
+ if (stewardEvm) {
341
+ logger.info(`[wallet] Steward EVM address cached: ${stewardEvm}`);
342
+ }
343
+ if (stewardSolana) {
344
+ logger.info(`[wallet] Steward Solana address cached: ${stewardSolana}`);
345
+ }
346
+ } catch (err) {
347
+ logger.debug(`[wallet] Steward wallet cache init unavailable: ${err}`);
348
+ }
349
+ }
350
+ function getWalletAddresses() {
351
+ let evmAddress = null;
352
+ let solanaAddress = null;
353
+ const stewardEvm = stewardAddressCache?.evm?.trim() ?? process.env[STEWARD_EVM_ADDRESS_ENV_KEY]?.trim();
354
+ if (stewardEvm && /^0x[0-9a-fA-F]{40}$/.test(stewardEvm)) {
355
+ evmAddress = stewardEvm;
356
+ }
357
+ const stewardSolana = stewardAddressCache?.solana?.trim() ?? process.env[STEWARD_SOLANA_ADDRESS_ENV_KEY]?.trim();
358
+ if (stewardSolana) {
359
+ try {
360
+ const decoded = base58Decode(stewardSolana);
361
+ if (decoded.length === 32) {
362
+ solanaAddress = stewardSolana;
363
+ }
364
+ } catch {
365
+ }
366
+ }
367
+ if (!evmAddress) {
368
+ const evmKey = process.env.EVM_PRIVATE_KEY;
369
+ if (evmKey && !ENV_SENTINEL_RE.test(evmKey)) {
370
+ try {
371
+ evmAddress = deriveEvmAddress(evmKey);
372
+ } catch (e) {
373
+ logger.warn(`Bad EVM key: ${e}`);
374
+ }
375
+ }
376
+ }
377
+ if (!solanaAddress) {
378
+ const solKey = process.env.SOLANA_PRIVATE_KEY;
379
+ if (solKey && !ENV_SENTINEL_RE.test(solKey)) {
380
+ try {
381
+ solanaAddress = deriveSolanaAddress(solKey);
382
+ } catch (e) {
383
+ logger.warn(`Bad SOL key: ${e}`);
384
+ }
385
+ }
386
+ }
387
+ if (!evmAddress) {
388
+ const managedEvmAddress = process.env[MANAGED_EVM_ADDRESS_ENV_KEY];
389
+ if (managedEvmAddress) {
390
+ const trimmed = managedEvmAddress.trim();
391
+ if (/^0x[0-9a-fA-F]{40}$/.test(trimmed)) {
392
+ evmAddress = trimmed;
393
+ } else {
394
+ logger.warn("Bad managed EVM address in env");
395
+ }
396
+ }
397
+ }
398
+ if (!solanaAddress) {
399
+ const managedSolanaAddress = process.env[MANAGED_SOLANA_ADDRESS_ENV_KEY];
400
+ if (managedSolanaAddress) {
401
+ const trimmed = managedSolanaAddress.trim();
402
+ try {
403
+ const decoded = base58Decode(trimmed);
404
+ if (decoded.length === 32) {
405
+ solanaAddress = trimmed;
406
+ } else {
407
+ logger.warn("Bad managed Solana address in env");
408
+ }
409
+ } catch {
410
+ logger.warn("Bad managed Solana address in env");
411
+ }
412
+ }
413
+ }
414
+ return { evmAddress, solanaAddress };
415
+ }
416
+ async function getWalletAddressesWithSteward() {
417
+ const base = getWalletAddresses();
418
+ const stewardApiUrl = process.env.STEWARD_API_URL?.trim();
419
+ if (!stewardApiUrl) {
420
+ return base;
421
+ }
422
+ const agentId = process.env.STEWARD_AGENT_ID?.trim() || process.env.ELIZA_STEWARD_AGENT_ID?.trim() || base.evmAddress?.trim() || null;
423
+ if (!agentId) {
424
+ return base;
425
+ }
426
+ try {
427
+ const headers = {
428
+ Accept: "application/json"
429
+ };
430
+ const bearerToken = process.env.STEWARD_AGENT_TOKEN?.trim();
431
+ const apiKey = process.env.STEWARD_API_KEY?.trim();
432
+ const tenantId = process.env.STEWARD_TENANT_ID?.trim();
433
+ if (bearerToken) {
434
+ headers.Authorization = `Bearer ${bearerToken}`;
435
+ } else if (apiKey) {
436
+ headers["X-Steward-Key"] = apiKey;
437
+ }
438
+ if (tenantId) {
439
+ headers["X-Steward-Tenant"] = tenantId;
440
+ }
441
+ const res = await fetch(
442
+ `${stewardApiUrl}/agents/${encodeURIComponent(agentId)}`,
443
+ { headers, signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) }
444
+ );
445
+ if (!res.ok) {
446
+ logger.warn(`Steward agent lookup returned ${res.status}`);
447
+ return base;
448
+ }
449
+ const agent = readStewardAgentWalletPayload(await res.json());
450
+ const stewardEvm = agent?.walletAddresses?.evm?.trim() || agent?.walletAddress?.trim() || null;
451
+ const stewardSolana = agent?.walletAddresses?.solana?.trim() || null;
452
+ return {
453
+ evmAddress: base.evmAddress ?? stewardEvm,
454
+ solanaAddress: base.solanaAddress ?? stewardSolana,
455
+ stewardEvmAddress: stewardEvm,
456
+ stewardSolanaAddress: stewardSolana
457
+ };
458
+ } catch (err) {
459
+ logger.warn(`Steward wallet address lookup failed: ${err}`);
460
+ return base;
461
+ }
462
+ }
463
+ function rpcJsonRequest(body) {
464
+ return {
465
+ method: "POST",
466
+ headers: { "Content-Type": "application/json" },
467
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
468
+ body
469
+ };
470
+ }
471
+ function describeRpcEndpoint(url) {
472
+ try {
473
+ return new URL(url).host;
474
+ } catch {
475
+ return "rpc";
476
+ }
477
+ }
478
+ async function jsonOrThrow(res) {
479
+ const text = await res.text();
480
+ if (!res.ok) throw new Error(text.slice(0, 200) || `HTTP ${res.status}`);
481
+ try {
482
+ return JSON.parse(text);
483
+ } catch {
484
+ throw new Error(text.slice(0, 200) || "Invalid JSON");
485
+ }
486
+ }
487
+ async function fetchSolanaBalances(address, heliusKey) {
488
+ const url = `https://mainnet.helius-rpc.com/?api-key=${heliusKey}`;
489
+ const rpc = (body) => ({
490
+ method: "POST",
491
+ headers: { "Content-Type": "application/json" },
492
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
493
+ body
494
+ });
495
+ let solBalance = "0";
496
+ try {
497
+ const data = await jsonOrThrow(
498
+ await fetch(
499
+ url,
500
+ rpc(
501
+ JSON.stringify({
502
+ jsonrpc: "2.0",
503
+ id: 1,
504
+ method: "getBalance",
505
+ params: [address]
506
+ })
507
+ )
508
+ )
509
+ );
510
+ if (data.error?.message) throw new Error(data.error.message);
511
+ solBalance = ((data.result?.value ?? 0) / 1e9).toFixed(9);
512
+ } catch (err) {
513
+ logger.warn(`SOL balance fetch failed: ${String(err)}`);
514
+ }
515
+ const tokens = [];
516
+ try {
517
+ const data = await jsonOrThrow(
518
+ await fetch(
519
+ url,
520
+ rpc(
521
+ JSON.stringify({
522
+ jsonrpc: "2.0",
523
+ id: 2,
524
+ method: "getAssetsByOwner",
525
+ params: {
526
+ ownerAddress: address,
527
+ displayOptions: { showFungible: true, showNativeBalance: true },
528
+ page: 1,
529
+ limit: 100
530
+ }
531
+ })
532
+ )
533
+ )
534
+ );
535
+ if (data.error?.message) throw new Error(data.error.message);
536
+ for (const item of data.result?.items ?? []) {
537
+ if (item.interface !== "FungibleToken" && item.interface !== "FungibleAsset")
538
+ continue;
539
+ const dec = item.token_info?.decimals ?? 0;
540
+ const raw = item.token_info?.balance ?? 0;
541
+ tokens.push({
542
+ symbol: item.token_info?.symbol ?? item.content?.metadata?.symbol ?? "???",
543
+ name: item.content?.metadata?.name ?? "Unknown",
544
+ mint: item.id,
545
+ balance: dec > 0 ? (raw / 10 ** dec).toString() : raw.toString(),
546
+ decimals: dec,
547
+ valueUsd: item.token_info?.price_info?.total_price?.toFixed(2) ?? "0",
548
+ logoUrl: item.content?.links?.image ?? ""
549
+ });
550
+ }
551
+ } catch (err) {
552
+ logger.warn(`Solana token fetch failed: ${String(err)}`);
553
+ }
554
+ return { solBalance, solValueUsd: "0", tokens };
555
+ }
556
+ async function fetchSolanaNativeBalanceViaRpc(address, rpcUrls) {
557
+ const urls = [...new Set(rpcUrls)].filter((u) => Boolean(u?.trim()));
558
+ const errors = [];
559
+ for (const rpcUrl of urls) {
560
+ try {
561
+ const data = await jsonOrThrow(
562
+ await fetch(
563
+ rpcUrl,
564
+ rpcJsonRequest(
565
+ JSON.stringify({
566
+ jsonrpc: "2.0",
567
+ id: 1,
568
+ method: "getBalance",
569
+ params: [address]
570
+ })
571
+ )
572
+ )
573
+ );
574
+ if (data.error?.message) throw new Error(data.error.message);
575
+ const solBalance = ((data.result?.value ?? 0) / 1e9).toFixed(9);
576
+ return { solBalance, solValueUsd: "0", tokens: [] };
577
+ } catch (err) {
578
+ const msg = String(err);
579
+ errors.push(`${describeRpcEndpoint(rpcUrl)}: ${msg}`);
580
+ }
581
+ }
582
+ throw new Error(errors.join(" | ").slice(0, 400) || "Solana RPC unavailable");
583
+ }
584
+ export {
585
+ DEFAULT_EVM_CHAINS,
586
+ DEXPAPRIKA_CHAIN_MAP,
587
+ DEXSCREENER_CHAIN_MAP,
588
+ DEX_PRICE_TIMEOUT_MS,
589
+ MANAGED_EVM_ADDRESS_ENV_KEY,
590
+ MANAGED_SOLANA_ADDRESS_ENV_KEY,
591
+ STEWARD_EVM_ADDRESS_ENV_KEY,
592
+ STEWARD_SOLANA_ADDRESS_ENV_KEY,
593
+ WRAPPED_NATIVE,
594
+ computeValueUsd,
595
+ deriveEvmAddress,
596
+ deriveSolanaAddress,
597
+ fetchDexPaprikaPrices,
598
+ fetchDexPrices,
599
+ fetchDexScreenerPrices,
600
+ fetchEvmBalances,
601
+ fetchSolanaBalances,
602
+ fetchSolanaNativeBalanceViaRpc,
603
+ generateWalletForChain,
604
+ generateWalletKeys,
605
+ getWalletAddresses,
606
+ getWalletAddressesWithSteward,
607
+ importWallet,
608
+ initStewardWalletCache,
609
+ maskSecret,
610
+ resolveEvmProviderKeys,
611
+ setSolanaWalletEnv,
612
+ syncSolanaPublicKeyEnv,
613
+ validateEvmPrivateKey,
614
+ validatePrivateKey,
615
+ validateSolanaPrivateKey
616
+ };
617
+ //# sourceMappingURL=wallet.js.map