最近有個專案需要用到波場鏈的授權轉賬,找了各種檔案資料都沒有詳細說明,因為做交易所的時候有一個功能叫授權轉賬,比如我們充值到交易所的充值地址,其實當交易所創建這個充值地址的時候會呼叫合約approve方法把當前地址操作權限授權給交易所的熱錢包來操作當前充值地址,在參考別人轉賬代碼的基礎上實作了transferFrom功能,自己也研究了1周才搞定,給后來人少走的彎路吧
下來來代碼
public static final String SUCCESS_STATUS = "SUCCESS" ;
public static final String TRANSFER_TYPE = "TransferContract" ;
public static final int HEX_ADDRESS_SIZE = 21;
public static final byte ADD_PRE_FIX_BYTE_TESTNET = (byte) 0xa0; //a0 + address
@Autowired
private RestTemplate restTemplate;
private static SecureRandom random = new SecureRandom();
private static final Integer PRECIS=18;
/**
* trc20合約地址 這個是USDT代幣
*/
private String contract = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";
/**
* TRX主網
*/
private static final String tronUrl = "https://api.trongrid.io";
private static final String WALLET_URL="https://api.trongrid.io";
private static final long feeLimit=1000000L;
/**
* 代幣精度
*/
//token的精度 就是小數點后面有多少位小數 然后1后面加多少個0就可以
private static final BigDecimal decimal = new BigDecimal("1000000");
查詢余額
public BigDecimal usdtBalanceOf(String address) {
return balanceOf(contract,address);
}
public String getTransactionById(String txId){
Map<String,Object> param = new HashMap<>();
param.put("value", txId);
String url=tronUrl + "/wallet/gettransactionbyid";
String jsonStr =restTemplate.postForEntity(url,param, String.class).getBody();
return jsonStr;
}
/**
* 查詢tron幣數量
*
* @param address
* @return
*/
public BigDecimal balanceOfTron(String address) {
final BigDecimal decimal = new BigDecimal("1000000");
final int accuracy = 6;//六位小數
Map<String, Object> param = new HashMap<>();
param.put("address", castHexAddress(address));
String url=tronUrl + "/wallet/getaccount";
JSONObject obj = restTemplate.postForEntity(url,param,JSONObject.class).getBody();
if (obj != null) {
BigInteger balance = obj.getBigInteger("balance");
if(balance == null) balance = BigInteger.ZERO;
return new BigDecimal(balance).divide(decimal, accuracy, RoundingMode.FLOOR);
}
return BigDecimal.ZERO;
}
/**
* 查詢額度
*
* @param contract 合約地址
* @param address 查詢地址
* @return
*/
public BigDecimal balanceOf(String contract, String address) {
String hexAddress = address;
if (address.startsWith("T")) {
hexAddress = TronUtils.toHexAddress(address);
}
String hexContract = contract;
if (contract.startsWith("T")) {
hexContract = TronUtils.toHexAddress(contract);
}
TriggerSmartContract.Param param = new TriggerSmartContract.Param();
param.setContract_address(hexContract);
param.setOwner_address(hexAddress);
param.setFunction_selector("balanceOf(address)");
String addressParam = addZero(hexAddress.substring(2), 64);
param.setParameter(addressParam);
String url=tronUrl + "/wallet/triggersmartcontract";
TriggerSmartContract.Result result = restTemplate.postForEntity(url,param,TriggerSmartContract.Result.class).getBody();
if (result != null && result.isSuccess()) {
String value = result.getConstantResult(0);
if (value != null) {
final int accuracy = 6;//六位小數
return new BigDecimal(value).divide(decimal, accuracy, RoundingMode.FLOOR);
//return new BigInteger(value, 16);
}
}
return BigDecimal.ZERO;
}
public String castHexAddress(String address) {
if (address.startsWith("T")) {
return TronUtils.toHexAddress(address);
}
return address;
}
代幣授權轉賬
/**
* 代幣轉賬 trc20
*
* @param contract
* @param fromAddress
* @param privateKey fromAddress的私鑰
* @param amount
* @param toAddress
* @param remark
* @return
*/
public String sendTokenTransformTransaction(String contract,String authAddress, String fromAddress, String privateKey, String amount, String toAddress, String remark) {
try {
String hexFromAddress = castHexAddress(fromAddress);
String hexToAddress = castHexAddress(toAddress);
String hexAuthAddress = castHexAddress(authAddress);
String hexContract = castHexAddress(contract);
BigInteger a = new BigInteger(amount);
if (a.compareTo(BigInteger.ZERO) <= 0) {
log.error("轉賬失敗:額度不符合規則 " + amount);
return null;
}
if (remark == null) {
remark = "";
}
TriggerSmartContract.Param param = new TriggerSmartContract.Param();
param.setOwner_address(hexAuthAddress);
param.setContract_address(hexContract);
param.setFee_limit(6000000L);
// param.setFunction_selector("transfer(address,uint256)");
param.setFunction_selector("transferFrom(address,address,uint256)");
String fromAddressParam = addZero(hexFromAddress, 64);
String addressParam = addZero(hexToAddress, 64);
String amountParam = addZero(a.toString(16), 64);
param.setParameter(fromAddressParam+ addressParam + amountParam);
log.info("創建交易引數:" + JSONObject.toJSONString(param));
String url=tronUrl + "/wallet/triggersmartcontract";
String json = restTemplate.postForEntity(url,param,String.class).getBody();
log.info("創建交易回傳:" + json);
TriggerSmartContract.Result obj=JSON.parseObject(json,TriggerSmartContract.Result.class);
if (!obj.isSuccess()) {
log.error("創建交易失敗");
return null;
}
Transaction transaction= TronUtils.packTransaction(JSON.toJSONString(obj.getTransaction()));
byte[] transaction4 = signTransaction2Byte(transaction.toByteArray(), ByteArray.fromHexString(privateKey));
com.alibaba.fastjson.JSONObject transactionObj = org.tron.common.utils.Utils.printTransactionToJSON(Transaction.parseFrom(transaction4), false);
JSONObject jsonObject = restTemplate.postForEntity(tronUrl+"/wallet/broadcasttransaction",transactionObj, JSONObject.class).getBody();
log.info("廣播交易結果:" + jsonObject.toJSONString());
if (jsonObject != null) {
Object result = jsonObject.get("result");
if (result instanceof Boolean) {
if ((boolean) result) {
return (String) jsonObject.get("txid");
}
}
}
} catch (Throwable t) {
log.error(t.getMessage(), t);
}
return null;
}
代幣轉賬
/**
* 代幣轉賬 trc20
*
* @param contract
* @param fromAddress
* @param privateKey fromAddress的私鑰
* @param amount
* @param toAddress
* @param remark
* @return
*/
public String sendTokenTransaction(String contract, String fromAddress, String privateKey, String amount, String toAddress, String remark) {
try {
String hexFromAddress = castHexAddress(fromAddress);
String hexToAddress = castHexAddress(toAddress);
String hexContract = castHexAddress(contract);
BigInteger a = new BigInteger(amount);
if (a.compareTo(BigInteger.ZERO) <= 0) {
log.error("轉賬失敗:額度不符合規則 " + amount);
return null;
}
if (remark == null) {
remark = "";
}
TriggerSmartContract.Param param = new TriggerSmartContract.Param();
param.setOwner_address(hexFromAddress);
param.setContract_address(hexContract);
param.setFee_limit(1000000L);
param.setFunction_selector("transfer(address,uint256)");
String addressParam = addZero(hexToAddress, 64);
String amountParam = addZero(a.toString(16), 64);
param.setParameter(addressParam + amountParam);
log.info("創建交易引數:" + JSONObject.toJSONString(param));
String url=tronUrl + "/wallet/triggersmartcontract";
String json = restTemplate.postForEntity(url,param,String.class).getBody();
TriggerSmartContract.Result obj=JSON.parseObject(json,TriggerSmartContract.Result.class);
if (!obj.isSuccess()) {
log.error("創建交易失敗");
return null;
}
Transaction transaction= TronUtils.packTransaction(JSON.toJSONString(obj.getTransaction()));
byte[] transaction4 = signTransaction2Byte(transaction.toByteArray(), ByteArray.fromHexString(privateKey));
com.alibaba.fastjson.JSONObject transactionObj = org.tron.common.utils.Utils.printTransactionToJSON(Transaction.parseFrom(transaction4), false);
JSONObject jsonObject = restTemplate.postForEntity(tronUrl+"/wallet/broadcasttransaction",transactionObj, JSONObject.class).getBody();
// JSONObject rea = restTemplate.postForEntity(tronUrl+"/wallet/broadcasttransaction",signParam, JSONObject.class).getBody();
log.info("廣播交易結果:" + jsonObject.toJSONString());
if (jsonObject != null) {
Object result = jsonObject.get("result");
if (result instanceof Boolean) {
if ((boolean) result) {
return (String) jsonObject.get("txid");
}
}
}
} catch (Throwable t) {
log.error(t.getMessage(), t);
}
return null;
}
/**
* 補充0到64個位元組
*
* @param dt
* @return
*/
private String addZero(String dt, int length) {
StringBuilder builder = new StringBuilder();
final int count = length;
int zeroAmount = count - dt.length();
for (int i = 0; i < zeroAmount; i++) {
builder.append("0");
}
builder.append(dt);
return builder.toString();
}
創建地址
/**具體方法
*/
public Map<String, String> createAddress() {
ECKey eCkey = new ECKey(random);
String privateKey = ByteArray.toHexString(eCkey.getPrivKeyBytes());
byte[] addressBytes = eCkey.getAddress();
String hexAddress = ByteArray.toHexString(addressBytes);
Map<String, String> addressInfo = new HashMap<>(3);
addressInfo.put("address", toViewAddress(hexAddress));
addressInfo.put("hexAddress", hexAddress);
addressInfo.put("privateKey", privateKey);
//String privateKeyBase58 = org.spongycastle.util.encoders.Hex.e(base58Str);
String privateKeyBase58= encode58Check(eCkey.getPrivKeyBytes());
addressInfo.put("privateKeyBase58", privateKeyBase58);
return addressInfo;
}
代碼下載地址:
trx-usdt-transfer.zip-Java檔案類資源-CSDN下載TRX波場轉賬和USDT轉賬及授權轉賬更多下載資源、學習資料請訪問CSDN下載頻道.https://download.csdn.net/download/kingson88/76251400
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/413975.html
標籤:區塊鏈
