From 92f25647162b3c35f31368d3082095baf0c165c7 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 30 Dec 2024 19:12:45 +0700 Subject: [PATCH 1/3] add TEE plugin-env support --- packages/plugin-evm/package.json | 45 ++++++------ packages/plugin-evm/src/providers/wallet.ts | 40 ++++++++--- pnpm-lock.yaml | 76 +++++++++++++++++++-- 3 files changed, 126 insertions(+), 35 deletions(-) diff --git a/packages/plugin-evm/package.json b/packages/plugin-evm/package.json index 30eb88d2f32..ce1c38085cf 100644 --- a/packages/plugin-evm/package.json +++ b/packages/plugin-evm/package.json @@ -1,24 +1,25 @@ { - "name": "@elizaos/plugin-evm", - "version": "0.1.7-alpha.2", - "main": "dist/index.js", - "type": "module", - "types": "dist/index.d.ts", - "dependencies": { - "@elizaos/core": "workspace:*", - "@lifi/data-types": "5.15.5", - "@lifi/sdk": "3.4.1", - "@lifi/types": "16.3.0", - "tsup": "8.3.5", - "viem": "2.21.53" - }, - "scripts": { - "build": "tsup --format esm --dts", - "dev": "tsup --format esm --dts --watch", - "test": "vitest run", - "lint": "eslint --fix --cache ." - }, - "peerDependencies": { - "whatwg-url": "7.1.0" - } + "name": "@elizaos/plugin-evm", + "version": "0.1.7-alpha.1", + "main": "dist/index.js", + "type": "module", + "types": "dist/index.d.ts", + "dependencies": { + "@elizaos/core": "workspace:*", + "@elizaos/plugin-tee": "workspace:*", + "@lifi/data-types": "5.15.5", + "@lifi/sdk": "3.4.1", + "@lifi/types": "16.3.0", + "tsup": "8.3.5", + "viem": "2.21.53" + }, + "scripts": { + "build": "tsup --format esm --dts", + "dev": "tsup --format esm --dts --watch", + "test": "vitest run", + "lint": "eslint --fix --cache ." + }, + "peerDependencies": { + "whatwg-url": "7.1.0" + } } diff --git a/packages/plugin-evm/src/providers/wallet.ts b/packages/plugin-evm/src/providers/wallet.ts index c0fbcc7360a..45940950869 100644 --- a/packages/plugin-evm/src/providers/wallet.ts +++ b/packages/plugin-evm/src/providers/wallet.ts @@ -16,6 +16,7 @@ import type { PrivateKeyAccount, } from "viem"; import * as viemChains from "viem/chains"; +import { DeriveKeyProvider, TEEMode } from "@elizaos/plugin-tee"; import type { SupportedChain } from "../types"; @@ -24,9 +25,9 @@ export class WalletProvider { chains: Record = { mainnet: viemChains.mainnet }; account: PrivateKeyAccount; - constructor(privateKey: `0x${string}`, chains?: Record) { - this.setAccount(privateKey); + constructor(account: PrivateKeyAccount, chains?: Record) { this.setChains(chains); + this.account = account; if (chains && Object.keys(chains).length > 0) { this.setCurrentChain(Object.keys(chains)[0] as SupportedChain); @@ -197,15 +198,36 @@ const genChainsFromRuntime = ( return chains; }; -export const initWalletProvider = (runtime: IAgentRuntime) => { - const privateKey = runtime.getSetting("EVM_PRIVATE_KEY"); - if (!privateKey) { - throw new Error("EVM_PRIVATE_KEY is missing"); - } +export const initWalletProvider = async (runtime: IAgentRuntime) => { + const teeMode = runtime.getSetting("TEE_MODE") || TEEMode.OFF; const chains = genChainsFromRuntime(runtime); - return new WalletProvider(privateKey as `0x${string}`, chains); + if (teeMode !== TEEMode.OFF) { + const walletSecretSalt = runtime.getSetting("WALLET_SECRET_SALT"); + if (!walletSecretSalt) { + throw new Error( + "WALLET_SECRET_SALT required when TEE_MODE is enabled" + ); + } + + const deriveKeyProvider = new DeriveKeyProvider(teeMode); + const deriveKeyResult = await deriveKeyProvider.deriveEcdsaKeypair( + "/", + walletSecretSalt, + runtime.agentId + ); + return new WalletProvider(deriveKeyResult.keypair, chains); + } else { + const privateKey = runtime.getSetting( + "EVM_PRIVATE_KEY" + ) as `0x${string}`; + if (!privateKey) { + throw new Error("EVM_PRIVATE_KEY is missing"); + } + const account = privateKeyToAccount(privateKey); + return new WalletProvider(account, chains); + } }; export const evmWalletProvider: Provider = { @@ -215,7 +237,7 @@ export const evmWalletProvider: Provider = { _state?: State ): Promise { try { - const walletProvider = initWalletProvider(runtime); + const walletProvider = await initWalletProvider(runtime); const address = walletProvider.getAddress(); const balance = await walletProvider.getWalletBalance(); const chain = walletProvider.getCurrentChain(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a4683f236c..24a75803b8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1134,6 +1134,9 @@ importers: '@elizaos/core': specifier: workspace:* version: link:../core + '@elizaos/plugin-tee': + specifier: workspace:* + version: link:../plugin-tee '@lifi/data-types': specifier: 5.15.5 version: 5.15.5 @@ -1920,10 +1923,10 @@ importers: version: 8.16.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3) jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) + version: 29.7.0(@types/node@20.17.9) ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.9))(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -31419,6 +31422,21 @@ snapshots: - supports-color - ts-node + create-jest@29.7.0(@types/node@20.17.9): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 @@ -35292,6 +35310,25 @@ snapshots: - supports-color - ts-node + jest-cli@29.7.0(@types/node@20.17.9): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.17.9) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest-cli@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) @@ -35313,7 +35350,7 @@ snapshots: jest-cli@29.7.0(@types/node@22.10.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 @@ -35767,6 +35804,18 @@ snapshots: - supports-color - ts-node + jest@29.7.0(@types/node@20.17.9): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.17.9) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) @@ -35781,7 +35830,7 @@ snapshots: jest@29.7.0(@types/node@22.10.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 jest-cli: 29.7.0(@types/node@22.10.2) @@ -41832,6 +41881,25 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.9))(typescript@5.6.3): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.17.9) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.6.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.8.4)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 From 34ac4e55ca2d7f670a15c2b48898d8aab4cdd5f3 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 30 Dec 2024 20:00:02 +0700 Subject: [PATCH 2/3] fix --- packages/plugin-evm/src/actions/transfer.ts | 2 +- packages/plugin-evm/src/providers/wallet.ts | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/plugin-evm/src/actions/transfer.ts b/packages/plugin-evm/src/actions/transfer.ts index 71e252f9b63..7ca220da14d 100644 --- a/packages/plugin-evm/src/actions/transfer.ts +++ b/packages/plugin-evm/src/actions/transfer.ts @@ -115,7 +115,7 @@ export const transferAction = { callback?: HandlerCallback ) => { console.log("Transfer action handler called"); - const walletProvider = initWalletProvider(runtime); + const walletProvider = await initWalletProvider(runtime); const action = new TransferAction(walletProvider); // Compose transfer context diff --git a/packages/plugin-evm/src/providers/wallet.ts b/packages/plugin-evm/src/providers/wallet.ts index 45940950869..752f6b7c05e 100644 --- a/packages/plugin-evm/src/providers/wallet.ts +++ b/packages/plugin-evm/src/providers/wallet.ts @@ -25,9 +25,12 @@ export class WalletProvider { chains: Record = { mainnet: viemChains.mainnet }; account: PrivateKeyAccount; - constructor(account: PrivateKeyAccount, chains?: Record) { + constructor( + accountOrPrivateKey: PrivateKeyAccount | `0x${string}`, + chains?: Record + ) { + this.setAccount(accountOrPrivateKey); this.setChains(chains); - this.account = account; if (chains && Object.keys(chains).length > 0) { this.setCurrentChain(Object.keys(chains)[0] as SupportedChain); @@ -119,8 +122,14 @@ export class WalletProvider { this.setCurrentChain(chainName); } - private setAccount = (pk: `0x${string}`) => { - this.account = privateKeyToAccount(pk); + private setAccount = ( + accountOrPrivateKey: PrivateKeyAccount | `0x${string}` + ) => { + if (typeof accountOrPrivateKey === "string") { + this.account = privateKeyToAccount(accountOrPrivateKey); + } else { + this.account = accountOrPrivateKey; + } }; private setChains = (chains?: Record) => { @@ -225,8 +234,7 @@ export const initWalletProvider = async (runtime: IAgentRuntime) => { if (!privateKey) { throw new Error("EVM_PRIVATE_KEY is missing"); } - const account = privateKeyToAccount(privateKey); - return new WalletProvider(account, chains); + return new WalletProvider(privateKey, chains); } }; From 5821769d36f6f824f1b2ce9e716e10714791189c Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 30 Dec 2024 20:01:54 +0700 Subject: [PATCH 3/3] fix --- packages/plugin-evm/src/actions/bridge.ts | 2 +- packages/plugin-evm/src/actions/swap.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin-evm/src/actions/bridge.ts b/packages/plugin-evm/src/actions/bridge.ts index 5683f814b30..d5d8816e25a 100644 --- a/packages/plugin-evm/src/actions/bridge.ts +++ b/packages/plugin-evm/src/actions/bridge.ts @@ -97,7 +97,7 @@ export const bridgeAction = { callback?: any ) => { console.log("Bridge action handler called"); - const walletProvider = initWalletProvider(runtime); + const walletProvider = await initWalletProvider(runtime); const action = new BridgeAction(walletProvider); // Compose bridge context diff --git a/packages/plugin-evm/src/actions/swap.ts b/packages/plugin-evm/src/actions/swap.ts index 718be7edb9d..a43dca6cbd8 100644 --- a/packages/plugin-evm/src/actions/swap.ts +++ b/packages/plugin-evm/src/actions/swap.ts @@ -107,7 +107,7 @@ export const swapAction = { callback?: any ) => { console.log("Swap action handler called"); - const walletProvider = initWalletProvider(runtime); + const walletProvider = await initWalletProvider(runtime); const action = new SwapAction(walletProvider); // Compose swap context