波场归集充值回调(trx/trc10/trc20版本整合)

举报
向佐撞 发表于 2021/04/22 11:57:26 2021/04/22
【摘要】 ## 功能内容说明 【注意】不需要自己搭建节点,不需要自己搭建节点 ``` 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。