Send TRX with the Samsung Blockchain Platform SDK
M.A. Hasan Molla
Engineer, Samsung Developer Program
TRON is a well-known, blockchain-based, and decentralized platform that aims to create a global decentralized digital content system. By using blockchain technology, TRON has established a network between content creators and consumers, which eliminates the need for a middleman between these two parties.
Because TRON is an account-based blockchain system, a transaction in TRON is executed by an account and every transaction needs to pass the consensus process, which is known as DPoS. In this process, some witnesses are selected according to a vote to verify the transaction. Any token holder can vote to select these witnesses.
The Samsung Blockchain Platform (SBP) SDK provides an opportunity for Android developers to develop applications that can interact with Ethereum and TRON blockchain platforms. The SBP SDK supports coin transactions as well as smart contracts and tokens like TRC-10, TRC-20, and so on.
This blog describes the process of sending TRX (the base coin of the TRON platform) using the SBP SDK, with a sample application. For an example of sending Ether (the base coin of the Ethereum platform), see Send Ether with Samsung Blockchain Platform SDK.
Prerequisites
For developing a sample application that can perform TRX transactions, the following actions must be performed before the transaction takes place.
- Initialize the object
- Connect to a hardware wallet
- Get accounts
Each of these actions of the application has been implemented with a corresponding button so that the results of each action can be more visible and clearly illustrated.
Initialize the object
To use the APIs of the SDK in an Android project, an object of the SDK is required. To create the object, follow the steps below.
- Create a new Android project and integrate the SBP SDK with the application. All dependencies need to be mentioned in the build.gradle file. To complete this step follow these instructions.
- After completing the synchronization of build.gradle with the file system, the project is ready for creating an instance of the Sblockchain class. Relevant source code can be found here.
Connect to a hardware wallet
A hardware wallet is a storage device with the facility of authentication for securely storing the public-private key pair. There are several hardware wallets in the market, and Samsung provides a hardware wallet integrated with select Samsung mobile devices, known as the Samsung Blockchain Keystore.
SBP provides an interface to connect hardware wallets. Alongside the Samsung Blockchain Keystore, SBP currently supports Ledger Nano X and Ledger Nano S. Connect your application with a hardware wallet using the following code.
In this article, the Samsung Blockchain Keystore has been used as the hardware wallet. While running the sample application on your device, please ensure you meet the device restrictions of the Samsung Blockchain Keystore. You can also change the hardware wallet type and test the same application with other supported hardware wallets.
Get accounts
An account is an important protocol of TRON. It functions as a gateway to interact with the TRON blockchain. Your TRX balance, token balance, bandwidth, energy, and so on are all attached to your account. TRX balance can be sent from one account to another. Moreover, an account can issue a smart contract. TRON accounts also provide the facility to vote for super representatives. To learn more about super representatives and voting, see the TRON documentation.
Every account consists of a private and public key pair. An account remains deactivated until a TRX or token transaction is performed. Creating an account consumes frozen bandwidth points. If none are available, then the action burns 0.1 TRX instead. If you want to know more about the underlying algorithm and the process of creating an account, see the TRON account documentation.
The SBP SDK allows you to create a new account or restore existing accounts from the TRON network. Restoring and creating accounts are network operations. For more information, see the account management guide for the SBP SDK. It discusses generating, restoring and fetching accounts using the SDK.
If you have no TRX in your account, you can get some by purchasing from the sites listed here or get test TRX.
TRX Transaction
Let's send TRX from your account to another account. The SBP SDK provides an API called sendTransaction
to perform a transaction between two accounts. This API needs four parameters.
- wallet: A connected hardware wallet.
- fromAccount: The sender’s TRON account.
- toAddress: Where you want to transfer your TRX to, taking the address as a string.
- value: How much TRX you want to transfer. Input unit is SUN (1 TRX= 10^6 SUN).
The CoinService class called TronService provides the sendTransaction
API for transactions on the TRON platform. In addition, a Remote Procedure Call (RPC) is required to communicate with the TRON node. We are going to use TronGrid for this purpose, which allows developers to access a TRON client that is running on the cloud instead of creating one. You can learn more about the TronGrid here.
Before completing the example transaction, some terminology related to transactions, like bandwidth and energy, are discussed.
NetworkType networkType = TronNetworkType.SHASTA;
CoinType coinType = CoinType.TRX;
//Shasta rpc
String rpc = "https://api.shasta.trongrid.io";
// creating coinNetworkInfo
CoinNetworkInfo mCoinNetworkInfo = new CoinNetworkInfo(coinType, networkType, rpc);
//Creating CoinService
CoinService mCoinService = CoinServiceFactory.getCoinService(getApplicationContext(), mCoinNetworkInfo);
//Creating TronService
TronService tronService = (TronService) mCoinService;
Fetch TRX balance
TRX is the primary currency of TRON. It can be used to obtain Bandwidth, Energy, or Power. The SBP SDK provides the getBalance
API for fetching the balance of an account.
public void onClickGetBalance(View view) {
mCoinService = CoinServiceFactory.getCoinService(getApplicationContext(), mCoinNetworkInfo);
TextView trxAmountTextView = findViewById(R.id.amount_tron);
mCoinService.getBalance(mFirstAccount).setCallback(new ListenableFutureTask.Callback<BigInteger>() {
@Override
public void onSuccess(BigInteger bigInteger) {
convertedAmount = TronUtils.convertSunToTrx(bigInteger);
Log.i(LOG_TAG, "Balance has fetched successfully.");
Log.i(LOG_TAG, "Balance is:" + convertedAmount.toString());
runOnUiThread(() -> {
accountInfoButton.setEnabled(true);
trxAmountTextView.setText(convertedAmount.toString());
}
);
}
@Override
public void onFailure(@NotNull ExecutionException e) {
Log.e(LOG_TAG, "Fetching balance is failed.");
Log.e(LOG_TAG, "" + e.getMessage());
}
@Override
public void onCancelled(@NotNull InterruptedException e) {
Log.e(LOG_TAG, "Fetching balance is canceled.");
}
});
}
Fetch bandwidth and energy
TRON implements some new and interesting features named freeze, bandwidth, and energy. You can freeze some of your TRX balance to gain bandwidth and energy. For every frozen TRX, the user receives 1 TRON power which is needed to cast a vote on super representatives. After freezing some of your TRX, it is not possible to use these TRX until they are unfrozen.
Bandwidth is used as a fee for TRX transactions. Energy is needed to execute smart contracts. The SBP SDK only provides an API to get a frozen balance amount. You can freeze TRX and gain bandwidth and energy using Tronscan. Tronscan is a blockchain explorer, which allows anyone to explore addresses, transactions, and tokens in the TRON blockchain.
The SBP SDK provides the getAccountInfo
API for fetching bandwidth, energy and power (frozen balance) information. The input parameter is the account address of the sender. In the sample application, after pressing the Account Info button, the asynchronous task returns this information, which is set on a text view in the UI.
public void OnClickAccountInfo(View view) {
tronService = (TronService) mCoinService;
try {
tronService.getAccountInfo(mFirstAccount.getAddress()).setCallback(new ListenableFutureTask.Callback<TronAccountInfo>() {
@Override
public void onSuccess(TronAccountInfo tronAccountInfo) {
Log.i(LOG_TAG, "Account info is fetched successfully.");
Log.i(LOG_TAG, "BandWidth is:" + tronAccountInfo.getBandwidth());
Log.i(LOG_TAG, "Power is:" + tronAccountInfo.getFrozenBalance());
runOnUiThread(() -> {
sendButton.setEnabled(true);
bandWidthTextView.setText(tronAccountInfo.getBandwidth().toString());
powerTextView.setText(tronAccountInfo.getFrozenBalance().toString());
}
);
}
@Override
public void onFailure(@NotNull ExecutionException e) {
Log.e(LOG_TAG, "Fetching account info is failed.");
Log.e(LOG_TAG, "" + e.getMessage());
}
@Override
public void onCancelled(@NotNull InterruptedException e) {
Log.e(LOG_TAG, "Fetching account info is canceled.");
}
});
} catch (Exception e) {
Log.e(LOG_TAG, "Error in fetching account info: " + e);
}
}
After fetching bandwidth and energy, we can check them on the sample application UI.
Transfer TRX
Now we have all the parameters needed for sending TRX. The sendTransaction
API is used to transfer TRX to the recipient. If the transaction is successful, the onSuccess()
callback returns the transaction hash.
Every transaction in the TRON blockchain can be found in Tronscan.
public void onClickSend(View view) {
if (toAddress.isEmpty() || amount.isEmpty()) {
Toast.makeText(getApplicationContext(), "Fill ToAddress and Amount Field", Toast.LENGTH_SHORT).show();
} else if(!tronService.isValidAddress(toAddress)){
Toast.makeText(getApplicationContext(), "Invalid Address.", Toast.LENGTH_SHORT).show();
} else {
BigDecimal sendAmount = new BigDecimal(amount);
BigInteger convertedSendAmount = TronUtils.convertTrxToSun(sendAmount);
try {
tronService.sendTransaction(mHardwareWallet, (TronAccount) mFirstAccount,
toAddress, convertedSendAmount).setCallback(new ListenableFutureTask.Callback<TransactionResult>() {
@Override
public void onSuccess(TransactionResult transactionResult) {
Log.d(LOG_TAG, "Transaction Hash: " + transactionResult.getHash());
runOnUiThread(() ->
Toast.makeText(getApplicationContext(), "Transaction Hash: " + transactionResult.getHash(), Toast.LENGTH_SHORT).show()
);
}
@Override
public void onFailure(@NotNull ExecutionException e) {
Log.e(LOG_TAG, "Transaction failed.");
Log.e(LOG_TAG, "" + e.getMessage());
}
@Override
public void onCancelled(@NotNull InterruptedException e) {
Log.e(LOG_TAG, "Transaction canceled.");
}
});
} catch (AvailabilityException e) {
Log.e(LOG_TAG, "Error in sending: " + e);
}
}
}
Now that you can send TRX to another account, you can create your wallet application and implement a transfer function using the SBP SDK. Keep an eye on the Samsung Developers site for updates as the Samsung Blockchain keeps expanding support for new platforms.
Additional Resources:
- Download the SBP SDK Transaction Sample App
- More Information on the SBP SDK
Follow Up
This site has many resources for developers looking to build for and integrate with Samsung devices and services. Stay in touch with the latest news by creating a free account or by subscribing to our monthly newsletter. Visit the Marketing Resources page for information on promoting and distributing your apps. Finally, our developer forum is an excellent way to stay up-to-date on all things related to the Galaxy ecosystem.