波场归集充值回调(trx/trc10/trc20版本整合)
【摘要】 ## 功能内容说明
【注意】不需要自己搭建节点,不需要自己搭建节点
```
1、地址创建
2、trx/trc10/trc20的转账以及查询
3、trx/trc10/trc20的充值回调通知
4、trc20的归集(usdt属于trc20)
```
前面做过波场相关的转账交易(搭建节点跟不搭建节点的),现在对这些内容做以下整合。
TRX转账功能
/**
* 发起trx交易
*
* @param privateKey 发起地址私钥
* @param to 收款地址
* @param sun trx数量(sun单位 1000000表示1trx)
* @param remark 备注信息
* @return
*/
@Override
public String transfer(String privateKey, String to, BigDecimal trx, String remark) {
requireNotEmpty(privateKey, "private-key");
requireNotEmpty(to, "to-address");
if (trx.compareTo(BigDecimal.ZERO) <= 0) {
throw new IllegalArgumentException("amount is not illegal:" + trx.toString());
}
String from = TronUtils.getAddressByPrivateKey(privateKey);
try {
String url = tronUrl + "/wallet/createtransaction";
JSONObject param = new JSONObject();
param.put("owner_address", TronUtils.toHexAddress(from));
param.put("to_address", TronUtils.toHexAddress(to));
param.put("amount", trx.multiply(DECIMAL).toBigInteger());
String _result = HttpClientUtils.postJson(url, param.toJSONString());
String txid = null;
if (StringUtils.isNotEmpty(_result)) {
if(_result.toLowerCase().contains("error")){
logger.info(_result);
}
JSONObject transaction = JSONObject.parseObject(_result);
if (StringUtils.isNotEmpty(remark)) {
transaction.getJSONObject("raw_data").put("data", Hex.toHexString(remark.getBytes()));
}
txid = TronUtils.signAndBroadcast(tronUrl, privateKey, transaction);
}
if (txid != null) {
logger.info(String.format("send trx|success:txid=%s from=%s to=%s amount=%s", txid, from, to, trx.toString()));
} else {
logger.error(String.format("send trx|fail:from=%s to=%s amount=%s", from, to, trx.toString()));
}
return txid;
} catch (Throwable t) {
logger.error(String.format("send trx error: from=%s to=%s amount=%s remark=%s",
from, to, trx.toString(), remark),t);
logger.error(String.format("send trx|fail:from=%s to=%s amount=%s", from, to, trx.toString()));
}
return null;
}
TRC20转账功能
/**
* 发起trc20转账
*
* @param privateKey 转出trc20的地址
* @param contract trc20合约地址
* @param to 收款地址
* @param amount 转出数量 带上进度 例如精度为6 那么1trc20就需要填1000000
* @param remark 备注信息
* @return
*/
@Override
public String transfer(String privateKey, String contract, String to, BigInteger amount, String remark) {
requireNotEmpty(contract, "contract");
requireNotEmpty(privateKey, "privateKey");
requireNotEmpty(to, "to");
if (amount.compareTo(BigInteger.ZERO) <= 0) {
throw new IllegalArgumentException("amount is illegal:" + amount.toString());
}
String from = TronUtils.getAddressByPrivateKey(privateKey);
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("contract_address", TronUtils.toHexAddress(contract));
jsonObject.put("function_selector", "transfer(address,uint256)");
List<Type> inputParameters = new ArrayList<>();
inputParameters.add(new Address(TronUtils.toHexAddress(to).substring(2)));
inputParameters.add(new Uint256(amount));
String parameter = FunctionEncoder.encodeConstructor(inputParameters);
jsonObject.put("parameter", parameter);
jsonObject.put("owner_address", TronUtils.toHexAddress(from));
jsonObject.put("call_value", 0);
jsonObject.put("fee_limit", 6000000L);
String trans1 = HttpClientUtils.postJson(envConfig.getTronUrl() + "/wallet/triggersmartcontract", jsonObject.toString());
JSONObject result = JSONObject.parseObject(trans1);
String txid = null;
if (!result.containsKey("Error")) {
JSONObject tx = result.getJSONObject("transaction");
if (remark != null) {
tx.getJSONObject("raw_data").put("data", Hex.toHexString(remark.getBytes()));//填写备注
}
txid = TronUtils.signAndBroadcast(envConfig.getTronUrl(), privateKey, tx);
}
if (txid != null) {
logger.info(String.format("send trx|success:txid=%s contract=%s from=%s to=%s amount=%s", txid, contract, from, to, amount.toString()));
} else {
logger.info(String.format("send trx|fail:contract=%s from=%s to=%s amount=%s", contract, from, to, amount.toString()));
}
return txid;
} catch (Throwable t) {
logger.error(String.format("send trx|fail:contract=%s from=%s to=%s amount=%s", contract, from, to, amount.toString()), t);
}
logger.info(String.format("send trx|fail:contract=%s from=%s to=%s amount=%s", contract, from, to, amount.toString()));
return null;
}
TRC10转账功能
/**
* 发起trc20转账
*
* @param privateKey 转出trc20的地址
* @param tokenId trc10对应的tokenId
* @param to 收款地址
* @param amount 转出数量 带上进度 例如精度为6 那么1trc20就需要填1000000
* @param remark 备注信息
* @return
*/
@Override
public String transfer(String privateKey, long tokenId, String to, BigInteger amount, String remark) {
String url = envConfig.getTronUrl() + "/wallet/transferasset";
String from = TronUtils.getAddressByPrivateKey(envConfig.getPrivateKey());
JSONObject param = new JSONObject();
param.put("owner_address", TronUtils.toHexAddress(from));
param.put("to_address", TronUtils.toHexAddress(to));
param.put("asset_name", ByteArray.toHexString((tokenId + "").getBytes()));
param.put("amount", amount);
String _result = "ERROR NOT FOUND";
try {
_result = HttpClientUtils.postJson(url, param.toString());
JSONObject result = JSONObject.parseObject(_result);
if (!result.containsKey("Error")) {
JSONObject tx = result.getJSONObject("transaction");
if (remark != null) {
tx.getJSONObject("raw_data").put("data", Hex.toHexString(remark.getBytes()));//填写备注
}
String txid = TronUtils.signAndBroadcast(envConfig.getTronUrl(), privateKey, tx);
if (txid != null) {
logger.info(String.format("发起交易成功|to=%s amount=%s token=%d txid=%s", to, amount.toString(), tokenId, txid));
return txid;
}
}
}catch (Throwable t){
logger.error(String.format("发送TRC10失败 from=%s to=%s token=%d error=%s",
from,to,tokenId,_result ),t);
}
logger.error(String.format("发送TRC10失败 from=%s to=%s token=%d error=%s",
from,to,tokenId,_result ));
return null;
}
接口说明
TronService.java 整理TRX转账/查询相关,以及波场的一些基础逻辑
/**
* 波场相关 通用
*
* @Autor Tricky
* @Date 2021-03-13 11:19:03
*/
public interface TronService {
/**
* 基础地址 配置的私钥对应地址
*
* @return
*/
String getBaseAddress();
/**
* 获取trx数量 结果为trx
*
* @param address
* @return
*/
BigDecimal balanceOf(String address);
/**
* 获取trx数量 结果为sun
*
* @param address
* @return
*/
BigInteger balanceOfSun(String address);
/**
* sun转成trx 1sun=0.000001sun
*
* @param sun
* @return
*/
BigDecimal toTrx(BigInteger sun);
/**
* trx转成成sun 1trx=1000000sun
*
* @param trx
* @return
*/
BigInteger toSun(BigDecimal trx);
/**
* 发起trx交易
*
* @param privateKey 发起地址私钥
* @param to 收款地址
* @param sun trx数量(sun单位 1000000表示1trx)
* @param remark 备注信息
* @return
*/
String transfer(String privateKey, String to, BigInteger sun, String remark);
/**
* 用配置的私钥发起trx交易
*
* @param to 收款地址
* @param sun trx数量(sun单位 1000000表示1trx)
* @param remark 备注信息
* @return
*/
String transfer(String to, BigInteger sun, String remark);
/**
* 发起trx交易
*
* @param privateKey 发起地址私钥
* @param to 收款地址
* @param trx trx数量 0.1表示0.1trx
* @param remark 备注信息
* @return
*/
String transfer(String privateKey, String to, BigDecimal trx, String remark);
/**
* 用配置的私钥发起trx交易
*
* @param to 收款地址
* @param trx trx数量 0.1表示0.1trx
* @param remark 备注信息
* @return
*/
String transfer(String to, BigDecimal trx, String remark);
/**
* 根据精度转换成decimal
*
* @param value 数量
* @param accuracy 精度
* @return
*/
BigDecimal toDecimal(BigInteger value, int accuracy);
/**
* 转换成最小单位
*
* @param value 数量
* @param accuracy 精度
* @return
*/
BigInteger toBigInteger(BigDecimal value, int accuracy);
/**
* 获取当前块高
*
* @return
*/
Long getNowBlock();
}
Trc20Service.java 整理trc20的转账/查询相关操作
/**
* trc20接口
*
* @Autor Tricky
* @Date 2021-03-13 11:25:00
*/
public interface Trc20Service {
/**
* 查询数量 最小单位。如果精度为6 那么如果为1个trc20就会返回1000000
*
* @param contract trc20合约地址
* @param address 查询地址
* @return
*/
BigInteger balanceOf(String contract, String address);
/**
* 发起trc20转账
*
* @param privateKey 转出trc20的地址
* @param contract trc20合约地址
* @param to 收款地址
* @param amount 转出数量 带上进度 例如精度为6 那么1trc20就需要填1000000
* @param remark 备注信息
* @return
*/
String transfer(String privateKey, String contract, String to, BigInteger amount, String remark);
/**
* 发起trc20转账,转出地址为配置私钥对应地址
*
* @param contract trc20合约地址
* @param to 收款地址
* @param amount 转出数量 带上进度 例如精度为6 那么1trc20就需要填1000000
* @param remark 备注信息
* @return
*/
String transfer(String contract, String to, BigInteger amount, String remark);
}
Trc20Handler.java 封装定制合约相关的操作
/**
* trc20处理器
*
* @Autor Tricky
* @Date 2021-03-13 11:34:23
*/
public interface Trc20Handler {
/**
* 返回合约地址
*
* @return
*/
String getContract();
/**
* 获取精度
*
* @return
*/
BigDecimal getDecimals();
/**
* 查询额度
*
* @param address
* @return
*/
BigDecimal balanceOf(String address);
/**
* 转账
*
* @param privateKey 转出地址的私钥
* @param to 收款地址
* @param amount 数量 0.1就表示0.1trc20
* @param remark 备注信息
* @return
*/
String transfer(String privateKey, String to, BigDecimal amount, String remark);
/**
* 转账(使用默认私钥)
*
* @param to
* @param amount
* @param remark
* @return
*/
String transfer(String to, BigDecimal amount, String remark);
}
Trc10Service.java 整合trc10相关的
/**
* trc10转账
*
* @Autor Tricky
* @Date 2021-03-13 11:28:33
*/
public interface Trc10Service {
/**
* 查询trc10数量 如果精度为6 那么1trc10就是1000000
*
* @param tokenId
* @param address
* @return
*/
BigInteger balanceOf(long tokenId, String address);
/**
* 发起trc20转账
*
* @param privateKey 转出trc20的地址
* @param tokenId trc10对应的tokenId
* @param to 收款地址
* @param amount 转出数量 带上进度 例如精度为6 那么1trc20就需要填1000000
* @param remark 备注信息
* @return
*/
String transfer(String privateKey, long tokenId, String to, BigInteger amount, String remark);
/**
* 发起trc20转账,转出地址为配置私钥对应地址
*
* @param tokenId trc10对应的tokenId
* @param to 收款地址
* @param amount 转出数量 带上进度 例如精度为6 那么1trc20就需要填1000000
* @param remark 备注信息
* @return
*/
String transfer(long tokenId, String to, BigInteger amount, String remark);
}
TRC20代币的回收/归集处理(可用于USDT归集)
整套的逻辑大致为检测trx数量,然后再进行trc20转账,最后回收多余的trx
Trc20RecycleService.java 接口简单 就一个
/**
* trc20回收
*
* @Autor Tricky
* @Date 2021-03-13 16:06:03
*/
public interface Trc20RecycleService {
/**
* 回收trc20 可以直接用来归集
*
* @param contract 合约地址
* @param privateKey 需要回收的地址对应私钥
* @param to 归集最终收款地址
*/
void recycle(String contract, String privateKey, String to);
}
扫块以及交易回调
先看看效果(shasta测试网环境,切换个url即可改为主网)
这里主要演示为 trc20的到账以及回收到冷钱包(归集到冷钱包)。如果不喜欢受到Token就直接归集,可以把它放到一个set中,然后在特定的一个时间遍历调用Trc20RecycleService的recycle方法即可。
项目说明
yml配置(仅仅需要配置这些,redis是必要的,mysql可以选择用不用,不用的话把相关功能割掉就好)
源码获取方式(白嫖是不可能的,这辈子都不可能白嫖)
微信 Tricky_Z
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)