@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,43 @@
|
|
|
1
|
+
import { deriveAgentVaultId } from "@elizaos/app-core/security/agent-vault-id";
|
|
2
|
+
import {
|
|
3
|
+
createNodePlatformSecureStore,
|
|
4
|
+
isWalletOsStoreReadEnabled
|
|
5
|
+
} from "@elizaos/app-core/security/platform-secure-store-node";
|
|
6
|
+
import { logger } from "@elizaos/core";
|
|
7
|
+
const WALLET_ENV_PAIRS = [
|
|
8
|
+
["EVM_PRIVATE_KEY", "wallet.evm_private_key"],
|
|
9
|
+
["SOLANA_PRIVATE_KEY", "wallet.solana_private_key"],
|
|
10
|
+
["STEWARD_API_URL", "steward.api_url"],
|
|
11
|
+
["STEWARD_AGENT_ID", "steward.agent_id"],
|
|
12
|
+
["STEWARD_AGENT_TOKEN", "steward.agent_token"]
|
|
13
|
+
];
|
|
14
|
+
async function hydrateWalletKeysFromNodePlatformSecureStore() {
|
|
15
|
+
if (!isWalletOsStoreReadEnabled()) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const store = createNodePlatformSecureStore();
|
|
20
|
+
if (!await store.isAvailable()) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const vaultId = deriveAgentVaultId();
|
|
24
|
+
for (const [envKey, kind] of WALLET_ENV_PAIRS) {
|
|
25
|
+
const cur = process.env[envKey];
|
|
26
|
+
if (typeof cur === "string" && cur.trim()) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const got = await store.get(vaultId, kind);
|
|
30
|
+
if (got.ok) {
|
|
31
|
+
process.env[envKey] = got.value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
} catch (err) {
|
|
35
|
+
logger.warn(
|
|
36
|
+
`[wallet][os-store] hydrate failed: ${err instanceof Error ? err.message : String(err)}`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
hydrateWalletKeysFromNodePlatformSecureStore
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=hydrate-wallet-keys-from-platform-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/security/hydrate-wallet-keys-from-platform-store.ts"],"sourcesContent":["import { deriveAgentVaultId } from \"@elizaos/app-core/security/agent-vault-id\";\nimport type { SecureStoreSecretKind } from \"@elizaos/app-core/security/platform-secure-store\";\nimport {\n createNodePlatformSecureStore,\n isWalletOsStoreReadEnabled,\n} from \"@elizaos/app-core/security/platform-secure-store-node\";\nimport { logger } from \"@elizaos/core\";\n\nconst WALLET_ENV_PAIRS: [keyof NodeJS.ProcessEnv, SecureStoreSecretKind][] = [\n [\"EVM_PRIVATE_KEY\", \"wallet.evm_private_key\"],\n [\"SOLANA_PRIVATE_KEY\", \"wallet.solana_private_key\"],\n [\"STEWARD_API_URL\", \"steward.api_url\"],\n [\"STEWARD_AGENT_ID\", \"steward.agent_id\"],\n [\"STEWARD_AGENT_TOKEN\", \"steward.agent_token\"],\n];\n\n/**\n * Fills `process.env` wallet keys from the OS secret store when the key is\n * unset/blank. Runs before upstream `startApiServer` merges `config.env`, so\n * persisted config only fills gaps the store did not supply.\n */\nexport async function hydrateWalletKeysFromNodePlatformSecureStore(): Promise<void> {\n if (!isWalletOsStoreReadEnabled()) {\n return;\n }\n\n try {\n const store = createNodePlatformSecureStore();\n if (!(await store.isAvailable())) {\n return;\n }\n\n const vaultId = deriveAgentVaultId();\n\n for (const [envKey, kind] of WALLET_ENV_PAIRS) {\n const cur = process.env[envKey];\n if (typeof cur === \"string\" && cur.trim()) {\n continue;\n }\n\n const got = await store.get(vaultId, kind);\n if (got.ok) {\n process.env[envKey] = got.value;\n }\n }\n } catch (err) {\n logger.warn(\n `[wallet][os-store] hydrate failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n"],"mappings":"AAAA,SAAS,0BAA0B;AAEnC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAEvB,MAAM,mBAAuE;AAAA,EAC3E,CAAC,mBAAmB,wBAAwB;AAAA,EAC5C,CAAC,sBAAsB,2BAA2B;AAAA,EAClD,CAAC,mBAAmB,iBAAiB;AAAA,EACrC,CAAC,oBAAoB,kBAAkB;AAAA,EACvC,CAAC,uBAAuB,qBAAqB;AAC/C;AAOA,eAAsB,+CAA8D;AAClF,MAAI,CAAC,2BAA2B,GAAG;AACjC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,QAAQ,8BAA8B;AAC5C,QAAI,CAAE,MAAM,MAAM,YAAY,GAAI;AAChC;AAAA,IACF;AAEA,UAAM,UAAU,mBAAmB;AAEnC,eAAW,CAAC,QAAQ,IAAI,KAAK,kBAAkB;AAC7C,YAAM,MAAM,QAAQ,IAAI,MAAM;AAC9B,UAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,GAAG;AACzC;AAAA,MACF;AAEA,YAAM,MAAM,MAAM,MAAM,IAAI,SAAS,IAAI;AACzC,UAAI,IAAI,IAAI;AACV,gBAAQ,IAAI,MAAM,IAAI,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,sCAAsC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACxF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function deleteWalletSecretsFromOsStore(): Promise<void>;
|
|
2
|
+
export type MigrateWalletPrivateKeysToOsStoreResult = {
|
|
3
|
+
migrated: string[];
|
|
4
|
+
failed: string[];
|
|
5
|
+
/** True when the backend cannot run on this host (e.g. Linux without secret-tool). */
|
|
6
|
+
unavailable?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Copies wallet keys from `process.env` and/or persisted `config.env` into the
|
|
10
|
+
* OS store, strips them from saved config, and ensures `process.env` holds the
|
|
11
|
+
* values for the running process.
|
|
12
|
+
*/
|
|
13
|
+
export declare function migrateWalletPrivateKeysToOsStore(): Promise<MigrateWalletPrivateKeysToOsStoreResult>;
|
|
14
|
+
//# sourceMappingURL=wallet-os-store-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-os-store-actions.d.ts","sourceRoot":"","sources":["../../src/security/wallet-os-store-actions.ts"],"names":[],"mappings":"AAUA,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED,MAAM,MAAM,uCAAuC,GAAG;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,sFAAsF;IACtF,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,uCAAuC,CAAC,CA6D1G"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { loadElizaConfig, saveElizaConfig } from "@elizaos/agent/config/config";
|
|
2
|
+
import { deriveAgentVaultId } from "@elizaos/app-core/security/agent-vault-id";
|
|
3
|
+
import { createNodePlatformSecureStore } from "@elizaos/app-core/security/platform-secure-store-node";
|
|
4
|
+
const WALLET_PAIRS = [
|
|
5
|
+
["EVM_PRIVATE_KEY", "wallet.evm_private_key"],
|
|
6
|
+
["SOLANA_PRIVATE_KEY", "wallet.solana_private_key"]
|
|
7
|
+
];
|
|
8
|
+
async function deleteWalletSecretsFromOsStore() {
|
|
9
|
+
const store = createNodePlatformSecureStore();
|
|
10
|
+
const vaultId = deriveAgentVaultId();
|
|
11
|
+
await store.delete(vaultId, "wallet.evm_private_key");
|
|
12
|
+
await store.delete(vaultId, "wallet.solana_private_key");
|
|
13
|
+
}
|
|
14
|
+
async function migrateWalletPrivateKeysToOsStore() {
|
|
15
|
+
const store = createNodePlatformSecureStore();
|
|
16
|
+
const migrated = [];
|
|
17
|
+
const failed = [];
|
|
18
|
+
if (!await store.isAvailable()) {
|
|
19
|
+
return { migrated, failed: [], unavailable: true };
|
|
20
|
+
}
|
|
21
|
+
const vaultId = deriveAgentVaultId();
|
|
22
|
+
const config = loadElizaConfig();
|
|
23
|
+
const persisted = config.env && typeof config.env === "object" && !Array.isArray(config.env) ? config.env : {};
|
|
24
|
+
for (const [envKey, kind] of WALLET_PAIRS) {
|
|
25
|
+
const fromProcess = typeof process.env[envKey] === "string" ? process.env[envKey]?.trim() : "";
|
|
26
|
+
const fromConfig = typeof persisted[envKey] === "string" ? String(persisted[envKey]).trim() : "";
|
|
27
|
+
const value = fromProcess || fromConfig;
|
|
28
|
+
if (!value) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const r = await store.set(vaultId, kind, value);
|
|
32
|
+
if (!r.ok) {
|
|
33
|
+
failed.push(envKey);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
migrated.push(envKey);
|
|
37
|
+
if (!fromProcess) {
|
|
38
|
+
process.env[envKey] = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
let dirty = false;
|
|
42
|
+
const nextEnv = { ...persisted };
|
|
43
|
+
for (const [envKey] of WALLET_PAIRS) {
|
|
44
|
+
if (typeof nextEnv[envKey] === "string") {
|
|
45
|
+
delete nextEnv[envKey];
|
|
46
|
+
dirty = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (dirty) {
|
|
50
|
+
if (Object.keys(nextEnv).length === 0) {
|
|
51
|
+
delete config.env;
|
|
52
|
+
} else {
|
|
53
|
+
config.env = nextEnv;
|
|
54
|
+
}
|
|
55
|
+
saveElizaConfig(config);
|
|
56
|
+
}
|
|
57
|
+
return { migrated, failed };
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
deleteWalletSecretsFromOsStore,
|
|
61
|
+
migrateWalletPrivateKeysToOsStore
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=wallet-os-store-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/security/wallet-os-store-actions.ts"],"sourcesContent":["import { loadElizaConfig, saveElizaConfig } from \"@elizaos/agent/config/config\";\nimport { deriveAgentVaultId } from \"@elizaos/app-core/security/agent-vault-id\";\nimport type { SecureStoreSecretKind } from \"@elizaos/app-core/security/platform-secure-store\";\nimport { createNodePlatformSecureStore } from \"@elizaos/app-core/security/platform-secure-store-node\";\n\nconst WALLET_PAIRS: [string, SecureStoreSecretKind][] = [\n [\"EVM_PRIVATE_KEY\", \"wallet.evm_private_key\"],\n [\"SOLANA_PRIVATE_KEY\", \"wallet.solana_private_key\"],\n];\n\nexport async function deleteWalletSecretsFromOsStore(): Promise<void> {\n const store = createNodePlatformSecureStore();\n const vaultId = deriveAgentVaultId();\n await store.delete(vaultId, \"wallet.evm_private_key\");\n await store.delete(vaultId, \"wallet.solana_private_key\");\n}\n\nexport type MigrateWalletPrivateKeysToOsStoreResult = {\n migrated: string[];\n failed: string[];\n /** True when the backend cannot run on this host (e.g. Linux without secret-tool). */\n unavailable?: boolean;\n};\n\n/**\n * Copies wallet keys from `process.env` and/or persisted `config.env` into the\n * OS store, strips them from saved config, and ensures `process.env` holds the\n * values for the running process.\n */\nexport async function migrateWalletPrivateKeysToOsStore(): Promise<MigrateWalletPrivateKeysToOsStoreResult> {\n const store = createNodePlatformSecureStore();\n const migrated: string[] = [];\n const failed: string[] = [];\n\n if (!(await store.isAvailable())) {\n return { migrated, failed: [], unavailable: true };\n }\n\n const vaultId = deriveAgentVaultId();\n const config = loadElizaConfig();\n const persisted =\n config.env && typeof config.env === \"object\" && !Array.isArray(config.env)\n ? (config.env as Record<string, unknown>)\n : {};\n\n for (const [envKey, kind] of WALLET_PAIRS) {\n const fromProcess =\n typeof process.env[envKey] === \"string\"\n ? process.env[envKey]?.trim()\n : \"\";\n const fromConfig =\n typeof persisted[envKey] === \"string\"\n ? String(persisted[envKey]).trim()\n : \"\";\n const value = fromProcess || fromConfig;\n if (!value) {\n continue;\n }\n\n const r = await store.set(vaultId, kind, value);\n if (!r.ok) {\n failed.push(envKey);\n continue;\n }\n\n migrated.push(envKey);\n if (!fromProcess) {\n process.env[envKey] = value;\n }\n }\n\n let dirty = false;\n const nextEnv = { ...persisted };\n for (const [envKey] of WALLET_PAIRS) {\n if (typeof nextEnv[envKey] === \"string\") {\n delete nextEnv[envKey];\n dirty = true;\n }\n }\n\n if (dirty) {\n if (Object.keys(nextEnv).length === 0) {\n delete config.env;\n } else {\n config.env = nextEnv as typeof config.env;\n }\n saveElizaConfig(config);\n }\n\n return { migrated, failed };\n}\n"],"mappings":"AAAA,SAAS,iBAAiB,uBAAuB;AACjD,SAAS,0BAA0B;AAEnC,SAAS,qCAAqC;AAE9C,MAAM,eAAkD;AAAA,EACtD,CAAC,mBAAmB,wBAAwB;AAAA,EAC5C,CAAC,sBAAsB,2BAA2B;AACpD;AAEA,eAAsB,iCAAgD;AACpE,QAAM,QAAQ,8BAA8B;AAC5C,QAAM,UAAU,mBAAmB;AACnC,QAAM,MAAM,OAAO,SAAS,wBAAwB;AACpD,QAAM,MAAM,OAAO,SAAS,2BAA2B;AACzD;AAcA,eAAsB,oCAAsF;AAC1G,QAAM,QAAQ,8BAA8B;AAC5C,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAE,MAAM,MAAM,YAAY,GAAI;AAChC,WAAO,EAAE,UAAU,QAAQ,CAAC,GAAG,aAAa,KAAK;AAAA,EACnD;AAEA,QAAM,UAAU,mBAAmB;AACnC,QAAM,SAAS,gBAAgB;AAC/B,QAAM,YACJ,OAAO,OAAO,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,IACpE,OAAO,MACR,CAAC;AAEP,aAAW,CAAC,QAAQ,IAAI,KAAK,cAAc;AACzC,UAAM,cACJ,OAAO,QAAQ,IAAI,MAAM,MAAM,WAC3B,QAAQ,IAAI,MAAM,GAAG,KAAK,IAC1B;AACN,UAAM,aACJ,OAAO,UAAU,MAAM,MAAM,WACzB,OAAO,UAAU,MAAM,CAAC,EAAE,KAAK,IAC/B;AACN,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,MAAM,IAAI,SAAS,MAAM,KAAK;AAC9C,QAAI,CAAC,EAAE,IAAI;AACT,aAAO,KAAK,MAAM;AAClB;AAAA,IACF;AAEA,aAAS,KAAK,MAAM;AACpB,QAAI,CAAC,aAAa;AAChB,cAAQ,IAAI,MAAM,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,QAAQ;AACZ,QAAM,UAAU,EAAE,GAAG,UAAU;AAC/B,aAAW,CAAC,MAAM,KAAK,cAAc;AACnC,QAAI,OAAO,QAAQ,MAAM,MAAM,UAAU;AACvC,aAAO,QAAQ,MAAM;AACrB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,OAAO;AACT,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AACA,oBAAgB,MAAM;AAAA,EACxB;AAEA,SAAO,EAAE,UAAU,OAAO;AAC5B;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steward-credentials.d.ts","sourceRoot":"","sources":["../../src/services/steward-credentials.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/steward-credentials.ts"],"sourcesContent":["export * from \"@elizaos/app-core\";\n"],"mappings":"AAAA,cAAc;","names":[]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Steward EVM Account — a viem-compatible Account that routes all signing
|
|
3
|
+
* through the Steward API. No private keys touch the container.
|
|
4
|
+
*
|
|
5
|
+
* Used when ELIZA_CLOUD_PROVISIONED=1 and STEWARD_AGENT_TOKEN is set.
|
|
6
|
+
*
|
|
7
|
+
* Implements viem's CustomAccount interface:
|
|
8
|
+
* - address
|
|
9
|
+
* - signMessage({ message })
|
|
10
|
+
* - signTransaction({ ... })
|
|
11
|
+
* - signTypedData({ domain, types, primaryType, message })
|
|
12
|
+
*
|
|
13
|
+
* The Steward API endpoints used:
|
|
14
|
+
* POST /vault/:agentId/sign — sign + optionally broadcast EVM tx
|
|
15
|
+
* POST /vault/:agentId/sign-message — sign arbitrary message (EIP-191)
|
|
16
|
+
* POST /vault/:agentId/sign-typed-data — sign EIP-712 typed data
|
|
17
|
+
*
|
|
18
|
+
* Auth: Bearer token (STEWARD_AGENT_TOKEN JWT) in Authorization header.
|
|
19
|
+
*/
|
|
20
|
+
import type { Account, Address } from "viem";
|
|
21
|
+
export interface StewardEvmAccountConfig {
|
|
22
|
+
/** Steward API base URL (e.g. http://172.18.0.1:3200) */
|
|
23
|
+
apiUrl: string;
|
|
24
|
+
/** JWT bearer token for agent authentication */
|
|
25
|
+
agentToken: string;
|
|
26
|
+
/** Agent ID in Steward */
|
|
27
|
+
agentId: string;
|
|
28
|
+
/** EVM wallet address (fetched from Steward at init) */
|
|
29
|
+
address: Address;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fetch the EVM wallet address for an agent from the Steward API.
|
|
33
|
+
* Tries /vault/:agentId/addresses first (multi-chain), falls back to /agents/:agentId.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Fetch optional multi-chain addresses from Steward (`/vault` first, then `/agents`).
|
|
37
|
+
* Solana may be present from `/vault/.../addresses` while EVM may come from either path.
|
|
38
|
+
*/
|
|
39
|
+
export declare function fetchStewardVaultChainAddresses(apiUrl: string, agentToken: string, agentId: string): Promise<{
|
|
40
|
+
evm: Address | null;
|
|
41
|
+
solana: string | null;
|
|
42
|
+
}>;
|
|
43
|
+
export declare function fetchStewardWalletAddress(apiUrl: string, agentToken: string, agentId: string): Promise<Address>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a viem-compatible Account that routes signing through Steward API.
|
|
46
|
+
*
|
|
47
|
+
* Usage:
|
|
48
|
+
* const account = createStewardEvmAccount({ apiUrl, agentToken, agentId, address });
|
|
49
|
+
* const walletProvider = new WalletProvider(account, runtime, chains);
|
|
50
|
+
*/
|
|
51
|
+
export declare function createStewardEvmAccount(config: StewardEvmAccountConfig): Account;
|
|
52
|
+
/**
|
|
53
|
+
* Check if the runtime has the credentials needed to sign EVM transactions
|
|
54
|
+
* through the Steward API. True for both cloud-provisioned containers
|
|
55
|
+
* (ELIZA_CLOUD_PROVISIONED=1) and self-hosted Steward deployments — the
|
|
56
|
+
* signing capability only depends on having the API URL and agent token.
|
|
57
|
+
*/
|
|
58
|
+
export declare function isStewardSigningReady(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* True when this runtime is a cloud-provisioned container. Informational —
|
|
61
|
+
* distinguishes cloud Steward from self-hosted Steward in logs and UI, but
|
|
62
|
+
* does NOT gate signing capability.
|
|
63
|
+
*/
|
|
64
|
+
export declare function isStewardCloudProvisioned(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Resolve Steward config from environment variables.
|
|
67
|
+
* Returns null when signing credentials are unavailable.
|
|
68
|
+
*/
|
|
69
|
+
export declare function resolveStewardEvmConfig(): StewardEvmAccountConfig | null;
|
|
70
|
+
/**
|
|
71
|
+
* Initialize a Steward-backed viem Account. Fetches the wallet address from the API.
|
|
72
|
+
* Returns null if Steward is unavailable (allows fallback to local key).
|
|
73
|
+
*/
|
|
74
|
+
export declare function initStewardEvmAccount(): Promise<Account | null>;
|
|
75
|
+
//# sourceMappingURL=steward-evm-account.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steward-evm-account.d.ts","sourceRoot":"","sources":["../../src/services/steward-evm-account.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EAOR,MAAM,MAAM,CAAC;AAQd,MAAM,WAAW,uBAAuB;IACtC,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;CAClB;AAmHD;;;GAGG;AACH;;;GAGG;AACH,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA2DzD;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAalB;AAID;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAkHT;AAID;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,uBAAuB,GAAG,IAAI,CAwBxE;AAqBD;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAyBrE"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { toAccount } from "viem/accounts";
|
|
2
|
+
const ZERO_ADDRESS_SENTINEL = "0x0000000000000000000000000000000000000000";
|
|
3
|
+
class StewardSigningClient {
|
|
4
|
+
baseUrl;
|
|
5
|
+
agentToken;
|
|
6
|
+
agentId;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.baseUrl = config.apiUrl.replace(/\/+$/, "");
|
|
9
|
+
this.agentToken = config.agentToken;
|
|
10
|
+
this.agentId = config.agentId;
|
|
11
|
+
}
|
|
12
|
+
async request(path, body) {
|
|
13
|
+
const url = `${this.baseUrl}${path}`;
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: {
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
Accept: "application/json",
|
|
19
|
+
Authorization: `Bearer ${this.agentToken}`
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify(body)
|
|
22
|
+
});
|
|
23
|
+
const text = await response.text();
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = JSON.parse(text);
|
|
27
|
+
} catch {
|
|
28
|
+
throw new Error(
|
|
29
|
+
`[StewardAccount] Invalid JSON from Steward API (${response.status}): ${text.slice(0, 200)}`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
if (!parsed.ok) {
|
|
33
|
+
if (response.status === 202 && parsed.data && typeof parsed.data === "object" && "status" in parsed.data && parsed.data.status === "pending_approval") {
|
|
34
|
+
throw new Error(
|
|
35
|
+
`[StewardAccount] Transaction requires manual approval (txId: ${parsed.data.txId})`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
throw new Error(
|
|
39
|
+
`[StewardAccount] API error (${response.status}): ${parsed.error || "Unknown error"}`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
return parsed.data;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Sign an EVM transaction.
|
|
46
|
+
* Returns the signed transaction hex (when broadcast=false) or txHash (when broadcast=true).
|
|
47
|
+
*/
|
|
48
|
+
async signTransaction(tx) {
|
|
49
|
+
return this.request(`/vault/${encodeURIComponent(this.agentId)}/sign`, {
|
|
50
|
+
...tx,
|
|
51
|
+
broadcast: tx.broadcast ?? false
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Sign an arbitrary message (EIP-191 personal_sign).
|
|
56
|
+
*/
|
|
57
|
+
async signMessage(message) {
|
|
58
|
+
return this.request(
|
|
59
|
+
`/vault/${encodeURIComponent(this.agentId)}/sign-message`,
|
|
60
|
+
{ message }
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Sign EIP-712 typed data.
|
|
65
|
+
*/
|
|
66
|
+
async signTypedData(input) {
|
|
67
|
+
return this.request(
|
|
68
|
+
`/vault/${encodeURIComponent(this.agentId)}/sign-typed-data`,
|
|
69
|
+
input
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function fetchStewardVaultChainAddresses(apiUrl, agentToken, agentId) {
|
|
74
|
+
const baseUrl = apiUrl.replace(/\/+$/, "");
|
|
75
|
+
const timeoutMs = 1e4;
|
|
76
|
+
const headers = {
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
Accept: "application/json",
|
|
79
|
+
Authorization: `Bearer ${agentToken}`
|
|
80
|
+
};
|
|
81
|
+
try {
|
|
82
|
+
const addrResp = await fetch(
|
|
83
|
+
`${baseUrl}/vault/${encodeURIComponent(agentId)}/addresses`,
|
|
84
|
+
{
|
|
85
|
+
headers,
|
|
86
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
if (addrResp.ok) {
|
|
90
|
+
const addrData = await addrResp.json();
|
|
91
|
+
if (addrData.ok && addrData.data) {
|
|
92
|
+
const evmRaw = addrData.data.evm?.trim();
|
|
93
|
+
const solRaw = addrData.data.solana?.trim();
|
|
94
|
+
return {
|
|
95
|
+
evm: evmRaw ? evmRaw : null,
|
|
96
|
+
solana: solRaw ?? null
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
} catch {
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const agentResp = await fetch(
|
|
104
|
+
`${baseUrl}/agents/${encodeURIComponent(agentId)}`,
|
|
105
|
+
{
|
|
106
|
+
headers,
|
|
107
|
+
signal: AbortSignal.timeout(timeoutMs)
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
if (agentResp.ok) {
|
|
111
|
+
const agentData = await agentResp.json();
|
|
112
|
+
if (agentData.ok && agentData.data?.walletAddress) {
|
|
113
|
+
return {
|
|
114
|
+
evm: agentData.data.walletAddress,
|
|
115
|
+
solana: null
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} catch {
|
|
120
|
+
}
|
|
121
|
+
return { evm: null, solana: null };
|
|
122
|
+
}
|
|
123
|
+
async function fetchStewardWalletAddress(apiUrl, agentToken, agentId) {
|
|
124
|
+
const baseUrl = apiUrl.replace(/\/+$/, "");
|
|
125
|
+
const { evm } = await fetchStewardVaultChainAddresses(
|
|
126
|
+
apiUrl,
|
|
127
|
+
agentToken,
|
|
128
|
+
agentId
|
|
129
|
+
);
|
|
130
|
+
if (!evm) {
|
|
131
|
+
throw new Error(
|
|
132
|
+
`[StewardAccount] Could not fetch wallet address for agent "${agentId}" from ${baseUrl}`
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
return evm;
|
|
136
|
+
}
|
|
137
|
+
function createStewardEvmAccount(config) {
|
|
138
|
+
const client = new StewardSigningClient({
|
|
139
|
+
apiUrl: config.apiUrl,
|
|
140
|
+
agentToken: config.agentToken,
|
|
141
|
+
agentId: config.agentId
|
|
142
|
+
});
|
|
143
|
+
const signTypedData = async (typedData) => {
|
|
144
|
+
const td = typedData;
|
|
145
|
+
const domain = td.domain && typeof td.domain === "object" ? td.domain : {};
|
|
146
|
+
const types = {
|
|
147
|
+
...td.types && typeof td.types === "object" ? td.types : {}
|
|
148
|
+
};
|
|
149
|
+
const primaryType = typeof td.primaryType === "string" ? td.primaryType : "";
|
|
150
|
+
const value = td.message && typeof td.message === "object" ? td.message : {};
|
|
151
|
+
delete types.EIP712Domain;
|
|
152
|
+
const result = await client.signTypedData({
|
|
153
|
+
domain,
|
|
154
|
+
types,
|
|
155
|
+
primaryType,
|
|
156
|
+
value
|
|
157
|
+
});
|
|
158
|
+
return result.signature;
|
|
159
|
+
};
|
|
160
|
+
return toAccount({
|
|
161
|
+
address: config.address,
|
|
162
|
+
async signMessage({ message }) {
|
|
163
|
+
let msgStr;
|
|
164
|
+
if (typeof message === "string") {
|
|
165
|
+
msgStr = message;
|
|
166
|
+
} else if (typeof message === "object" && "raw" in message) {
|
|
167
|
+
const raw = message.raw;
|
|
168
|
+
if (typeof raw === "string") {
|
|
169
|
+
msgStr = raw;
|
|
170
|
+
} else {
|
|
171
|
+
msgStr = `0x${Buffer.from(raw).toString("hex")}`;
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
msgStr = String(message);
|
|
175
|
+
}
|
|
176
|
+
const result = await client.signMessage(msgStr);
|
|
177
|
+
return result.signature;
|
|
178
|
+
},
|
|
179
|
+
async signTransaction(transaction) {
|
|
180
|
+
const to = transaction.to ?? "0x0000000000000000000000000000000000000000";
|
|
181
|
+
const value = transaction.value?.toString() ?? "0";
|
|
182
|
+
const data = transaction.data;
|
|
183
|
+
const result = await client.signTransaction({
|
|
184
|
+
to,
|
|
185
|
+
value,
|
|
186
|
+
data,
|
|
187
|
+
chainId: transaction.chainId,
|
|
188
|
+
nonce: transaction.nonce,
|
|
189
|
+
gas: transaction.gas?.toString(),
|
|
190
|
+
maxFeePerGas: transaction.maxFeePerGas?.toString(),
|
|
191
|
+
maxPriorityFeePerGas: transaction.maxPriorityFeePerGas?.toString(),
|
|
192
|
+
broadcast: false
|
|
193
|
+
// We want the signed tx back, not a broadcast
|
|
194
|
+
});
|
|
195
|
+
if (result.signedTx) {
|
|
196
|
+
return result.signedTx;
|
|
197
|
+
}
|
|
198
|
+
if (result.txHash) {
|
|
199
|
+
console.warn(
|
|
200
|
+
"[StewardAccount] Steward auto-broadcast tx despite broadcast=false. Hash:",
|
|
201
|
+
result.txHash
|
|
202
|
+
);
|
|
203
|
+
return result.txHash;
|
|
204
|
+
}
|
|
205
|
+
throw new Error(
|
|
206
|
+
"[StewardAccount] signTransaction returned neither signedTx nor txHash"
|
|
207
|
+
);
|
|
208
|
+
},
|
|
209
|
+
signTypedData
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function isStewardSigningReady() {
|
|
213
|
+
return !!process.env.STEWARD_AGENT_TOKEN && !!process.env.STEWARD_API_URL;
|
|
214
|
+
}
|
|
215
|
+
function isStewardCloudProvisioned() {
|
|
216
|
+
return process.env.ELIZA_CLOUD_PROVISIONED === "1" && isStewardSigningReady();
|
|
217
|
+
}
|
|
218
|
+
function resolveStewardEvmConfig() {
|
|
219
|
+
if (!isStewardSigningReady()) return null;
|
|
220
|
+
const apiUrl = process.env.STEWARD_API_URL;
|
|
221
|
+
const agentToken = process.env.STEWARD_AGENT_TOKEN;
|
|
222
|
+
const agentId = process.env.STEWARD_AGENT_ID || process.env.ELIZA_STEWARD_AGENT_ID || extractAgentIdFromJwt(agentToken) || "";
|
|
223
|
+
if (!agentId) {
|
|
224
|
+
console.warn("[StewardAccount] No agent ID found in env or JWT token");
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
apiUrl,
|
|
229
|
+
agentToken,
|
|
230
|
+
agentId,
|
|
231
|
+
address: ZERO_ADDRESS_SENTINEL
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function extractAgentIdFromJwt(token) {
|
|
235
|
+
try {
|
|
236
|
+
const parts = token.split(".");
|
|
237
|
+
if (parts.length !== 3) return null;
|
|
238
|
+
const payloadB64 = parts[1];
|
|
239
|
+
if (!payloadB64) return null;
|
|
240
|
+
const payload = JSON.parse(Buffer.from(payloadB64, "base64url").toString());
|
|
241
|
+
return payload.agentId || payload.sub || null;
|
|
242
|
+
} catch {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async function initStewardEvmAccount() {
|
|
247
|
+
const config = resolveStewardEvmConfig();
|
|
248
|
+
if (!config) return null;
|
|
249
|
+
try {
|
|
250
|
+
console.log(
|
|
251
|
+
"[StewardAccount] Cloud-provisioned mode detected, fetching wallet address..."
|
|
252
|
+
);
|
|
253
|
+
const address = await fetchStewardWalletAddress(
|
|
254
|
+
config.apiUrl,
|
|
255
|
+
config.agentToken,
|
|
256
|
+
config.agentId
|
|
257
|
+
);
|
|
258
|
+
config.address = address;
|
|
259
|
+
console.log(`[StewardAccount] Wallet address: ${address}`);
|
|
260
|
+
const account = createStewardEvmAccount(config);
|
|
261
|
+
console.log("[StewardAccount] \u2713 Steward signing proxy ready");
|
|
262
|
+
return account;
|
|
263
|
+
} catch (err) {
|
|
264
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
265
|
+
console.error(`[StewardAccount] Failed to initialize: ${msg}`);
|
|
266
|
+
console.warn("[StewardAccount] Falling back to local key signing");
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
export {
|
|
271
|
+
createStewardEvmAccount,
|
|
272
|
+
fetchStewardVaultChainAddresses,
|
|
273
|
+
fetchStewardWalletAddress,
|
|
274
|
+
initStewardEvmAccount,
|
|
275
|
+
isStewardCloudProvisioned,
|
|
276
|
+
isStewardSigningReady,
|
|
277
|
+
resolveStewardEvmConfig
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=steward-evm-account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/steward-evm-account.ts"],"sourcesContent":["/**\n * Steward EVM Account — a viem-compatible Account that routes all signing\n * through the Steward API. No private keys touch the container.\n *\n * Used when ELIZA_CLOUD_PROVISIONED=1 and STEWARD_AGENT_TOKEN is set.\n *\n * Implements viem's CustomAccount interface:\n * - address\n * - signMessage({ message })\n * - signTransaction({ ... })\n * - signTypedData({ domain, types, primaryType, message })\n *\n * The Steward API endpoints used:\n * POST /vault/:agentId/sign — sign + optionally broadcast EVM tx\n * POST /vault/:agentId/sign-message — sign arbitrary message (EIP-191)\n * POST /vault/:agentId/sign-typed-data — sign EIP-712 typed data\n *\n * Auth: Bearer token (STEWARD_AGENT_TOKEN JWT) in Authorization header.\n */\n\nimport type {\n Account,\n Address,\n CustomSource,\n Hex,\n SignableMessage,\n TransactionSerializable,\n TypedData,\n TypedDataDefinition,\n} from \"viem\";\nimport { toAccount } from \"viem/accounts\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nconst ZERO_ADDRESS_SENTINEL =\n \"0x0000000000000000000000000000000000000000\" as Address;\n\nexport interface StewardEvmAccountConfig {\n /** Steward API base URL (e.g. http://172.18.0.1:3200) */\n apiUrl: string;\n /** JWT bearer token for agent authentication */\n agentToken: string;\n /** Agent ID in Steward */\n agentId: string;\n /** EVM wallet address (fetched from Steward at init) */\n address: Address;\n}\n\ninterface StewardApiResponse<T = unknown> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\n// ─── Steward API Client (minimal, signing-only) ──────────────────────────────\n\nclass StewardSigningClient {\n private baseUrl: string;\n private agentToken: string;\n private agentId: string;\n\n constructor(\n config: Pick<StewardEvmAccountConfig, \"apiUrl\" | \"agentToken\" | \"agentId\">,\n ) {\n this.baseUrl = config.apiUrl.replace(/\\/+$/, \"\");\n this.agentToken = config.agentToken;\n this.agentId = config.agentId;\n }\n\n private async request<T>(path: string, body: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n Authorization: `Bearer ${this.agentToken}`,\n },\n body: JSON.stringify(body),\n });\n\n const text = await response.text();\n let parsed: StewardApiResponse<T>;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new Error(\n `[StewardAccount] Invalid JSON from Steward API (${response.status}): ${text.slice(0, 200)}`,\n );\n }\n\n if (!parsed.ok) {\n // 202 with pending_approval is a special case\n if (\n response.status === 202 &&\n parsed.data &&\n typeof parsed.data === \"object\" &&\n \"status\" in (parsed.data as Record<string, unknown>) &&\n (parsed.data as Record<string, unknown>).status === \"pending_approval\"\n ) {\n throw new Error(\n `[StewardAccount] Transaction requires manual approval (txId: ${(parsed.data as Record<string, unknown>).txId})`,\n );\n }\n throw new Error(\n `[StewardAccount] API error (${response.status}): ${parsed.error || \"Unknown error\"}`,\n );\n }\n\n return parsed.data as T;\n }\n\n /**\n * Sign an EVM transaction.\n * Returns the signed transaction hex (when broadcast=false) or txHash (when broadcast=true).\n */\n async signTransaction(tx: {\n to: string;\n value: string;\n data?: string;\n chainId?: number;\n nonce?: number;\n gas?: string;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n broadcast?: boolean;\n }): Promise<{ signedTx?: string; txHash?: string }> {\n return this.request(`/vault/${encodeURIComponent(this.agentId)}/sign`, {\n ...tx,\n broadcast: tx.broadcast ?? false,\n });\n }\n\n /**\n * Sign an arbitrary message (EIP-191 personal_sign).\n */\n async signMessage(message: string): Promise<{ signature: string }> {\n return this.request(\n `/vault/${encodeURIComponent(this.agentId)}/sign-message`,\n { message },\n );\n }\n\n /**\n * Sign EIP-712 typed data.\n */\n async signTypedData(input: {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n value: Record<string, unknown>;\n }): Promise<{ signature: string }> {\n return this.request(\n `/vault/${encodeURIComponent(this.agentId)}/sign-typed-data`,\n input,\n );\n }\n}\n\n// ─── Fetch wallet address from Steward ───────────────────────────────────────\n\n/**\n * Fetch the EVM wallet address for an agent from the Steward API.\n * Tries /vault/:agentId/addresses first (multi-chain), falls back to /agents/:agentId.\n */\n/**\n * Fetch optional multi-chain addresses from Steward (`/vault` first, then `/agents`).\n * Solana may be present from `/vault/.../addresses` while EVM may come from either path.\n */\nexport async function fetchStewardVaultChainAddresses(\n apiUrl: string,\n agentToken: string,\n agentId: string,\n): Promise<{ evm: Address | null; solana: string | null }> {\n const baseUrl = apiUrl.replace(/\\/+$/, \"\");\n const timeoutMs = 10_000;\n const headers = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n Authorization: `Bearer ${agentToken}`,\n };\n\n try {\n const addrResp = await fetch(\n `${baseUrl}/vault/${encodeURIComponent(agentId)}/addresses`,\n {\n headers,\n signal: AbortSignal.timeout(timeoutMs),\n },\n );\n if (addrResp.ok) {\n const addrData = (await addrResp.json()) as StewardApiResponse<{\n evm?: string;\n solana?: string;\n }>;\n if (addrData.ok && addrData.data) {\n const evmRaw = addrData.data.evm?.trim();\n const solRaw = addrData.data.solana?.trim();\n return {\n evm: evmRaw ? (evmRaw as Address) : null,\n solana: solRaw ?? null,\n };\n }\n }\n } catch {\n // fall through\n }\n\n try {\n const agentResp = await fetch(\n `${baseUrl}/agents/${encodeURIComponent(agentId)}`,\n {\n headers,\n signal: AbortSignal.timeout(timeoutMs),\n },\n );\n if (agentResp.ok) {\n const agentData = (await agentResp.json()) as StewardApiResponse<{\n walletAddress?: string;\n }>;\n if (agentData.ok && agentData.data?.walletAddress) {\n return {\n evm: agentData.data.walletAddress as Address,\n solana: null,\n };\n }\n }\n } catch {\n // fall through\n }\n\n return { evm: null, solana: null };\n}\n\nexport async function fetchStewardWalletAddress(\n apiUrl: string,\n agentToken: string,\n agentId: string,\n): Promise<Address> {\n const baseUrl = apiUrl.replace(/\\/+$/, \"\");\n const { evm } = await fetchStewardVaultChainAddresses(\n apiUrl,\n agentToken,\n agentId,\n );\n if (!evm) {\n throw new Error(\n `[StewardAccount] Could not fetch wallet address for agent \"${agentId}\" from ${baseUrl}`,\n );\n }\n return evm;\n}\n\n// ─── Create viem Account ─────────────────────────────────────────────────────\n\n/**\n * Create a viem-compatible Account that routes signing through Steward API.\n *\n * Usage:\n * const account = createStewardEvmAccount({ apiUrl, agentToken, agentId, address });\n * const walletProvider = new WalletProvider(account, runtime, chains);\n */\nexport function createStewardEvmAccount(\n config: StewardEvmAccountConfig,\n): Account {\n const client = new StewardSigningClient({\n apiUrl: config.apiUrl,\n agentToken: config.agentToken,\n agentId: config.agentId,\n });\n const signTypedData = async <\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | \"EIP712Domain\" = keyof typedData,\n >(\n typedData: TypedDataDefinition<typedData, primaryType>,\n ): Promise<Hex> => {\n const td = typedData as Record<string, unknown>;\n const domain =\n td.domain && typeof td.domain === \"object\"\n ? (td.domain as Record<string, unknown>)\n : {};\n const types = {\n ...((td.types && typeof td.types === \"object\" ? td.types : {}) as Record<\n string,\n unknown\n >),\n };\n const primaryType =\n typeof td.primaryType === \"string\" ? td.primaryType : \"\";\n const value =\n td.message && typeof td.message === \"object\"\n ? (td.message as Record<string, unknown>)\n : {};\n\n // Remove the EIP712Domain type if present (Steward expects raw types)\n delete types.EIP712Domain;\n\n const result = await client.signTypedData({\n domain,\n types,\n primaryType,\n value,\n });\n return result.signature as Hex;\n };\n\n return toAccount({\n address: config.address,\n\n async signMessage({ message }: { message: SignableMessage }): Promise<Hex> {\n // Normalize message to string\n let msgStr: string;\n if (typeof message === \"string\") {\n msgStr = message;\n } else if (typeof message === \"object\" && \"raw\" in message) {\n // Raw bytes\n const raw = message.raw;\n if (typeof raw === \"string\") {\n msgStr = raw; // already hex\n } else {\n // Uint8Array → hex\n msgStr = `0x${Buffer.from(raw).toString(\"hex\")}`;\n }\n } else {\n msgStr = String(message);\n }\n\n const result = await client.signMessage(msgStr);\n return result.signature as Hex;\n },\n\n async signTransaction(transaction: TransactionSerializable): Promise<Hex> {\n // Build a signing request for Steward\n const to = transaction.to ?? \"0x0000000000000000000000000000000000000000\";\n const value = transaction.value?.toString() ?? \"0\";\n\n // Serialize calldata if present\n const data = (transaction as Record<string, unknown>).data as\n | string\n | undefined;\n\n const result = await client.signTransaction({\n to,\n value,\n data,\n chainId: transaction.chainId,\n nonce: transaction.nonce,\n gas: transaction.gas?.toString(),\n maxFeePerGas: (\n transaction as Record<string, unknown>\n ).maxFeePerGas?.toString(),\n maxPriorityFeePerGas: (\n transaction as Record<string, unknown>\n ).maxPriorityFeePerGas?.toString(),\n broadcast: false, // We want the signed tx back, not a broadcast\n });\n\n if (result.signedTx) {\n return result.signedTx as Hex;\n }\n\n // If Steward returned a txHash instead (auto-broadcast), wrap it\n if (result.txHash) {\n console.warn(\n \"[StewardAccount] Steward auto-broadcast tx despite broadcast=false. Hash:\",\n result.txHash,\n );\n // Return the hash — callers will need to handle this edge case\n return result.txHash as Hex;\n }\n\n throw new Error(\n \"[StewardAccount] signTransaction returned neither signedTx nor txHash\",\n );\n },\n\n signTypedData: signTypedData as CustomSource[\"signTypedData\"],\n });\n}\n\n// ─── Integration helper ──────────────────────────────────────────────────────\n\n/**\n * Check if the runtime has the credentials needed to sign EVM transactions\n * through the Steward API. True for both cloud-provisioned containers\n * (ELIZA_CLOUD_PROVISIONED=1) and self-hosted Steward deployments — the\n * signing capability only depends on having the API URL and agent token.\n */\nexport function isStewardSigningReady(): boolean {\n return !!process.env.STEWARD_AGENT_TOKEN && !!process.env.STEWARD_API_URL;\n}\n\n/**\n * True when this runtime is a cloud-provisioned container. Informational —\n * distinguishes cloud Steward from self-hosted Steward in logs and UI, but\n * does NOT gate signing capability.\n */\nexport function isStewardCloudProvisioned(): boolean {\n return process.env.ELIZA_CLOUD_PROVISIONED === \"1\" && isStewardSigningReady();\n}\n\n/**\n * Resolve Steward config from environment variables.\n * Returns null when signing credentials are unavailable.\n */\nexport function resolveStewardEvmConfig(): StewardEvmAccountConfig | null {\n if (!isStewardSigningReady()) return null;\n\n const apiUrl = process.env.STEWARD_API_URL as string;\n const agentToken = process.env.STEWARD_AGENT_TOKEN as string;\n\n // Agent ID can come from the JWT payload or env var\n const agentId =\n process.env.STEWARD_AGENT_ID ||\n process.env.ELIZA_STEWARD_AGENT_ID ||\n extractAgentIdFromJwt(agentToken) ||\n \"\";\n\n if (!agentId) {\n console.warn(\"[StewardAccount] No agent ID found in env or JWT token\");\n return null;\n }\n\n return {\n apiUrl,\n agentToken,\n agentId,\n address: ZERO_ADDRESS_SENTINEL,\n };\n}\n\n/**\n * Extract agentId from a JWT token's payload (without verification).\n * Steward JWTs typically have { sub: agentId, ... } or { agentId: \"...\" }.\n */\nfunction extractAgentIdFromJwt(token: string): string | null {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3) return null;\n const payloadB64 = parts[1];\n if (!payloadB64) return null;\n const payload = JSON.parse(Buffer.from(payloadB64, \"base64url\").toString());\n return payload.agentId || payload.sub || null;\n } catch {\n return null;\n }\n}\n\n// ─── Full initialization helper ──────────────────────────────────────────────\n\n/**\n * Initialize a Steward-backed viem Account. Fetches the wallet address from the API.\n * Returns null if Steward is unavailable (allows fallback to local key).\n */\nexport async function initStewardEvmAccount(): Promise<Account | null> {\n const config = resolveStewardEvmConfig();\n if (!config) return null;\n\n try {\n console.log(\n \"[StewardAccount] Cloud-provisioned mode detected, fetching wallet address...\",\n );\n const address = await fetchStewardWalletAddress(\n config.apiUrl,\n config.agentToken,\n config.agentId,\n );\n config.address = address;\n console.log(`[StewardAccount] Wallet address: ${address}`);\n\n const account = createStewardEvmAccount(config);\n console.log(\"[StewardAccount] ✓ Steward signing proxy ready\");\n return account;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`[StewardAccount] Failed to initialize: ${msg}`);\n console.warn(\"[StewardAccount] Falling back to local key signing\");\n return null;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Steward EVM Bridge — intercepts plugin-wallet EVM initialization in cloud-provisioned
|
|
3
|
+
* containers to route signing through Steward API instead of local private keys.
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* 1. Before the runtime starts plugins, check if we're in cloud-provisioned mode
|
|
7
|
+
* 2. If so, create a Steward viem Account
|
|
8
|
+
* 3. Inject a reserved EVM_PRIVATE_KEY setting so initWalletProvider doesn't
|
|
9
|
+
* generate a random key, then immediately replace the account on the
|
|
10
|
+
* WalletProvider after EVMService starts
|
|
11
|
+
*
|
|
12
|
+
* This module exports a boot hook that should be called early in the runtime
|
|
13
|
+
* initialization, before plugins are loaded.
|
|
14
|
+
*/
|
|
15
|
+
import type { IAgentRuntime } from "@elizaos/core";
|
|
16
|
+
import { initStewardEvmAccount } from "./steward-evm-account.js";
|
|
17
|
+
/**
|
|
18
|
+
* Pre-boot hook: call before plugins are loaded.
|
|
19
|
+
* Sets a reserved EVM_PRIVATE_KEY if in Steward mode so that initWalletProvider
|
|
20
|
+
* does not auto-generate and persist a random key.
|
|
21
|
+
*/
|
|
22
|
+
export declare function stewardEvmPreBoot(runtime: IAgentRuntime): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Post-boot hook: call after plugins have started.
|
|
25
|
+
* Replaces the WalletProvider's account on the EVMService with the Steward account.
|
|
26
|
+
*/
|
|
27
|
+
export declare function stewardEvmPostBoot(runtime: IAgentRuntime): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Get the Steward account if initialized (for use by other services).
|
|
30
|
+
*/
|
|
31
|
+
export declare function getStewardEvmAccount(): Awaited<ReturnType<typeof initStewardEvmAccount>>;
|
|
32
|
+
/**
|
|
33
|
+
* Check if Steward EVM bridge is active.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isStewardEvmBridgeActive(): boolean;
|
|
36
|
+
//# sourceMappingURL=steward-evm-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steward-evm-bridge.d.ts","sourceRoot":"","sources":["../../src/services/steward-evm-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,qBAAqB,EAGtB,MAAM,uBAAuB,CAAC;AAY/B;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC7E;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAC7C,UAAU,CAAC,OAAO,qBAAqB,CAAC,CACzC,CAEA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD"}
|