From 47c7d4d6d153ef77a65eaf07cd5c5d33063338b4 Mon Sep 17 00:00:00 2001 From: BitPod Date: Wed, 12 Feb 2025 03:13:30 +0800 Subject: [PATCH 1/4] Update the userprofile wallets --- packages/client-direct/src/routes.ts | 9 ++++++++- packages/plugin-data-enrich/src/userprofile.ts | 7 +------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/client-direct/src/routes.ts b/packages/client-direct/src/routes.ts index 2878e762da243..b81f4ad6a2a14 100644 --- a/packages/client-direct/src/routes.ts +++ b/packages/client-direct/src/routes.ts @@ -1084,7 +1084,14 @@ export class Routes { const runtime = await this.authUtils.getRuntime(req.params.agentId); const userManager = new UserManager(runtime.cacheManager); const profile = await userManager.verifyExistingUser(userId); - const address = profile.walletAddress;// "0xdD1Be812e7ACe045C67167503157a9FC88D6E403"; //profile.walletAddress; + //const address = profile.walletAddress;// "0xdD1Be812e7ACe045C67167503157a9FC88D6E403"; //profile.walletAddress; + let address = ""; + if (profile && profile.wallets) { + address = profile.wallets[typestr]; + } + if (!address) { + address = profile.walletAddress; + } if (!address) { throw new ApiError(400, "Missing required field: walletAddress"); } diff --git a/packages/plugin-data-enrich/src/userprofile.ts b/packages/plugin-data-enrich/src/userprofile.ts index b9f8eab7ca30e..38194fe78728e 100644 --- a/packages/plugin-data-enrich/src/userprofile.ts +++ b/packages/plugin-data-enrich/src/userprofile.ts @@ -8,18 +8,13 @@ interface WatchItem { tags: []; } -interface WalletItem { - chain: string; - address: string; -} - export interface UserProfile { userId: string; gmail?: string; agentname: string; bio?: string | string[]; walletAddress?: string; - wallets?: WalletItem[]; + wallets: Record; level: number; experience: number; nextLevelExp: number; From 6592c9c371137f180fd0208418dad168b8a5a459 Mon Sep 17 00:00:00 2001 From: BitPod Date: Wed, 12 Feb 2025 10:19:43 +0800 Subject: [PATCH 2/4] Add eth and more operation --- .env.example | 29 +++++++++ packages/client-direct/src/routes.ts | 23 +++++-- packages/plugin-data-enrich/package.json | 6 +- packages/plugin-data-enrich/src/eth.ts | 69 +++++++++++++++++++++ packages/plugin-data-enrich/src/starknet.ts | 65 +++++++++++++++++++ 5 files changed, 186 insertions(+), 6 deletions(-) create mode 100644 packages/plugin-data-enrich/src/eth.ts create mode 100644 packages/plugin-data-enrich/src/starknet.ts diff --git a/.env.example b/.env.example index 492b2bcad20d0..6161af5934fad 100644 --- a/.env.example +++ b/.env.example @@ -969,6 +969,35 @@ TAVILY_API_KEY= PRIVY_APP_ID= PRIVY_APP_SECRET= +BINANCE_API_KEY= +BINANCE_SECRET_KEY= + +SUI_RPC= +SUI_PRIVATEKEY= +TOKEN_PROJECT_ID= + +# ETH Compatible +ETH_RPC= +ETH_CONTRACT_ADDRESS= +ETH_PRIVATE_KEY= + +BSC_RPC= +BSC_CONTRACT_ADDRESS= +BSC_PRIVATE_KEY= + +BASE_RPC= +BASE_CONTRACT_ADDRESS= +BASE_PRIVATE_KEY= + +MANTLE_RPC= +MANTLE_CONTRACT_ADDRESS= +MANTLE_PRIVATE_KEY= + +#Starknet +STARKNET_CONTRACT_ADDRESS= +STARKNET_PRIVATE_KEY= +STARKNET_ACCOUNT_ADDRESS= + # Web3Agent Watcher KOL TW_KOL_LIST=`[ "elonmusk", diff --git a/packages/client-direct/src/routes.ts b/packages/client-direct/src/routes.ts index b81f4ad6a2a14..7a17404eaab45 100644 --- a/packages/client-direct/src/routes.ts +++ b/packages/client-direct/src/routes.ts @@ -28,7 +28,9 @@ import { InvalidPublicKeyError as SplInvalidPublicKeyError } from "../../plugin- import { createSolTransferTransaction } from "../../plugin-data-enrich/src/solana"; import { createSolSplTransferTransaction } from "../../plugin-data-enrich/src/solanaspl"; import { callSolanaAgentTransfer } from "../../plugin-data-enrich/src/solanaagentkit"; +import { transferEthToken } from "../../plugin-data-enrich/src/eth"; import { transferSui } from "../../plugin-data-enrich/src/sui"; +import { transferStarknetToken } from "../../plugin-data-enrich/src/starknet"; import { MemoController } from "./memo"; import { requireAuth } from "./auth"; import { CoinAnalysisObj, KEY_BNB_CACHE_STR } from "../../client-twitter/src/sighter"; @@ -1188,19 +1190,32 @@ export class Routes { throw new ApiError(500, "Internal server error"); } case "eth": - // Handle eth transfer + case "bsc": + case "base": + case "mantle": + // Handle eth and eth-compatible transfer + const signature = await transferEthToken(address, '1000', typestr); return res.json({ success: true, - data: "eth reward processed", + signature, + data: "ETH reward processed", }); case "sui": // Handle SUI transfer - const signature = await transferSui(address,'1000'); + const suiHash = await transferSui(address, '1000'); return res.json({ success: true, - signature, + signature: suiHash, data: "SUI reward processed", }); + case "starknet": + // Handle Starknet transfer + const snHash = await transferStarknetToken(address, '1000'); + return res.json({ + success: true, + signature: snHash, + data: "Starknet reward processed", + }); case "base": // Handle base transfer console.log("handleGainRewards 1"); diff --git a/packages/plugin-data-enrich/package.json b/packages/plugin-data-enrich/package.json index 7ae8addb0a1b0..5cefbac108da1 100644 --- a/packages/plugin-data-enrich/package.json +++ b/packages/plugin-data-enrich/package.json @@ -10,11 +10,13 @@ "@solana/spl-token": "^0.4.9", "@elysiajs/swagger": "^1.2.0", "@mysten/sui": "^1.21.1", - "elysia": "^1.2.12", "agent-twitter-client": "0.0.18", - "solana-agent-kit": "^1.2.0", "bs58": "^6.0.0", + "elysia": "^1.2.12", + "ethers": "^6.13.5", "node-cache": "5.1.2", + "solana-agent-kit": "^1.2.0", + "starknet": "6.18.0", "tsup": "^8.3.5" }, "scripts": { diff --git a/packages/plugin-data-enrich/src/eth.ts b/packages/plugin-data-enrich/src/eth.ts new file mode 100644 index 0000000000000..3a9213db388a7 --- /dev/null +++ b/packages/plugin-data-enrich/src/eth.ts @@ -0,0 +1,69 @@ +import { ethers } from 'ethers'; +import { settings } from "@elizaos/core"; + + +// Token contract address and ABI +const tokenAbi = [ + "function transfer(address to, uint256 amount) returns (bool)" +]; + +export async function transferEthToken( + toAddress: string, + amountString: string, + chainType: string +): Promise { + try { + // BSC mainnet provider URL (you can get this from services like Infura or Alchemy) + let provider = new ethers.providers.JsonRpcProvider(settings.ETH_RPC); + let contractAddress = settings.ETH_CONTRACT_ADDRESS; + let privateKey = settings.ETH_PRIVATE_KEY; + //const accountAddress = settings.BSC_ACCOUNT_ADDRESS; + + switch (chainType) { + case "eth": + provider = new ethers.providers.JsonRpcProvider(settings.ETH_RPC); + contractAddress = settings.ETH_CONTRACT_ADDRESS; + privateKey = settings.ETH_PRIVATE_KEY; + break; + case "bsc": + provider = new ethers.providers.JsonRpcProvider(settings.BSC_RPC); + contractAddress = settings.BSC_CONTRACT_ADDRESS; + privateKey = settings.BSC_PRIVATE_KEY; + break; + case "base": + provider = new ethers.providers.JsonRpcProvider(settings.BASE_RPC); + contractAddress = settings.BASE_CONTRACT_ADDRESS; + privateKey = settings.BASE_PRIVATE_KEY; + break; + case "mantle": + provider = new ethers.providers.JsonRpcProvider(settings.MANTLE_RPC); + contractAddress = settings.MANTLE_CONTRACT_ADDRESS; + privateKey = settings.MANTLE_PRIVATE_KEY; + break; + default: + provider = new ethers.providers.JsonRpcProvider(settings.ETH_RPC); + contractAddress = settings.ETH_CONTRACT_ADDRESS; + privateKey = settings.ETH_PRIVATE_KEY; + break; + } + + const wallet = new ethers.Wallet(privateKey, provider); + + const contract = new ethers.Contract(contractAddress, tokenAbi, wallet); + + // The amount to send, adjust according to your token's decimals + const amount = ethers.utils.parseUnits(amountString, 18); + + console.log("Starting transfer..."); + const tx = await contract.transfer(toAddress, amount); + console.log(`Transaction hash: ${tx.hash}`); + + // Wait for the transaction to be confirmed + await tx.wait(); + console.log("Transfer successful!"); + return tx.hash; + } catch (error) { + console.error("Transfer failed:", error); + throw new Error(`ETH Transaction Error: ${error.message}`); + } +} diff --git a/packages/plugin-data-enrich/src/starknet.ts b/packages/plugin-data-enrich/src/starknet.ts new file mode 100644 index 0000000000000..eececde894b46 --- /dev/null +++ b/packages/plugin-data-enrich/src/starknet.ts @@ -0,0 +1,65 @@ +import { Account, Contract, Provider, constants } from 'starknet'; +import { uint256 } from 'starknet/dist/utils/uint256'; +import { settings } from "@elizaos/core"; + +/** + * Starknet Transfer API endpoint handler + */ +export async function transferStarknetToken(toAddress: string, amount: string): Promise { + try { + const contractAddress = settings.STARKNET_CONTRACT_ADDRESS; + const privateKey = settings.STARKNET_PRIVATE_KEY; + const accountAddress = settings.STARKNET_ACCOUNT_ADDRESS; + + // Init Starknet provider + const provider = new Provider({ + sequencer: { + network: constants.NetworkName.SN_MAIN // or SN_GOERLI for testnet + } + }); + + // Init account + const account = new Account( + provider, + accountAddress, + privateKey + ); + + // Init contract + const contract = new Contract( + [ + { + name: 'transfer', + type: 'function', + inputs: [ + { name: 'recipient', type: 'felt' }, + { name: 'amount', type: 'Uint256' } + ], + outputs: [] + } + ], + contractAddress, + provider + ); + + contract.connect(account); + + // to uint256 + const amountUint256 = uint256.bnToUint256(amount); + + // transfer + const { transaction_hash } = await contract.transfer( + toAddress, + amountUint256 + ); + + // wait + await provider.waitForTransaction(transaction_hash); + + return transaction_hash; + + } catch (error: any) { + console.error('Starknet Transfer API Error:', error); + throw new Error(`Starknet Transaction Error: ${error.message}`); + } +} From 7cdb392369a71b931f3b9c1967b999349d10fcac Mon Sep 17 00:00:00 2001 From: BitPod Date: Wed, 12 Feb 2025 12:33:44 +0800 Subject: [PATCH 3/4] Bug fix --- packages/client-direct/src/routes.ts | 2 +- packages/plugin-data-enrich/src/userprofile.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client-direct/src/routes.ts b/packages/client-direct/src/routes.ts index 7a17404eaab45..9375b4f64238e 100644 --- a/packages/client-direct/src/routes.ts +++ b/packages/client-direct/src/routes.ts @@ -1216,7 +1216,7 @@ export class Routes { signature: snHash, data: "Starknet reward processed", }); - case "base": + case "base-test": // Handle base transfer console.log("handleGainRewards 1"); // Connect to Ethereum node diff --git a/packages/plugin-data-enrich/src/userprofile.ts b/packages/plugin-data-enrich/src/userprofile.ts index 38194fe78728e..bcd1ba506c82d 100644 --- a/packages/plugin-data-enrich/src/userprofile.ts +++ b/packages/plugin-data-enrich/src/userprofile.ts @@ -14,7 +14,7 @@ export interface UserProfile { agentname: string; bio?: string | string[]; walletAddress?: string; - wallets: Record; + wallets?: Record; level: number; experience: number; nextLevelExp: number; From 9b2e3625c51d73051866d366199a040103a3f5ba Mon Sep 17 00:00:00 2001 From: BitPod Date: Wed, 12 Feb 2025 14:24:52 +0800 Subject: [PATCH 4/4] Starknet Bug Fix --- packages/plugin-data-enrich/src/starknet.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/plugin-data-enrich/src/starknet.ts b/packages/plugin-data-enrich/src/starknet.ts index eececde894b46..b812d923e4e9b 100644 --- a/packages/plugin-data-enrich/src/starknet.ts +++ b/packages/plugin-data-enrich/src/starknet.ts @@ -1,5 +1,5 @@ import { Account, Contract, Provider, constants } from 'starknet'; -import { uint256 } from 'starknet/dist/utils/uint256'; +import { uint256 } from 'starknet'; import { settings } from "@elizaos/core"; /** @@ -33,7 +33,8 @@ export async function transferStarknetToken(toAddress: string, amount: string): type: 'function', inputs: [ { name: 'recipient', type: 'felt' }, - { name: 'amount', type: 'Uint256' } + { name: "amount_low", type: "felt" }, + { name: "amount_high", type: "felt" } ], outputs: [] } @@ -50,7 +51,8 @@ export async function transferStarknetToken(toAddress: string, amount: string): // transfer const { transaction_hash } = await contract.transfer( toAddress, - amountUint256 + amountUint256.low, + amountUint256.high ); // wait