关于usdt erc20链上的充币和提币,首先需要监控到地址交易理论上要实现

目前关于usdt erc20链上的充币和提币,首先需要监控到地址交易理论上要实现

1 生成地址 可以获取到地址的控制权
2 可以实现程序转账
3 可以监控到地址上面的交易记录
4 可以根据交易的hash查询到交易

erc20他是基于以太坊

具体的目前实现了 nodejs 搭建一个http 服务,然后其他程序可以进行调用

详细的代码可以在github上

/* 
* @Author: Awe
* @Date:   2019-06-20 11:19:05
* @Last 不要复制我的代码不然后果自负
* @Last Modified time: 2019-07-09 10:12:04
* @desc server.js
*/
require("./config/config.js");
const superagent = require('superagent')
var express =require("express");
var app=express();
var bodyParser = require('body-parser');
var util = require("util")
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true, limit : '50mb' }));
app.use(bodyParser.json({limit: '1mb'}));  //body-parser 解析json格式数据
app.use(express.static(__dirname + "/root"));
app.listen(http_port,http_host  );
console.log( "ERC20服务器监听地址是:"  +  http_host +":端口是:"+http_port)

const CommonModules = require ('./module/common.js') 



app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With,content-type");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' my name is qiao daima ')
    res.header("Content-Type", "application/json");
    next();
});
/*
    生成一个不上链的地址
*/
app.post("/generate_address",function (req,res) {
    let  addressModule = require ('./module/address.js') 
    try{
        let addressObj = addressModule.address.generateAddress()
        CommonModules.Common.consoleLog("生成地址成功:,币地址>>>" + addressObj.address + " 私钥>>>>"+ addressObj.privateKey );
        res.send(
            CommonModules.Common.echoJsons(1 , 'ok' , addressObj)
        ) ;
    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "error:" + e) )
    }
    
});


/*
    判断地址是否正确
*/
app.post("/isAddress",function (req,res) {
    let  addressModule = require ('./module/address.js') 
    try{
        var  address = req.body.address  || "" ;//
        if(address == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失地址' )
            ) ;
        }
        let status = addressModule.address.isAddress(address)
        res.send(
            CommonModules.Common.echoJsons(1 , 'ok' , {status:status} )
        ) ;
    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "error:" + e) )
    }
});



/*
    ERC20 转账
*/

app.post("/erc20_trans",function (req,res) {
    try{
        var  from_address_private = req.body.from_address_private  || "" ;//从哪个账号创建 就是那个账号的私钥
        var  fromAddress = req.body.fromAddress  || "" ;//从哪个账号转
        var  toAddress = req.body.toAddress  || "" ;//转给谁
        var  amount = req.body.amount  ||  0  ;//转多少usdt

        if(from_address_private == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失创建者的私钥' )
            ) ;
        }
        if(fromAddress == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '请输入转账账号' )
            ) ;
        }
        if(toAddress == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失目标账号' )
            ) ;
        }

        if(amount ==  0  ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '请输入转账数量' )
            ) ;
        }
        let  usdtModule = require ('./module/concart.js') 

        usdtModule.concart.usdt_trans(fromAddress,from_address_private,toAddress , amount ).then(function(result){
            res.send(
                CommonModules.Common.echoJsons(1 , 'ok' , result)
            ) ;
        },function(e){
            res.send(CommonModules.Common.echoJsons( 0 , "USDT转账error:" + e) )
        });
        
    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "USDT转账error:" + e) )
    }
});


/*
    ERC20 转账 预估消耗的 ETH 
*/


app.post("/estimateEth",function (req,res) {
    try{
        var  fromAddress = req.body.fromAddress  || "" ;//从哪个账号转
        var  toAddress = req.body.toAddress  || "" ;//转给谁
        var  amount = req.body.amount  ||  0  ;//转多少usdt

        if(fromAddress == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '请输入转账账号' )
            ) ;
        }
        if(toAddress == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失目标账号' )
            ) ;
        }

        if(amount ==  0  ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '请输入转账数量' )
            ) ;
        }
        let  usdtModule = require ('./module/concart.js') 

        usdtModule.concart.estimateEth(fromAddress,toAddress , amount ).then(function(result){
            res.send(
                CommonModules.Common.echoJsons(1 , 'ok' , result)
            ) ;
        },function(e){
            res.send(CommonModules.Common.echoJsons( 0 , "获取预估转账消耗的ETH失败了:" + e) )
        });
        
    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "获取预估转账消耗的ETH失败了:" + e) )
    }
});


/*
   eth转账
*/




app.post("/eth_trans",function (req,res) {
    try{
        var  from_address_private = req.body.from_address_private  || "" ;//从哪个账号创建 就是那个账号的私钥
        var  fromAddress = req.body.fromAddress  || "" ;//从哪个账号转
        var  toAddress = req.body.toAddress  || "" ;//转给谁
        var  amount = req.body.amount  ||  0  ;//转多少eth

        var  all = req.body.all  ||  0  ; //是否账户里面的全部转出

        if(from_address_private == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失创建者的私钥' )
            ) ;
        }
        if(fromAddress == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '请输入转账账号' )
            ) ;
        }
        if(toAddress == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失目标账号' )
            ) ;
        }

        if(amount ==  0  ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '请输入转账eth数量' )
            ) ;
        }
      
        let  ethModule = require ('./module/eth.js') 


        ethModule.eth.eth_trans(from_address_private , fromAddress , toAddress , amount ,all ).then(function(data){
            res.send(CommonModules.Common.echoJsons( 1 ,  'ok' , data ) )
        },function(err){
            res.send(CommonModules.Common.echoJsons( 0 , "ETH转账失败 :" + err) )
        })
        
       
    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "转账ETH出错:error:" + e) )
    }
});





async function getMoney(address ){

    let  ethModule = require ('./module/eth.js') 

    let eth = await ethModule.eth.money(address);

    let  usdtModule = require ('./module/concart.js') 

    let usdt = await usdtModule.concart.money(address)

    return {
        'usdt' : usdt,
        'trx' :eth 
    }
}

/*
   获取账户的 eth 余额 和 usdt 余额
*/

app.post("/get_money",function (req,res) {
    try{
        var  address = req.body.address  || "" ;//

        if(address == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失地址' )
            ) ;
        }
        getMoney(address ).then(function(data){
            res.send(CommonModules.Common.echoJsons( 1 ,  'ok' , data ) )
        },function(err){
            res.send(CommonModules.Common.echoJsons( 0 , "获取账户余额 Balance失败:" + err) )
        })
    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "获取账户余额失败:" + e) )
    }
});




/*
   根据地址获取 ERC20的交易数据[注意这个里面包含了转入和转出]
*/

app.post("/GetErc20Trans",function (req,res) {
    try{
        var  address = req.body.address  || "" ;
        if(address == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失地址' )
            ) ;
        }

        let  concartModule = require ('./module/concart.js') 

        concartModule.concart.GetErc20Trans(address,1,1000).then(function(result){
            res.send(CommonModules.Common.echoJsons( 1 ,  'ok' , result ) )
        },function(err){
            res.send(CommonModules.Common.echoJsons( 0 , "根据地址获取erc20历史交易记录失败:" + err) )
        })

    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "根据地址获取erc20历史交易记录失败:" + e) )
    }
});


/*
   获取交易详情  按交易哈希查询交易
*/

app.post("/GetTransactionById",function (req,res) {
    try{
        var  trxid = req.body.trxid  || "" ;//参数 trxid
        if(trxid == '' ){
            res.send(
                CommonModules.Common.echoJsons( 0  , '缺失trxid' )
            ) ;
        }
        let requestData = {
            "value" :trxid
        }
        var requestDatas = JSON.stringify(requestData);

        let url = etherscan_api_url + "/api?module=transaction&action=gettxreceiptstatus&txhash="+trxid+"&apikey="+etherscan_api_keys
        superagent.post(url)
            .accept('application/json')
            .timeout(5000)
            .set('Content-Type', 'application/json')
            .end(function(err, resp) {
                if (err) {
                    res.send(CommonModules.Common.echoJsons( 0 , "按交易哈希查询交易失败:" + err) )
                    return;
                }
                try{
                    let statusCode = resp.statusCode
                    let status = resp.status
                    let text = resp.text || ""
                    let repCode = resp.body.repCode || ""
                    if(statusCode == 200 && status == 200 ){
                        //let body = resp.body || {}
                        if(text){
                            text = JSON.parse(text)
                            //var owner_address = text.raw_data.
                        }

                        res.send(CommonModules.Common.echoJsons( 1 ,  'ok' , text ) )
                    }else{
                        res.send(CommonModules.Common.echoJsons( 0 , "按交易哈希查询交易失败:" + text) )
                    }
                }catch( err ){
                    res.send(CommonModules.Common.echoJsons( 0 , "按交易哈希查询交易失败:" + err) )
                }
            })
    }catch(e){
        res.send(CommonModules.Common.echoJsons( 0 , "按交易哈希查询交易失败:" + e) )
    }
});
THE END