QRC20 Integration Technical Guide

QRC20 Integration Technical Guide

This document explains the basics of interacting with an QRC20 contract with the qtumd CLI command tool.
The full example in PHP: Qrc20.php .


We recommend that an exchange use one main address to store tokens for all users. Below MAIN_QRC_ADDRESS is the main address.
The address of the QRC20 token contract is TOKEN_CONTRACT_ADDRESS.
  • gas limit is DEFAULT_GAS_LIMIT, recommended value is 250000
  • gas price is DEFAULT_GAS_PRICE,recommended value is 0.00000040
TOKEN_DECIMALS is the decimals of the token, which varies per token. Here we set it 8.
We'll use the following utility functions:
  • addressToHash160 - Convert base58 address to hash160 address.
  • to32bytesArg left-pad hex data to 32 bytes with 0.
  • addDecimals multiply the nominal token amount by the number of decimal places.

Running QTUMD

You should remember to enable the indexing service when starting qtumd, using the flags -logevents -txindex.

Interacting With QRC20

In the CLI examples below, please substitute {} with actual addresses and values.

Getting Token Balance

  • $userAddress is the deposit address
qtum-cli callcontract \
In the JSON output look for executionResult.output. This is the token balance.


  • $userAddress is the withdraw address
  • $amount the withdraw amount in unit token
qtum-cli sendtocontract \
a9059cbb{to32bytesArg(addressToHash160($userAddress))}{to32bytesArg(addDecimals($amount)) \
0 \
The command returns the txid of this transaction. You may use it to find information about this transaction (e.g. number of confirmations).

Generate a deposit address

For an exchange, a user may use the same address for both QTUM and other QRC20 tokens.
Use this command to generate a deposit address:
qtum-cli getnewaddress

Deposit and Witdraw Logs

  • $startingBlock is where you want to start looking (inclursive)
    • You can start looking from 0, but for better efficiency, you should remember where to start looking.
qtum-cli searchlogs \
999999999 \
'{ "addresses": ["TOKEN_CONTRACT_ADDRESS"]}' \
'{"topics": ["ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}'
The event type filtered is the Transfer event:
event Transfer(address indexed _from, address indexed _to, uint256 _value)
Look through the logs to filter by to or from addresses.

Checking Confirmations

Given a transaction id $txid:
qtum-cli gettransaction $txid
Use the property confirmations from output.