TRON归集回调

news2024/12/22 19:13:48

简介

设计一个通过调用api创建对应的tron地址,当地址收到token的时候,进行归集&回调通知的。包括的功能有:

  1. 根据UID创建地址
  2. 归集(TRX归集 TRC10归集 TRC20归集)
  3. 回调通知(转出回调通知&接收回调通知)
  4. 发起转出订单
  5. 以及上述一些的异常处理

源码预览(后台代码)

  1. 创建地址
    /**
     * 离线创建地址
     *
     * @return
     */
    public static CreateAddressResult createAddress() {
        ECKey eCkey = new ECKey(random);
        String privateKey = ByteArray.toHexString(eCkey.getPrivKeyBytes());
        byte[] addressBytes = eCkey.getAddress();
        String hexAddress = ByteArray.toHexString(addressBytes);
        CreateAddressResult addressInfo = new CreateAddressResult();
        addressInfo.setAddress(toViewAddress(hexAddress));
        addressInfo.setHexAddress(hexAddress);
        addressInfo.setPrivateKey(privateKey);
        return addressInfo;
    }
  1. 转出TRX
    /**
     * 转出TRX
     *
     * @param tronUrl
     * @param signKey
     * @param to
     * @param trx
     * @param headMap
     * @return
     * @throws Throwable
     */
    public static String transfer(String tronUrl, String signKey, String to, BigDecimal trx, Map<String, String> headMap) throws Throwable {
        if (trx.compareTo(BigDecimal.ZERO) <= 0) {
            throw new IllegalArgumentException("trx cannot less than Zero");
        }
        String from = TronUtils.getAddressByPrivateKey(signKey);
        logger.info(String.format("SendTrx|start|sender=%s receiver=%s amount=%s", from, to, trx));
        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(TRX_DECIMAL).toBigInteger());
        String _result = HttpClientUtils.postJson(url, param.toJSONString(), headMap);
        String txid = null;
        if (StringUtils.isNotEmpty(_result)) {
            if (_result.toLowerCase().contains("error")) {
                logger.info(_result);
            }
            JSONObject transaction = JSONObject.parseObject(_result);
            txid = TronUtils.signAndBroadcast(tronUrl, signKey, transaction, headMap);
        }
        if (txid != null) {
            logger.info(String.format("SendTrx|success|txid=%s sender=%s receiver=%s amount=%s", txid, from, to, trx.toString()));
        } else {
            logger.error(String.format("SendTrx|fail|sender=%s receiver=%s amount=%s", from, to, trx.toString()));
        }
        return txid;
    }
  1. 触发智能合约

    /**
     * 执行合约函数
     *
     * @param tronUrl
     * @param contract
     * @param signKey
     * @param owner
     * @param function
     * @param params
     * @param feeLimit
     * @param callValue
     * @param headMap
     * @return
     * @throws Throwable
     */
    public static String triggerSmartContract(String tronUrl, String contract, String signKey, String owner,
                                              String function, List<Type> params, BigInteger feeLimit, BigDecimal callValue,
                                              Map<String, String> headMap) throws Throwable {
        logger.info(String.format("触发智能合约|START|%s|%s", contract, function));
        if (StrUtil.isEmpty(owner)) {
            owner = getAddressByPrivateKey(signKey);
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("contract_address", TronUtils.toHexAddress(contract));
        jsonObject.put("function_selector", function);

        String parameter = "";
        if (CollUtil.isNotEmpty(params)) {
            parameter = FunctionEncoder.encodeConstructor(params);
        }
        jsonObject.put("parameter", parameter);
        jsonObject.put("owner_address", TronUtils.toHexAddress(owner));
        if (callValue != null) {
            jsonObject.put("call_value", callValue.multiply(new BigDecimal("1e6")).toBigInteger().longValue());
        }
        jsonObject.put("fee_limit", feeLimit.longValue());
        String trans1 = HttpClientUtils.postJson(tronUrl + "/wallet/triggersmartcontract", jsonObject.toString());
        JSONObject result = JSONObject.parseObject(trans1);
        if (result.containsKey("Error")) {
            logger.warn(String.format("触发智能合约|END|FAIL|%s|%s|%s", contract, function, trans1));
            return null;
        }
        JSONObject tx = result.getJSONObject("transaction");
        String txid = signAndBroadcast(tronUrl, signKey, tx, headMap);
        if (txid != null) {
            logger.info(String.format("触发智能合约|END|SUCCESS|%s|%s|%s", contract, function, txid));
        } else {
            logger.warn(String.format("触发智能合约|END|FAIL|%s|%s|%s", contract, function, "HashIsNull"));
        }
        return txid;
    }

  1. 查询智能合约信息

    /**
     * 调用合约查询
     *
     * @param tronUrl
     * @param contract
     * @param function
     * @param params
     * @param headMap
     * @return
     * @throws Throwable
     */
    public static String triggerConstantContract(String tronUrl, String contract, String function, List<Type> params, Map<String, String> headMap) throws Throwable {
        String url = tronUrl + "/wallet/triggerconstantcontract";
        JSONObject param = new JSONObject();
        param.put("owner_address", TronUtils.toHexAddress("T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb"));
        param.put("contract_address", TronUtils.toHexAddress(contract));
        param.put("function_selector", function);
        if (CollUtil.isNotEmpty(params)) {
            param.put("parameter", FunctionEncoder.encodeConstructor(params));
        }

        String result = HttpClientUtils.postJson(url, param.toJSONString(), headMap);
        if (StringUtils.isNotEmpty(result)) {
            JSONObject obj = JSONObject.parseObject(result);
            JSONArray results = obj.getJSONArray("constant_result");
            if (results != null && results.size() > 0) {
                return results.getString(0);
            }
        }
        return "";
    }

TronService


public interface TronService {

    long getLogNowBlock();
    /**
     * trx数量
     *
     * @param address
     * @return
     */
    BigDecimal balanceOf(String address) throws IOException;

    /**
     * 发送trx
     *
     * @param signKey 签名私钥
     * @param to      接受
     * @param amount  数量
     * @return
     * @throws Throwable
     */

    String sendTrx(String signKey, String to, BigDecimal amount) throws Throwable;


    /**
     * trc10数量
     *
     * @param tokenId
     * @param address
     * @return
     * @throws Throwable
     */
    BigInteger balanceOfTrc10(long tokenId, String address) throws Throwable;

    /**
     * 发送trc10
     *
     * @param signKey
     * @param tokenId
     * @param to
     * @param amount
     * @return
     * @throws Throwable
     */
    String sendTrc10(String signKey, long tokenId, String to, BigInteger amount) throws Throwable;

    /**
     * 发送trc20
     *
     * @param signKey
     * @param contract
     * @param to
     * @param amount
     * @return
     * @throws Throwable
     */
    String transferTrc20(String signKey, String contract, String to, BigInteger amount, BigInteger feeLimit) throws Throwable;


    /**
     * 获取trc20的数量
     *
     * @param contract
     * @param address
     * @return
     */
    BigInteger balanceOfTrc20(String contract, String address) throws Throwable;


    /**
     * 获取trc20的数量
     *
     * @param contract
     * @param address
     * @param accuracy
     * @return
     */
    BigDecimal balanceOfTrc20(String contract, String address, int accuracy) throws Throwable;


    /**
     * 获取当前块高
     *
     * @return
     */
    long getNowBlock();

    /**
     * 交易是否成功
     *
     * @param hash
     * @return
     */
    boolean isSuccess(String hash) throws Throwable;

}


系统预览(管理平台)

导航

在这里插入图片描述

订单管理

在这里插入图片描述

数据配置

在这里插入图片描述

重要配置加密存放(保证私钥不会因为数据导致泄露)
在这里插入图片描述

后台管理

在这里插入图片描述

维护管理

在这里插入图片描述


API文档

直接通过http/https相关调用,即可使用
在这里插入图片描述

调用API安全问题(通过API-KEY签名 以及配置的白名单IP地址)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/919194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是JVM ?

一、JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机&#xff1a; JVM 、 VMwave 、 Virtual Box 。 JVM 和其他两个虚拟机的区别…

《JVM修仙之路》初入JVM世界

《JVM修仙之路》初入JVM世界 博主目前正在学习JVM的相关知识&#xff0c;想以一种不同的方式记录下&#xff0c;娱乐一下 清晨&#xff0c;你睁开双眼&#xff0c;看到刺眼的阳光&#xff0c;你第一反应就是完了完了&#xff0c;又要迟到了。刚准备起床穿衣的你突然意识到不对&…

Netty核心源码解析(三)--NioEventLoop

NioEventLoop介绍 NioEventLoop继承SingleThreadEventLoop,核心是一个单例线程池,可以理解为单线程,这也是Netty解决线程并发问题的最根本思路--同一个channel连接上的IO事件只由一个线程来处理,NioEventLoop中的单例线程池轮询事件队列,有新的IO事件或者用户提交的task时便执…

Centos7 安装Docker 详细多图版

配置要求 Docker CE&#xff08;社区免费版&#xff09; 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10&#xff0c; CentOS 7 满足最低内核的要求&#xff0c;所以我们在CentOS 7安装Docker。 一、Centos安装Docker 1.1 卸载&#xff08;可选&#xff0…

项目:点餐系统2

httplib的思想简单总结; 使用线程池来处理请求由用户定义处理函数&#xff0c;告诉httplib哪个请求应该使用哪个函数处理线程接收请求并解析请求后调用处理函数 一、服务器搭建 get主要是用来获取资源的&#xff0c;post主要是客户端提交数据的。 #include"httplib.h"…

小白带你学习linux的shell脚本基础(三十五)

目录 一、概述 1、脚本就是将手动一次性执行的命令进行规范且自动化 2、学习路径 2.1表达式 2.2语句 2.3函数 2.4正则表达式 2.5文件操作四剑客 二、表达式 1、shell 2、表达式 2、1 变量 2、2 运算符 2、3shell脚本编写规范 2、4shell运行规则 2、5shell脚本运…

SpringSecurity原理

最近在研究SpringSecurity&#xff0c;肝了好多天&#xff0c;算是有点收获&#xff0c;在这里分享下 SpringSecurity是什么&#xff1f; SpringSecurity是一个强大的可高度定制的认证和授权框架&#xff0c;对于Spring应用来说它是一套Web安全标准。SpringSecurity注重于为J…

数据结构:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言一、插入排序1.直接插入排序2.希尔排序 二、选择排序1. 选择排序2.堆排序 三、交换排序1.冒泡排序2.快速排序(递归)a.hoare版(PartSort1)b.挖坑法(PartSort2)c.前后指针法(PartSort…

基于引力搜索算法优化的BP神经网络(预测应用) - 附代码

基于引力搜索算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于引力搜索算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.引力搜索优化BP神经网络2.1 BP神经网络参数设置2.2 引力搜索算法应用 4.测试结果&#xff1a;5…

Mr. Cappuccino的第64杯咖啡——Spring循环依赖问题

Spring循环依赖问题 什么是循环依赖问题示例项目结构项目代码运行结果 Async注解导致的问题使用Lazy注解解决Async注解导致的问题开启Aop使用代理对象示例项目结构项目代码运行结果 Spring是如何解决循环依赖问题的原理源码解读 什么情况下Spring无法解决循环依赖问题 什么是循…

nginx部署 vue配置代理服务器 解决跨域问题

为了演示方便使用的是windows部署 1.首先将vue打包 2.打包好的vue放入到nginx-1.24.0\html\下,这里我创建一个big-data文件夹所以放入到big-data方便多项目管理 3.打开nginx.conf的配置文件修改 server {listen 8081;server_name localhost;location /{alias html/big-data…

锐捷校园网使用指南

Linux ubantu linux客户端下载 进入到下载目录解压 进入解压后的文件目录&#xff0c;修改文件权限 开始使用&#xff0c;了解一些命令&#xff0c;查看帮助 连接有线网络 sudo ./rjsupplicant -u 你的校园网账号 -p 你的密码 -d 1 然后输入当前linux ip账户的密码&#xff0c…

19.图,图的两种存储结构

目录 一. 一些基本概念 二. 图的抽象数据类型定义 三. 图的存储结构 &#xff08;1&#xff09;数组表示法&#xff08;邻接矩阵表示法&#xff09; &#xff08;a&#xff09;邻接矩阵 &#xff08;b&#xff09;存储表示 &#xff08;c&#xff09;优缺点分析 &#x…

无限计算力:探索云计算的无限可能性

这里写目录标题 前言云计算介绍服务模型&#xff1a; 应用领域&#xff1a;云计算主要体现在生活中的地方云计算未来发展的方向 前言 云计算是一种基于互联网的计算模型&#xff0c;通过它可以实现资源的共享、存储、管理和处理。它已经成为许多个人、企业和组织的重要技术基础…

变压器绝缘油色谱分析试验

试验目的 分析油中溶解气体的组分和含量是监视充油设备安全运行的最有效措施之一。 该 方法适用于充有矿物质绝缘油和以纸或层压板为绝缘材料的电气设备。 对判断充油电 气设备内部故障有价值的气体包括: 氢气 (H2 )、 甲烷 (CH4 )、 乙烷 (C2 H6 )、 乙烯 (C2H4 )、 乙炔 (C2…

mybatis讲解(2)之动态SQL的运用

目录 经典面试题&#xff1a; 1.mybatis动态sql 2.模糊查询&#xff08;3种方式&#xff09; 3.查询返回结果集 总结&#xff1a; 前言&#xff1a;在我上篇已经学习了Mybatis简介以及如何去连接数据库&#xff0c;具有增删改查的方法。那么我们今天来学习Mybatis的第二节关…

苹果叶病害识别(Python代码,pyTorch框架,预训练好的VGG16模型,也很容易替换为其它模型,带有GUI识别界面)

代码运行要求&#xff1a;Torch>1.13.1即可 1.数据集介绍&#xff1a; Apple Scab类文件夹图片 Black Rot类文件夹图片 Cedar Apple Rust文件夹 healthy文件夹 2.整个项目 data文件夹存放的是未被划分训练集和测试集的原始照片 picture文件夹存放的是经hf.py对data文件夹…

docker 02(docker 命令)

一、docker服务命令 systemctl start docker 启动docker服务 [参考] systemctl status docker 状态 systemctl stop docker 停止docker服务 systemctl restart docker 重启动docker服务 systemctl enable docker 开机自启动docker服务 &#xff0c;无需手动 二、docke…

远程调试环境配置

目录 一、准备工作 二、ssh连接和xdebug配置 1.ssh连接 2.xdebug配置 三、xdebug调试&#xff0c;访问 一、准备工作 1.安装vscode里面的两个扩展 2.安装对应PHP版本的xdebug 去xdebug官方&#xff0c;复制自己的phpinfo源码到方框里&#xff0c;再点击Analyse Xdebug: …

【UML】软件工程中常用图:类图、部署图、时序图、状态图

前言&#xff1a; UML中的很多东西平时都听过、用过&#xff0c;诸如类图、时序图等&#xff0c;本文将详细详细讲一下UML中常用的几类图&#xff0c;并且会引入一个完整的例子来讲解&#xff0c;UML在工程上到底该怎么合理使用。 目录 1.概述 1.1.什么是UML&#xff1f; …