KKSU
2024-04-28 673d9890158a00c42a0cb187d7f40b599d272da9
测试环境新版
15 files modified
2 files added
466 ■■■■ changed files
src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ContractEventService.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/EthUsdtContract.java 123 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberFund.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberFundMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java 55 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/job/ChainListenerJob.java 188 ●●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 4 ●●●● patch | view | raw | blame | history
src/main/resources/application-prod.yml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/DappFundFlowDao.xml 8 ●●●●● patch | view | raw | blame | history
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",
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);
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);
}
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;
    }
}
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) {
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;
}
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberFund.java
New file
@@ -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;//这次挖矿时间
}
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);
}
src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberFundMapper.java
New file
@@ -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> {
}
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);
}
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);
    }
}
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"));
    }
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();
    }
}
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);
    }
}
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
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/
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>