TRON归集回调

简介

设计一个通过调用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地址)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue组件的scope 以及 如何样式穿透

个人复习&#xff01;&#xff01;&#xff01; 有什么用 让当前组件的样式不会修改到其它地方的样式&#xff0c;使用了data-v-hash的方式来使css有了它对应模块的标识 实现原理 1、给HTML的dom节点添加一个不重复的data属性(例如: data-v-5558831a)来唯一标识这个dom 元素…

Four Operations

一、题目 Little Ruins is a studious boy, recently he learned the four operations! Now he want to use four operations to generate a number, he takes a string which only contains digits ‘1’ - ‘9’, and split it into 5 5 intervals and add the four operat…

LRU淘汰策略执行过程

1 介绍 Redis无论是惰性删除还是定期删除&#xff0c;都可能存在删除不尽的情况&#xff0c;无法删除完全&#xff0c;比如每次删除完过期的 key 还是超过 25%&#xff0c;且这些 key 再也不会被客户端访问。 这样的话&#xff0c;定期删除和堕性删除可能都彻底的清理掉。如果…

设计模式——接口隔离原则

文章目录 基本介绍应用实例应传统方法的问题和使用接口隔离原则改进 基本介绍 客户端不应该依赖它不需要的接口&#xff0c;即一个类对另一个类的依赖应该建立在最小的接口上先看一张图: 类 A 通过接口 Interface1 依赖类 B&#xff0c;类 C 通过接口 Interface1 依赖类 D&…

A 题国际旅游网络的大数据分析-详细解析与代码答案(2023 年全国高校数据统计与调查分析挑战赛

请你们进行数据统计与调查分析&#xff0c;使用附件中的数据&#xff0c;回答下列问题&#xff1a; ⚫ 问题 1: 请进行分类汇总统计&#xff0c;计算不同国家 1995 年至 2020 年累计旅游总人数&#xff0c;从哪个国家旅游出发的人数最多&#xff0c;哪个国家旅游到达的人数最多…

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

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

前端工程化概述

软件工程定义&#xff1a;将工程方法系统化地应用到软件开发中 前端发展历史 前端工程化的发展历史可以追溯到互联网的早期阶段&#xff0c;随着前端技术的不断演进和互联网应用的复杂化&#xff0c;前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程…

【了解一下常见的设计模式】

文章目录 了解一下常用的设计模式(工厂、包装、关系)导语设计模式辨析系列 工厂篇工厂什么是工厂简单工厂「模式」&#xff08;Simple Factory「Pattern」&#xff09;简单工厂代码示例&#xff1a;简单计算器优点&#xff1a;缺点&#xff1a; 静态工厂模式特点&#xff1a; 工…

手搭手入门MyBatis-Plus

MyBatis-Plus Mybatis-Plus介绍 为简化开发而生 MyBatis-Plus(opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis(opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#…

protobuf+netty自定义编码解码

protobufnetty自定义编 项目背景 protobufnetty自定义编码解码 比如心跳协议&#xff0c;客户端请求的协议是10001&#xff0c;在java端如何解码&#xff0c;心跳返回协议如何编码&#xff0c;将协议号带过去 // 心跳包 //10001 message c2s_heartbeat { }//10002 message …

LeetCode--HOT100题(38)

目录 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;226. 翻转二叉树&#xff08;简单&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 LeetCode做题链…

lvs-DR模式:

lvs-DR数据包流向分析 客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 Director Server 和 Real Server 在同一个网络中&#xff0c;数据通过二层数据链路…

7-42 整型关键字的散列映射

题目链接&#xff1a;这里 题目大意&#xff1a;就是写一个线性探测的散列 然鹅&#xff0c;我不会写(?)我一共错了两个地方 有冲突的情况下&#xff0c;就是线性探查然后往后找&#xff0c;但是我之前写的是t&#xff0c;应该是t (t1)%p;…在有重复关键字的时候&#xff0c…

大学生创业出路【第二弹】科创训练营

目录 &#x1f680;一、我从哪里了解到的训练营 &#x1f680;二、训练营里学习和日常 &#x1f50e;学习 &#x1f50e;环境和设备 &#x1f50e;遇到的人 &#x1f50e;团队记录视频 &#x1f680;三、感悟 ​​​​个人主页&#xff1a;一天三顿-不喝奶茶&#x1f39…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

目录 之前的文章&#xff1a; 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams ​编辑 发射器更新&#xff1a; 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是&#xff1a; 开始模拟后的效果是&#xff1a; 发射器更新 …

数据结构入门 — 顺序表详解

前言 数据结构入门 — 顺序表详解 博客主页链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 文章末尾有源码 *****感谢观看&#xff0c;希望对你有所帮助***** 文章目录 前言一、顺序表1. 顺序表是什么2. 优缺点 二、概念及结构…

java-IONIO

一、JAVA IO 1.1. 阻塞 IO 模型 最传统的一种 IO 模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求之后&#xff0c;内 核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线…

java八股文面试[数据结构]——ArrayList和LinkedList区别

ArrayList和LinkedList的异同 二者的线程都不安全&#xff0c;相对线程安全的Vector,执行效率高。此外&#xff0c;ArrayList时实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构&#xff0c;对于随机访问get和set&#xff0c;ArrayList觉得优于LinkedLis…

线性回归的正则化改进(岭回归、Lasso、弹性网络),最小二乘法和最大似然估计之间关系,正则化

目录 最小二乘法 极大似然估计的思想 概率&#xff1a;已知分布参数-对分布参数进行估计 概率描述的是结果;似然描述的是假设/模型​编辑 似然&#xff1a;已知观测结果-对分布参数进行估计​编辑 对数函数消灭连乘-连乘导致算法参数消失 极大似然估计公式&#xff1a;将乘…

LeetCode:Hot100python版本之回溯

回溯算法其实是纯暴力搜索。for循环嵌套是写不出的 组合&#xff1a;没有顺序 排列&#xff1a;有顺序 回溯法可以抽象为树形结构。只有在回溯算法中递归才会有返回值。 46. 全排列 排列是有顺序的。 组合类问题用startindex&#xff0c;排序类问题用used&#xff0c;来标…