USDT兑换TRX的自动兑换机

当进行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()