This guide provides step-by-step instructions for enabling tokens on Stellar using the Adamik API. On the Stellar network, before you can receive or hold custom assets (tokens), you must establish a trustline to the asset’s issuer. This process is called “enabling a token” or “creating a trustline.”
Stellar requires users to explicitly opt-in to hold custom assets as a security measure. This prevents unwanted tokens from being sent to your account without your permission.
Understanding Stellar Assets
On Stellar, all assets except the native XLM are identified by:
- Asset Code: A 1-12 character alphanumeric code (e.g., “USDC”, “EURC”)
- Issuer Address: The Stellar account that created and issued the asset
Together, these form a unique identifier for each asset on the network.
Prerequisites
Before enabling a token, ensure you have:
- A funded Stellar account (minimum 1 XLM for base reserve)
- Your account’s secret key for signing transactions
- The asset code and issuer address of the token you want to enable
- An Adamik API key from dashboard.adamik.io
Each trustline requires 0.5 XLM to be locked as a base reserve. This XLM becomes available again if you remove the trustline.
Step-by-Step Tutorial
Step 1: Prepare Your Request
To enable a token, use the /api/stellar-testnet/transaction/encode
endpoint with the enable_token
mode:
{
"transaction": {
"data": {
"chainId": "stellar-testnet",
"mode": "enable_token",
"tokenId": "USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5",
"senderAddress": "GCZ2GEDRGWOB42FGJM3UVW2PQPOTKAUD5TFYUIVTJZR3ROCBJATPGB4R",
"format": "json"
}
}
}
The tokenId
field follows the format: ASSET_CODE:ISSUER_ADDRESS
Step 2: API Response
The API returns an encoded transaction ready for signing:
{
"chainId": "stellar-testnet",
"transaction": {
"data": {
"mode": "enable_token",
"senderAddress": "GCZ2GEDRGWOB42FGJM3UVW2PQPOTKAUD5TFYUIVTJZR3ROCBJATPGB4R",
"tokenId": "USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5",
"fees": "100"
},
"encoded": [
{
"raw": {
"format": "XDR",
"value": "cee0302d59844d32bdca915c8203dd44b33fbb7edc19051ea37abedf28ecd472..."
},
"hash": {
"format": "sha256",
"value": "a1b2c3d4e5f6..."
}
}
]
}
}
Step 3: Sign the Transaction
For Stellar, you must sign the transaction hash (not the raw transaction):
const { Keypair } = require("@stellar/stellar-sdk");
// Your wallet's secret key
const secretKey = "SBFZCHU5645DOKRWYBXVOXY2ELGJKFRX6VGGPRYUWHQ7PMXXJNDZFMKD";
const keypair = Keypair.fromSecret(secretKey);
// Extract and sign the hash
const hashToSign = encodedData.transaction.encoded[0].hash.value;
const hashBuffer = Buffer.from(hashToSign, 'hex');
const signature = keypair.sign(hashBuffer);
const signatureHex = signature.toString('hex');
Step 4: Broadcast the Signed Transaction
Send the signed transaction back to Adamik for broadcasting:
{
"transaction": {
"data": {
"mode": "enable_token",
"senderAddress": "GCZ2GEDRGWOB42FGJM3UVW2PQPOTKAUD5TFYUIVTJZR3ROCBJATPGB4R",
"tokenId": "USDC:GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5",
"fees": "100"
},
"encoded": [...],
"signature": "5a3e0ec98d7475332f09900cd6f2ef6e266fdb4f95b2800ee9c0244a6dba70cf..."
}
}
Use the /api/stellar-testnet/transaction/broadcast
endpoint to broadcast.
Step 5: Verify the Transaction
Upon successful broadcast, you’ll receive a transaction hash:
{
"hash": "7f8e9d0c1b2a3..."
}
You can view the transaction on Stellar Expert:
https://stellar.expert/explorer/testnet/tx/{hash}
Complete Code Example
Here’s a complete Node.js example for enabling a token on Stellar testnet:
const { Keypair } = require("@stellar/stellar-sdk");
async function enableStellarToken() {
// Configuration
const ADAMIK_API_KEY = "your-adamik-api-key";
const secretKey = "your-stellar-secret-key";
const assetCode = "USDC";
const issuerAddress = "GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5";
// Create keypair
const keypair = Keypair.fromSecret(secretKey);
const senderAddress = keypair.publicKey();
// Step 1: Encode the enable_token transaction
const encodeResponse = await fetch(
"https://api.adamik.io/api/stellar-testnet/transaction/encode",
{
method: "POST",
headers: {
Authorization: ADAMIK_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
transaction: {
data: {
chainId: "stellar-testnet",
mode: "enable_token",
tokenId: `${assetCode}:${issuerAddress}`,
senderAddress: senderAddress,
format: "json",
},
},
}),
}
);
const encodedData = await encodeResponse.json();
if (!encodeResponse.ok) {
console.error("Failed to encode:", encodedData);
return;
}
console.log("Trustline transaction encoded successfully");
// Step 2: Sign the transaction hash
const hashToSign = encodedData.transaction.encoded[0].hash.value;
const hashBuffer = Buffer.from(hashToSign, 'hex');
const signature = keypair.sign(hashBuffer);
const signatureHex = signature.toString('hex');
// Step 3: Broadcast the signed transaction
const broadcastResponse = await fetch(
"https://api.adamik.io/api/stellar-testnet/transaction/broadcast",
{
method: "POST",
headers: {
Authorization: ADAMIK_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
transaction: {
data: encodedData.transaction.data,
encoded: encodedData.transaction.encoded,
signature: signatureHex,
},
}),
}
);
const result = await broadcastResponse.json();
if (broadcastResponse.ok && result.hash) {
console.log(`✅ Token enabled successfully!`);
console.log(`Transaction hash: ${result.hash}`);
console.log(`View on explorer: https://stellar.expert/explorer/testnet/tx/${result.hash}`);
} else {
console.error("Broadcast failed:", result);
}
}
enableStellarToken().catch(console.error);
Common Testnet Tokens
Here are some commonly used tokens on Stellar testnet for testing:
Asset Code | Issuer | Description |
---|
USDC | GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5 | USD Coin Test |
SRT | GCDNJUBQSX7AJWLJACMJ7I4BC3Z47BQUTMHEICZLE6MU4KQBRYG5JY6B | Stellar Reference Token |
EURC | GB3Q6QDZYTHWT7E5PVS3W7FUT5GVAFC5KSZFFLPU25GO7VTC3NM2ZTVO | Euro Coin Test |
Troubleshooting
Common Errors and Solutions
Error | Cause | Solution |
---|
”Balance is too low” | Insufficient XLM for reserves | Ensure account has at least 1.5 XLM (1 XLM base + 0.5 XLM per trustline) |
“Asset issuer not found” | Invalid issuer address | Verify the issuer address is correct and active |
”Trustline already exists” | Token already enabled | The token is already enabled for your account |
”Invalid asset code” | Malformed asset code | Asset codes must be 1-12 alphanumeric characters |
Important Considerations
- Reserve Requirements: Each trustline locks 0.5 XLM as a base reserve
- Trust Limits: You can optionally set a maximum amount you’re willing to hold of an asset
- Asset Freezing: Some issuers can freeze assets - research issuers before trusting
- Removing Trustlines: You can only remove a trustline if your balance of that asset is zero
Next Steps
After enabling a token, you can:
- Receive the token from other accounts
- Trade the token on Stellar DEX
- Send the token to other accounts that have also enabled it
- Set up path payments using the token
For more information on Stellar assets and trustlines, visit the Stellar documentation.
Get Support
Need help? Connect with us: