package top.rhynie.web3j;
import com.google.protobuf.ByteString;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.bouncycastle.jcajce.provider.digest.Keccak;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;
import org.tron.tronj.abi.FunctionEncoder;
import org.tron.tronj.abi.FunctionReturnDecoder;
import org.tron.tronj.abi.TypeReference;
import org.tron.tronj.abi.datatypes.Address;
import org.tron.tronj.abi.datatypes.Function;
import org.tron.tronj.abi.datatypes.generated.Uint256;
import org.tron.tronj.client.TronClient;
import org.tron.tronj.client.exceptions.IllegalException;
import org.tron.tronj.client.transaction.TransactionBuilder;
import org.tron.tronj.crypto.SECP256K1;
import org.tron.tronj.proto.Chain;
import org.tron.tronj.proto.Contract;
import org.tron.tronj.proto.Response;
import org.tron.tronj.utils.Base58Check;
import org.tron.tronj.utils.Numeric;
import top.rhynie.web3j.contract.BetFair;
import top.rhynie.web3j.contract.ERC20;
import top.rhynie.web3j.utils.GsonUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
//import org.spongycastle.util.encoders.Hex;
//import top.rhynie.web3j.contract.BetTrx;
public class Web3jTest {
String abi = "[\n" +
"\t{\n" +
"\t\t\"inputs\": [],\n" +
"\t\t\"payable\": false,\n" +
"\t\t\"stateMutability\": \"nonpayable\",\n" +
"\t\t\"type\": \"constructor\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"constant\": false,\n" +
"\t\t\"inputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"address\",\n" +
"\t\t\t\t\"name\": \"_superiorAddr\",\n" +
"\t\t\t\t\"type\": \"address\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"name\": \"deposit\",\n" +
"\t\t\"outputs\": [],\n" +
"\t\t\"payable\": true,\n" +
"\t\t\"stateMutability\": \"payable\",\n" +
"\t\t\"type\": \"function\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"constant\": true,\n" +
"\t\t\"inputs\": [],\n" +
"\t\t\"name\": \"globalInfo\",\n" +
"\t\t\"outputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"bool\",\n" +
"\t\t\t\t\"name\": \"_needUpdate\",\n" +
"\t\t\t\t\"type\": \"bool\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"_usersLength\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"_totalDeposit\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"_totalWithdrawal\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"_round\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"payable\": false,\n" +
"\t\t\"stateMutability\": \"view\",\n" +
"\t\t\"type\": \"function\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"constant\": false,\n" +
"\t\t\"inputs\": [],\n" +
"\t\t\"name\": \"massUpdateIncomes\",\n" +
"\t\t\"outputs\": [],\n" +
"\t\t\"payable\": false,\n" +
"\t\t\"stateMutability\": \"nonpayable\",\n" +
"\t\t\"type\": \"function\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"constant\": true,\n" +
"\t\t\"inputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"name\": \"roundMap\",\n" +
"\t\t\"outputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"payable\": false,\n" +
"\t\t\"stateMutability\": \"view\",\n" +
"\t\t\"type\": \"function\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"constant\": false,\n" +
"\t\t\"inputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"pct\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"name\": \"setVertexPct\",\n" +
"\t\t\"outputs\": [],\n" +
"\t\t\"payable\": false,\n" +
"\t\t\"stateMutability\": \"nonpayable\",\n" +
"\t\t\"type\": \"function\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"constant\": true,\n" +
"\t\t\"inputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"address\",\n" +
"\t\t\t\t\"name\": \"\",\n" +
"\t\t\t\t\"type\": \"address\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"name\": \"userMap\",\n" +
"\t\t\"outputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"bool\",\n" +
"\t\t\t\t\"name\": \"exist\",\n" +
"\t\t\t\t\"type\": \"bool\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"address\",\n" +
"\t\t\t\t\"name\": \"superiorAddr\",\n" +
"\t\t\t\t\"type\": \"address\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"balance\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"directRevenue\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"staticIncome\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"actualStaticIncome\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"dynamicIncome\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"actualDynamicIncome\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"depositAmount\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"actualDepositAmount\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"recommendQuantity\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"totalPerformance\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"payable\": false,\n" +
"\t\t\"stateMutability\": \"view\",\n" +
"\t\t\"type\": \"function\"\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"constant\": false,\n" +
"\t\t\"inputs\": [\n" +
"\t\t\t{\n" +
"\t\t\t\t\"internalType\": \"uint256\",\n" +
"\t\t\t\t\"name\": \"_amount\",\n" +
"\t\t\t\t\"type\": \"uint256\"\n" +
"\t\t\t}\n" +
"\t\t],\n" +
"\t\t\"name\": \"withdraw\",\n" +
"\t\t\"outputs\": [],\n" +
"\t\t\"payable\": false,\n" +
"\t\t\"stateMutability\": \"nonpayable\",\n" +
"\t\t\"type\": \"function\"\n" +
"\t}\n" +
"]";
@Test
public void clientTest() {
TronClient mainnetClient = TronClient.ofMainnet("your private key");
TronClient shastaClient = TronClient.ofShasta("your private key");
TronClient nileClient = TronClient.ofNile("your private key");
//如果使用专用网,则可以使用其他构造函数 String grpcEndpoint, String grpcEndpointSolidity, String hexPrivateKey
TronClient customizeClient = new TronClient("String grpcEndpoint", "String grpcEndpointSolidity", "String hexPrivateKey");
}
@Test
public void transferTrxTest() {
TronClient client = TronClient.ofShasta("your private key");
Web3J web3J = new Web3J(client);
web3J.transferTrx("TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY", "TAXhs8xGWGXpFudfLVas4QnTvJTbR983RW", 1000000L);
}
@Test
public void createAccountTest() {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Web3J web3J = new Web3J(client);
web3J.createAccount("TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY");
Map map = web3J.createAccount("TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY");
map.keySet().forEach(k -> System.out.println(k + "----" + map.get(k)));
}
@Test
public void aaa() {
SECP256K1.KeyPair kp = SECP256K1.KeyPair.generate();
SECP256K1.PublicKey pubKey = kp.getPublicKey();
Keccak.Digest256 digest = new Keccak.Digest256();
digest.update(pubKey.getEncoded(), 0, 64);
byte[] raw = digest.digest();
byte[] rawAddr = new byte[21];
rawAddr[0] = 65;
System.arraycopy(raw, 12, rawAddr, 1, 20);
System.out.println(Base58Check.bytesToBase58(TronClient.parseHex(Hex.toHexString(rawAddr)).toByteArray()));
System.out.println(Hex.toHexString(kp.getPrivateKey().getEncoded()));
}
@Test
public void generateContractClassTest() {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Web3J web3J = new Web3J(client);
String className = "Redbull";
String packagePath = "D:\\mzdata\\outsourcing\\TronRedBull\\red-bull\\src\\main\\java\\";
String packageName = "com.rhynie.redbull.contract";
web3J.generateContractClass(abi, className, packagePath, packageName);
}
@Test
public void ContractClassTest() {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Web3J web3J = new Web3J(client);
ERC20 erc20 = ERC20.load(web3J, "TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY", "TPZHNvymERT7695HU2bnhoEZkx65T3hxuM", 1000_000_000L);
List name = erc20.name();
System.out.println(name.toString());
}
@Test
public void ContractClassTest1() {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Web3J web3J = new Web3J(client);
BetFair betFair = BetFair.load(web3J, "TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY", "TAkoM8S8Tq8y65rt7jTKPtvtLCYjFtA4CG", 1000_000_000L);
List name = betFair.name();
System.out.println(name.toString());
}
@Test
public void test() throws IOException, TemplateException {
String className = "ERC20";
String path = "D:\\git-project\\web3j-tron\\src\\main\\java\\";
String packageName = "top.rhynie.web3j.contract";
path = (path + packageName).replace(".", "\\");
System.out.println(path);
File file = new File(path);
System.out.println(file.getPath());
if(!file.exists()) {
System.out.println(file.mkdirs());
}
List> maps = GsonUtil.GsonToListMaps(abi);
maps.stream()
.forEach(m -> {
m.keySet().forEach(k -> System.out.println(k + "----" + m.get(k)));
System.out.println("--------------------------------------");
});
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
String filePath = this.getClass().getClassLoader().getResource("template").getFile();
cfg.setDirectoryForTemplateLoading(new File(filePath));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Template template = cfg.getTemplate("contract.ftl");
Map dataModel = new HashMap<>();
dataModel.put("packageName", packageName);
dataModel.put("className", className);
List> functions = maps.stream().filter(m -> "function".equals(m.get("type")))
.collect(Collectors.toList());
dataModel.put("functions", functions);
File dir = new File(path);
if(!dir.exists()) {
dir.mkdirs();
}
OutputStream fos = new FileOutputStream( new File(dir, className + ".java"));
Writer out = new OutputStreamWriter(fos);
template.process(dataModel, out);
fos.flush();
fos.close();;
System.out.println("gen code success!");
}
@Test
public void test1() {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Function viewName = new Function("owner", Collections.emptyList(), Arrays.asList(new TypeReference
() {}));String ownerAddr = "TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY";
ByteString newOwnerAddr = TronClient.parseAddress(ownerAddr);
String contractAddr = "TTxU9eraUsavhAyDyPZzD728irC7jwCDXb";
ByteString newContractAddr = TronClient.parseAddress(contractAddr);
Response.TransactionExtention txnExt = client.constantCall(Base58Check.bytesToBase58(newOwnerAddr.toByteArray()),
Base58Check.bytesToBase58(newContractAddr.toByteArray()),
viewName);
List constantResultList = txnExt.getConstantResultList();
List resultList = constantResultList.stream()
.map(value -> Numeric.toHexString(value.toByteArray()))
.collect(Collectors.toList());
List collect = Stream.iterate(0, x -> ++x)
.limit(resultList.size())
.map(x -> FunctionReturnDecoder.decode(resultList.get(x), viewName.getOutputParameters()).get(x).getValue())
.collect(Collectors.toList());
collect.forEach(System.out::println);
}
@Test
public void test2() {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Function viewName = new Function("deposit", Arrays.asList(new Address("TYXixYDDMfKQTLUQ7hx9t7wxqeD8SAh1u6")), Collections.emptyList());
String ownerAddr = "TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY";
ByteString newOwnerAddr = TronClient.parseAddress(ownerAddr);
String contractAddr = "TTxU9eraUsavhAyDyPZzD728irC7jwCDXb";
ByteString newContractAddr = TronClient.parseAddress(contractAddr);
String encodedHex = FunctionEncoder.encode(viewName);
Contract.TriggerSmartContract trigger =
Contract.TriggerSmartContract.newBuilder()
.setOwnerAddress(newOwnerAddr)
.setContractAddress(newContractAddr)
.setData(TronClient.parseHex(encodedHex))
.setCallValue(500000000)
.build();
System.out.println("trigger:\n" + trigger);
Response.TransactionExtention txnExt = client.blockingStub.triggerContract(trigger);
System.out.println("txn id => " + Hex.toHexString(txnExt.getTxid().toByteArray()));
Chain.Transaction signedTxn = client.signTransaction(txnExt);
System.out.println(signedTxn.toString());
Response.TransactionReturn ret = client.blockingStub.broadcastTransaction(signedTxn);
System.out.println("======== Result ========\n" + ret.toString());
}
@Test
public void test22() {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Function function = new Function("setVertexPct",
Arrays.asList(new Uint256(100000000000000000L)),
Collections.emptyList());
String ownerAddr = "TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY";
ByteString newOwnerAddr = TronClient.parseAddress(ownerAddr);
String contractAddr = "TTxU9eraUsavhAyDyPZzD728irC7jwCDXb";
ByteString newContractAddr = TronClient.parseAddress(contractAddr);
TransactionBuilder builder = client.triggerCall(Base58Check.bytesToBase58(newOwnerAddr.toByteArray()),
Base58Check.bytesToBase58(newContractAddr.toByteArray()), function);
builder.setFeeLimit(1000_000_000L);
builder.setMemo("备注");
Chain.Transaction signedTxn = client.signTransaction(builder.build());
Response.TransactionReturn ret = client.broadcastTransaction(signedTxn);
System.out.println(ret.getResult());
}
// @Test
// public void test222() {
// TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
// Function viewName = new Function("deposit", Arrays.asList(new Address("TYXixYDDMfKQTLUQ7hx9t7wxqeD8SAh1u6")), Collections.emptyList());
// String ownerAddr = "TU1HhkfKfGKZkhQLzdEaQae6iz5aCDkCAY";
// ByteString newOwnerAddr = TronClient.parseAddress(ownerAddr);
// String contractAddr = "TTxU9eraUsavhAyDyPZzD728irC7jwCDXb";
// ByteString newContractAddr = TronClient.parseAddress(contractAddr);
// String encodedHex = FunctionEncoder.encode(viewName);
//
// Contract.TriggerSmartContract trigger =
// Contract.TriggerSmartContract.newBuilder()
// .setOwnerAddress(newOwnerAddr)
// .setContractAddress(newContractAddr)
// .setData(TronClient.parseHex(encodedHex))
// .setCallValue(500000000)
// .build();
//
// System.out.println("trigger:\n" + trigger);
// Response.TransactionExtention txnExt = client.blockingStub.triggerContract(trigger);
// System.out.println("txn id => " + Hex.toHexString(txnExt.getTxid().toByteArray()));
//
// Chain.Transaction signedTxn = client.signTransaction(txnExt);
//
// System.out.println(signedTxn.toString());
// Response.TransactionReturn ret = client.blockingStub.broadcastTransaction(signedTxn);
// System.out.println("======== Result ========\n" + ret.toString());
// }
@Test
public void test3() throws IllegalException {
TronClient client = TronClient.ofShasta("709cbe2bec603df1eeabc69459855089fa7a4169b90c8b3a1c7a92a9ea6b6fbf");
Response.TransactionInfo tx = client.getTransactionInfoById("0a764d5b8106ddc56f38dec9c11b90df8e613f6c24ff503ec078675b0ae3c097");
System.out.println(tx.getResult());
// System.out.println(client.getTransactionInfoById("b5f9239e18eb9827a88c7f3f054bef20303db111bb9d0fd547409dd337b96df1"));
}
}
一键复制
编辑
Web IDE
原始数据
按行查看
历史