KKSU
2024-05-13 ff8e73504ab40738ce1c90f6394bbd7b88260f5e
src/main/java/cc/mrbird/febs/dapp/contract/andao/AndaoContractMain.java
@@ -1,11 +1,17 @@
package cc.mrbird.febs.dapp.contract.andao;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.contants.SystemConstants;
import cc.mrbird.febs.common.service.RedisService;
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.rabbit.producer.ChainProducer;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
@@ -19,13 +25,21 @@
import org.web3j.utils.Convert;
import java.math.BigInteger;
import java.util.List;
@Component
@ConditionalOnProperty(prefix = "system", name = "quartz-job", havingValue = "true")
public class AndaoContractMain {
    @Autowired
    private ChainProducer chainProducer;
    @Autowired
    private DappMemberDao dappMemberDao;
    @Autowired
    private DappFundFlowDao dappFundFlowDao;
    @Autowired
    private SystemConstants systemConstants;
@@ -68,18 +82,22 @@
        return Web3j.build(httpService);
    }
    private static Web3j getInstanceScopes() {
        HttpService httpService = new HttpService(blockchainNode);
        return Web3j.build(httpService);
    }
    // 区块链节点地址 TODO
//    private static String blockchainNode = "https://bsc-dataseed.binance.org";
    private static String blockchainNode = "https://bsc-dataseed1.ninicoin.io";
    // 合约地址 TODO
//    private static String contractAddr = "0xb5a1aC0fA05BFb8ad16B231e84b0bAC1d46eAfD0";//测试
    private static String contractAddr = "0x06Bd96a05B0B7B06449F1da58E8918cc6AfBB394";
    private static String contractAddr = "0xbE8470ff4cF69eb6F2923aE3A8B29f58Ea81cEb0";
    // 操作账号 手续费钱包地址的私钥(合约里会把手续费转到你这个私钥地址上) 用于操作合约内方法 TODO
    private static String privateKey = "221be67f85375a5af6dd0f4b77fbe877ad2e57e05db201de1b1383fb76494d18";//测试
//    private static String privateKey = AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() ;
    private static String privateKey = AppContants.FEE_ADDRESS_KEY.get("feeAddressKey").toString() ;
    private EthFilter getFilter(BigInteger startBlock) {
        if (startBlock != null) {
@@ -102,21 +120,34 @@
        Credentials credentials = Credentials.create(privateKey);
        Abi contract = Abi.load(contractAddr, getInstanceScope(), credentials, new DefaultGasProvider());
        EthFilter filter = getFilter(startBlock);
        contract.transferEventFlowable(filter).subscribe(e->{
        contract.receivedEventFlowable(filter).subscribe(e->{
            try {
                // 投注人的地址
                String from = e.from;
                String to = e.to;
                BigInteger amount = e.value;
                if(from==null){
                    // 为空则不进入后续逻辑
                    return;
                }
                // TODO 业务操作逻辑代码
                System.out.println("from:"+from+",to:"+to+",amount:"+amount);
                // 更新区块编号 TODO
                redisService.set("BNB_BLOCK_NUMBER",e.log.getBlockNumber().intValue());
                DappMemberEntity dappMemberEntity = dappMemberDao.selectByAddress(from, "BSC");
                if(ObjectUtil.isEmpty(dappMemberEntity)){
                    return;
                }
                BigInteger amount = e.amount;
                String regFlow = e.regFlow;
                if(regFlow==null){
                    // 为空则不进入后续逻辑
                    return;
                }
                DappFundFlowEntity dappFundFlowEntity = dappFundFlowDao.selectById(Long.parseLong(regFlow));
                if(ObjectUtil.isEmpty(dappFundFlowEntity)){
                    return;
                }
                // TODO 业务操作逻辑代码
                System.out.println("from:"+from+",amount:"+amount+",regFlow:"+regFlow);
//                chainProducer.sendContractAnDao(Long.parseLong(regFlow));
                //投注人
//                DappMemberEntity dappMemberEntity = dappMemberDao.selectByAddress(from, "BSC");
//                if(ObjectUtil.isNotEmpty(dappMemberEntity)){
@@ -135,7 +166,29 @@
            }catch (Exception exception) {
                exception.printStackTrace();
            }
        });
        },
                error -> System.out.println("onError: " + error),
                () -> System.out.println("onComplete will not be printed!")
        );
    }
    public void listenBettings(BigInteger startBlock){
        System.out.println("启动投注监听事件");
        // 指定密钥文件并进行账号和密码的验证
        Credentials credentials = Credentials.create(privateKey);
        Abi contract = Abi.load(contractAddr, getInstanceScopes(), credentials, new DefaultGasProvider());
        EthFilter filter = getFilter(startBlock);
        contract.withdrawnEventFlowable(filter).subscribe(e->{
            try {
                // 更新区块编号 TODO
                redisService.set("BNB_BLOCK_NUMBER",e.log.getBlockNumber().intValue());
            }catch (Exception exception) {
                exception.printStackTrace();
            }
        },
                error -> System.out.println("onError: " + error),
                () -> System.out.println("onComplete will not be printed!")
        );
    }
    /**
@@ -147,7 +200,7 @@
        Abi contract = Abi.load(contractAddr, getInstance(), credentials, getStaticGasProvider());
        try {
            //BigInteger bigInteger = Convert.toWei(amount.toString(), Convert.Unit.ETHER).toBigInteger();
            TransactionReceipt send = contract.transfer(to1, amount).send();
            TransactionReceipt send = contract.withdrawANDAO(to1, amount).send();
            if(ObjectUtil.isNotEmpty(send)){
                transactionHash = send.getTransactionHash();
            }
@@ -156,31 +209,29 @@
        }
        return transactionHash;
    }
    /**
     * 从合约内转币到制定地址
     */
    public String burnToken(BigInteger amount, String to1){
        String transactionHash = null;
        Credentials credentials = Credentials.create(privateKey);
        Abi contract = Abi.load(contractAddr, getInstance(), credentials, getStaticGasProvider());
        try {
            //BigInteger bigInteger = Convert.toWei(amount.toString(), Convert.Unit.ETHER).toBigInteger();
            TransactionReceipt send = contract.transfer(to1, amount).send();
            if(ObjectUtil.isNotEmpty(send)){
                transactionHash = send.getTransactionHash();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return transactionHash;
    }
//    /**
//     * 初始化合约地址
//     */
//    public String setAddress(List<String> list){
//        String transactionHash = null;
//        Credentials credentials = Credentials.create(privateKey);
//        Abi contract = Abi.load(contractAddr, getInstance(), credentials, getStaticGasProvider());
//        try {
//            //BigInteger bigInteger = Convert.toWei(amount.toString(), Convert.Unit.ETHER).toBigInteger();
//            TransactionReceipt send = contract.initializeAddresses(list).send();
//            if(ObjectUtil.isNotEmpty(send)){
//                transactionHash = send.getTransactionHash();
//            }
//        } catch (Exception exception) {
//            exception.printStackTrace();
//        }
//        return transactionHash;
//    }
    public static void main(String[] args) {
        AndaoContractMain andaoContractMain = new AndaoContractMain();
        String address = "0x7a9bfE048d110EF90a467803653f9B8666f9096C";
//        String address = "0x785D5Aa2951Ac4C6f28Dc593AF0b0536Dd3E82Fe";
        BigInteger bigInteger = new BigInteger(Convert.toWei("1", Convert.Unit.ETHER).setScale(0).toString());
        String hash = andaoContractMain.trans(bigInteger,address);
        System.out.println(hash);