@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.
- package/dist/ApprovalQueue.d.ts +18 -0
- package/dist/ApprovalQueue.d.ts.map +1 -0
- package/dist/ApprovalQueue.js +420 -0
- package/dist/ApprovalQueue.js.map +1 -0
- package/dist/StewardLogo.d.ts +11 -0
- package/dist/StewardLogo.d.ts.map +1 -0
- package/dist/StewardLogo.js +36 -0
- package/dist/StewardLogo.js.map +1 -0
- package/dist/StewardView.d.ts +13 -0
- package/dist/StewardView.d.ts.map +1 -0
- package/dist/StewardView.helpers.d.ts +15 -0
- package/dist/StewardView.helpers.d.ts.map +1 -0
- package/dist/StewardView.helpers.js +45 -0
- package/dist/StewardView.helpers.js.map +1 -0
- package/dist/StewardView.interact.d.ts +2 -0
- package/dist/StewardView.interact.d.ts.map +1 -0
- package/dist/StewardView.interact.js +54 -0
- package/dist/StewardView.interact.js.map +1 -0
- package/dist/StewardView.js +249 -0
- package/dist/StewardView.js.map +1 -0
- package/dist/TransactionHistory.d.ts +22 -0
- package/dist/TransactionHistory.d.ts.map +1 -0
- package/dist/TransactionHistory.js +361 -0
- package/dist/TransactionHistory.js.map +1 -0
- package/dist/__fixtures__/steward-sdk-fixtures.d.ts +10 -0
- package/dist/__fixtures__/steward-sdk-fixtures.d.ts.map +1 -0
- package/dist/__fixtures__/steward-sdk-fixtures.js +60 -0
- package/dist/__fixtures__/steward-sdk-fixtures.js.map +1 -0
- package/dist/actions/wallet-action-shared.d.ts +15 -0
- package/dist/actions/wallet-action-shared.d.ts.map +1 -0
- package/dist/actions/wallet-action-shared.js +16 -0
- package/dist/actions/wallet-action-shared.js.map +1 -0
- package/dist/api/binance-skill-helpers.d.ts +21 -0
- package/dist/api/binance-skill-helpers.d.ts.map +1 -0
- package/dist/api/binance-skill-helpers.js +790 -0
- package/dist/api/binance-skill-helpers.js.map +1 -0
- package/dist/api/bsc-trade.d.ts +36 -0
- package/dist/api/bsc-trade.d.ts.map +1 -0
- package/dist/api/bsc-trade.js +796 -0
- package/dist/api/bsc-trade.js.map +1 -0
- package/dist/api/trade-safety.d.ts +35 -0
- package/dist/api/trade-safety.d.ts.map +1 -0
- package/dist/api/trade-safety.js +56 -0
- package/dist/api/trade-safety.js.map +1 -0
- package/dist/api/tx-service.d.ts +53 -0
- package/dist/api/tx-service.d.ts.map +1 -0
- package/dist/api/tx-service.js +206 -0
- package/dist/api/tx-service.js.map +1 -0
- package/dist/api/wallet-bsc-routes.d.ts +63 -0
- package/dist/api/wallet-bsc-routes.d.ts.map +1 -0
- package/dist/api/wallet-bsc-routes.js +337 -0
- package/dist/api/wallet-bsc-routes.js.map +1 -0
- package/dist/api/wallet-capability.d.ts +2 -0
- package/dist/api/wallet-capability.d.ts.map +1 -0
- package/dist/api/wallet-capability.js +15 -0
- package/dist/api/wallet-capability.js.map +1 -0
- package/dist/api/wallet-dex-prices.d.ts +43 -0
- package/dist/api/wallet-dex-prices.d.ts.map +1 -0
- package/dist/api/wallet-dex-prices.js +132 -0
- package/dist/api/wallet-dex-prices.js.map +1 -0
- package/dist/api/wallet-evm-balance.d.ts +72 -0
- package/dist/api/wallet-evm-balance.d.ts.map +1 -0
- package/dist/api/wallet-evm-balance.js +697 -0
- package/dist/api/wallet-evm-balance.js.map +1 -0
- package/dist/api/wallet-routes.d.ts +27 -0
- package/dist/api/wallet-routes.d.ts.map +1 -0
- package/dist/api/wallet-routes.js +556 -0
- package/dist/api/wallet-routes.js.map +1 -0
- package/dist/api/wallet-rpc.d.ts +73 -0
- package/dist/api/wallet-rpc.d.ts.map +1 -0
- package/dist/api/wallet-rpc.js +460 -0
- package/dist/api/wallet-rpc.js.map +1 -0
- package/dist/api/wallet-trade-routes.d.ts +104 -0
- package/dist/api/wallet-trade-routes.d.ts.map +1 -0
- package/dist/api/wallet-trade-routes.js +353 -0
- package/dist/api/wallet-trade-routes.js.map +1 -0
- package/dist/api/wallet-trading-profile.d.ts +31 -0
- package/dist/api/wallet-trading-profile.d.ts.map +1 -0
- package/dist/api/wallet-trading-profile.js +500 -0
- package/dist/api/wallet-trading-profile.js.map +1 -0
- package/dist/api/wallet.d.ts +60 -0
- package/dist/api/wallet.d.ts.map +1 -0
- package/dist/api/wallet.js +617 -0
- package/dist/api/wallet.js.map +1 -0
- package/dist/chain-utils.d.ts +10 -0
- package/dist/chain-utils.d.ts.map +1 -0
- package/dist/chain-utils.js +81 -0
- package/dist/chain-utils.js.map +1 -0
- package/dist/components/StewardSpatialView.d.ts +74 -0
- package/dist/components/StewardSpatialView.d.ts.map +1 -0
- package/dist/components/StewardSpatialView.js +309 -0
- package/dist/components/StewardSpatialView.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +21 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +319 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/steward-balance.d.ts +12 -0
- package/dist/providers/steward-balance.d.ts.map +1 -0
- package/dist/providers/steward-balance.js +85 -0
- package/dist/providers/steward-balance.js.map +1 -0
- package/dist/providers/steward-receive-address.d.ts +12 -0
- package/dist/providers/steward-receive-address.d.ts.map +1 -0
- package/dist/providers/steward-receive-address.js +47 -0
- package/dist/providers/steward-receive-address.js.map +1 -0
- package/dist/register-routes.d.ts +2 -0
- package/dist/register-routes.d.ts.map +1 -0
- package/dist/register-routes.js +6 -0
- package/dist/register-routes.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +34 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/routes/steward-bridge.d.ts +202 -0
- package/dist/routes/steward-bridge.d.ts.map +1 -0
- package/dist/routes/steward-bridge.js +776 -0
- package/dist/routes/steward-bridge.js.map +1 -0
- package/dist/routes/steward-compat-routes.d.ts +21 -0
- package/dist/routes/steward-compat-routes.d.ts.map +1 -0
- package/dist/routes/steward-compat-routes.js +350 -0
- package/dist/routes/steward-compat-routes.js.map +1 -0
- package/dist/routes/wallet-browser-compat-routes.d.ts +6 -0
- package/dist/routes/wallet-browser-compat-routes.d.ts.map +1 -0
- package/dist/routes/wallet-browser-compat-routes.js +402 -0
- package/dist/routes/wallet-browser-compat-routes.js.map +1 -0
- package/dist/routes/wallet-bsc-core-routes.d.ts +15 -0
- package/dist/routes/wallet-bsc-core-routes.d.ts.map +1 -0
- package/dist/routes/wallet-bsc-core-routes.js +59 -0
- package/dist/routes/wallet-bsc-core-routes.js.map +1 -0
- package/dist/routes/wallet-compat-routes.d.ts +13 -0
- package/dist/routes/wallet-compat-routes.d.ts.map +1 -0
- package/dist/routes/wallet-compat-routes.js +206 -0
- package/dist/routes/wallet-compat-routes.js.map +1 -0
- package/dist/routes/wallet-core-routes.d.ts +16 -0
- package/dist/routes/wallet-core-routes.d.ts.map +1 -0
- package/dist/routes/wallet-core-routes.js +48 -0
- package/dist/routes/wallet-core-routes.js.map +1 -0
- package/dist/routes/wallet-trade-compat-routes.d.ts +11 -0
- package/dist/routes/wallet-trade-compat-routes.d.ts.map +1 -0
- package/dist/routes/wallet-trade-compat-routes.js +570 -0
- package/dist/routes/wallet-trade-compat-routes.js.map +1 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts +7 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.js +43 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.js.map +1 -0
- package/dist/security/wallet-os-store-actions.d.ts +14 -0
- package/dist/security/wallet-os-store-actions.d.ts.map +1 -0
- package/dist/security/wallet-os-store-actions.js +63 -0
- package/dist/security/wallet-os-store-actions.js.map +1 -0
- package/dist/services/steward-credentials.d.ts +2 -0
- package/dist/services/steward-credentials.d.ts.map +1 -0
- package/dist/services/steward-credentials.js +2 -0
- package/dist/services/steward-credentials.js.map +1 -0
- package/dist/services/steward-evm-account.d.ts +75 -0
- package/dist/services/steward-evm-account.d.ts.map +1 -0
- package/dist/services/steward-evm-account.js +279 -0
- package/dist/services/steward-evm-account.js.map +1 -0
- package/dist/services/steward-evm-bridge.d.ts +36 -0
- package/dist/services/steward-evm-bridge.d.ts.map +1 -0
- package/dist/services/steward-evm-bridge.js +78 -0
- package/dist/services/steward-evm-bridge.js.map +1 -0
- package/dist/services/steward-sidecar/health-check.d.ts +2 -0
- package/dist/services/steward-sidecar/health-check.d.ts.map +1 -0
- package/dist/services/steward-sidecar/health-check.js +2 -0
- package/dist/services/steward-sidecar/health-check.js.map +1 -0
- package/dist/services/steward-sidecar/helpers.d.ts +2 -0
- package/dist/services/steward-sidecar/helpers.d.ts.map +1 -0
- package/dist/services/steward-sidecar/helpers.js +2 -0
- package/dist/services/steward-sidecar/helpers.js.map +1 -0
- package/dist/services/steward-sidecar/process-management.d.ts +2 -0
- package/dist/services/steward-sidecar/process-management.d.ts.map +1 -0
- package/dist/services/steward-sidecar/process-management.js +2 -0
- package/dist/services/steward-sidecar/process-management.js.map +1 -0
- package/dist/services/steward-sidecar/types.d.ts +2 -0
- package/dist/services/steward-sidecar/types.d.ts.map +1 -0
- package/dist/services/steward-sidecar/types.js +2 -0
- package/dist/services/steward-sidecar/types.js.map +1 -0
- package/dist/services/steward-sidecar/wallet-setup.d.ts +2 -0
- package/dist/services/steward-sidecar/wallet-setup.d.ts.map +1 -0
- package/dist/services/steward-sidecar/wallet-setup.js +2 -0
- package/dist/services/steward-sidecar/wallet-setup.js.map +1 -0
- package/dist/services/steward-sidecar.d.ts +2 -0
- package/dist/services/steward-sidecar.d.ts.map +1 -0
- package/dist/services/steward-sidecar.js +2 -0
- package/dist/services/steward-sidecar.js.map +1 -0
- package/dist/services/steward-wallet.d.ts +25 -0
- package/dist/services/steward-wallet.d.ts.map +1 -0
- package/dist/services/steward-wallet.js +333 -0
- package/dist/services/steward-wallet.js.map +1 -0
- package/dist/steward-ui-state.d.ts +14 -0
- package/dist/steward-ui-state.d.ts.map +1 -0
- package/dist/steward-ui-state.js +46 -0
- package/dist/steward-ui-state.js.map +1 -0
- package/dist/steward-view-bundle.d.ts +3 -0
- package/dist/steward-view-bundle.d.ts.map +1 -0
- package/dist/steward-view-bundle.js +7 -0
- package/dist/steward-view-bundle.js.map +1 -0
- package/dist/types/bsc-trade.d.ts +180 -0
- package/dist/types/bsc-trade.d.ts.map +1 -0
- package/dist/types/bsc-trade.js +1 -0
- package/dist/types/bsc-trade.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/steward.d.ts +83 -0
- package/dist/types/steward.d.ts.map +1 -0
- package/dist/types/steward.js +1 -0
- package/dist/types/steward.js.map +1 -0
- package/dist/ui.d.ts +7 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +7 -0
- package/dist/ui.js.map +1 -0
- package/dist/views/bundle.js +601 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { loadElizaConfig } from "@elizaos/agent/config/config";
|
|
3
|
+
import { ensureCompatApiAuthorized } from "@elizaos/app-core/api/auth";
|
|
4
|
+
import {
|
|
5
|
+
readCompatJsonBody
|
|
6
|
+
} from "@elizaos/app-core/api/compat-route-shared";
|
|
7
|
+
import {
|
|
8
|
+
sendJsonError as sendJsonErrorResponse,
|
|
9
|
+
sendJson as sendJsonResponse
|
|
10
|
+
} from "@elizaos/app-core/api/response";
|
|
11
|
+
import * as ethers from "ethers";
|
|
12
|
+
import { deriveSolanaAddress } from "../api/wallet.js";
|
|
13
|
+
import { resolveWalletRpcReadiness } from "../api/wallet-rpc.js";
|
|
14
|
+
function safeParseBigInt(value) {
|
|
15
|
+
try {
|
|
16
|
+
return BigInt(value);
|
|
17
|
+
} catch {
|
|
18
|
+
throw new Error(
|
|
19
|
+
`Invalid transaction value: expected an integer or hex string, got "${value}"`
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
import { isStewardConfigured, signViaSteward } from "./steward-bridge.js";
|
|
24
|
+
function normalizeHexData(value) {
|
|
25
|
+
if (typeof value !== "string") {
|
|
26
|
+
return void 0;
|
|
27
|
+
}
|
|
28
|
+
const trimmed = value.trim();
|
|
29
|
+
if (!trimmed) {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
return trimmed.startsWith("0x") ? trimmed : `0x${trimmed}`;
|
|
33
|
+
}
|
|
34
|
+
function normalizeString(value) {
|
|
35
|
+
if (typeof value !== "string") {
|
|
36
|
+
return void 0;
|
|
37
|
+
}
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
return trimmed ? trimmed : void 0;
|
|
40
|
+
}
|
|
41
|
+
function normalizeBoolean(value, fallback) {
|
|
42
|
+
return typeof value === "boolean" ? value : fallback;
|
|
43
|
+
}
|
|
44
|
+
const SOLANA_PKCS8_DER_PREFIX = Buffer.from(
|
|
45
|
+
"302e020100300506032b657004220420",
|
|
46
|
+
"hex"
|
|
47
|
+
);
|
|
48
|
+
const B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
49
|
+
function resolveLocalBrowserWallet() {
|
|
50
|
+
const evmKey = normalizeString(process.env.EVM_PRIVATE_KEY);
|
|
51
|
+
if (!evmKey) {
|
|
52
|
+
throw new Error("Local wallet signing is unavailable.");
|
|
53
|
+
}
|
|
54
|
+
return new ethers.Wallet(evmKey.startsWith("0x") ? evmKey : `0x${evmKey}`);
|
|
55
|
+
}
|
|
56
|
+
function base58Decode(value) {
|
|
57
|
+
if (!value.length) {
|
|
58
|
+
return Buffer.alloc(0);
|
|
59
|
+
}
|
|
60
|
+
let number = 0n;
|
|
61
|
+
for (const character of value) {
|
|
62
|
+
const index = B58.indexOf(character);
|
|
63
|
+
if (index === -1) {
|
|
64
|
+
throw new Error(`Invalid base58 character: ${character}`);
|
|
65
|
+
}
|
|
66
|
+
number = number * 58n + BigInt(index);
|
|
67
|
+
}
|
|
68
|
+
const hex = number.toString(16);
|
|
69
|
+
const bytes = Buffer.from(hex.length % 2 === 0 ? hex : `0${hex}`, "hex");
|
|
70
|
+
let leadingZeroes = 0;
|
|
71
|
+
for (const character of value) {
|
|
72
|
+
if (character !== "1") {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
leadingZeroes += 1;
|
|
76
|
+
}
|
|
77
|
+
return leadingZeroes ? Buffer.concat([Buffer.alloc(leadingZeroes), bytes]) : bytes;
|
|
78
|
+
}
|
|
79
|
+
function decodeLocalSolanaPrivateKey(value) {
|
|
80
|
+
const trimmed = value.trim();
|
|
81
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]") && /^\[\s*\d/.test(trimmed)) {
|
|
82
|
+
const parsed = JSON.parse(trimmed);
|
|
83
|
+
if (!Array.isArray(parsed) || !parsed.every((entry) => typeof entry === "number")) {
|
|
84
|
+
throw new Error("Invalid Solana private key JSON array.");
|
|
85
|
+
}
|
|
86
|
+
return Buffer.from(parsed);
|
|
87
|
+
}
|
|
88
|
+
return base58Decode(trimmed);
|
|
89
|
+
}
|
|
90
|
+
function resolveLocalSolanaSeed() {
|
|
91
|
+
const solanaKey = normalizeString(process.env.SOLANA_PRIVATE_KEY);
|
|
92
|
+
if (!solanaKey) {
|
|
93
|
+
throw new Error("Local Solana signing is unavailable.");
|
|
94
|
+
}
|
|
95
|
+
const decoded = decodeLocalSolanaPrivateKey(solanaKey);
|
|
96
|
+
const seed = decoded.length === 64 ? decoded.subarray(0, 32) : decoded.length === 32 ? decoded : null;
|
|
97
|
+
if (!seed) {
|
|
98
|
+
throw new Error(
|
|
99
|
+
`Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}.`
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
address: deriveSolanaAddress(solanaKey),
|
|
104
|
+
seed
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function resolveSolanaMessageBytes(body) {
|
|
108
|
+
const messageBase64 = normalizeString(body.messageBase64);
|
|
109
|
+
if (messageBase64) {
|
|
110
|
+
return Buffer.from(messageBase64, "base64");
|
|
111
|
+
}
|
|
112
|
+
const message = normalizeString(body.message);
|
|
113
|
+
if (!message) {
|
|
114
|
+
throw new Error("message or messageBase64 is required.");
|
|
115
|
+
}
|
|
116
|
+
return Buffer.from(message, "utf8");
|
|
117
|
+
}
|
|
118
|
+
let cachedRpcReadiness = null;
|
|
119
|
+
let cachedRpcReadinessAt = 0;
|
|
120
|
+
const RPC_CACHE_TTL_MS = 3e4;
|
|
121
|
+
function resolvePreferredRpcUrl(chainId) {
|
|
122
|
+
const now = Date.now();
|
|
123
|
+
if (!cachedRpcReadiness || now - cachedRpcReadinessAt > RPC_CACHE_TTL_MS) {
|
|
124
|
+
cachedRpcReadiness = resolveWalletRpcReadiness(loadElizaConfig());
|
|
125
|
+
cachedRpcReadinessAt = now;
|
|
126
|
+
}
|
|
127
|
+
const readiness = cachedRpcReadiness;
|
|
128
|
+
switch (chainId) {
|
|
129
|
+
case 1:
|
|
130
|
+
return readiness.ethereumRpcUrls[0] ?? null;
|
|
131
|
+
case 56:
|
|
132
|
+
case 97:
|
|
133
|
+
return readiness.bscRpcUrls[0] ?? null;
|
|
134
|
+
case 8453:
|
|
135
|
+
return readiness.baseRpcUrls[0] ?? null;
|
|
136
|
+
case 43114:
|
|
137
|
+
return readiness.avalancheRpcUrls[0] ?? null;
|
|
138
|
+
default:
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function sendLocalBrowserWalletTransaction(request) {
|
|
143
|
+
if (request.broadcast === false) {
|
|
144
|
+
throw new Error(
|
|
145
|
+
"Local browser wallet signing currently requires broadcast=true."
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
const rpcUrl = resolvePreferredRpcUrl(request.chainId);
|
|
149
|
+
if (!rpcUrl) {
|
|
150
|
+
throw new Error(`No RPC URL configured for chain ${request.chainId}.`);
|
|
151
|
+
}
|
|
152
|
+
const provider = new ethers.JsonRpcProvider(rpcUrl);
|
|
153
|
+
try {
|
|
154
|
+
const wallet = resolveLocalBrowserWallet().connect(provider);
|
|
155
|
+
const txResponse = await wallet.sendTransaction({
|
|
156
|
+
chainId: request.chainId,
|
|
157
|
+
data: request.data,
|
|
158
|
+
to: request.to,
|
|
159
|
+
value: safeParseBigInt(request.value)
|
|
160
|
+
});
|
|
161
|
+
return {
|
|
162
|
+
approved: true,
|
|
163
|
+
mode: "local-key",
|
|
164
|
+
pending: false,
|
|
165
|
+
txHash: txResponse.hash
|
|
166
|
+
};
|
|
167
|
+
} finally {
|
|
168
|
+
provider.destroy();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function resolveBrowserWalletMessagePayload(message) {
|
|
172
|
+
const trimmed = message.trim();
|
|
173
|
+
if (trimmed.startsWith("0x") && trimmed.length >= 4 && trimmed.length % 2 === 0) {
|
|
174
|
+
try {
|
|
175
|
+
return ethers.getBytes(trimmed);
|
|
176
|
+
} catch {
|
|
177
|
+
return message;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return message;
|
|
181
|
+
}
|
|
182
|
+
async function signLocalBrowserWalletMessage(message) {
|
|
183
|
+
const wallet = resolveLocalBrowserWallet();
|
|
184
|
+
return {
|
|
185
|
+
mode: "local-key",
|
|
186
|
+
signature: await wallet.signMessage(
|
|
187
|
+
resolveBrowserWalletMessagePayload(message)
|
|
188
|
+
)
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
async function signLocalBrowserSolanaMessage(body) {
|
|
192
|
+
const { address, seed } = resolveLocalSolanaSeed();
|
|
193
|
+
const privateKey = crypto.createPrivateKey({
|
|
194
|
+
key: Buffer.concat([SOLANA_PKCS8_DER_PREFIX, seed]),
|
|
195
|
+
format: "der",
|
|
196
|
+
type: "pkcs8"
|
|
197
|
+
});
|
|
198
|
+
const signature = crypto.sign(
|
|
199
|
+
null,
|
|
200
|
+
resolveSolanaMessageBytes(body),
|
|
201
|
+
privateKey
|
|
202
|
+
);
|
|
203
|
+
return {
|
|
204
|
+
address,
|
|
205
|
+
mode: "local-key",
|
|
206
|
+
signatureBase64: signature.toString("base64")
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
const SOLANA_WEB3_PACKAGE = "@solana/web3.js";
|
|
210
|
+
async function loadSolanaWeb3() {
|
|
211
|
+
return await import(SOLANA_WEB3_PACKAGE);
|
|
212
|
+
}
|
|
213
|
+
function normalizeSolanaCluster(value) {
|
|
214
|
+
if (value === "devnet" || value === "testnet" || value === "mainnet") {
|
|
215
|
+
return value;
|
|
216
|
+
}
|
|
217
|
+
return "mainnet";
|
|
218
|
+
}
|
|
219
|
+
function clusterRpcUrl(cluster) {
|
|
220
|
+
switch (cluster) {
|
|
221
|
+
case "devnet":
|
|
222
|
+
return "https://api.devnet.solana.com";
|
|
223
|
+
case "testnet":
|
|
224
|
+
return "https://api.testnet.solana.com";
|
|
225
|
+
default:
|
|
226
|
+
return "https://api.mainnet-beta.solana.com";
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async function signLocalBrowserSolanaTransaction(body) {
|
|
230
|
+
const transactionBase64 = normalizeString(body.transactionBase64);
|
|
231
|
+
if (!transactionBase64) {
|
|
232
|
+
throw new Error("transactionBase64 is required.");
|
|
233
|
+
}
|
|
234
|
+
const broadcast = normalizeBoolean(body.broadcast, false);
|
|
235
|
+
const cluster = normalizeSolanaCluster(body.cluster);
|
|
236
|
+
const { address, seed } = resolveLocalSolanaSeed();
|
|
237
|
+
const web3 = await loadSolanaWeb3();
|
|
238
|
+
const { Keypair, VersionedTransaction, Transaction, Connection } = web3;
|
|
239
|
+
const keypair = Keypair.fromSeed(new Uint8Array(seed));
|
|
240
|
+
const txBytes = Buffer.from(transactionBase64, "base64");
|
|
241
|
+
let signedBytes;
|
|
242
|
+
let broadcastSignature;
|
|
243
|
+
try {
|
|
244
|
+
const versioned = VersionedTransaction.deserialize(txBytes);
|
|
245
|
+
versioned.sign([keypair]);
|
|
246
|
+
signedBytes = versioned.serialize();
|
|
247
|
+
if (broadcast) {
|
|
248
|
+
const conn = new Connection(clusterRpcUrl(cluster), "confirmed");
|
|
249
|
+
broadcastSignature = await conn.sendRawTransaction(signedBytes);
|
|
250
|
+
}
|
|
251
|
+
} catch (_err) {
|
|
252
|
+
const legacy = Transaction.from(txBytes);
|
|
253
|
+
legacy.partialSign(keypair);
|
|
254
|
+
signedBytes = legacy.serialize();
|
|
255
|
+
if (broadcast) {
|
|
256
|
+
const conn = new Connection(clusterRpcUrl(cluster), "confirmed");
|
|
257
|
+
broadcastSignature = await conn.sendRawTransaction(signedBytes);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
address,
|
|
262
|
+
mode: "local-key",
|
|
263
|
+
signedTransactionBase64: Buffer.from(signedBytes).toString("base64"),
|
|
264
|
+
...broadcastSignature ? { signature: broadcastSignature } : {},
|
|
265
|
+
cluster
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
async function handleWalletBrowserCompatRoutes(req, res, _state) {
|
|
269
|
+
const method = (req.method ?? "GET").toUpperCase();
|
|
270
|
+
const url = new URL(req.url ?? "/", "http://localhost");
|
|
271
|
+
if (method !== "POST" || url.pathname !== "/api/wallet/browser-transaction" && url.pathname !== "/api/wallet/browser-sign-message" && url.pathname !== "/api/wallet/browser-solana-sign-message" && url.pathname !== "/api/wallet/browser-solana-transaction") {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
if (!ensureCompatApiAuthorized(req, res)) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
const body = await readCompatJsonBody(req, res);
|
|
278
|
+
if (!body) {
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
const hasLocalKey = Boolean(normalizeString(process.env.EVM_PRIVATE_KEY));
|
|
282
|
+
const hasLocalSolanaKey = Boolean(
|
|
283
|
+
normalizeString(process.env.SOLANA_PRIVATE_KEY)
|
|
284
|
+
);
|
|
285
|
+
let stewardError = null;
|
|
286
|
+
if (url.pathname === "/api/wallet/browser-sign-message") {
|
|
287
|
+
const message = normalizeString(body.message);
|
|
288
|
+
if (!message) {
|
|
289
|
+
sendJsonErrorResponse(res, 400, "message is required.");
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
if (hasLocalKey) {
|
|
293
|
+
try {
|
|
294
|
+
sendJsonResponse(
|
|
295
|
+
res,
|
|
296
|
+
200,
|
|
297
|
+
await signLocalBrowserWalletMessage(message)
|
|
298
|
+
);
|
|
299
|
+
return true;
|
|
300
|
+
} catch (error) {
|
|
301
|
+
const failureMessage = error instanceof Error ? error.message : String(error);
|
|
302
|
+
sendJsonErrorResponse(res, 503, failureMessage);
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
sendJsonErrorResponse(
|
|
307
|
+
res,
|
|
308
|
+
503,
|
|
309
|
+
isStewardConfigured() ? "Browser message signing currently requires a local wallet key." : "No browser wallet signer is available."
|
|
310
|
+
);
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
if (url.pathname === "/api/wallet/browser-solana-sign-message") {
|
|
314
|
+
if (hasLocalSolanaKey) {
|
|
315
|
+
try {
|
|
316
|
+
sendJsonResponse(res, 200, await signLocalBrowserSolanaMessage(body));
|
|
317
|
+
return true;
|
|
318
|
+
} catch (error) {
|
|
319
|
+
const failureMessage = error instanceof Error ? error.message : String(error);
|
|
320
|
+
sendJsonErrorResponse(res, 503, failureMessage);
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
sendJsonErrorResponse(res, 503, "No browser Solana signer is available.");
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
if (url.pathname === "/api/wallet/browser-solana-transaction") {
|
|
328
|
+
if (hasLocalSolanaKey) {
|
|
329
|
+
try {
|
|
330
|
+
sendJsonResponse(
|
|
331
|
+
res,
|
|
332
|
+
200,
|
|
333
|
+
await signLocalBrowserSolanaTransaction(body)
|
|
334
|
+
);
|
|
335
|
+
return true;
|
|
336
|
+
} catch (error) {
|
|
337
|
+
const failureMessage = error instanceof Error ? error.message : String(error);
|
|
338
|
+
sendJsonErrorResponse(res, 503, failureMessage);
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
sendJsonErrorResponse(
|
|
343
|
+
res,
|
|
344
|
+
503,
|
|
345
|
+
"No browser Solana transaction signer is available."
|
|
346
|
+
);
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
const request = {
|
|
350
|
+
broadcast: normalizeBoolean(body.broadcast, true),
|
|
351
|
+
chainId: typeof body.chainId === "number" && Number.isFinite(body.chainId) ? body.chainId : Number.NaN,
|
|
352
|
+
data: normalizeHexData(body.data),
|
|
353
|
+
description: normalizeString(body.description),
|
|
354
|
+
to: normalizeString(body.to) ?? "",
|
|
355
|
+
value: normalizeString(body.value) ?? "0"
|
|
356
|
+
};
|
|
357
|
+
if (!request.to || !request.value || !Number.isFinite(request.chainId)) {
|
|
358
|
+
sendJsonErrorResponse(
|
|
359
|
+
res,
|
|
360
|
+
400,
|
|
361
|
+
"to, value, and a valid chainId are required."
|
|
362
|
+
);
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
if (isStewardConfigured()) {
|
|
366
|
+
try {
|
|
367
|
+
const result = await signViaSteward(request);
|
|
368
|
+
sendJsonResponse(res, 200, {
|
|
369
|
+
...result,
|
|
370
|
+
mode: "steward"
|
|
371
|
+
});
|
|
372
|
+
return true;
|
|
373
|
+
} catch (error) {
|
|
374
|
+
stewardError = error instanceof Error ? error : new Error(String(error));
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (hasLocalKey) {
|
|
378
|
+
try {
|
|
379
|
+
sendJsonResponse(
|
|
380
|
+
res,
|
|
381
|
+
200,
|
|
382
|
+
await sendLocalBrowserWalletTransaction(request)
|
|
383
|
+
);
|
|
384
|
+
return true;
|
|
385
|
+
} catch (error) {
|
|
386
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
387
|
+
sendJsonErrorResponse(res, 503, message);
|
|
388
|
+
return true;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
sendJsonErrorResponse(
|
|
392
|
+
res,
|
|
393
|
+
503,
|
|
394
|
+
stewardError?.message || "No browser wallet signer is available."
|
|
395
|
+
);
|
|
396
|
+
return true;
|
|
397
|
+
}
|
|
398
|
+
export {
|
|
399
|
+
handleWalletBrowserCompatRoutes,
|
|
400
|
+
safeParseBigInt
|
|
401
|
+
};
|
|
402
|
+
//# sourceMappingURL=wallet-browser-compat-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/wallet-browser-compat-routes.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport type http from \"node:http\";\nimport { loadElizaConfig } from \"@elizaos/agent/config/config\";\nimport { ensureCompatApiAuthorized } from \"@elizaos/app-core/api/auth\";\nimport {\n type CompatRuntimeState,\n readCompatJsonBody,\n} from \"@elizaos/app-core/api/compat-route-shared\";\nimport {\n sendJsonError as sendJsonErrorResponse,\n sendJson as sendJsonResponse,\n} from \"@elizaos/app-core/api/response\";\nimport * as ethers from \"ethers\";\nimport { deriveSolanaAddress } from \"../api/wallet.js\";\nimport { resolveWalletRpcReadiness } from \"../api/wallet-rpc.js\";\nimport type { StewardSignRequest } from \"../types/steward.js\";\n\n/** @internal Exported for testing. Parse a transaction value string to BigInt. */\nexport function safeParseBigInt(value: string): bigint {\n try {\n return BigInt(value);\n } catch {\n throw new Error(\n `Invalid transaction value: expected an integer or hex string, got \"${value}\"`,\n );\n }\n}\n\nimport { isStewardConfigured, signViaSteward } from \"./steward-bridge.js\";\n\nfunction normalizeHexData(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed.startsWith(\"0x\") ? trimmed : `0x${trimmed}`;\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction normalizeBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === \"boolean\" ? value : fallback;\n}\n\nconst SOLANA_PKCS8_DER_PREFIX = Buffer.from(\n \"302e020100300506032b657004220420\",\n \"hex\",\n);\nconst B58 = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nfunction resolveLocalBrowserWallet(): ethers.Wallet {\n const evmKey = normalizeString(process.env.EVM_PRIVATE_KEY);\n if (!evmKey) {\n throw new Error(\"Local wallet signing is unavailable.\");\n }\n return new ethers.Wallet(evmKey.startsWith(\"0x\") ? evmKey : `0x${evmKey}`);\n}\n\nfunction base58Decode(value: string): Buffer {\n if (!value.length) {\n return Buffer.alloc(0);\n }\n let number = 0n;\n for (const character of value) {\n const index = B58.indexOf(character);\n if (index === -1) {\n throw new Error(`Invalid base58 character: ${character}`);\n }\n number = number * 58n + BigInt(index);\n }\n const hex = number.toString(16);\n const bytes = Buffer.from(hex.length % 2 === 0 ? hex : `0${hex}`, \"hex\");\n let leadingZeroes = 0;\n for (const character of value) {\n if (character !== \"1\") {\n break;\n }\n leadingZeroes += 1;\n }\n return leadingZeroes\n ? Buffer.concat([Buffer.alloc(leadingZeroes), bytes])\n : bytes;\n}\n\nfunction decodeLocalSolanaPrivateKey(value: string): Buffer {\n const trimmed = value.trim();\n if (\n trimmed.startsWith(\"[\") &&\n trimmed.endsWith(\"]\") &&\n /^\\[\\s*\\d/.test(trimmed)\n ) {\n const parsed = JSON.parse(trimmed) as unknown;\n if (\n !Array.isArray(parsed) ||\n !parsed.every((entry) => typeof entry === \"number\")\n ) {\n throw new Error(\"Invalid Solana private key JSON array.\");\n }\n return Buffer.from(parsed);\n }\n return base58Decode(trimmed);\n}\n\nfunction resolveLocalSolanaSeed(): { address: string; seed: Buffer } {\n const solanaKey = normalizeString(process.env.SOLANA_PRIVATE_KEY);\n if (!solanaKey) {\n throw new Error(\"Local Solana signing is unavailable.\");\n }\n const decoded = decodeLocalSolanaPrivateKey(solanaKey);\n const seed =\n decoded.length === 64\n ? decoded.subarray(0, 32)\n : decoded.length === 32\n ? decoded\n : null;\n if (!seed) {\n throw new Error(\n `Invalid Solana private key length: expected 32 or 64 bytes, got ${decoded.length}.`,\n );\n }\n return {\n address: deriveSolanaAddress(solanaKey),\n seed,\n };\n}\n\nfunction resolveSolanaMessageBytes(body: Record<string, unknown>): Buffer {\n const messageBase64 = normalizeString(body.messageBase64);\n if (messageBase64) {\n return Buffer.from(messageBase64, \"base64\");\n }\n const message = normalizeString(body.message);\n if (!message) {\n throw new Error(\"message or messageBase64 is required.\");\n }\n return Buffer.from(message, \"utf8\");\n}\n\nlet cachedRpcReadiness: ReturnType<typeof resolveWalletRpcReadiness> | null =\n null;\nlet cachedRpcReadinessAt = 0;\nconst RPC_CACHE_TTL_MS = 30_000;\n\nfunction resolvePreferredRpcUrl(chainId: number): string | null {\n const now = Date.now();\n if (!cachedRpcReadiness || now - cachedRpcReadinessAt > RPC_CACHE_TTL_MS) {\n cachedRpcReadiness = resolveWalletRpcReadiness(loadElizaConfig());\n cachedRpcReadinessAt = now;\n }\n const readiness = cachedRpcReadiness;\n switch (chainId) {\n case 1:\n return readiness.ethereumRpcUrls[0] ?? null;\n case 56:\n case 97:\n return readiness.bscRpcUrls[0] ?? null;\n case 8453:\n return readiness.baseRpcUrls[0] ?? null;\n case 43114:\n return readiness.avalancheRpcUrls[0] ?? null;\n default:\n return null;\n }\n}\n\nasync function sendLocalBrowserWalletTransaction(\n request: StewardSignRequest,\n): Promise<{\n approved: true;\n mode: \"local-key\";\n pending: false;\n txHash: string;\n}> {\n if (request.broadcast === false) {\n throw new Error(\n \"Local browser wallet signing currently requires broadcast=true.\",\n );\n }\n\n const rpcUrl = resolvePreferredRpcUrl(request.chainId);\n if (!rpcUrl) {\n throw new Error(`No RPC URL configured for chain ${request.chainId}.`);\n }\n\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n try {\n const wallet = resolveLocalBrowserWallet().connect(provider);\n const txResponse = await wallet.sendTransaction({\n chainId: request.chainId,\n data: request.data,\n to: request.to,\n value: safeParseBigInt(request.value),\n });\n return {\n approved: true,\n mode: \"local-key\",\n pending: false,\n txHash: txResponse.hash,\n };\n } finally {\n provider.destroy();\n }\n}\n\nfunction resolveBrowserWalletMessagePayload(\n message: string,\n): string | Uint8Array {\n const trimmed = message.trim();\n if (\n trimmed.startsWith(\"0x\") &&\n trimmed.length >= 4 &&\n trimmed.length % 2 === 0\n ) {\n try {\n return ethers.getBytes(trimmed);\n } catch {\n return message;\n }\n }\n return message;\n}\n\nasync function signLocalBrowserWalletMessage(message: string): Promise<{\n mode: \"local-key\";\n signature: string;\n}> {\n const wallet = resolveLocalBrowserWallet();\n return {\n mode: \"local-key\",\n signature: await wallet.signMessage(\n resolveBrowserWalletMessagePayload(message),\n ),\n };\n}\n\nasync function signLocalBrowserSolanaMessage(\n body: Record<string, unknown>,\n): Promise<{\n address: string;\n mode: \"local-key\";\n signatureBase64: string;\n}> {\n const { address, seed } = resolveLocalSolanaSeed();\n const privateKey = crypto.createPrivateKey({\n key: Buffer.concat([SOLANA_PKCS8_DER_PREFIX, seed]),\n format: \"der\",\n type: \"pkcs8\",\n });\n const signature = crypto.sign(\n null,\n resolveSolanaMessageBytes(body),\n privateKey,\n );\n return {\n address,\n mode: \"local-key\",\n signatureBase64: signature.toString(\"base64\"),\n };\n}\n\ntype SolanaCluster = \"mainnet\" | \"devnet\" | \"testnet\";\n\ninterface SolanaWeb3Module {\n Keypair: {\n fromSeed(seed: Uint8Array): unknown;\n };\n VersionedTransaction: {\n deserialize(bytes: Uint8Array): {\n sign(signers: unknown[]): void;\n serialize(): Uint8Array;\n };\n };\n Transaction: {\n from(bytes: Uint8Array): {\n partialSign(...signers: unknown[]): void;\n serialize(): Uint8Array;\n };\n };\n Connection: new (\n endpoint: string,\n commitment: string,\n ) => {\n sendRawTransaction(bytes: Uint8Array): Promise<string>;\n };\n}\n\nconst SOLANA_WEB3_PACKAGE: string = \"@solana/web3.js\";\n\nasync function loadSolanaWeb3(): Promise<SolanaWeb3Module> {\n return (await import(SOLANA_WEB3_PACKAGE)) as SolanaWeb3Module;\n}\n\nfunction normalizeSolanaCluster(value: unknown): SolanaCluster {\n if (value === \"devnet\" || value === \"testnet\" || value === \"mainnet\") {\n return value;\n }\n return \"mainnet\";\n}\n\nfunction clusterRpcUrl(cluster: SolanaCluster): string {\n switch (cluster) {\n case \"devnet\":\n return \"https://api.devnet.solana.com\";\n case \"testnet\":\n return \"https://api.testnet.solana.com\";\n default:\n return \"https://api.mainnet-beta.solana.com\";\n }\n}\n\nasync function signLocalBrowserSolanaTransaction(\n body: Record<string, unknown>,\n): Promise<{\n address: string;\n mode: \"local-key\";\n signedTransactionBase64: string;\n signature?: string;\n cluster: SolanaCluster;\n}> {\n const transactionBase64 = normalizeString(body.transactionBase64);\n if (!transactionBase64) {\n throw new Error(\"transactionBase64 is required.\");\n }\n const broadcast = normalizeBoolean(body.broadcast, false);\n const cluster = normalizeSolanaCluster(body.cluster);\n\n const { address, seed } = resolveLocalSolanaSeed();\n\n const web3 = await loadSolanaWeb3();\n const { Keypair, VersionedTransaction, Transaction, Connection } = web3;\n\n const keypair = Keypair.fromSeed(new Uint8Array(seed));\n const txBytes = Buffer.from(transactionBase64, \"base64\");\n\n // Solana transactions have a single-byte version prefix on v0/versioned\n // transactions (high bit set). Try the versioned path first; fall back to\n // legacy on parse failure to support both shapes uniformly.\n let signedBytes: Uint8Array;\n let broadcastSignature: string | undefined;\n try {\n const versioned = VersionedTransaction.deserialize(txBytes);\n versioned.sign([keypair]);\n signedBytes = versioned.serialize();\n if (broadcast) {\n const conn = new Connection(clusterRpcUrl(cluster), \"confirmed\");\n broadcastSignature = await conn.sendRawTransaction(signedBytes);\n }\n } catch (_err) {\n const legacy = Transaction.from(txBytes);\n legacy.partialSign(keypair);\n signedBytes = legacy.serialize();\n if (broadcast) {\n const conn = new Connection(clusterRpcUrl(cluster), \"confirmed\");\n broadcastSignature = await conn.sendRawTransaction(signedBytes);\n }\n }\n\n return {\n address,\n mode: \"local-key\",\n signedTransactionBase64: Buffer.from(signedBytes).toString(\"base64\"),\n ...(broadcastSignature ? { signature: broadcastSignature } : {}),\n cluster,\n };\n}\n\nexport async function handleWalletBrowserCompatRoutes(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n _state: CompatRuntimeState,\n): Promise<boolean> {\n const method = (req.method ?? \"GET\").toUpperCase();\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n\n if (\n method !== \"POST\" ||\n (url.pathname !== \"/api/wallet/browser-transaction\" &&\n url.pathname !== \"/api/wallet/browser-sign-message\" &&\n url.pathname !== \"/api/wallet/browser-solana-sign-message\" &&\n url.pathname !== \"/api/wallet/browser-solana-transaction\")\n ) {\n return false;\n }\n\n if (!ensureCompatApiAuthorized(req, res)) {\n return true;\n }\n\n const body = await readCompatJsonBody(req, res);\n if (!body) {\n return true;\n }\n\n const hasLocalKey = Boolean(normalizeString(process.env.EVM_PRIVATE_KEY));\n const hasLocalSolanaKey = Boolean(\n normalizeString(process.env.SOLANA_PRIVATE_KEY),\n );\n let stewardError: Error | null = null;\n\n if (url.pathname === \"/api/wallet/browser-sign-message\") {\n const message = normalizeString(body.message);\n if (!message) {\n sendJsonErrorResponse(res, 400, \"message is required.\");\n return true;\n }\n\n if (hasLocalKey) {\n try {\n sendJsonResponse(\n res,\n 200,\n await signLocalBrowserWalletMessage(message),\n );\n return true;\n } catch (error) {\n const failureMessage =\n error instanceof Error ? error.message : String(error);\n sendJsonErrorResponse(res, 503, failureMessage);\n return true;\n }\n }\n\n sendJsonErrorResponse(\n res,\n 503,\n isStewardConfigured()\n ? \"Browser message signing currently requires a local wallet key.\"\n : \"No browser wallet signer is available.\",\n );\n return true;\n }\n\n if (url.pathname === \"/api/wallet/browser-solana-sign-message\") {\n if (hasLocalSolanaKey) {\n try {\n sendJsonResponse(res, 200, await signLocalBrowserSolanaMessage(body));\n return true;\n } catch (error) {\n const failureMessage =\n error instanceof Error ? error.message : String(error);\n sendJsonErrorResponse(res, 503, failureMessage);\n return true;\n }\n }\n\n sendJsonErrorResponse(res, 503, \"No browser Solana signer is available.\");\n return true;\n }\n\n if (url.pathname === \"/api/wallet/browser-solana-transaction\") {\n if (hasLocalSolanaKey) {\n try {\n sendJsonResponse(\n res,\n 200,\n await signLocalBrowserSolanaTransaction(body),\n );\n return true;\n } catch (error) {\n const failureMessage =\n error instanceof Error ? error.message : String(error);\n sendJsonErrorResponse(res, 503, failureMessage);\n return true;\n }\n }\n\n sendJsonErrorResponse(\n res,\n 503,\n \"No browser Solana transaction signer is available.\",\n );\n return true;\n }\n\n const request: StewardSignRequest = {\n broadcast: normalizeBoolean(body.broadcast, true),\n chainId:\n typeof body.chainId === \"number\" && Number.isFinite(body.chainId)\n ? body.chainId\n : Number.NaN,\n data: normalizeHexData(body.data),\n description: normalizeString(body.description),\n to: normalizeString(body.to) ?? \"\",\n value: normalizeString(body.value) ?? \"0\",\n };\n\n if (!request.to || !request.value || !Number.isFinite(request.chainId)) {\n sendJsonErrorResponse(\n res,\n 400,\n \"to, value, and a valid chainId are required.\",\n );\n return true;\n }\n\n if (isStewardConfigured()) {\n try {\n const result = await signViaSteward(request);\n sendJsonResponse(res, 200, {\n ...result,\n mode: \"steward\",\n });\n return true;\n } catch (error) {\n stewardError = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n if (hasLocalKey) {\n try {\n sendJsonResponse(\n res,\n 200,\n await sendLocalBrowserWalletTransaction(request),\n );\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJsonErrorResponse(res, 503, message);\n return true;\n }\n }\n\n sendJsonErrorResponse(\n res,\n 503,\n stewardError?.message || \"No browser wallet signer is available.\",\n );\n return true;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BSC wallet trade routes wrapper — wraps handleWalletBscRoutes for plugin
|
|
3
|
+
* route registration.
|
|
4
|
+
*
|
|
5
|
+
* Handles:
|
|
6
|
+
* POST /api/wallet/trade/preflight
|
|
7
|
+
* POST /api/wallet/trade/quote
|
|
8
|
+
* GET /api/wallet/trade/tx-status
|
|
9
|
+
* GET /api/wallet/trading/profile
|
|
10
|
+
* POST /api/wallet/transfer/execute
|
|
11
|
+
* POST /api/wallet/production-defaults
|
|
12
|
+
*/
|
|
13
|
+
import type http from "node:http";
|
|
14
|
+
export declare function handleWalletBscCoreRoutes(req: http.IncomingMessage, res: http.ServerResponse, _state: unknown): Promise<boolean>;
|
|
15
|
+
//# sourceMappingURL=wallet-bsc-core-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-bsc-core-routes.d.ts","sourceRoot":"","sources":["../../src/routes/wallet-bsc-core-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAyBlC,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,OAAO,CAAC,CAmClB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { loadElizaConfig, saveElizaConfig } from "@elizaos/agent/config/config";
|
|
2
|
+
import { readCompatJsonBody } from "@elizaos/app-core/api/compat-route-shared";
|
|
3
|
+
import { sendJson, sendJsonError } from "@elizaos/app-core/api/response";
|
|
4
|
+
import {
|
|
5
|
+
canUseLocalTradeExecution,
|
|
6
|
+
resolveTradePermissionMode
|
|
7
|
+
} from "@elizaos/plugin-wallet";
|
|
8
|
+
import {
|
|
9
|
+
buildBscTradePreflight,
|
|
10
|
+
buildBscTradeQuote,
|
|
11
|
+
resolvePrimaryBscRpcUrl
|
|
12
|
+
} from "../api/bsc-trade.js";
|
|
13
|
+
import { getWalletAddresses } from "../api/wallet.js";
|
|
14
|
+
import { handleWalletBscRoutes } from "../api/wallet-bsc-routes.js";
|
|
15
|
+
import { resolveWalletRpcReadiness } from "../api/wallet-rpc.js";
|
|
16
|
+
import {
|
|
17
|
+
loadWalletTradingProfile,
|
|
18
|
+
updateWalletTradeLedgerEntryStatus
|
|
19
|
+
} from "../api/wallet-trading-profile.js";
|
|
20
|
+
function isAgentAutomationRequest(req) {
|
|
21
|
+
return req.headers["x-eliza-agent-automation"] === "1";
|
|
22
|
+
}
|
|
23
|
+
async function handleWalletBscCoreRoutes(req, res, _state) {
|
|
24
|
+
const method = req.method?.toUpperCase() ?? "GET";
|
|
25
|
+
const url = new URL(
|
|
26
|
+
req.url ?? "/",
|
|
27
|
+
`http://${req.headers.host ?? "localhost"}`
|
|
28
|
+
);
|
|
29
|
+
const pathname = url.pathname;
|
|
30
|
+
const config = loadElizaConfig();
|
|
31
|
+
return handleWalletBscRoutes({
|
|
32
|
+
req,
|
|
33
|
+
res,
|
|
34
|
+
method,
|
|
35
|
+
pathname,
|
|
36
|
+
url,
|
|
37
|
+
state: { config },
|
|
38
|
+
json: (r, data, status) => sendJson(r, status ?? 200, data),
|
|
39
|
+
error: (r, message, status) => sendJsonError(r, status ?? 500, message),
|
|
40
|
+
readJsonBody: readCompatJsonBody,
|
|
41
|
+
deps: {
|
|
42
|
+
getWalletAddresses,
|
|
43
|
+
resolveWalletRpcReadiness,
|
|
44
|
+
resolvePrimaryBscRpcUrl,
|
|
45
|
+
buildBscTradePreflight,
|
|
46
|
+
buildBscTradeQuote,
|
|
47
|
+
updateWalletTradeLedgerEntryStatus,
|
|
48
|
+
loadWalletTradingProfile,
|
|
49
|
+
resolveTradePermissionMode,
|
|
50
|
+
isAgentAutomationRequest,
|
|
51
|
+
canUseLocalTradeExecution,
|
|
52
|
+
saveElizaConfig
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
handleWalletBscCoreRoutes
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=wallet-bsc-core-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/wallet-bsc-core-routes.ts"],"sourcesContent":["/**\n * BSC wallet trade routes wrapper — wraps handleWalletBscRoutes for plugin\n * route registration.\n *\n * Handles:\n * POST /api/wallet/trade/preflight\n * POST /api/wallet/trade/quote\n * GET /api/wallet/trade/tx-status\n * GET /api/wallet/trading/profile\n * POST /api/wallet/transfer/execute\n * POST /api/wallet/production-defaults\n */\nimport type http from \"node:http\";\nimport { loadElizaConfig, saveElizaConfig } from \"@elizaos/agent/config/config\";\nimport { readCompatJsonBody } from \"@elizaos/app-core/api/compat-route-shared\";\nimport { sendJson, sendJsonError } from \"@elizaos/app-core/api/response\";\nimport {\n canUseLocalTradeExecution,\n resolveTradePermissionMode,\n} from \"@elizaos/plugin-wallet\";\nimport {\n buildBscTradePreflight,\n buildBscTradeQuote,\n resolvePrimaryBscRpcUrl,\n} from \"../api/bsc-trade.js\";\nimport { getWalletAddresses } from \"../api/wallet.js\";\nimport { handleWalletBscRoutes } from \"../api/wallet-bsc-routes.js\";\nimport { resolveWalletRpcReadiness } from \"../api/wallet-rpc.js\";\nimport {\n loadWalletTradingProfile,\n updateWalletTradeLedgerEntryStatus,\n} from \"../api/wallet-trading-profile.js\";\n\nfunction isAgentAutomationRequest(req: http.IncomingMessage): boolean {\n return req.headers[\"x-eliza-agent-automation\"] === \"1\";\n}\n\nexport async function handleWalletBscCoreRoutes(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n _state: unknown,\n): Promise<boolean> {\n const method = req.method?.toUpperCase() ?? \"GET\";\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const pathname = url.pathname;\n\n const config = loadElizaConfig();\n\n return handleWalletBscRoutes({\n req,\n res,\n method,\n pathname,\n url,\n state: { config },\n json: (r, data, status) => sendJson(r, status ?? 200, data),\n error: (r, message, status) => sendJsonError(r, status ?? 500, message),\n readJsonBody: readCompatJsonBody as never,\n deps: {\n getWalletAddresses,\n resolveWalletRpcReadiness,\n resolvePrimaryBscRpcUrl,\n buildBscTradePreflight,\n buildBscTradeQuote,\n updateWalletTradeLedgerEntryStatus:\n updateWalletTradeLedgerEntryStatus as never,\n loadWalletTradingProfile: loadWalletTradingProfile as never,\n resolveTradePermissionMode: resolveTradePermissionMode as never,\n isAgentAutomationRequest,\n canUseLocalTradeExecution: canUseLocalTradeExecution as never,\n saveElizaConfig: saveElizaConfig as never,\n },\n });\n}\n"],"mappings":"AAaA,SAAS,iBAAiB,uBAAuB;AACjD,SAAS,0BAA0B;AACnC,SAAS,UAAU,qBAAqB;AACxC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,0BAA0B;AACnC,SAAS,6BAA6B;AACtC,SAAS,iCAAiC;AAC1C;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,yBAAyB,KAAoC;AACpE,SAAO,IAAI,QAAQ,0BAA0B,MAAM;AACrD;AAEA,eAAsB,0BACpB,KACA,KACA,QACkB;AAClB,QAAM,SAAS,IAAI,QAAQ,YAAY,KAAK;AAC5C,QAAM,MAAM,IAAI;AAAA,IACd,IAAI,OAAO;AAAA,IACX,UAAU,IAAI,QAAQ,QAAQ,WAAW;AAAA,EAC3C;AACA,QAAM,WAAW,IAAI;AAErB,QAAM,SAAS,gBAAgB;AAE/B,SAAO,sBAAsB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,EAAE,OAAO;AAAA,IAChB,MAAM,CAAC,GAAG,MAAM,WAAW,SAAS,GAAG,UAAU,KAAK,IAAI;AAAA,IAC1D,OAAO,CAAC,GAAG,SAAS,WAAW,cAAc,GAAG,UAAU,KAAK,OAAO;AAAA,IACtE,cAAc;AAAA,IACd,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet OS-store, keys, and NFT compat routes.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* GET /api/wallet/os-store — keychain/secret-service backend status
|
|
6
|
+
* POST /api/wallet/os-store — migrate / delete wallet secrets in OS store
|
|
7
|
+
* GET /api/wallet/keys — EVM + Solana keys (loopback + first-run gate)
|
|
8
|
+
* GET /api/wallet/nfts — EVM NFT fetch
|
|
9
|
+
*/
|
|
10
|
+
import type http from "node:http";
|
|
11
|
+
import { type CompatRuntimeState } from "@elizaos/app-core/api/compat-route-shared";
|
|
12
|
+
export declare function handleWalletCompatRoutes(req: http.IncomingMessage, res: http.ServerResponse, _state: CompatRuntimeState): Promise<boolean>;
|
|
13
|
+
//# sourceMappingURL=wallet-compat-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-compat-routes.d.ts","sourceRoot":"","sources":["../../src/routes/wallet-compat-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAQlC,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,2CAA2C,CAAC;AAqBnD,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,OAAO,CAAC,CAqNlB"}
|