| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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 = "0xD88F63aCbcF82cC6D2255b8082D7bdE43b559d00"; |
| | | 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) { |
| | |
| | | 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)){ |
| | |
| | | }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!") |
| | | ); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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(); |
| | | } |
| | |
| | | } |
| | | 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); |