From 0472dcfef325e37736f6965f8453c20545806c12 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 12 Jan 2025 19:57:35 +1100 Subject: [PATCH 1/2] add evm provider --- packages/core/package.json | 1 + packages/core/src/core/providers.ts | 46 +++++++++++++++++- pnpm-lock.yaml | 74 +++++++++++++++++++++++++++++ readme.md | 2 +- 4 files changed, 121 insertions(+), 2 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 615b6796..9294c0be 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -18,6 +18,7 @@ "ajv": "^8.17.1", "chromadb": "^1.9.4", "chromadb-default-embed": "^2.13.2", + "ethers": "^6.13.5", "openai": "^4.76.0", "starknet": "^6.11.0", "uuid": "^11.0.3", diff --git a/packages/core/src/core/providers.ts b/packages/core/src/core/providers.ts index a82ca4d6..dd3020e3 100644 --- a/packages/core/src/core/providers.ts +++ b/packages/core/src/core/providers.ts @@ -1,6 +1,7 @@ import { Account, type Call, CallData, RpcProvider } from "starknet"; import { env } from "./env"; - +import type { CoTTransaction } from "../types"; +import { ethers } from "ethers"; interface GraphQLResponse { data?: T; errors?: Array<{ @@ -82,3 +83,46 @@ export const executeStarknetTransaction = async (call: Call): Promise => { return error instanceof Error ? error : new Error("Unknown error occurred"); } }; + +export interface EvmTransaction extends CoTTransaction { + network: "evm"; + method: string; + value?: string; + gasLimit?: string; +} + +export async function executeEvmTransaction( + transaction: EvmTransaction +): Promise { + try { + // Initialize provider (customize based on your needs) + const provider = new ethers.JsonRpcProvider(process.env.EVM_RPC_URL); + + // Initialize wallet/signer + const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); + + // Create contract instance + const contract = new ethers.Contract( + transaction.contractAddress, + ["function " + transaction.method + "(...)"], // You might want to pass ABI instead + wallet + ); + + // Prepare transaction options + const txOptions = { + value: BigInt(transaction.value || "0"), + gasLimit: BigInt(transaction.gasLimit || "0"), + }; + + // Execute transaction + const tx = await contract[transaction.method]( + ...transaction.calldata, + txOptions + ); + const receipt = await tx.wait(); + + return receipt; + } catch (error) { + return error instanceof Error ? error : new Error("Unknown error occurred"); + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1be3513d..2b23d077 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: chromadb-default-embed: specifier: ^2.13.2 version: 2.13.2 + ethers: + specifier: ^6.13.5 + version: 6.13.5 openai: specifier: ^4.76.0 version: 4.78.0(zod@3.24.1) @@ -63,6 +66,9 @@ importers: packages: + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@anthropic-ai/sdk@0.32.1': resolution: {integrity: sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==} @@ -211,12 +217,19 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@noble/curves@1.3.0': resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + '@noble/hashes@1.3.3': resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} engines: {node: '>= 16'} @@ -391,6 +404,9 @@ packages: '@types/node@22.10.5': resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} @@ -431,6 +447,9 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + agent-twitter-client@0.0.16: resolution: {integrity: sha512-Clgb/N2LXoGMlId6GDUaaR05eJ0PqSifM6wikl/FiQ2+3+6I2ZhZB7KRulc8R4xvYFe6h0wNWe6FZiF48r124w==} @@ -643,6 +662,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + ethers@6.13.5: + resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} + engines: {node: '>=14.0.0'} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -1077,6 +1100,9 @@ packages: ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1094,6 +1120,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -1208,6 +1237,18 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -1230,6 +1271,8 @@ packages: snapshots: + '@adraffy/ens-normalize@1.10.1': {} + '@anthropic-ai/sdk@0.32.1': dependencies: '@types/node': 18.19.70 @@ -1315,6 +1358,10 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + '@noble/curves@1.3.0': dependencies: '@noble/hashes': 1.3.3 @@ -1323,6 +1370,8 @@ snapshots: dependencies: '@noble/hashes': 1.4.0 + '@noble/hashes@1.3.2': {} + '@noble/hashes@1.3.3': {} '@noble/hashes@1.4.0': {} @@ -1447,6 +1496,10 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + '@types/ws@8.5.13': dependencies: '@types/node': 22.10.5 @@ -1502,6 +1555,8 @@ snapshots: dependencies: event-target-shim: 5.0.1 + aes-js@4.0.0-beta.5: {} + agent-twitter-client@0.0.16: dependencies: '@sinclair/typebox': 0.32.35 @@ -1741,6 +1796,19 @@ snapshots: dependencies: '@types/estree': 1.0.6 + ethers@6.13.5: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + event-target-shim@5.0.1: {} expand-template@2.0.3: {} @@ -2236,6 +2304,8 @@ snapshots: ts-mixer@6.0.4: {} + tslib@2.7.0: {} + tslib@2.8.1: {} tunnel-agent@0.6.0: @@ -2248,6 +2318,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici-types@6.20.0: {} universalify@0.2.0: {} @@ -2353,6 +2425,8 @@ snapshots: wrappy@1.0.2: {} + ws@8.17.1: {} + y18n@5.0.8: {} yargs-parser@21.1.1: {} diff --git a/readme.md b/readme.md index 5c260290..ff167049 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # Daydreams -Daydreams is a generative agent library for playing anything onchain. It is chain agnostic and can be used to play any onchain game by simply injecting context. Base, Solana, Ethereum, Starknet, etc. +Daydreams is a generative agent library for playing anything onchain. It is chain agnostic and can be used to play anything onchain by simply injecting context. Base, Solana, Ethereum, Starknet, etc. You can drop daydreams into Eliza or any typescript agent framework via their plugin system. From 5a8f745dd0bd7a2338d6c8033c071a93f32eb953 Mon Sep 17 00:00:00 2001 From: Loaf <90423308+ponderingdemocritus@users.noreply.github.com> Date: Sun, 12 Jan 2025 20:07:59 +1100 Subject: [PATCH 2/2] Update packages/core/src/core/providers.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- packages/core/src/core/providers.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/core/src/core/providers.ts b/packages/core/src/core/providers.ts index dd3020e3..9ec7545c 100644 --- a/packages/core/src/core/providers.ts +++ b/packages/core/src/core/providers.ts @@ -102,12 +102,20 @@ export async function executeEvmTransaction( const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider); // Create contract instance + if (!transaction.abi) { + throw new Error('Contract ABI is required'); + } + const contract = new ethers.Contract( transaction.contractAddress, - ["function " + transaction.method + "(...)"], // You might want to pass ABI instead + transaction.abi, wallet ); + if (!contract[transaction.method]) { + throw new Error(`Method ${transaction.method} not found in contract ABI`); + } + // Prepare transaction options const txOptions = { value: BigInt(transaction.value || "0"),