diff --git a/src/main/java/org/tron/walletcli/Client.java b/src/main/java/org/tron/walletcli/Client.java index 7cf72daf4..9155b2d7a 100755 --- a/src/main/java/org/tron/walletcli/Client.java +++ b/src/main/java/org/tron/walletcli/Client.java @@ -5,6 +5,22 @@ import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; import io.netty.util.internal.StringUtil; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.Base64.Decoder; +import java.util.Base64.Encoder; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.lang3.ArrayUtils; import org.bouncycastle.util.encoders.Hex; import org.jline.reader.Completer; @@ -14,7 +30,32 @@ import org.jline.reader.impl.completer.StringsCompleter; import org.jline.terminal.Terminal; import org.jline.terminal.TerminalBuilder; -import org.tron.api.GrpcAPI.*; +import org.tron.api.GrpcAPI.AccountNetMessage; +import org.tron.api.GrpcAPI.AccountResourceMessage; +import org.tron.api.GrpcAPI.AddressPrKeyPairMessage; +import org.tron.api.GrpcAPI.AssetIssueList; +import org.tron.api.GrpcAPI.BlockExtention; +import org.tron.api.GrpcAPI.BlockList; +import org.tron.api.GrpcAPI.BlockListExtention; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.api.GrpcAPI.DelegatedResourceList; +import org.tron.api.GrpcAPI.DiversifierMessage; +import org.tron.api.GrpcAPI.ExchangeList; +import org.tron.api.GrpcAPI.ExpandedSpendingKeyMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyDiversifierMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyMessage; +import org.tron.api.GrpcAPI.Node; +import org.tron.api.GrpcAPI.NodeList; +import org.tron.api.GrpcAPI.Note; +import org.tron.api.GrpcAPI.NumberMessage; +import org.tron.api.GrpcAPI.PaymentAddressMessage; +import org.tron.api.GrpcAPI.ProposalList; +import org.tron.api.GrpcAPI.TransactionApprovedList; +import org.tron.api.GrpcAPI.TransactionList; +import org.tron.api.GrpcAPI.TransactionListExtention; +import org.tron.api.GrpcAPI.TransactionSignWeight; +import org.tron.api.GrpcAPI.ViewingKeyMessage; +import org.tron.api.GrpcAPI.WitnessList; import org.tron.common.crypto.Hash; import org.tron.common.utils.AbiUtil; import org.tron.common.utils.ByteArray; @@ -32,18 +73,17 @@ import org.tron.core.zen.address.PaymentAddress; import org.tron.keystore.StringUtils; import org.tron.protos.Contract.AssetIssueContract; -import org.tron.protos.Protocol.*; +import org.tron.protos.Protocol.Account; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.ChainParameters; +import org.tron.protos.Protocol.DelegatedResourceAccountIndex; +import org.tron.protos.Protocol.Exchange; +import org.tron.protos.Protocol.Proposal; +import org.tron.protos.Protocol.SmartContract; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.TransactionInfo; import org.tron.walletserver.WalletApi; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.Base64.Decoder; -import java.util.Base64.Encoder; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class Client { @@ -150,7 +190,8 @@ public class Client { "WithdrawBalance", "UpdateBrokerage", "GetReward", - "GetBrokerage" + "GetBrokerage", + "CreateCrossChainTransaction" }; private static String[] commandList = { @@ -254,7 +295,8 @@ public class Client { "WithdrawBalance", "UpdateBrokerage", "GetReward", - "GetBrokerage" + "GetBrokerage", + "CreateCrossChainTransaction" }; private byte[] inputPrivateKey() throws IOException { @@ -1476,7 +1518,8 @@ private void exchangeTransaction(String[] parameters) throws IOException, CipherException, CancelException { if (parameters == null || (parameters.length != 4 && parameters.length != 5)) { System.out.println("Using exchangeTransaction command needs 4 or 5 parameters like: "); - System.out.println("exchangeTransaction [OwnerAddress] exchange_id token_id quantity expected"); + System.out + .println("exchangeTransaction [OwnerAddress] exchange_id token_id quantity expected"); return; } @@ -2322,7 +2365,8 @@ private void showShieldedAddressInfo(String[] parameters) { ShieldedAddressInfo addressInfo = ShieldedWrapper.getInstance().getShieldedAddressInfoMap().get(shieldedAddress); if (addressInfo != null) { - System.out.println("The following variables are secret information, please don't show to other people!!!"); + System.out.println( + "The following variables are secret information, please don't show to other people!!!"); System.out.println("sk :" + ByteArray.toHexString(addressInfo.getSk())); System.out.println("ivk:" + ByteArray.toHexString(addressInfo.getIvk())); System.out.println("ovk:" + ByteArray.toHexString(addressInfo.getOvk())); @@ -2804,7 +2848,8 @@ private void importShieldedWallet() throws CipherException, IOException { walletApiWrapper.getNewShieldedAddressBySkAndD(sk, d); if (addressInfo.isPresent() && ShieldedWrapper.getInstance().addNewShieldedAddress(addressInfo.get(), false)) { - System.out.println("Import new shielded wallet address is: " + addressInfo.get().getAddress()); + System.out + .println("Import new shielded wallet address is: " + addressInfo.get().getAddress()); System.out.println("ImportShieldedWallet successful !!!"); } else { System.out.println("ImportShieldedWallet failed !!!"); @@ -2844,6 +2889,43 @@ private void create2(String[] parameters) { return; } + private void createCrossChainTransaction(String[] parameters) + throws IOException, CipherException, CancelException { + if (parameters == null || parameters.length < 8) { + System.out.println("Using createCrossChainTransaction command needs 2 parameters like: "); + System.out.println( + "createCrossChainTransaction [OwnerAddress] ownerChainId toAddress toChainId tokenId tokenChainId tokenName precision amount"); + return; + } + + int index = 0; + byte[] ownerAddress = null; + + if (parameters.length == 9) { + ownerAddress = WalletApi.decodeFromBase58Check(parameters[index++]); + } + String ownerChainId = parameters[index++]; + byte[] toAddress = WalletApi.decodeFromBase58Check(parameters[index++]); + String toChainId = parameters[index++]; + String tokenId = parameters[index++]; + String tokenChainId = parameters[index++]; + String tokenName = parameters[index++]; + int precision = Integer.valueOf(parameters[index++]); + long amount = Long.valueOf(parameters[index++]); + + if (precision < 0 || precision > 6) { + System.out.println("precision between 0-6."); + return; + } + boolean result = walletApiWrapper.createCrossChainTransaction(ownerChainId, toChainId, + ownerAddress, toAddress, tokenId, tokenChainId, tokenName, precision, amount); + if (result) { + System.out.println("createCrossChainTransaction successful !!!"); + } else { + System.out.println("createCrossChainTransaction failed !!!"); + } + } + private void help() { System.out.println("Help: List of Tron Wallet-cli commands"); System.out.println( @@ -3343,6 +3425,10 @@ private void run() { create2(parameters); break; } + case "createcrosschaintransaction": { + createCrossChainTransaction(parameters); + break; + } case "exit": case "quit": { System.out.println("Exit !!!"); diff --git a/src/main/java/org/tron/walletcli/WalletApiWrapper.java b/src/main/java/org/tron/walletcli/WalletApiWrapper.java index c844e9345..8b7bd58c4 100644 --- a/src/main/java/org/tron/walletcli/WalletApiWrapper.java +++ b/src/main/java/org/tron/walletcli/WalletApiWrapper.java @@ -2,9 +2,37 @@ import com.google.protobuf.ByteString; import io.netty.util.internal.StringUtil; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; import lombok.extern.slf4j.Slf4j; import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.*; +import org.tron.api.GrpcAPI.AddressPrKeyPairMessage; +import org.tron.api.GrpcAPI.AssetIssueList; +import org.tron.api.GrpcAPI.BlockExtention; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.api.GrpcAPI.DecryptNotes; +import org.tron.api.GrpcAPI.DecryptNotesMarked; +import org.tron.api.GrpcAPI.DiversifierMessage; +import org.tron.api.GrpcAPI.ExchangeList; +import org.tron.api.GrpcAPI.ExpandedSpendingKeyMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyDiversifierMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyMessage; +import org.tron.api.GrpcAPI.IvkDecryptAndMarkParameters; +import org.tron.api.GrpcAPI.IvkDecryptParameters; +import org.tron.api.GrpcAPI.NfParameters; +import org.tron.api.GrpcAPI.NodeList; +import org.tron.api.GrpcAPI.Note; +import org.tron.api.GrpcAPI.OvkDecryptParameters; +import org.tron.api.GrpcAPI.PaymentAddressMessage; +import org.tron.api.GrpcAPI.PrivateParameters; +import org.tron.api.GrpcAPI.PrivateParametersWithoutAsk; +import org.tron.api.GrpcAPI.ProposalList; +import org.tron.api.GrpcAPI.ReceiveNote; +import org.tron.api.GrpcAPI.SpendNote; +import org.tron.api.GrpcAPI.ViewingKeyMessage; +import org.tron.api.GrpcAPI.WitnessList; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Utils; import org.tron.core.exception.CancelException; @@ -25,14 +53,14 @@ import org.tron.protos.Contract.IncrementalMerkleVoucherInfo; import org.tron.protos.Contract.OutputPoint; import org.tron.protos.Contract.OutputPointInfo; -import org.tron.protos.Protocol.*; +import org.tron.protos.Protocol.Account; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.ChainParameters; +import org.tron.protos.Protocol.Exchange; +import org.tron.protos.Protocol.Proposal; +import org.tron.protos.Protocol.Transaction; import org.tron.walletserver.WalletApi; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; - @Slf4j public class WalletApiWrapper { @@ -125,7 +153,6 @@ public void logout() { } - //password is current, will be enc by password2. public byte[] backupWallet() throws IOException, CipherException { if (wallet == null || !wallet.isLoginState()) { @@ -1209,4 +1236,16 @@ public GrpcAPI.NumberMessage getReward(byte[] ownerAddress) { public GrpcAPI.NumberMessage getBrokerage(byte[] ownerAddress) { return WalletApi.getBrokerage(ownerAddress); } + + public boolean createCrossChainTransaction(String ownerChainId, String toChainId, byte[] owner, + byte[] toAddress, String tokenId, String tokenChainId, String tokenName, int precision, + long amount) + throws CipherException, IOException, CancelException { + if (wallet == null || !wallet.isLoginState()) { + System.out.println("Warning: updateSetting failed, Please login first !!"); + return false; + } + return wallet.createCrossChainTransaction(ownerChainId, toChainId, owner, toAddress, tokenId, + tokenChainId, tokenName, precision, amount); + } } diff --git a/src/main/java/org/tron/walletserver/GrpcClient.java b/src/main/java/org/tron/walletserver/GrpcClient.java index f04066b8c..37a66547b 100644 --- a/src/main/java/org/tron/walletserver/GrpcClient.java +++ b/src/main/java/org/tron/walletserver/GrpcClient.java @@ -3,11 +3,59 @@ import com.google.protobuf.ByteString; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.*; +import org.tron.api.GrpcAPI.AccountNetMessage; +import org.tron.api.GrpcAPI.AccountPaginated; +import org.tron.api.GrpcAPI.AccountResourceMessage; +import org.tron.api.GrpcAPI.AddressPrKeyPairMessage; +import org.tron.api.GrpcAPI.AssetIssueList; +import org.tron.api.GrpcAPI.BlockExtention; +import org.tron.api.GrpcAPI.BlockLimit; +import org.tron.api.GrpcAPI.BlockList; +import org.tron.api.GrpcAPI.BlockListExtention; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.api.GrpcAPI.DecryptNotes; +import org.tron.api.GrpcAPI.DecryptNotesMarked; +import org.tron.api.GrpcAPI.DelegatedResourceList; +import org.tron.api.GrpcAPI.DelegatedResourceMessage; +import org.tron.api.GrpcAPI.DiversifierMessage; +import org.tron.api.GrpcAPI.EasyTransferAssetByPrivateMessage; +import org.tron.api.GrpcAPI.EasyTransferAssetMessage; +import org.tron.api.GrpcAPI.EasyTransferByPrivateMessage; +import org.tron.api.GrpcAPI.EasyTransferMessage; +import org.tron.api.GrpcAPI.EasyTransferResponse; +import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.ExchangeList; +import org.tron.api.GrpcAPI.ExpandedSpendingKeyMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyDiversifierMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyMessage; +import org.tron.api.GrpcAPI.IvkDecryptAndMarkParameters; +import org.tron.api.GrpcAPI.IvkDecryptParameters; +import org.tron.api.GrpcAPI.NfParameters; +import org.tron.api.GrpcAPI.NodeList; +import org.tron.api.GrpcAPI.NoteParameters; +import org.tron.api.GrpcAPI.NumberMessage; +import org.tron.api.GrpcAPI.OvkDecryptParameters; +import org.tron.api.GrpcAPI.PaginatedMessage; +import org.tron.api.GrpcAPI.PaymentAddressMessage; +import org.tron.api.GrpcAPI.PrivateParameters; +import org.tron.api.GrpcAPI.PrivateParametersWithoutAsk; +import org.tron.api.GrpcAPI.ProposalList; import org.tron.api.GrpcAPI.Return.response_code; +import org.tron.api.GrpcAPI.SpendAuthSigParameters; +import org.tron.api.GrpcAPI.SpendResult; +import org.tron.api.GrpcAPI.TransactionApprovedList; +import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.api.GrpcAPI.TransactionList; +import org.tron.api.GrpcAPI.TransactionListExtention; +import org.tron.api.GrpcAPI.TransactionSignWeight; +import org.tron.api.GrpcAPI.ViewingKeyMessage; +import org.tron.api.GrpcAPI.WitnessList; import org.tron.api.WalletExtensionGrpc; import org.tron.api.WalletGrpc; import org.tron.api.WalletSolidityGrpc; @@ -15,11 +63,16 @@ import org.tron.protos.Contract; import org.tron.protos.Contract.IncrementalMerkleVoucherInfo; import org.tron.protos.Contract.OutputPointInfo; -import org.tron.protos.Protocol.*; - -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.TimeUnit; +import org.tron.protos.Protocol.Account; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.ChainParameters; +import org.tron.protos.Protocol.DelegatedResourceAccountIndex; +import org.tron.protos.Protocol.Exchange; +import org.tron.protos.Protocol.Proposal; +import org.tron.protos.Protocol.SmartContract; +import org.tron.protos.Protocol.Transaction; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.Protocol.TransactionSign; @Slf4j public class GrpcClient { @@ -894,4 +947,9 @@ public NumberMessage getBrokerage(byte[] address) { return blockingStubFull.getBrokerageInfo(bytesMessage); } } + + public TransactionExtention createCrossChainTransaction( + Transaction transaction) { + return blockingStubFull.createCommonTransaction(transaction); + } } diff --git a/src/main/java/org/tron/walletserver/WalletApi.java b/src/main/java/org/tron/walletserver/WalletApi.java index e81b0a0a6..c6bbeaa8a 100644 --- a/src/main/java/org/tron/walletserver/WalletApi.java +++ b/src/main/java/org/tron/walletserver/WalletApi.java @@ -11,13 +11,63 @@ import com.typesafe.config.Config; import com.typesafe.config.ConfigObject; import io.grpc.Status; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.spongycastle.util.encoders.Hex; import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.*; +import org.tron.api.GrpcAPI.AccountNetMessage; +import org.tron.api.GrpcAPI.AccountResourceMessage; +import org.tron.api.GrpcAPI.AddressPrKeyPairMessage; +import org.tron.api.GrpcAPI.AssetIssueList; +import org.tron.api.GrpcAPI.BlockExtention; +import org.tron.api.GrpcAPI.BlockList; +import org.tron.api.GrpcAPI.BlockListExtention; +import org.tron.api.GrpcAPI.BytesMessage; +import org.tron.api.GrpcAPI.DecryptNotes; +import org.tron.api.GrpcAPI.DecryptNotesMarked; +import org.tron.api.GrpcAPI.DelegatedResourceList; +import org.tron.api.GrpcAPI.DiversifierMessage; +import org.tron.api.GrpcAPI.EasyTransferResponse; +import org.tron.api.GrpcAPI.EmptyMessage; +import org.tron.api.GrpcAPI.ExchangeList; +import org.tron.api.GrpcAPI.ExpandedSpendingKeyMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyDiversifierMessage; +import org.tron.api.GrpcAPI.IncomingViewingKeyMessage; +import org.tron.api.GrpcAPI.IvkDecryptAndMarkParameters; +import org.tron.api.GrpcAPI.IvkDecryptParameters; +import org.tron.api.GrpcAPI.NfParameters; +import org.tron.api.GrpcAPI.NodeList; +import org.tron.api.GrpcAPI.NoteParameters; +import org.tron.api.GrpcAPI.OvkDecryptParameters; +import org.tron.api.GrpcAPI.PaymentAddressMessage; +import org.tron.api.GrpcAPI.PrivateParameters; +import org.tron.api.GrpcAPI.PrivateParametersWithoutAsk; +import org.tron.api.GrpcAPI.ProposalList; +import org.tron.api.GrpcAPI.Return; +import org.tron.api.GrpcAPI.SpendAuthSigParameters; +import org.tron.api.GrpcAPI.SpendResult; +import org.tron.api.GrpcAPI.TransactionApprovedList; +import org.tron.api.GrpcAPI.TransactionExtention; +import org.tron.api.GrpcAPI.TransactionList; +import org.tron.api.GrpcAPI.TransactionListExtention; +import org.tron.api.GrpcAPI.TransactionSignWeight; import org.tron.api.GrpcAPI.TransactionSignWeight.Result.response_code; +import org.tron.api.GrpcAPI.ViewingKeyMessage; +import org.tron.api.GrpcAPI.WitnessList; import org.tron.common.crypto.ECKey; import org.tron.common.crypto.Hash; import org.tron.common.crypto.Sha256Sm3Hash; @@ -30,19 +80,48 @@ import org.tron.core.config.Parameter.CommonConstant; import org.tron.core.exception.CancelException; import org.tron.core.exception.CipherException; -import org.tron.keystore.*; +import org.tron.keystore.CheckStrength; +import org.tron.keystore.Credentials; +import org.tron.keystore.Wallet; +import org.tron.keystore.WalletFile; +import org.tron.keystore.WalletUtils; import org.tron.protos.Contract; -import org.tron.protos.Contract.*; -import org.tron.protos.Protocol.*; +import org.tron.protos.Contract.AssetIssueContract; +import org.tron.protos.Contract.BuyStorageBytesContract; +import org.tron.protos.Contract.BuyStorageContract; +import org.tron.protos.Contract.ClearABIContract; +import org.tron.protos.Contract.CreateSmartContract; +import org.tron.protos.Contract.CrossContract; +import org.tron.protos.Contract.CrossContract.CrossDataType; +import org.tron.protos.Contract.CrossToken; +import org.tron.protos.Contract.FreezeBalanceContract; +import org.tron.protos.Contract.IncrementalMerkleVoucherInfo; +import org.tron.protos.Contract.OutputPointInfo; +import org.tron.protos.Contract.SellStorageContract; +import org.tron.protos.Contract.ShieldedTransferContract; +import org.tron.protos.Contract.SpendDescription; +import org.tron.protos.Contract.UnfreezeAssetContract; +import org.tron.protos.Contract.UnfreezeBalanceContract; +import org.tron.protos.Contract.UpdateBrokerageContract; +import org.tron.protos.Contract.UpdateEnergyLimitContract; +import org.tron.protos.Contract.UpdateSettingContract; +import org.tron.protos.Contract.WithdrawBalanceContract; +import org.tron.protos.Protocol.Account; +import org.tron.protos.Protocol.Block; +import org.tron.protos.Protocol.ChainParameters; +import org.tron.protos.Protocol.DelegatedResourceAccountIndex; +import org.tron.protos.Protocol.Exchange; +import org.tron.protos.Protocol.Key; +import org.tron.protos.Protocol.Permission; +import org.tron.protos.Protocol.Proposal; +import org.tron.protos.Protocol.SmartContract; +import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.Transaction.Result; - -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import org.tron.protos.Protocol.Transaction.raw; +import org.tron.protos.Protocol.TransactionInfo; +import org.tron.protos.Protocol.TransactionSign; +import org.tron.protos.Protocol.Witness; @Slf4j public class WalletApi { @@ -130,7 +209,7 @@ public static int getRpcVersion() { /** * Creates a new WalletApi with a random ECKey or no ECKey. - * */ + */ public static WalletFile CreateWalletFile(byte[] password) throws CipherException { WalletFile walletFile = null; if (isEckey) { @@ -176,7 +255,7 @@ public boolean checkPassword(byte[] passwd) throws CipherException { /** * Creates a Wallet with an existing ECKey. - * */ + */ public WalletApi(WalletFile walletFile) { if (this.walletFile.isEmpty()) { this.walletFile.add(walletFile); @@ -312,7 +391,7 @@ private static WalletFile loadWalletFile() throws IOException { /** * load a Wallet from keystore - * */ + */ public static WalletApi loadWalletFromKeystore() throws IOException { WalletFile walletFile = loadWalletFile(); WalletApi walletApi = new WalletApi(walletFile); @@ -474,7 +553,7 @@ private void showTransactionAfterSign(Transaction transaction) } private static boolean processShieldedTransaction(TransactionExtention transactionExtention, - WalletApi wallet) + WalletApi wallet) throws IOException, CipherException, CancelException { if (transactionExtention == null) { return false; @@ -2456,4 +2535,47 @@ public static GrpcAPI.NumberMessage getReward(byte[] owner) { public static GrpcAPI.NumberMessage getBrokerage(byte[] owner) { return rpcCli.getBrokerage(owner); } + + public boolean createCrossChainTransaction(String ownerChainId, String toChainId, byte[] owner, + byte[] toAddress, String tokenId, String tokenChainId, String tokenName, int precision, + long amount) + throws IOException, CipherException, CancelException { + if (owner == null) { + owner = getAddress(); + } + + CrossToken.Builder crossToken = CrossToken.newBuilder(); + crossToken.setAmount(amount).setTokenId(ByteString.copyFrom(ByteArray.fromString(tokenId))) + .setTokenName(ByteString.copyFrom(ByteArray.fromString(tokenName))).setPrecision(precision) + .setChainId(ByteString.copyFrom(ByteArray.fromHexString(tokenChainId))); + CrossContract.Builder builder = CrossContract.newBuilder(); + builder.setOwnerAddress(ByteString.copyFrom(owner)) + .setOwnerChainId(ByteString.copyFrom(ByteArray.fromHexString(ownerChainId))) + .setToChainId(ByteString.copyFrom(ByteArray.fromHexString(toChainId))) + .setToAddress(ByteString.copyFrom(toAddress)).setType(CrossDataType.TOKEN) + .setData(crossToken.build().toByteString()); + Transaction.Builder transaction = Transaction.newBuilder(); + raw.Builder raw = Transaction.raw.newBuilder(); + Transaction.Contract.Builder contract = Transaction.Contract.newBuilder(); + contract.setType(ContractType.CrossContract) + .setParameter(Any.pack(builder.build())); + raw.addContract(contract.build()); + transaction.setRawData(raw.build()); + + TransactionExtention transactionExtention = + rpcCli.createCrossChainTransaction(transaction.build()); + if (transactionExtention == null || !transactionExtention.getResult().getResult()) { + System.out.println("RPC create cross trx failed!"); + if (transactionExtention != null) { + System.out.println("Code = " + transactionExtention.getResult().getCode()); + System.out.println( + "Message = " + transactionExtention.getResult().getMessage().toStringUtf8()); + } + return false; + } + + return processTransactionExtention(transactionExtention); + + + } } diff --git a/src/main/protos/api/api.proto b/src/main/protos/api/api.proto index 6172ffcfb..c25c7f569 100644 --- a/src/main/protos/api/api.proto +++ b/src/main/protos/api/api.proto @@ -698,6 +698,9 @@ service Wallet { }; // end for shiededTransaction + rpc CreateCommonTransaction (Transaction) returns (TransactionExtention) { + + }; }; service WalletSolidity { diff --git a/src/main/protos/core/Contract.proto b/src/main/protos/core/Contract.proto index bcafc904e..8fe45525d 100644 --- a/src/main/protos/core/Contract.proto +++ b/src/main/protos/core/Contract.proto @@ -340,3 +340,22 @@ message ShieldedTransferContract { int64 to_amount = 7; // the amount to transparent to_address } // end shielded transaction +message CrossContract { + bytes owner_address = 1; + bytes owner_chainId = 2; + bytes to_address = 3; + bytes to_chainId = 4; + bytes data = 5; + CrossDataType type = 6; + enum CrossDataType { + TOKEN = 0; + } +} + +message CrossToken { + int64 amount = 1; + bytes token_id = 2; + bytes token_name = 3; + int32 precision = 4; + bytes chain_id = 5; +} \ No newline at end of file diff --git a/src/main/protos/core/Tron.proto b/src/main/protos/core/Tron.proto index d70672297..78108a692 100644 --- a/src/main/protos/core/Tron.proto +++ b/src/main/protos/core/Tron.proto @@ -275,6 +275,7 @@ message Transaction { ClearABIContract = 48; UpdateBrokerageContract = 49; ShieldedTransferContract = 51; + CrossContract = 53; } ContractType type = 1; google.protobuf.Any parameter = 2;