Guide
What is TokenUp Wallet SDK
The TokenUp Wallet SDK provides a streamlined gateway for users to adopt Web3 effortlessly. It eliminates the complexities of wallet management and user relationships, abstracts away low-level blockchain communication, and enables rapid wallet integration – empowering developers to build with ease.
Quickstart
integrate the aar
1、Install TokenUpWalletSdk.aar
2、Configure Dependencies
implementation(files("aar/TokenUpWalletSdk.aar"))
implementation("com.tencent:mmkv:1.3.9")
implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
implementation("com.google.code.gson:gson:2.11.0")
implementation("com.google.android.gms:play-services-auth:21.2.0")
implementation("com.google.apis:google-api-services-drive:v3-rev20220815-2.0.0")
implementation("com.google.api-client:google-api-client:2.0.0")
implementation("com.google.oauth-client:google-oauth-client-jetty:1.34.1")
implementation("com.google.auth:google-auth-library-oauth2-http:1.11.0")
Error codes
const val WEB_MANAGER_ERROR_ID = 401 //Unknown error
const val WEB_MANAGER_SUCCESS_ID = 0 //Request succeeded
const val WEB_MANAGER_NO_PASSWORD = -86750 //Password not set
const val WEB_MANAGER_PASSWORD_ERROR = -86751 //Invalid password
const val WEB_MANAGER_ACCOUNT_IS_ADD = -86752 //Account already added
const val WEB_MANAGER_NOT_INIT = -1111 //Not initialized
Conversion rate mapping
val AUDUSD: String,val CADCNY: String,val CHFCNY: String,val CNYAED: String,val CNYALL: String,
val CNYAOA: String,val CNYARS: String,val CNYBAM: String,val CNYBGN: String,val CNYBHD: String,
val CNYBND: String,val CNYBOB: String,val CNYBRL: String,val CNYBWP: String,val CNYBYN: String,
val CNYCLP: String,val CNYCOP: String,val CNYCZK: String,val CNYDKK: String,val CNYDZD: String,
val CNYEGP: String,val CNYGHS: String,val CNYGYD: String,val CNYHRK: String,val CNYHUF: String,
val CNYILS: String,val CNYINR: String,val CNYIQD: String,val CNYIRR: String,val CNYISK: String,
val CNYJOD: String,val CNYKES: String,val CNYKRW: String,val CNYKWD: String,val CNYLAK: String,
val CNYLBP: String,val CNYLKR: String,val CNYLYD: String,val CNYMAD: String,val CNYMDL: String,
val CNYMKD: String,val CNYMMK: String,val CNYMOP: String,val CNYMUR: String,val CNYMVR: String,
val CNYMWK: String,val CNYMXN: String,val CNYMYR: String,val CNYNGN: String,val CNYNOK: String,
val CNYNPR: String,val CNYOMR: String,val CNYPEN: String,val CNYPHP: String,val CNYPKR: String,
val CNYPLN: String,val CNYPYG: String,val CNYQAR: String,val CNYRON: String,val CNYRSD: String,
val CNYRUB: String,val CNYSAR: String,val CNYSDG: String,val CNYSDR: String,val CNYSEK: String,
val CNYSLL: String,val CNYSRD: String,val CNYSSP: String,val CNYSYP: String,val CNYTHB: String,
val CNYTND: String,val CNYTRY: String,val CNYTWD: String,val CNYTZS: String,val CNYUAH: String,
val CNYUGX: String,val CNYUYU: String,val CNYUZS: String,val CNYVEF: String,val CNYVND: String,
val CNYXAF: String,val CNYYER: String,val CNYZAR: String,val CNYZMW: String,val EURCNY: String,
val EURUSD: String,val GBPCNY: String,val GBPUSD: String,val HKDCNY: String,val JPYCNY: String,
val NZDCNY: String,val NZDUSD: String,val SGDCNY: String,val USDAED: String,val USDARS: String,
val USDBGN: String,val USDBHD: String,val USDBND: String,val USDBRL: String,val USDBWP: String,
val USDBYN: String,val USDCAD: String,val USDCHF: String,val USDCLP: String,val USDCNH: String,
val USDCNY: String,val USDCOP: String,val USDCRC: String,val USDCZK: String,val USDDKK: String,
val USDDZD: String,val USDEGP: String,val USDHKD: String,val USDHRK: String,val USDHUF: String,
val USDIDR: String,val USDILS: String,val USDINR: String,val USDIQD: String,val USDIRR: String,
val USDISK: String,val USDJOD: String,val USDJPY: String,val USDKES: String,val USDKHR: String,
val USDKRW: String,val USDKWD: String,val USDKZT: String,val USDLAK: String,val USDLBP: String,
val USDLKR: String,val USDMAD: String,val USDMMK: String,val USDMOP: String,val USDMXN: String,
val USDMYR: String,val USDNGN: String,val USDNOK: String,val USDOMR: String,val USDPEN: String,
val USDPHP: String,val USDPLN: String,val USDQAR: String,val USDRON: String,val USDRSD: String,
val USDRUB: String,val USDSAR: String,val USDSEK: String,val USDSGD: String,val USDSYP: String,
val USDTHB: String,val USDTRY: String,val USDTUSD: String,val USDTWD: String,val USDTZS: String,
val USDUGX: String,val USDVES: String,val USDVND: String,val USDX: String,val USDYER: String,
val USDZAR: String,val USDZMW: String,val XAGUSD: String,val XAUUSD: String,val XPDUSD: String,
val XPTUSD: String
Initialize
initcallback: Initialize the callback; the SDK methods can only be used after successful initialization
fun init(context:Application,initCallback:(Boolean)->Unit)
Account
Login
token: The Server Client ID for Google Sign-In in your product application
appName: Your project's appName
launcher: Receiving and processing the login callback
fun login(activity: FragmentActivity,token:String,appName:String,isDebug:Boolean,launcher: ActivityResultLauncher<Intent>)
This method processes the login callback response.
block: Login success callback,true false
fun handleLoginResult(result: ActivityResult, activity: FragmentActivity, block: (Boolean) -> Unit)
Switch Account
id: The accountId, which allows switching to a specific account.
fun switchAccount(id:String):SubAccountBean?
Delete Account
password: Wallet passward
accountId: The ID of the deleted account.
callback: Callback that returns an Int (refer to status codes).
fun delAccount(password: String? = "",accountId: String,callback:(Int)->Unit)
Add Account
password: Wallet passward
callback:Success Callback for Account Creation,AccountBean,contains a status code and the account object
This method will create wallets for all currently supported blockchains in a single operation.
fun createNewAccount(password: String? = "",callback: (AccountBean?)->Unit)
Import account via private key
password: Wallet passward
privateKey: The private key to be added
chains: The blockchain networks associated with this private key
callback:Success callback for addition,AccountBean,contains a status code and the account object
importPrivateKeyAccount(password: String? = "",privateKey:String?,chains:MutableList<String>,callback: (AccountBean?)->Unit)
Import account via Seed phrase
password: Wallet passward
mnemonics: Seed phrase
callback:Success callback for addition,AccountBean,contains a status code and the account object
importMnemonicAccount(password: String? = "",mnemonics:String,callback: (AccountBean?)->Unit)
Sync Remote Account List
callback: Return the current account listing
fun syncAllAccount(callback:(MutableList<SubAccountBean>?)->Unit)
Retrieve the account list
fun getAllAccount(): MutableList<SubAccountBean>?
Get Current Account
fun getCurrentAccount():SubAccountBean?
Get Seed Phrase
password: Wallet password
accountId: Account ID
callback: MnemonicBean containing status code and 12/24-word mnemonic phrase
fun getMnemonic(password: String?="",accountId:String,callback:(MnemonicBean?)->Unit)
Get Private Key
accountId: Account ID
chainType: Blockchain type
password: Wallet password
PrivateKeyBean: containing status code and private key
fun getPrivateKey(accountId:String,chainType: String,password: String? = "",callback: (PrivateKeyBean) -> Unit)
Get Account's Private Key List
accountId: Account ID
password: Wallet password
callback: PrivateKeyListBean containing status code and list of private keys
fun getPrivateKeyList(accountId:String,password: String? = "",callback:(PrivateKeyListBean?)->Unit)
Change Password
oldPwd: Old password
newPwd: New password
callback: Returns status code
fun changePassword(oldPwd:String = "",newPwd:String,callback:(Int)->Unit)
Check If Password Was Changed
fun isChangePassword():Boolean
Get Current Login Email
fun getCurrentLoginEmail():String?
Network
Get All Supported Networks
fun getAllNetWork(callback: (MutableList<ChainListBean>?) -> Unit)
Get Current Network
fun getCurrentNet(callBack: (ChainListBean?) -> Unit)
Switch Network
chainId: Switch Network ID
callback: Returns whether switch was successful
fun switchNetWork(chainId: Long,callback: (Boolean)->Unit)
Blockchain
Get Supported Chains
fun getSupportChains():MutableList<String>
Tokens
Get Current Network's Token List
fun getCurrentNetTokenList(callBack: (MutableList<TokenListBean>?) -> Unit)
Get Popular Tokens for Specific Network
chainId: Network ID
chainType: Network type
fun getTokenListByChainId(chainId:Long,chainType: String,callBack: (MutableList<TokenListBean>?) -> Unit)
Get Token's Latest Price (USDT)
params: [{"chainType_chainId":"contract_address"}] //For native tokens use symbol instead
callback:[{"contract_address",ChainPriceBean}]
ChainPriceBean: Field 'c' contains latest price
fun getChainPrice(params:List<HashMap<String,String>>, callback:(MutableList<HashMap<String, ChainPriceBean>>?)->Unit)
Get Exchange Rates
fun getExchangeRate(callback: (HashMap<String,String>?) -> Unit)
Query Token Metadata (Custom Tokens)
appkey:Required for TON chain
fun getTokenMetaData(rpc: String?,chainType:String?,contract :String?,appKey:String?,callback: (TokenListBean?)->Unit)
Transaction History
Register Wallet as Transaction Observer
Call this method when creating new wallets to add them to observation list
fun uploadHistory(subAccountBean: SubAccountBean)
Query Transaction History
fun getHistoryList(chainId:Long,chainType: String,address: String,page:Int,limit:Int = 50,callback: (HistoryListBean?)->Unit)
Transactions
Get TRON Network Bandwidth
fun getTronAccountResources(rpc:String?,address:String?,callback:(TronAccountResponseBean?)->Unit)
Get Current Network's TRON Bandwidth
fun getCurrentTronAccount(callback:(TronAccountResponseBean?)->Unit)
Get Token Balance
params:BalanceRequestBean
data class BalanceRequestBean(var rpc:String? = "",var chainType:String? = "",var address:String? = "",
var contract:String? = "",var appKey:String? = "" //Required for TON chain)
callback: Returns raw balance amount (needs division by token's decimal places), -1 indicates error
fun getBalance(params:BalanceRequestBean,callback: ((String?) -> Unit))
Get Current Network's Token Balance
contract:Token contract address
fun getCurrentNetBalance(contract:String,callback: (String?) -> Unit)
Validate Wallet Address
Validates if address format is correct for specified chain
fun checkAddress(chainType:String,address:String,callback:(Boolean)->Unit)
Get Gas Fee
params:GasFeeRequestBean
data class GasFeeRequestBean(var amount: String? = "", //Optional
var appKey: String? = "",var chainType: String? = "",var contract: String? = "",
var from: String? = "", var to: String? = "" ,//If no address provided,to=from
var isEIP1559: Boolean = false,var suggestGas1559Url: String? = "",//Required for EVM chains
var rpc: String? = "")
callback: Returns JSON string
Response format varies between EVM and Other types
Gas fee is in native token amount (needs division by token's decimal places)
other type
{
"gas": "110",
// The following parameters are only available for Tron
"bandwidth": "0",
"residualBandwidth": "0",
"energy": "0",
"residualEnergy": "0",
}
evm type
1559 = true
{
"low": {
"gasLimit": "21000",
"maxFeePerGas": "23813114133",
"maxPriorityFeePerGas": "10000000",
"gasFee": "500075396793000",
"estimatedTime": "≤ 30 seconds"
},
"medium": {
"gasLimit": "23100",
"maxFeePerGas": "32134204079",
"maxPriorityFeePerGas": "0",
"gasFee": "742300114224900",
"estimatedTime": "≤ 45 seconds"
},
"high": {
"gasLimit": "25200",
"maxFeePerGas": "40465294026",
"maxPriorityFeePerGas": "0",
"gasFee": "1019725409455200",
"estimatedTime": "≤ 60 seconds"
},
"estimatedBaseFee": "23803114133"
}
1559 = false
{
"low": {
"gasLimit": "21000",
"gasPrice": "112112060928",
"gasFee": "2354353279488000",
"estimatedTime": "≤ 15 minutes"
},
"medium": {
"gasLimit": "23100",
"gasPrice": "123323267021",
"gasFee": "2589788607436800",
"estimatedTime": "≤ 3 minutes"
},
"high": {
"gasLimit": "25200",
"gasPrice": "134534473114",
"gasFee": "2825223935385600",
"estimatedTime": "≤ 1 minute"
}
}
fun getGasFee(params: GasFeeRequestBean,callback: (String?) -> Unit)
Get EVM Gas Fee
callback:GasFeeEvmResponse
Returns null if query fails
fun getEvmGasFee(isEIP1559:Boolean,toAddress:String,contract: String,amount:String,callback: (GasFeeEvmResponse?)->Unit)
Get Other Chain Types' Gas Fee
callback:GasFeeResponseBean
Returns null if query fails
fun getOtherGasFee(toAddress:String,contract: String,amount:String,callback: (GasFeeResponseBean?)->Unit)
EVM Transfer
params:TransFerEvmRequestBean
data class TransFerEvmRequestBean(var amount: String?,var chainType: String?,var contract: String?,var from: String?,
var password: String?,var rpc: String?,var to: String?,var chainId: String?,var gasLimit: String?,var gasPrice: String?,
var maxFeePerGas: String?, var maxPriorityFeePerGas: String? Fill based on 1559 response data)
callback:TransFerResponseBean
Contain status code and transaction hash
fun transFerEvm(params:TransFerEvmRequestBean,callback:(TransFerResponseBean?)->Unit)
Current Network EVM Transfer
Simplified version that doesn't require network type/rpc or sender address
fun transFerEvmCurrentNet(params: TransFerEvmNoNetRequestBean,callback: (TransFerResponseBean?) -> Unit)
Non-EVM Transfer
params:TransFerOtherRequestBean
data class TransFerOtherRequestBean(var amount: String?,var appKey: String?,var chainType: String?,
var contract: String?,var from: String?,var password: String?,var rpc: String?,
var to: String?)
callback:TransFerResponseBean
Contain status code and transaction hash
fun transFerOther(params: TransFerOtherRequestBean,callback: (TransFerResponseBean?) -> Unit)
Current Network Non-EVM Transfer
Simplified version that doesn't require network type/rpc or sender address
fun transFerOtherCurrentNet(params: TransFerOtherNoNetRequestBean,callback: (TransFerResponseBean?) -> Unit)
Wallet Events
Integration
Inject JS
Get JS code to inject when opening DApps to intercept wallet events
fun getJsInfo(context:Context):String?
Register Methods
JS calls app:
App must provide send(json:String) method
App calls JS
Call hInjectJsReceive.on(JSON.stringify(${json}))
DApp Response Codes
code = 0 Success
code = 4001 User rejected
code = 4100 Wallet not connected
code = 4902 Network not found
code = -32605 Unknown Error
code = -32601 Method Not Found
code = -32602 Invalid Params
code = -32603 Internal Error
code = -32604 Server Error
Get All Connected Objects
host: DApp website host
fun getAllConnect(host: String):List<DappConnectBean>?
Get Current Connected Object
host: DApp website host
chainType: Which network's connection to get
chainId: Whether to switch connection to specific network
address: Check if specific wallet address is connected
Returns: null if no matching connection
fun getConnectInfo(host: String,chainType: String?,chainId: Long?,address: String?):DappConnectBean?
Remove Connection (Disconnect)
id:Connection object's accountId
address:Wallet address to disconnect
host:Wallet address to disconnect
fun disConnect(id:String)
fun disConnect(address:String,host:String)
DApp Event Callback
code Response code
params: Data to return to DApp
fun sendToDapp(code:Int,params:HashMap<String,Any?>)
Wallet Event Flow
Connect Wallet
{
"id": "XXX",
"chainType": "xxxx",
"methodName": "connect",
"params": {
// Optional network selection
"chainId": "XXXX"
}
}
response:
{
"address": "XXX"
}
1.Get connection object
2.If exists, return to DApp
3.If not, show user account list for selection
4.After approval, return connection data and save
Disconnect
{
"id": "XXX",
"chainType": "xxx",
"methodName": "disconnect"
}
response:
code = 0
params = null
1.Find connection object
2.Remove connection
3.Return result to DApp
Switch Network
response:
code = 0
params = null
1.Find connection object
2.Update connection's network
3.Return result to DApp
Add Token
response:
code = 0
true or false
1.Get connection object
2.Query token info by contract address
3.Add token to local token list
4.Return result to DApp
Sign Message
response:
{
"signature": "..."
}
1.Get connection object and display data
2.After approval, generate signature
3.Return signature to DApp
Sign Transaction
response:
{
"signature": "..."
}
1.Get connection object
2.Prepare transaction data (xxParseTransaction, xxEstimateGasByRawTx)
3.Show transaction dialog
4.After approval, generate signed transaction (xxSignRawTransaction)
5.Return signed transaction to DApp
Sign and Send Transaction
response:
{
"signature": "..."
}
1.Same as Sign Transaction
2.After signing, send transaction (xxSendSignedTransaction)
3.Return transaction hash to DApp
HC
Sign Message
dapp json
{
"id": "XXX",
"chainType": "HC",
"methodName": "signMessage",
"params": {
// base58 format
"message": "XXXX", //Convert message based on display format
"display": "utf8" | "hex"},
}
callback: Int -> SDK status code
String -> signature
fun getSignMessage(password:String = "",accountId: String,chainType: String,message: String?,messageType:Int=-1,callback:(Int,String)->Unit)
Sign Transaction
dapp json
{
"id": "XXX",
"chainType": "HC",
"methodName": "signTransaction",
"params": {
// base58 format
"transaction": "XXXX"
},
}
params:
transactions Pass DApp's transaction to parse data
fun hcParseTransaction(transactions: MutableList<String>,rpc:String?,callback: (MutableList<TransactionResultBean>?) -> Unit)
params:
callback:String Returns raw HC gas fee
fun hcEstimateGasByRawTx(transactions: MutableList<String>,rpc:String?,callback: (String?) -> Unit)
params:
transaction Pass DApp's transaction to generate signature
callback : Int -> SDK status code
String -> signature
fun hcSignRawTransaction(transaction:String,chainType: String,accountId: String,password: String? = "",callback: (Int,String?) -> Unit)
Sign and Send Transaction
dapp json
{
"id": "XXX",
"chainType": "HC",
"methodName": "signTransaction",
"params": {
// base58 format
"transaction": "XXXX"
},
}
params:
signature Pass signature from hcSignRawTransaction
callback: String ->transaction hash
fun hcSendSignedTransaction(signature:String,rpc: String?,callback: (String?) -> Unit)
Ethereum
Switch Network
{
"id": "XXX",
"chainType": "Ethereum",
"methodName": "wallet_switchEthereumChain",
"params": {
"chainId": "XXXX"
}
}
Sign Message
{
"id": "XXX",
"chainType": "Ethereum",
"methodName": "signMessage",
"params": {
"address": "",
"message": "",
"messageType": 0 | 1 | 4
}
}
fun getSignMessage(password:String = "",accountId: String,chainType: String,message: String?,messageType:Int=-1,callback:(Int,String)->Unit)
Sign Transaction
{
"id": "XXX",
"chainType": "Ethereum",
"methodName": "signTransaction",
"params": {
"from": "XXXX",
"to": "XXXX",
"value": "XXXX",
"data": "XXXX",
"nonce": "XXXX", // optional
"gas": "XXXX", // optional
"gasPrice": "XXXX", // optional
"maxPriorityFeePerGas": "XXXX", // optional
"maxFeePerGas": "XXXX", // optional
}
}
fun ethParseTransaction(to: String?,value: String?,data:String? = "",callback: (EthParseResponseBean?)->Unit)
params:
EthParseResponseBean.type = approve
Additional method required
fun ethGenerateApproveData(toAddress: String?,approveAmount:String?,callback: (String?) -> Unit)
params:
GasFeeEvmResponse Returns GasFeeEvmResponse with low/medium/high options
fun ethEstimateGas(rpc: String?,from:String?,to:String?,value:String?,data:String?,isEIP1559:Boolean = false,chainId: Long?,callback: (GasFeeEvmResponse?)->Unit)
params:
callback: Int-> SDK status code
String -> signed transaction
fun ethSignTransaction(accountId: String?,rpc: String?,password: String? = "",chainType: String?,chainId: String?,to:String?,value: String?,data: String?,
nonce:String?,contractAddress:String?,from: String?,maxPriorityFeePerGas:String? = "",maxFeePerGas:String? = "",
gasLimit:String? = "",gasPrice:String? = "",callback: (Int,String?) -> Unit)
Sign and Send Transaction
{
"id": "XXX",
"chainType": "Ethereum",
"methodName": "signTransaction",
"params": {
"from": "XXXX",
"to": "XXXX",
"value": "XXXX",
"data": "XXXX",
"nonce": "XXXX", // optional
"gas": "XXXX", // optional
"gasPrice": "XXXX", // optional
"maxPriorityFeePerGas": "XXXX", // optional
"maxFeePerGas": "XXXX", // optional
}
}
params:
signedTransaction Pass signed transaction from signing
callback : String -> transaction hash
fun ethSendSignedTransaction(rpc:String?,signedTransaction:String,callback: (String?) -> Unit)
Tron
Sign Message
{
"id": "XXX",
"chainType": "Tron",
"methodName": "signMessage",
"params": {
// hex code
"message": "XXXX",
"address": "XXXX"
},
}
fun getSignMessage(password:String = "",accountId: String,chainType: String,message: String?,messageType:Int=-1,callback:(Int,String)->Unit)
Sign Transaction
{
"id": "XXX",
"chainType": "Tron",
"methodName": "signTransaction",
"params": {
"transaction": "XXXX",
"input": "XXXX",
"fromAddress": "XXXX",
},
}
fun tronParseTransaction(rpc: String?,input: String?,callback: (TronParseResponseBean?)->Unit)
fun tronEstimateGasByRawTx(rpc: String?,fromAddress:String?,transaction:String?,input:String?,callback: (TronGasResponseBean?) -> Unit)
fun tronSignRawTransaction(password: String? = "",accountId: String?,chainType: String?,transaction:String?,callback:(Int,String?)->Unit)
Tron does not sign and send transactions
Solana
Sign Message
{
"id": "XXX",
"chainType": "Solana",
"methodName": "signMessage",
"params": {
"message": "XXXX",
"address": "XXXX"
}
}
fun getSignMessage(password:String = "",accountId: String,chainType: String,message: String?,messageType:Int=-1,callback:(Int,String)->Unit)
Sign Transaction
{
"id": "XXX",
"chainType": "Solana",
"methodName": "signTransaction",
"params": {
// base58 format
"transaction": "XXXX"
},
}
Same flow as HC
fun solParseTransaction(transactions: MutableList<String>,rpc:String?,signerAddress:String,callback: (MutableList<TransactionResultBean>?) -> Unit)
fun solEstimateGasByRawTx(transactions: MutableList<String>,rpc:String?,callback: (String?) -> Unit)
fun solSignRawTransaction(transaction:String,chainType: String,accountId: String,password: String? = "",callback: (Int,String?) -> Unit)
Sign and Send Transaction
dapp json
{
"id": "XXX",
"chainType": "Solana",
"methodName": "signTransaction",
"params": {
// base58 format
"transaction": "XXXX"
},
}
params:
signature Pass signature from solSignRawTransaction
callback: String -> transaction hash
fun solSendSignedTransaction(signature:String,rpc: String?,callback: (String?) -> Unit)