src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -52,6 +52,7 @@ private final static ContractChainService ETH = new EthService(ETH_URL, ETH_ADDRESS, ETH_PRIVATE, ETH_CONTRACT_ADDRESS); private final static ContractChainService BSC = new EthService(BSC_URL, BSC_ADDRESS, BSC_PRIVATE, BSC_CONTRACT_ADDRESS); private final static ContractChainService TRX = new TrxService(TRX_ADDRESS, TRX_PRIVATE, TRX_CONTRACT_ADDRESS, API_KEY); private final static ContractChainService BSC_TFC = new EthService(ChainEnum.BSC_TFC.getUrl(), ChainEnum.BSC_TFC.getAddress(), ChainEnum.BSC_TFC.getPrivateKey(), ChainEnum.BSC_TFC.getContractAddress()); private final String ETH_PREFIX = "0x"; @@ -68,6 +69,8 @@ return BSC; case "TRX" : return TRX; case "BSC_TFC": return BSC_TFC; default: break; } @@ -98,6 +101,7 @@ return EthUsdtContract.load(contractAddress, Web3j.build(new HttpService(url)), credentials, new StaticGasProvider(BigInteger.valueOf(4500000L), BigInteger.valueOf(200000L))); } // 18097238 18098663 private static EthFilter getFilter(BigInteger startBlock, String contractAddress) { DefaultBlockParameter parameterName = null; if (startBlock != null) { @@ -106,7 +110,33 @@ parameterName = DefaultBlockParameterName.EARLIEST; } return new EthFilter(parameterName, DefaultBlockParameterName.LATEST, contractAddress); // return new EthFilter(parameterName, DefaultBlockParameterName.LATEST, contractAddress); return new EthFilter(parameterName, new DefaultBlockParameterNumber(new BigInteger("18098663")), contractAddress); } public static void main(String[] args) { ChainEnum chain = ChainEnum.getValueByName(ChainEnum.BSC_TFC.name()); assert chain != null; EthUsdtContract contract = contract(chain.getPrivateKey(), chain.getContractAddress(), chain.getUrl()); EthFilter filter = getFilter(new BigInteger("18097238"), new BigInteger("18098663"), chain.getContractAddress()); contract.transferEventFlowable(filter).subscribe(e -> { System.out.println(1); }, error -> { log.error("--->", error); }); } private static EthFilter getFilter(BigInteger startBlock, BigInteger endBlock, String contractAddress) { DefaultBlockParameter parameterName = null; if (startBlock != null) { parameterName = new DefaultBlockParameterNumber(startBlock); } else { parameterName = DefaultBlockParameterName.EARLIEST; } return new EthFilter(parameterName, new DefaultBlockParameterNumber(endBlock), contractAddress); } } src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
@@ -1,15 +1,90 @@ package cc.mrbird.febs.dapp.service.impl; 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.DappMemberEntity; import cc.mrbird.febs.dapp.mapper.DappMemberDao; import cn.hutool.core.util.StrUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigInteger; @Service public class BscCoinContractEvent implements ContractEventService { @Autowired private DappMemberDao dappMemberDao; private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25"; int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(); @Override public void compile(EthUsdtContract.TransferEventResponse e) { if (e.to != null) { if ("0x0000000000000000000000000000000000000000".equals(e.from)) { return; } DappMemberEntity fromMember = dappMemberDao.selectByAddress(e.from, null); if (fromMember == null) { fromMember = insertMember(e.from, null); } if (!e.to.equals(ADDRESS)) { DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null); if (toMember == null) { toMember = insertMember(e.to, fromMember.getInviteId()); } } // 卖币 if (e.to.equals(ADDRESS)) { BigInteger tokens = e.tokens; } } } private DappMemberEntity insertMember(String address, String refererId) { DappMemberEntity member = new DappMemberEntity(); member.setAddress(address); dappMemberDao.insert(member); member.setInviteId(ShareCodeUtil.toSerialCode(member.getId())); member.setRefererId(refererId); if (StrUtil.isNotBlank(refererId)){ boolean flag = false; String parentId = refererId; String ids = ""; while (!flag && StringUtils.isNotBlank(parentId)) { if (StrUtil.isBlank(ids)) { ids += parentId; } else { ids += ("," + parentId); } DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId); if (parentMember == null) { break; } parentId = parentMember.getRefererId(); if(StringUtils.isBlank(parentId)){ break; } if (parentMember.getRefererId().equals(parentMember.getInviteId())) { flag = true; } } member.setRefererIds(ids); } dappMemberDao.updateById(member); return member; } } src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
@@ -1,8 +1,14 @@ package cc.mrbird.febs.dapp.service.impl; import cc.mrbird.febs.common.utils.ShareCodeUtil; import cc.mrbird.febs.dapp.chain.ContractEventService; import cc.mrbird.febs.dapp.chain.EthUsdtContract; import cc.mrbird.febs.dapp.entity.DappMemberEntity; import cc.mrbird.febs.dapp.mapper.DappMemberDao; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Slf4j @@ -11,5 +17,6 @@ @Override public void compile(EthUsdtContract.TransferEventResponse e) { } } src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
@@ -23,7 +23,7 @@ @PostConstruct public void chainListenerJob() { log.info("监听打开"); ChainService.contractEventListener(new BigInteger("18103010"), bscUsdtContractEvent, ChainEnum.BSC_USDT.name()); // ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name()); // ChainService.contractEventListener(new BigInteger("18097238"), bscUsdtContractEvent, ChainEnum.BSC_USDT.name()); ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name()); } } src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -3,7 +3,10 @@ <mapper namespace="cc.mrbird.febs.dapp.mapper.DappMemberDao"> <select id="selectByAddress" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity"> select * from dapp_member where address=#{address} and chain_type=#{chain} select * from dapp_member where address=#{address} <if test="chain != null and chain != ''"> and chain_type=#{chain} </if> </select> <select id="selectMemberInfoByInviteId" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">