From 673d9890158a00c42a0cb187d7f40b599d272da9 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Sun, 28 Apr 2024 12:03:03 +0800
Subject: [PATCH] 测试环境新版

---
 src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java          |    2 
 src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java                 |   15 +
 src/main/java/cc/mrbird/febs/dapp/chain/EthUsdtContract.java              |  123 +++++++++++++++
 src/main/resources/mapper/dapp/DappFundFlowDao.xml                        |    8 +
 src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java |    6 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java             |    3 
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java |   10 +
 src/main/java/cc/mrbird/febs/dapp/entity/DappMemberFund.java              |   24 +++
 src/main/resources/application-prod.yml                                   |    4 
 src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java                    |    5 
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java  |    9 +
 src/main/java/cc/mrbird/febs/job/ChainListenerJob.java                    |  188 ++++++++++++++---------
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java  |   55 ++++++
 src/main/resources/application-dev.yml                                    |    4 
 src/main/java/cc/mrbird/febs/dapp/chain/ContractEventService.java         |    1 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberFundMapper.java        |    7 
 src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java                |    2 
 17 files changed, 384 insertions(+), 82 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
index a03e523..ace8eab 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -41,10 +41,11 @@
      * 正式 0x6c6835e60e7dBaD7a60112a6371271e8eb79ee68 https://bsc-dataseed1.ninicoin.io
      *
      */
+    //测试代币
     BSC_TFC("BSC", "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25",
             "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf",
-            "https://bsc-dataseed1.ninicoin.io",
-            "0x46ac4921e58773ca22826df1640672b91b1db2b3",
+            "https://data-seed-prebsc-1-s1.bnbchain.org:8545",
+            "0x2e8CC17ebbB248395a4c3A38374cef2ab0369e18",
             ""),
     BSC_GFA("BSC", "0x8Afd8Bfd8be3cCEB47A6A997DD1b3Fb0046d5124",
             "0x24a2b437f5d6b1212960fe6b0bff7dabae731a3e1fb32da6e4b50fc96623d05d",
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
index e83c1f0..d91b69a 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -79,6 +79,21 @@
         });
     }
 
+    public static void coinRewardEventListener(BigInteger startBlock, BigInteger endBlock, ContractEventService event, String type) {
+        ChainEnum chain = ChainEnum.getValueByName(type);
+        assert chain != null;
+
+        EthUsdtContract contract = contract(chain.getPrivateKey(), chain.getContractAddress(), chain.getUrl());
+        EthFilter filter = getFilter(startBlock, endBlock, chain.getContractAddress());
+
+        Flowable<EthUsdtContract.CoinRewardEventResponse> eventFlowable = contract.coinRewardEventFlowable(filter);
+        eventFlowable.subscribe(e -> {
+            event.coinReward(e);
+        }, error -> {
+            log.error("合约监听启动报错", error);
+        });
+    }
+
 
     private static EthUsdtContract contract(String privateKey, String contractAddress, String url) {
         Credentials credentials = Credentials.create(privateKey);
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ContractEventService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ContractEventService.java
index 481edd4..2b15c2a 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ContractEventService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ContractEventService.java
@@ -3,4 +3,5 @@
 public interface ContractEventService {
 
     void compile(EthUsdtContract.TransferEventResponse e);
+    void coinReward(EthUsdtContract.CoinRewardEventResponse e);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthUsdtContract.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthUsdtContract.java
index 14658e9..e29f66e 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthUsdtContract.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthUsdtContract.java
@@ -3,6 +3,8 @@
 import io.reactivex.Flowable;
 import io.reactivex.functions.Function;
 import org.web3j.abi.EventEncoder;
+import org.web3j.abi.EventValues;
+import org.web3j.abi.FunctionReturnDecoder;
 import org.web3j.abi.TypeReference;
 import org.web3j.abi.datatypes.*;
 import org.web3j.abi.datatypes.generated.Uint256;
@@ -146,6 +148,67 @@
 
     public static final Event TRANSFER_EVENT = new Event("Transfer",
             Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>(true) {}, new TypeReference<Uint256>() {}));
+    ;
+    /**
+     *        {
+     * 		"anonymous": false,
+     * 		"inputs": [
+     *                        {
+     * 				"indexed": false,
+     * 				"internalType": "address",
+     * 				"name": "adr",
+     * 				"type": "address"
+     *            },
+     *            {
+     * 				"indexed": false,
+     * 				"internalType": "uint256",
+     * 				"name": "amount",
+     * 				"type": "uint256"
+     *            },
+     *            {
+     * 				"indexed": false,
+     * 				"internalType": "uint256",
+     * 				"name": "price",
+     * 				"type": "uint256"
+     *            },
+     *            {
+     * 				"indexed": false,
+     * 				"internalType": "uint256",
+     * 				"name": "sameCoin",
+     * 				"type": "uint256"
+     *            },
+     *            {
+     * 				"indexed": false,
+     * 				"internalType": "uint256",
+     * 				"name": "finxMineCoin",
+     * 				"type": "uint256"
+     *            },
+     *            {
+     * 				"indexed": false,
+     * 				"internalType": "uint256",
+     * 				"name": "lastMineTime",
+     * 				"type": "uint256"
+     *            },
+     *            {
+     * 				"indexed": false,
+     * 				"internalType": "uint256",
+     * 				"name": "thisMineTime",
+     * 				"type": "uint256"
+     *            }
+     * 		],
+     * 		"name": "CoinReward",
+     * 		"type": "event"
+     * 	}
+     */
+    public static final Event COINREWARD_EVENT = new Event("CoinReward",
+            Arrays.<TypeReference<?>>asList(
+                    new TypeReference<Address>(false) {},
+                    new TypeReference<Uint256>(false) {},
+                    new TypeReference<Uint256>(false) {},
+                    new TypeReference<Uint256>(false) {},
+                    new TypeReference<Uint256>(false) {},
+                    new TypeReference<Uint256>(false) {},
+                    new TypeReference<Uint256>(false) {}));
     ;
 
     @Deprecated
@@ -317,6 +380,55 @@
         EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
         filter.addSingleTopic(EventEncoder.encode(TRANSFER_EVENT));
         return transferEventFlowable(filter);
+    }
+
+    public Flowable<CoinRewardEventResponse> coinRewardEventFlowable(EthFilter filter) {
+        return web3j.ethLogFlowable(filter).map(new Function<Log, CoinRewardEventResponse>() {
+            @Override
+            public CoinRewardEventResponse apply(Log log) {
+                final List<String> topics = log.getTopics();
+                String encodedEventSignature = EventEncoder.encode(COINREWARD_EVENT);
+                if (topics == null || topics.size() == 0 || !topics.get(0).equals(encodedEventSignature)) {
+                    return null;
+                }
+
+                List<Type> indexedValues = new ArrayList<>();
+                List<Type> nonIndexedValues =
+                        FunctionReturnDecoder.decode(log.getData(), COINREWARD_EVENT.getNonIndexedParameters());
+
+                List<TypeReference<Type>> indexedParameters = COINREWARD_EVENT.getIndexedParameters();
+                for (int i = 0; i < indexedParameters.size(); i++) {
+                    Type value =
+                            FunctionReturnDecoder.decodeIndexedValue(
+                                    topics.get(i + 1), indexedParameters.get(i));
+                    indexedValues.add(value);
+                }
+                final EventValues eventValues = new EventValues(indexedValues, nonIndexedValues);
+//                EventValuesWithLog eventValues = extractEventParametersWithLog(COINREWARD_EVENT, log);
+                CoinRewardEventResponse typedResponse = new CoinRewardEventResponse();
+                if(eventValues!=null){
+                    typedResponse.adr = (String) eventValues.getNonIndexedValues().get(0).getValue();
+                    typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
+                    typedResponse.price = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
+                    typedResponse.sameCoin = (BigInteger) eventValues.getNonIndexedValues().get(3).getValue();
+                    typedResponse.finxMineCoin = (BigInteger) eventValues.getNonIndexedValues().get(4).getValue();
+                    typedResponse.lastMineTime = (BigInteger) eventValues.getNonIndexedValues().get(5).getValue();
+                    typedResponse.thisMineTime = (BigInteger) eventValues.getNonIndexedValues().get(6).getValue();
+                }
+
+                return typedResponse;
+            }
+        });
+    }
+
+    public static void main(String[] args) {
+        System.out.println(EventEncoder.encode(COINREWARD_EVENT));
+    }
+
+    public Flowable<CoinRewardEventResponse> coinRewardEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
+        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
+        filter.addSingleTopic(EventEncoder.encode(TRANSFER_EVENT));
+        return coinRewardEventFlowable(filter);
     }
 
     public RemoteFunctionCall<BigInteger> allowance(String tokenOwner, String spender) {
@@ -717,4 +829,15 @@
 
         public BigInteger tokens;
     }
+
+    public static class CoinRewardEventResponse extends BaseEventResponse {
+        public String adr;
+
+        public BigInteger amount;
+        public BigInteger price;
+        public BigInteger sameCoin;
+        public BigInteger finxMineCoin;
+        public BigInteger lastMineTime;
+        public BigInteger thisMineTime;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
index cd5bfa0..5d4a74b 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -68,6 +68,12 @@
         return new FebsResponse().success().data(dappWalletService.zyInPage(recordInPageDto));
     }
 
+    @ApiOperation(value = "产矿收益", notes = "产矿收益")
+    @PostMapping(value = "/memberFundList")
+    public FebsResponse memberFundList(@RequestBody RecordInPageDto recordInPageDto) {
+        return new FebsResponse().success().data(dappWalletService.memberFundList(recordInPageDto));
+    }
+
     @ApiOperation(value = "资金流水列表", notes = "资金流水列表")
     @PostMapping(value = "/recordInPage")
     public FebsResponse recordInPage(@RequestBody RecordInPageDto recordInPageDto) {
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
index fd7d00a..369317b 100644
--- a/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
@@ -21,6 +21,6 @@
     @ApiModelProperty(value = "类型", example = "状态:1-进行中 2:已结束")
     private Integer type;
 
-    @ApiModelProperty(value = "流水类型", example = "4-质押产币")
+    @ApiModelProperty(value = "流水类型", example = "1-质押产币")
     private Integer state;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberFund.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberFund.java
new file mode 100644
index 0000000..e31455a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberFund.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.dapp.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+@Data
+@TableName("dapp_member_fund")
+public class DappMemberFund extends BaseEntity {
+
+
+    private Long memberId;
+    public String address;
+
+    public BigDecimal amount;//总挖矿数量
+    public BigDecimal price;//价格
+    public BigDecimal sameCoin;//金本位挖矿数量
+    public BigDecimal finxMineCoin;//币本位数量
+    public String lastMineTime;//上一次挖矿时间
+    public String thisMineTime;//这次挖矿时间
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
index b161219..5fbebe6 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.dapp.dto.TeamListDto;
 import cc.mrbird.febs.dapp.entity.DappAchieve;
 import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
+import cc.mrbird.febs.dapp.entity.DappMemberFund;
 import cc.mrbird.febs.dapp.vo.MoneyFlowVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -35,4 +36,6 @@
     IPage<MoneyFlowVo> findMoneyFlowVos(Page<MoneyFlowVo> page, @Param("record")TeamListDto teamListDto);
 
     IPage<DappFundFlowEntity> selectInPages(Page<DappFundFlowEntity> page, @Param("record")DappFundFlowEntity dappFundFlowEntity);
+
+    IPage<DappMemberFund> memberFundList(Page<DappMemberFund> page, @Param("record")DappMemberFund dappMemberFund);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberFundMapper.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberFundMapper.java
new file mode 100644
index 0000000..539b1c5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberFundMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.dapp.mapper;
+
+import cc.mrbird.febs.dapp.entity.DappMemberFund;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface DappMemberFundMapper extends BaseMapper<DappMemberFund> {
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
index 0455228..b938e79 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -42,4 +42,6 @@
     IPage<DappAchieveItem> dappAchieveItemInPage(DappAchieve dappAchieve, QueryRequest request);
 
     FebsResponse transferOut(TransferOutDto transferOutDto);
+
+    List<DappMemberFund> memberFundList(RecordInPageDto recordInPageDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
index 08360d6..919fc52 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
@@ -1,24 +1,24 @@
 package cc.mrbird.febs.dapp.service.impl;
 
 import cc.mrbird.febs.common.contants.AppContants;
+import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
 import cc.mrbird.febs.dapp.chain.ChainEnum;
 import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.chain.ContractEventService;
 import cc.mrbird.febs.dapp.chain.EthUsdtContract;
-import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
-import cc.mrbird.febs.dapp.entity.DappMemberEntity;
-import cc.mrbird.febs.dapp.entity.DappOnlineTransferEntity;
-import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
+import cc.mrbird.febs.dapp.entity.*;
 import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
 import cc.mrbird.febs.dapp.mapper.DappMemberDao;
+import cc.mrbird.febs.dapp.mapper.DappMemberFundMapper;
 import cc.mrbird.febs.dapp.mapper.DappOnlineTransferDao;
 import cc.mrbird.febs.dapp.service.DappMemberService;
 import cc.mrbird.febs.dapp.service.DappSystemService;
 import cc.mrbird.febs.dapp.utils.OnlineTransferUtil;
 import cc.mrbird.febs.rabbit.producer.ChainProducer;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
@@ -42,6 +42,8 @@
 
     @Resource
     private DappMemberDao dappMemberDao;
+    @Resource
+    private DappMemberFundMapper dappMemberFundMapper;
 
     @Resource
     private DappMemberService dappMemberService;
@@ -174,4 +176,49 @@
 
         }
     }
+
+    @Override
+    public void coinReward(EthUsdtContract.CoinRewardEventResponse e) {
+        if (e.adr == null) {
+            return;
+        }
+        /**
+         * 根据地址去查询数据库是否已经注册
+         * 生成对应的产矿记录
+         * 生成对应的产矿流水
+         */
+        String address = e.adr;
+        DappMemberEntity dappMemberEntity = dappMemberDao.selectByAddress(address, null);
+        if(ObjectUtil.isEmpty(dappMemberEntity)){
+            return;
+        }
+        int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
+        BigDecimal amount = new BigDecimal(e.amount.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
+        BigDecimal price = new BigDecimal(e.price.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
+        BigDecimal sameCoin = new BigDecimal(e.sameCoin.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
+        BigDecimal finxMineCoin = new BigDecimal(e.finxMineCoin.toString()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
+        BigInteger lastMineTime = e.lastMineTime;
+        BigInteger thisMineTime = e.thisMineTime;
+
+        Long memberId = dappMemberEntity.getId();
+        DappMemberFund dappMemberFund = new DappMemberFund();
+        dappMemberFund.setMemberId(memberId);
+        dappMemberFund.setAddress(address);
+        dappMemberFund.setAmount(amount);
+        dappMemberFund.setPrice(price);
+        dappMemberFund.setSameCoin(sameCoin);
+        dappMemberFund.setFinxMineCoin(finxMineCoin);
+        dappMemberFund.setLastMineTime(lastMineTime.toString());
+        dappMemberFund.setThisMineTime(thisMineTime.toString());
+        dappMemberFundMapper.insert(dappMemberFund);
+
+        DappFundFlowEntity fundFlowTuiJian = new DappFundFlowEntity(
+                memberId,
+                amount,
+                FlowTypeEnum.ZHIYA_CHA_CHU.getValue(),
+                DappFundFlowEntity.WITHDRAW_STATUS_AGREE,
+                StrUtil.format("金本位{},币本位{},价格{}。",sameCoin, finxMineCoin,price));
+        dappFundFlowDao.insert(fundFlowTuiJian);
+        log.info("本地交易:{},amount-{},price-{}", e.adr,amount,price);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
index 2a9b7e2..c51913d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
@@ -158,6 +158,15 @@
         }
     }
 
+    @Override
+    public void coinReward(EthUsdtContract.CoinRewardEventResponse e) {
+        if (e.adr == null) {
+            return;
+        }
+
+        log.info("本地无交易USDT:{}", e.log.getTransactionHash());
+    }
+
     public static void main(String[] args) {
         System.out.println(ChainService.getInstance(ChainEnum.BSC_USDT.name()).balanceOf("0x9DDE1834683D642D4D077498DC7fbdb8CF70E8FE"));
     }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
index e577032..6bb32aa 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -425,4 +425,14 @@
 
         return new FebsResponse().success();
     }
+
+    @Override
+    public List<DappMemberFund> memberFundList(RecordInPageDto recordInPageDto) {
+        DappMemberEntity member = LoginUserUtil.getAppUser();
+        Page<DappMemberFund> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
+        DappMemberFund dappMemberFund = new DappMemberFund();
+        dappMemberFund.setMemberId(member.getId());
+        IPage<DappMemberFund> records = dappFundFlowDao.memberFundList(page, dappMemberFund);
+        return records.getRecords();
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
index 305d742..32ccc1a 100644
--- a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
+++ b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
@@ -1,71 +1,71 @@
-//package cc.mrbird.febs.job;
-//
-//import cc.mrbird.febs.common.contants.AppContants;
-//import cc.mrbird.febs.common.utils.RedisUtils;
-//import cc.mrbird.febs.dapp.chain.ChainEnum;
-//import cc.mrbird.febs.dapp.chain.ChainService;
-//import cc.mrbird.febs.dapp.chain.ContractEventService;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.ApplicationArguments;
-//import org.springframework.boot.ApplicationRunner;
-//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-//import org.springframework.scheduling.annotation.Async;
-//import org.springframework.scheduling.annotation.Scheduled;
-//import org.springframework.stereotype.Component;
-//
-//import javax.annotation.PostConstruct;
-//import java.math.BigInteger;
-//
-//@Slf4j
-//@Component
-//@ConditionalOnProperty(prefix = "system", name = "chain-listener", havingValue = "true")
-//public class ChainListenerJob implements ApplicationRunner {
-//
-//    @Autowired
-//    private ContractEventService bscCoinContractEvent;
-//
-//    @Autowired
-//    private ContractEventService bscUsdtContractEvent;
-//
-//    @Autowired
-//    private RedisUtils redisUtils;
-//
-//    @Scheduled(cron = "0 0/5 * * * ? ")
-//    public void chainBlockUpdate() {
-//        log.info("最新区块更新");
-//        BigInteger blockNumber = ChainService.getInstance(ChainEnum.BSC_TFC.name()).blockNumber();
-//
-//        redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_NEWEST_NUM, blockNumber);
-//    }
-//
-//    @Scheduled(cron = "0/2 * * * * ? ")
-//    public void chainIncrementBlock() {
-//        Object newestBlockObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_NEWEST_NUM);
-//        BigInteger newestBlock;
-//        if (newestBlockObj == null) {
-//            newestBlock = ChainService.getInstance(ChainEnum.BSC_TFC.name()).blockNumber();
-//        } else {
-//            newestBlock = (BigInteger) newestBlockObj;
-//        }
-//
-//        Object incrementObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM);
-//        BigInteger toIncrement;
-//        if (incrementObj == null) {
-//            toIncrement = newestBlock;
-//        } else {
-//            BigInteger incrementBlock = (BigInteger) incrementObj;
-//
-//            // 最新区块小于增加区块
-//            if (newestBlock.compareTo(incrementBlock) <= 0) {
-//                return;
-//            }
-//            toIncrement = incrementBlock.add(BigInteger.ONE);
-//        }
-//
-//        redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, toIncrement);
-//    }
-//
+package cc.mrbird.febs.job;
+
+import cc.mrbird.febs.common.contants.AppContants;
+import cc.mrbird.febs.common.utils.RedisUtils;
+import cc.mrbird.febs.dapp.chain.ChainEnum;
+import cc.mrbird.febs.dapp.chain.ChainService;
+import cc.mrbird.febs.dapp.chain.ContractEventService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.math.BigInteger;
+
+@Slf4j
+@Component
+@ConditionalOnProperty(prefix = "system", name = "chain-listener", havingValue = "true")
+public class ChainListenerJob implements ApplicationRunner {
+
+    @Autowired
+    private ContractEventService bscCoinContractEvent;
+
+    @Autowired
+    private ContractEventService bscUsdtContractEvent;
+
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @Scheduled(cron = "0 0/5 * * * ? ")
+    public void chainBlockUpdate() {
+        log.info("最新区块更新");
+        BigInteger blockNumber = ChainService.getInstance(ChainEnum.BSC_TFC.name()).blockNumber();
+
+        redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_NEWEST_NUM, blockNumber);
+    }
+
+    @Scheduled(cron = "0/2 * * * * ? ")
+    public void chainIncrementBlock() {
+        Object newestBlockObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_NEWEST_NUM);
+        BigInteger newestBlock;
+        if (newestBlockObj == null) {
+            newestBlock = ChainService.getInstance(ChainEnum.BSC_TFC.name()).blockNumber();
+        } else {
+            newestBlock = (BigInteger) newestBlockObj;
+        }
+
+        Object incrementObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM);
+        BigInteger toIncrement;
+        if (incrementObj == null) {
+            toIncrement = newestBlock;
+        } else {
+            BigInteger incrementBlock = (BigInteger) incrementObj;
+
+            // 最新区块小于增加区块
+            if (newestBlock.compareTo(incrementBlock) <= 0) {
+                return;
+            }
+            toIncrement = incrementBlock.add(BigInteger.ONE);
+        }
+
+        redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, toIncrement);
+    }
+
 //    @Override
 //    public void run(ApplicationArguments args) throws Exception {
 //        long start = System.currentTimeMillis();
@@ -83,22 +83,64 @@
 //        while (newest.subtract(block).compareTo(section) > -1) {
 //            BigInteger end = block.add(section);
 //            log.info("监听:[{} - {}]", block, end);
-//            ChainService.contractEventListener(block, end, bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
+////            ChainService.contractEventListener(block, end, bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
 //            /**
 //             * 检测团队收益,质押数量的20%到一个钱包a,
 //             * 监控A钱包,
 //             */
-//            ChainService.contractEventListener(block, end, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+////            ChainService.contractEventListener(block, end, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+//            ChainService.coinRewardEventListener(block, end, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
 //
 //            block = block.add(section);
 //            if (block.compareTo(newest) > 0) {
 //                block = newest;
 //            }
 //        }
-//        ChainService.contractEventListener(block, bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
-//        ChainService.contractEventListener(block, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+////        ChainService.contractEventListener(block, bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
+////        ChainService.contractEventListener(block, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
 //
 //        long end = System.currentTimeMillis();
 //        log.info("区块链监听启动完成, 消耗时间{}", end - start);
 //    }
-//}
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        long start = System.currentTimeMillis();
+        log.info("区块链监听开始启动");
+
+        Object incrementObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM);
+        BigInteger newest = ChainService.getInstance(ChainEnum.BSC_TFC.name()).blockNumber();
+//        Object incrementObj = BigInteger.valueOf(39780699);
+//        BigInteger newest = BigInteger.valueOf(39780739);
+        BigInteger block;
+        if (incrementObj == null) {
+            block = newest;
+        } else {
+            block = (BigInteger) incrementObj;
+        }
+
+        BigInteger section = BigInteger.valueOf(5000);
+        while (newest.subtract(block).compareTo(section) > -1) {
+            BigInteger end = block.add(section);
+            log.info("监听:[{} - {}]", block, end);
+//            ChainService.contractEventListener(block, end, bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
+            /**
+             * 检测团队收益,质押数量的20%到一个钱包a,
+             * 监控A钱包,
+             */
+//            ChainService.contractEventListener(block, end, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+            ChainService.coinRewardEventListener(block, end, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+
+            block = block.add(section);
+            if (block.compareTo(newest) > 0) {
+                block = newest;
+            }
+        }
+//        ChainService.contractEventListener(block, bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
+//        ChainService.contractEventListener(block, bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+
+        long end = System.currentTimeMillis();
+        log.info("区块链监听启动完成, 消耗时间{}", end - start);
+    }
+
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 8b93369..8434734 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -50,8 +50,8 @@
 
 system:
   online-transfer: false
-  chain-listener: false
-  trade-job: true
+  chain-listener: true
+  trade-job: false
 
 
 
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 62f5815..a6849dc 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -52,6 +52,10 @@
     date-format: yyyy-MM-dd HH:mm:ss
     time-zone: GMT+9
 
+
+system:
+  chain-listener: true
+
 static:
   resource:
     url: https://gfaindex.gfaweb3.com/uploadeFile/
diff --git a/src/main/resources/mapper/dapp/DappFundFlowDao.xml b/src/main/resources/mapper/dapp/DappFundFlowDao.xml
index ae52d71..b4d0566 100644
--- a/src/main/resources/mapper/dapp/DappFundFlowDao.xml
+++ b/src/main/resources/mapper/dapp/DappFundFlowDao.xml
@@ -160,4 +160,12 @@
         </where>
         order by a.create_time desc
     </select>
+
+    <select id="memberFundList" resultType="cc.mrbird.febs.dapp.entity.DappMemberFund">
+        select
+        a.*
+        from dapp_member_fund a
+        left join dapp_member b on a.member_id = b.id
+        order by a.create_time desc
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1