Skip to main content
Our Solana assets schema comprises token transfers and credit debit tables.
TableDescription
BalancesTransaction-level balances of SOL and SPL tokens from genesis, plus latest balance snapshots updated hourly.
Token TransfersRecords transfers of SPL tokens and SOL from one address to another.
Credit DebitRecords amount and credit/debit direction for every transfer event of assets with USD value using double-entry bookkeeping.
Balance ChangesTransaction-level balance changes with counterparty attribution, consolidating balance changes per transaction.
PNLTransaction-level profit and loss records with realized and unrealized PNL calculations for portfolio analysis.

Edge cases in Solana transfers

There are several known edge cases of solana’s transfer activity.

1. Transfer of token account ownership as a means to move tokens

Although less conventional (and perhaps not recommended), it is possible to transfer the ownership of a token account. This is done via the setAuthority method. Allium’s coverage status: These transfers can be found with the filter transfer_type = 'token_account_transfer'

2. Return of SOL balances from account closures

When closing a token account, a non-WSOL account is guaranteed to have 0 balance when closing, so only the rent is returned to the destination of the close instruction. When closing a WSOL account, it is possible to have non-zero balance of WSOL tokens. Upon closing, these WSOL tokens will be returned as SOL tokens to the destination. Alium’s coverage status: when a token account is closed, both the rent return + remaining WSOL balance is summed and indicated in the amount transferred. Such records can be found with transfer_type='account_closure_sol_balance_transfer'.

3. Transfers by PDA not holding balances

It is possible for an account to send SOL (i.e. is the from party of a SOL transfer) without actually holding any balance. In this tx, the account B51Nfh3X6Dqu4BzsafwzeknU7n2CraNneLsdAfs3zaSU shows total outgoing transfers of 0.115 SOL, but based on the SOL Balance Change tab, the account starts with 0 SOL balance. In addition, the account did not have rent deposited, and no funding activity prior to the outgoing transfers. Allium’s coverage status: The transfers themselves are indexed. However, when closing such accounts (as explained in #4), it would then seem as though it has a negative balance to return. In our data, we set amount=0 for the such cases. In the current dataset this applies to 29/1.7b rows.

4. Invisible SOL transfers

It is possible to move SOL without calling the system transfer and transferChecked method. In this tx, there are no visible transfer instructions for the sale of the NFT (~0.27 SOL), but looking at the SOL Balance Change tab, the buyer and seller of the NFT indeed have their SOL balance changed. Allium’s coverage status: We currently use pre_balances and post_balances of the raw transaction data to infer amounts transferred, but only in the context of tensorswap sells (specifically the SellNftTokenPool method) to get NFT trades. All other indexing of invisible transfers will be on a case-by-case basis. If you intend to sum up transfers within a transaction for reconciliation, balance changes would be more suitable.

5. Collection of fees with TokenExtension program

In the TokenExtension program, in the fee extension, spl tokens can be collected by a fee authority using withdrawWithheldTokensFromAccounts and harvestWithheldTokensToMint. However, these 2 instructions do not generate transfer instructions, and the amount collected is not indicated. More info here and here. Allium’s coverage status: Transfers of spl tokens as a result of calling fee collection methods withdrawWithheldTokensFromAccounts and harvestWithheldTokensToMint are not indexed yet, we estimate that this results in <0.01% transfers being missing.