当进行USDT转账时,需要消耗TRX作为手续费,TRX的获取就成了一种需求。这里做了一个可以让用户通过给自己的地址转账USDT,自己的账户自动根据汇率向用户转账TRX的自动兑换服务。
类似于银行人民币兑换美元的服务,只不过是全自动的,同时留下手续费,作为利润。
程序原理:
实时监控自己账户的余额变动,当收到USDT时,扣除利润,将剩余的USDT,根据最新的TRX价格换算TRX金额 ,最后将TRX转账到付款地址
以上是程序的核心部分,为了让更多用户使用,往往会创建一个telegram bot。
下面提供nodeJS版本的核心代码:
import fetch from 'node-fetch'; import log4js from 'log4js'; import { JsonDB, Config } from 'node-json-db'; import TronWeb from 'tronweb' ; log4js.configure({ appenders: { console: { type: 'console' }, log: { type: 'file', filename: 'log/log.log', pattern: "-yyyy-MM-dd.log", }, }, categories: { default: { appenders: ['log', 'console'], level: 'all' }, } }); const logger = log4js.getLogger('log') const db = new JsonDB(new Config("amt_database", true, false, '/')); // 判断是否存在历史数据 try { await db.getData("/transactions_history") await db.getData("/transactions") } catch(error) { // 初始化转账记录 await db.push("/transactions", []); // 初始化已处理的交易记录 await db.push("/transactions_history", []); // 初始化交易失败记录 await db.push("/transactions_fail", []); logger.info(">>>创建数据库") }; const tronWeb = new TronWeb({ fullHost: 'https://api.trongrid.io', headers: { "TRON-PRO-API-KEY": 'XXXXX' }, privateKey: 'XXXXXXXX' }) // 钱包地址 const ADDRESS_MANAGER = "XXXXX"; // TRX默认价格 var TRX_PRICE = 0.10576; function main(){ logger.info("USDT兑换TRX程序启动.....") loopTRXPrice(); loopUSDCBalance(); } function loopTRXPrice(){ getTRXPrice() setInterval(async () => { try{ await getTRXPrice() }catch(e){ logger.info("查询TRX价格出错,异常....") } }, 1000 * 60 * 5); } function loopUSDCBalance(){ // 轮询地址是否收到USDT setInterval(async () => { try{ let result = await getTRC20Account() let transactions_history = await db.getData("/transactions_history"); if(result){ let list = result.data; if(list.length > 0){ for(let index in list){ let item = list[index] let transaction_id = item.transaction_id; if(transactions_history.indexOf(transaction_id) >= 0){ continue; } let value = 0; let address = ""; let resultValue = 0; if(item.token_info.symbol == "USDT"){ address = item.from; //付款地址 value = parseFloat(item.value)/1000000; //付款金额 if(value < 5){ continue } let finalValue = value / TRX_PRICE // 实际TRX价格 resultValue = (finalValue * (1 - 0.15)) // 扣除15%利润 resultValue = formatPrice(resultValue) // 需要转账的金额 if(resultValue > 0){ // 执行转账 let resultTransaction = await sendTransaction(address,resultValue) let transaction = { payTransactionId : transaction_id,// 收到USDT的交易ID value:item.value, resultValue:resultValue, datetime:new Date().getTime(), address:address, fromAddress:ADDRESS_MANAGER, profit:finalValue - resultValue, sendTransactionId:resultTransaction.transaction.txId // 发送TRX的交易ID } if(resultTransaction.result){ logger.info(address + ` | 收款:[${value}] -> 转账TRX:[${resultValue}] 成功!` ) var transactions = await db.getData("/transactions"); transactions_history.push(transaction_id) transactions.push(transaction) await db.push("/transactions", transactions); await db.push("/transactions_history", transactions_history); }else{ logger.info(address + ` | 收款:[${value}] -> 转账TRX:[${resultValue}] 失败!` ) var transactions = await db.getData("/transactions_fail"); transactions.push(transaction) await db.push("/transactions_fail", transactions); } } } } } } }catch(e){ logger.info("监控/处理转账程序出错...") } }, 3000); } async function getTRC20Account(){ // 查询指定地址的USDC交易记录<已确认/收款> let url = `https://api.trongrid.io/v1/accounts/${ADDRESS_MANAGER}/transactions/trc20?limit=50&only_to=true&only_confirmed=true` let response = await fetch(url, { "method": "GET", "headers":{ 'Content-Type': 'application/json', } }).catch(e => { console.info("API - 数据获取异常 " + e.message) }); let json = await response.json() if(json.success){ return json; }else{ console.info(JSON.stringify(json)) } return false; } async function getTRXPrice(){ let url = "https://sapi.coincarp.com/api/v2/market/ticker/coin?code=tron&tickertype=0&pair2=&page=1&pageSize=1&lang=zh-CN&imgprefix=false&_=" + new Date().getTime() let response = await fetch(url, { "method": "GET", "headers":{ 'Content-Type': 'application/json', } }).catch(e => { console.info("API - getTRXPrice 数据获取异常 " + e.message) }); let json = await response.json() if(json.msg = "success"){ let list = json.data.list if(list.length > 0){ TRX_PRICE = list[0].last console.info("TRX价格更新成功:" + TRX_PRICE) }else{ logger.info("查询TRX价格出错,未找到有效数据") } }else{ console.info(JSON.stringify(json)) } } async function sendTransaction(address,amount){ amount = amount * 1000000 let result = await tronWeb.trx.sendTransaction(address, amount); return result; } function formatPrice(price){ if(price.toString().indexOf(".") > 0){ return parseInt(price.toString().split(".")[0]) } return price } main()