package cc.mrbird.febs.dapp.service.impl; import cc.mrbird.febs.common.contants.AppContants; 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.mapper.DappFundFlowDao; import cc.mrbird.febs.dapp.mapper.DappMemberDao; import cc.mrbird.febs.dapp.service.DappMemberService; 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 org.springframework.transaction.annotation.Transactional; import org.web3j.utils.Numeric; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; @Service public class BscCoinContractEvent implements ContractEventService { @Resource private DappMemberDao dappMemberDao; @Resource private DappMemberService dappMemberService; @Resource private DappFundFlowDao dappFundFlowDao; @Resource private RedisUtils redisUtils; private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25"; public static void main(String[] args) { System.out.println(Numeric.toBigInt("0x12e4e85")); } @Transactional(rollbackFor = Exception.class) @Override public void compile(EthUsdtContract.TransferEventResponse e) { if (e.to != null) { redisUtils.set(AppContants.REDIS_KEY_BLOCK_COIN_NUM, e.log.getBlockNumber()); int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals(); // 合约创建时,同时创建地址 if ("0x0000000000000000000000000000000000000000".equals(e.from)) { DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null); if (toMember == null) { toMember = dappMemberService.insertMember(e.to, "0", "BSC", "admin"); } return; } DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null); if (fromMember == null) { DappMemberEntity sourceAddress = dappMemberDao.selectByAddress(ChainEnum.BSC_TFC.getAddress(), null); fromMember = dappMemberService.insertMember(e.from, sourceAddress.getInviteId()); } // 如果转账对象地址不为源池地址,则创建用户 if (!e.to.equals(ADDRESS)) { DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null); if (toMember == null) { toMember = dappMemberService.insertMember(e.to, fromMember.getInviteId()); } } // 卖币 if (e.to.equals(ADDRESS)) { BigInteger tokens = e.tokens; BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN); DappFundFlowEntity fundFlow = dappFundFlowDao.selectByFromHash(e.log.getTransactionHash(), 1); BigDecimal newPrice = fundFlow.getNewestPrice(); BigDecimal transferAmount = amount.multiply(newPrice); // 更改状态为已同步 fundFlow.setStatus(2); fundFlow.setTargetAmount(transferAmount); dappFundFlowDao.updateById(fundFlow); // TODO 划点分配 // TODO 自动转账 // String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(e.from, transferAmount); // fundFlow.setToHash(hash); // dappFundFlowDao.updateById(fundFlow); } } } }