Helius
2022-05-25 cbc6726bb3a9b68881987e47f966237503973234
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package cc.mrbird.febs.dapp.chain;
 
import cc.mrbird.febs.common.exception.FebsException;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.repository.query.ParameterOutOfBoundsException;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameter;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.DefaultBlockParameterNumber;
import org.web3j.protocol.core.methods.request.EthFilter;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.gas.StaticGasProvider;
 
import java.math.BigDecimal;
import java.math.BigInteger;
import java.rmi.activation.UnknownObjectException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * @author
 * @date 2022-03-23
 **/
@Slf4j
public class ChainService {
 
    private final static String TRX_ADDRESS = "TUFzqZRpLwLWJU4jcdf77RKS3Ts2uEhmWL";
    private final static String TRX_PRIVATE = "e08dce7a4626f97b790e791bcdec31cffab46233744bb1aa133f69f98623d3fb";
    private final static String TRX_CONTRACT_ADDRESS = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
    private final static String API_KEY = "9d461be6-9796-47b9-85d8-b150cbabbb54";
 
    private final static String ETH_URL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
    private final static String ETH_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
    private final static String ETH_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
    private final static String ETH_CONTRACT_ADDRESS = "0xdac17f958d2ee523a2206206994597c13d831ec7";
 
    private final static String BSC_URL = "https://bsc-dataseed1.ninicoin.io";
//    private final static String BSC_ADDRESS = "0x971c09aA9735EB98459B17EC8b48932D24CbB931";
//    private final static String BSC_PRIVATE = "0x5f38d0e63157f535fc21f89ea13ec3cd245691c20795c1d2cb60233b3ba7bb47";
//    private final static String BSC_CONTRACT_ADDRESS = "0x55d398326f99059fF775485246999027B3197955";
 
    private final static String BSC_ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25";
    private final static String BSC_PRIVATE = "0xefe98e00cd227b6322e892c82fcbd8eadf119c3188b7e574bc624f65405d61bf";
    private final static String BSC_CONTRACT_ADDRESS = "0x6c6835e60e7dbad7a60112a6371271e8eb79ee68";
 
    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";
 
    private ChainService() {
    }
 
    public final static ChainService INSTANCE = new ChainService();
 
    public static ContractChainService getInstance(String chainType) {
        switch (chainType) {
            case "ETH" :
                return ETH;
            case "BSC" :
                return BSC;
            case "TRX" :
                return TRX;
            case "BSC_TFC":
                return BSC_TFC;
            default:
                break;
        }
 
        throw new FebsException("参数错误");
    }
 
    /**
     * 监听合约事件
     * @param startBlock 开始区块
     */
    public static void contractEventListener(BigInteger startBlock, 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, chain.getContractAddress());
 
        contract.transferEventFlowable(filter).subscribe(e -> {
            event.compile(e);
        }, error -> {
            log.error("--->", error);
        });
    }
 
    private static EthUsdtContract contract(String privateKey, String contractAddress, String url) {
        Credentials credentials = Credentials.create(privateKey);
        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) {
            parameterName = new DefaultBlockParameterNumber(startBlock);
        } else {
            parameterName = DefaultBlockParameterName.EARLIEST;
        }
 
//        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);
    }
 
}