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>