Skip to content

Transaction History ​

The transaction history functionality allows users to see their past incoming and outgoing transactions for a specific token. It is implemented using a specialized component that interacts with the blockchain abstraction layer to fetch transaction data.

Implementation Details ​

1. Token Interface ​

The core logic for fetching transactions resides in the Token interface (defined in src/api/common.ts). All supported blockchain tokens (EVM, TON, Solana, etc.) must implement the getTransactions method.

typescript
export interface TransactionInfo {
    id: string;
    success: boolean;
    confirmed: boolean,
    direction: "in" | "out";
    timestamp: number; // Unix timestamp
    amount: string;
    scannerUrl: string; // Link to block explorer
}

export interface Token {
    // ... other methods
    getTransactions(args: {
        owner: string,
        limit: number,
        offset?: number,
    }): Promise<{
        total: number,
        items: TransactionInfo[],
    }>;
}

2. Frontend Component: TokenTransactionList.vue ​

The TokenTransactionList component (located in src/components/TokenTransactionList.vue) is responsible for:

  • Fetching transaction data from the current selected token.
  • Managing pagination state.
  • Rendering the list of transactions with metadata (direction icons, status, formatted dates).
  • Handling "Pull to Refresh" functionality.

Key Functions: ​

  • getTransactionsList(): Fetches a page of transactions based on the current pagination.limit and offset.
  • refreshHandler(): Resets pagination to the first page and re-fetches data.
  • goToPage(pageNumber): Navigates to a specific page in the history.

3. Data Fetching Logic ​

Specific blockchain implementations (e.g., EvmErc20Token in src/api/evm/erc20-token.ts) use a HistoryProvider to retrieve raw transaction data from an indexer or API.

typescript
async getTransactions(args: {
    owner: string,
    limit: number,
    offset?: number,
}): Promise<{
    total: number,
    items: TransactionInfo[],
}> {
    if( !ethers.isAddress(args.owner) ) {
        return { total: 0, items: [] };
    }

    const offset = args.offset ?? 0;
    const allItems = await this._history.getTokenTransactions({
        token: this._address,
        owner: args.owner,
    });

    return {
        total: allItems.length,
        items: allItems.slice(offset, offset + args.limit),
    };
}

Usage Example ​

In a Vue Component ​

To display the transaction history list in a page (like the Send.vue page), you can use the TokenTransactionList component:

vue
<template>
  <div class="history-container">
    <div class="history-title">Transaction History</div>
    <!-- TokenTransactionList handles its own loading and fetching -->
    <TokenTransactionList 
      :historyPageLimit="10"
      minHeight="400px"
    />
  </div>
</template>

<script>
import TokenTransactionList from '@/components/TokenTransactionList.vue';

export default {
  components: {
    TokenTransactionList
  }
}
</script>

Programmatic Access ​

If you need to fetch transaction history manually from a token instance:

javascript
import { getToken } from '@/api/ApiHandler';

async function fetchHistory(tokenRoot, walletAddress) {
  try {
    const token = await getToken(tokenRoot);
    const result = await token.getTransactions({
      owner: walletAddress,
      limit: 5,
      offset: 0
    });
    
    console.log('Total transactions:', result.total);
    result.items.forEach(tx => {
      console.log(`TX: ${tx.id}, Amount: ${tx.amount}, Direction: ${tx.direction}`);
    });
  } catch (error) {
    console.error('Failed to fetch transactions:', error);
  }
}

User Interface Features ​

  • Direction Indicators: Green "NarrowDown" icon for incoming transactions ("in") and Red "NarrowUp" icon for outgoing transactions ("out").
  • Status Badges: Shows "Success", "Failed", or "Pending" based on transaction confirmation and success state.
  • Pagination: Allows users to navigate through large transaction histories using a page selector at the bottom.
  • Explorer Link: Each transaction item includes a link that opens the transaction in the respective blockchain's explorer (e.g., Etherscan).