Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
34 changes: 28 additions & 6 deletions packages/client-direct/src/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -1084,7 +1086,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");
}
Expand Down Expand Up @@ -1181,20 +1190,33 @@ 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 "base":
case "starknet":
// Handle Starknet transfer
const snHash = await transferStarknetToken(address, '1000');
return res.json({
success: true,
signature: snHash,
data: "Starknet reward processed",
});
case "base-test":
// Handle base transfer
console.log("handleGainRewards 1");
// Connect to Ethereum node
Expand Down
6 changes: 4 additions & 2 deletions packages/plugin-data-enrich/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
69 changes: 69 additions & 0 deletions packages/plugin-data-enrich/src/eth.ts
Original file line number Diff line number Diff line change
@@ -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<string> {
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}`);
}
}
67 changes: 67 additions & 0 deletions packages/plugin-data-enrich/src/starknet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { Account, Contract, Provider, constants } from 'starknet';
import { uint256 } from 'starknet';
import { settings } from "@elizaos/core";

/**
* Starknet Transfer API endpoint handler
*/
export async function transferStarknetToken(toAddress: string, amount: string): Promise<string> {
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_low", type: "felt" },
{ name: "amount_high", type: "felt" }
],
outputs: []
}
],
contractAddress,
provider
);

contract.connect(account);

// to uint256
const amountUint256 = uint256.bnToUint256(amount);

// transfer
const { transaction_hash } = await contract.transfer(
toAddress,
amountUint256.low,
amountUint256.high
);

// 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}`);
}
}
7 changes: 1 addition & 6 deletions packages/plugin-data-enrich/src/userprofile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, string>;
level: number;
experience: number;
nextLevelExp: number;
Expand Down
Loading