主要基於 ES6 (ES2015) 和 ES2017 語法規範,但採用 Node.js 的 CommonJS 模組載入方式,屬於典型的後端 JavaScript 開發寫法。若要明確指定版本,可視為 ES2017+ 的實踐。 箭頭函數與 async/await 語法、const 與解構賦值、模板字符串(process.env.ETH_RPC_URL || ""),有小部分使用 ES2020+ 新特性如 optional chaining (?.) 或 nullish coalescing (??), 且 node 18.20.4 版本下載相關套件,雖然 node 14 以上就能用 ES2020+ 的寫法,但此專案還是以 ES2017+方式撰寫。當然日後用 ES2020+ 新特性去實作也不影響就是了。
- src/polling => 指應用程式定期向區塊鏈節點或 API 發送請求,以獲取最新的鏈上資料或狀態更新。例如,開發者會透過 polling 方式,定時查詢某個錢包地址的餘額、交易狀態、NFT 持有情況等資訊
- src/wallet => 初始化 EVM 或 Solana 錢包,例如使用 ethers.js 或 solana web3.js
🤖 Telegram Swap Copy Trading Bot 一個自動複製鏈上錢包交易行為的 Telegram 機器人,支援多鏈(EVM / Solana)與 DEX(1inch / Jupiter)
✅ 功能清單 以下為目前專案的主要功能模組與待完成/已完成任務,可勾選進行進度追蹤。
- 支援
/start
啟動機器人 - 支援
/add_wallet
新增監控錢包 - 支援
/remove_wallet
刪除錢包 - 支援
/list_wallets
查看所有已追蹤錢包 - 支援
/config
設定複製策略(Gas、比例等) - 支援
/help
顯示使用說明
- 接收並解析用戶指令
- 發送訊息回應用戶操作結果
- 整合命令處理與通知模組
- 初始化不同鏈的資料給 DB scripts/initDB.js
- 初始化機器人配置給 DB scripts/initDB.js
- 用 requiredSettings 增量補齊必要設定,避免覆蓋掉機器人原先的初始配置,提升安全性與擴展性 scripts/initDB.js
- 解析
/add_wallet
等指令 - 更新資料庫中用戶配置與錢包列表
- 觸發對應流程(如新增錢包後啟動監控)
- Chain Model:儲存支援的區塊鏈資訊 src/db/models/chains.js
- Tracked Wallet Model:記錄用戶追蹤的錢包地址與所屬鏈 src/db/models/trackedWallet.js
- Swap Model:儲存偵測到的交易與執行狀態 src/db/models/swap.js
- Bot Config Model:跟機器人有關的基本配置訊息,例如是否 bot 有正常運行:src/db/models/botConfig.js
- DB 連線成功或失敗邏輯 src/db/index.js
- 定期呼叫 Moralis API 或 RPC 取得錢包歷史 Swap
- 過濾新交易(避免重複執行)
- 儲存新交易至資料庫為「待處理」
- 從資料庫取出「待處理」Swap
- 呼叫 Execution Service 複製交易
- 更新交易狀態(執行中 / 成功 / 失敗)
- 發送交易結果通知給用戶
- 定期清理過期 Swap 記錄(如超過 24 小時未執行)
- 確保資料庫效能穩定
- 整合 Moralis API 取得錢包交易
- 整合 Blockchain RPCs 提交交易至目標鏈
- 整合 1inch API 用於 EVM Swap
- 整合 Jupiter API 用於 Solana Swap
- 支援 Ethereum、BSC、Polygon 等 EVM 鏈
- 處理 ERC-20、ERC-721 交易簽署與廣播
- 支援 SPL Token 與 Jupiter 交易格式
- 處理交易簽署與提交至 Solana 鏈
- 根據 1inch API 回傳資料複製 Swap
- 支援 Gas 價格優化與滑點容忍度調整
- 使用 Jupiter SDK 建立 Solana Swap 交易
- 自動處理路由與交易打包
- 私鑰加密管理
- 產生交易簽章
- 發送到對應鏈的 RPC 節點
- 支援成功/失敗通知
- 支援錯誤原因提示
- 支援用戶自訂通知偏好(例如僅接收失敗通知)
- 用戶新增錢包
- 使用 Telegram 發送
/add_wallet
指令 - Bot 將錢包地址與鏈資訊存入資料庫
- 定期檢測交易
- Swap Fetcher 定期呼叫 Moralis API 檢查錢包 Swap
- 發現新交易後存入資料庫為「待處理」
- Swap Processor 取出待處理交易
- 呼叫 Execution Services 簽署並提交交易至鏈上
- 通知服務將執行結果回報給用戶
- Cleanup Service 定期清除舊交易記錄
套件名稱 | 版本 | 說明 |
---|---|---|
@solana/web3.js | ^1.98.2 | 2025/05/28 版本一致 |
axios | ^1.9.0 | 2025/05/28 版本一致 |
base-58 | ^0.0.1 | 11 年未更新,功能單純,僅適用於非常基本需求,之後應該會改成 bs58 > 6.0.0 穩定、主流,廣泛用於加密貨幣與區塊鏈專案 |
dotenv | ^16.5.0 | 2025/05/28 版本一致 |
ethers | 5.0.0 | 先不升級,v5 適合需要維護舊專案或依賴大量社群現有教學的情境。 v6 適合新專案,享受更現代化語法、更簡潔 API 和更好效能 |
mongodb | ^6.16.0 | 25/05/28 最新版是 6.16.0 |
mongoose | ^8.15.1 | 25/05/28 最新版本為 8.15.1 |
node-telegram-bot-api | ^0.65.1 | 25/05/28 最新版本為 0.66.1 |
nodemon | ^3.1.10 | 25/05/28 最新版本為 3.1.10 |
|
特性/寫法 | ethers v5 | ethers v6 |
---|---|---|
數字處理 | 使用自有 BigNumber 類 | 改用原生 ES2020 BigInt |
Provider 實例 | ethers.providers.JsonRpcProvider |
ethers.JsonRpcProvider |
Web3Provider 命名 | Web3Provider |
改名為 BrowserProvider |
合約方法調用 | 需處理方法簽名衝突 | 用 Proxy 動態解析,Typed API 更簡潔 |
方法定義 | 方法分在 buckets | 每個方法直接掛載 less-common 操作 |
導入方式 | 多子包、monorepo | 所有 API 集中在主包,pkg.exports 支援細分 |
交易手續費 | 多個 fee 參數 | 統一為 .getFeeData() |
Transaction helpers | 分散多處 | 集中於 Transaction 類 |
// v5 寫法:
import { ethers } from 'ethers';
const provider = new ethers.providers.JsonRpcProvider(url);
const contract = new ethers.Contract(address, abi, provider);
// v6 寫法:
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider(url);
const contract = new ethers.Contract(address, abi, provider);
BigNumber 與 BigInt 差異:
v5: ethers.BigNumber.from('1000000000000000000')
v6: 12345678901234567890n(直接用 JS 的 BigInt)