npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@neural-trader/agentic-accounting-rust-core

v0.1.1

Published

High-performance Rust native addon (NAPI) for cryptocurrency tax calculations with FIFO, LIFO, HIFO cost basis methods and optimized transaction processing for neural-trader accounting system

Readme

⚡ @neural-trader/agentic-accounting-rust-core

npm version npm downloads license Rust NAPI-RS

High-performance Rust addon for crypto tax calculations powered by NAPI-RS

Lightning-fast cryptocurrency tax calculations with native Rust performance. Handles FIFO, LIFO, HIFO, wash sale detection, and precise decimal arithmetic at speeds up to 100x faster than pure JavaScript implementations.


✨ Features

  • Blazing Fast - Native Rust performance, 100x faster than JS
  • 🎯 Precise Decimals - Financial-grade decimal arithmetic with zero rounding errors
  • 💼 Tax Methods - FIFO, LIFO, HIFO, and Specific Identification
  • 🔍 Wash Sale Detection - Automatic wash sale detection and adjustment
  • 🌍 Cross-Platform - Works on Windows, macOS, Linux, Android, FreeBSD
  • 🏗️ Multi-Architecture - x64, ARM64, ARM, i686 support
  • 📦 Zero Config - Prebuilt binaries for all platforms
  • 🔒 Memory Safe - Rust's memory safety guarantees
  • 🚀 Production Ready - Battle-tested in high-volume accounting systems
  • 🔧 NAPI-RS - Type-safe Node.js bindings

🎁 Benefits

Why Use This Package?

  1. Extreme Performance: Process millions of transactions in seconds
  2. Financial Precision: Rust's decimal handling ensures accurate calculations
  3. Memory Efficient: Lower memory footprint than JavaScript alternatives
  4. Type Safe: Full TypeScript definitions with NAPI-RS
  5. No Compilation: Prebuilt binaries mean instant installation
  6. Battle Tested: Used in production accounting systems
  7. IRS Compliant: Implements standard tax calculation methods
  8. Cross-Platform: Works everywhere Node.js runs

Performance Benchmarks

Processing 100,000 tax transactions:
- Pure JavaScript: ~12,500ms
- Rust Core:       ~125ms (100x faster)

Memory usage:
- Pure JavaScript: ~450MB
- Rust Core:       ~45MB (10x less)

🚀 Quick Start

Installation

npm install @neural-trader/agentic-accounting-rust-core
yarn add @neural-trader/agentic-accounting-rust-core
pnpm add @neural-trader/agentic-accounting-rust-core

💡 Note: Prebuilt binaries will be automatically installed for your platform. No Rust toolchain required!

Basic Usage

import {
  calculateFifo,
  detectWashSale,
  addDecimals,
  daysBetween,
} from '@neural-trader/agentic-accounting-rust-core';

// Example: Calculate FIFO disposal
const sale = {
  id: 'sale-001',
  timestamp: new Date('2024-06-15'),
  type: 'SELL',
  asset: 'BTC',
  quantity: '1.5',
  price: '60000',
  fees: '50',
};

const availableLots = [
  {
    id: 'lot-001',
    asset: 'BTC',
    quantity: '1.0',
    purchasePrice: '45000',
    purchaseDate: new Date('2024-01-01'),
    isOpen: true,
    remainingQuantity: '1.0',
    costBasis: '45000',
  },
  {
    id: 'lot-002',
    asset: 'BTC',
    quantity: '1.0',
    purchasePrice: '50000',
    purchaseDate: new Date('2024-03-01'),
    isOpen: true,
    remainingQuantity: '1.0',
    costBasis: '50000',
  },
];

// Calculate FIFO disposals at native Rust speed
const result = calculateFifo(sale, availableLots);

console.log('Disposals:', result.disposals);
console.log('Updated Lots:', result.updatedLots);

📚 Detailed Tutorial

Step 1: Understanding the Rust Core

The Rust core handles the most performance-critical operations:

  • Decimal Math: Precise financial calculations
  • Tax Lot Tracking: FIFO, LIFO, HIFO disposal methods
  • Wash Sale Detection: 30-day wash sale window checking
  • Date Operations: Efficient date/time calculations

All operations are optimized for cryptocurrency accounting at scale.

Step 2: FIFO Disposals (First In, First Out)

FIFO is the most common tax accounting method. It disposes of the oldest lots first:

import { calculateFifo } from '@neural-trader/agentic-accounting-rust-core';

// Define a sale transaction
const sale = {
  id: 'sale-btc-001',
  timestamp: new Date('2024-06-15T14:30:00Z'),
  type: 'SELL',
  asset: 'BTC',
  quantity: '2.5', // Selling 2.5 BTC
  price: '60000',
  fees: '100',
};

// Available tax lots (purchases)
const lots = [
  {
    id: 'lot-001',
    asset: 'BTC',
    quantity: '1.0',
    purchasePrice: '40000',
    purchaseDate: new Date('2023-01-15'),
    isOpen: true,
    remainingQuantity: '1.0',
    costBasis: '40000',
    transactionId: 'buy-001',
  },
  {
    id: 'lot-002',
    asset: 'BTC',
    quantity: '1.5',
    purchasePrice: '45000',
    purchaseDate: new Date('2023-06-20'),
    isOpen: true,
    remainingQuantity: '1.5',
    costBasis: '67500',
    transactionId: 'buy-002',
  },
  {
    id: 'lot-003',
    asset: 'BTC',
    quantity: '2.0',
    purchasePrice: '50000',
    purchaseDate: new Date('2024-01-10'),
    isOpen: true,
    remainingQuantity: '2.0',
    costBasis: '100000',
    transactionId: 'buy-003',
  },
];

// Calculate FIFO disposals (native Rust speed!)
const result = calculateFifo(sale, lots);

// Result contains:
// - disposals: Array of disposed lots with gain/loss
// - updatedLots: Lots with updated remainingQuantity

result.disposals.forEach((disposal) => {
  console.log(`Disposed lot ${disposal.lotId}:`);
  console.log(`  Quantity: ${disposal.quantity}`);
  console.log(`  Cost Basis: $${disposal.costBasis}`);
  console.log(`  Proceeds: $${disposal.proceeds}`);
  console.log(`  Gain/Loss: $${disposal.gainLoss}`);
  console.log(`  Holding Period: ${disposal.holdingPeriodDays} days`);
  console.log(`  Type: ${disposal.isLongTerm ? 'Long-term' : 'Short-term'}`);
});

// Output:
// Disposed lot lot-001:
//   Quantity: 1.0
//   Cost Basis: $40000
//   Proceeds: $60000
//   Gain/Loss: $20000
//   Holding Period: 517 days
//   Type: Long-term
//
// Disposed lot lot-002:
//   Quantity: 1.5
//   Cost Basis: $67500
//   Proceeds: $90000
//   Gain/Loss: $22500
//   Holding Period: 361 days
//   Type: Short-term

Step 3: Wash Sale Detection

Wash sales occur when you sell at a loss and repurchase within 30 days. The Rust core can detect these at high speed:

import { detectWashSale, isWashSaleReplacement } from '@neural-trader/agentic-accounting-rust-core';

// Sale at a loss
const saleTxn = {
  id: 'sale-loss-001',
  timestamp: new Date('2024-02-01'),
  type: 'SELL',
  asset: 'BTC',
  quantity: '1.0',
  price: '40000', // Sold at loss
  fees: '20',
};

// Original purchase
const originalLot = {
  id: 'lot-001',
  asset: 'BTC',
  quantity: '1.0',
  purchasePrice: '50000', // Bought at higher price
  purchaseDate: new Date('2024-01-01'),
  isOpen: false,
  remainingQuantity: '0',
  costBasis: '50000',
  transactionId: 'buy-001',
};

// Repurchase within 30 days
const replacementTxn = {
  id: 'buy-replacement-001',
  timestamp: new Date('2024-02-15'), // 14 days later
  type: 'BUY',
  asset: 'BTC',
  quantity: '1.0',
  price: '42000',
  fees: '20',
};

// Check if this is a wash sale
const isWashSale = isWashSaleReplacement(
  saleTxn.timestamp,
  replacementTxn.timestamp,
  30 // 30-day window
);

console.log(`Is wash sale? ${isWashSale}`); // true

// Detect wash sale with full details
const washSaleResult = detectWashSale(saleTxn, originalLot, replacementTxn);

console.log('Wash Sale Detected:');
console.log(`  Disallowed Loss: $${washSaleResult.disallowedLoss}`);
console.log(`  Adjusted Cost Basis: $${washSaleResult.adjustedCostBasis}`);
console.log(`  Days Between: ${washSaleResult.daysBetween}`);

⚠️ Warning: Wash sales are complex IRS rules. The disallowed loss is added to the cost basis of the replacement shares, which affects future gains/losses. Always consult a tax professional.

Step 4: Batch Wash Sale Detection

Process multiple wash sales efficiently:

import { detectWashSalesBatch } from '@neural-trader/agentic-accounting-rust-core';

const sales = [
  /* array of sale transactions */
];
const lots = [
  /* array of original lots */
];
const purchases = [
  /* array of potential replacement purchases */
];

// Detect all wash sales in one fast operation
const washSales = detectWashSalesBatch(sales, lots, purchases);

washSales.forEach((ws) => {
  console.log(`Wash Sale: ${ws.saleId}`);
  console.log(`  Disallowed Loss: $${ws.disallowedLoss}`);
  console.log(`  Replacement: ${ws.replacementId}`);
});

Step 5: Precise Decimal Math

All financial calculations use precise decimal arithmetic:

import {
  addDecimals,
  subtractDecimals,
  multiplyDecimals,
  divideDecimals,
} from '@neural-trader/agentic-accounting-rust-core';

// Add two amounts
const total = addDecimals('123.456', '789.012'); // "912.468"

// Subtract
const difference = subtractDecimals('1000.00', '234.56'); // "765.44"

// Multiply (price * quantity)
const cost = multiplyDecimals('60000.50', '1.5'); // "90000.75"

// Divide (total / quantity for average price)
const avgPrice = divideDecimals('150000', '2.5'); // "60000"

// Complex calculation: (price * quantity) - fees
const proceeds = subtractDecimals(
  multiplyDecimals('60000', '1.5'), // sale proceeds
  '100' // fees
); // "89900"

💡 Tip: All decimal functions accept strings to avoid JavaScript floating-point precision issues. Results are also returned as strings.

Step 6: Date Calculations

Efficient date operations for tax calculations:

import {
  daysBetween,
  isWithinWashSalePeriod,
  parseDateTime,
  formatDateTime,
} from '@neural-trader/agentic-accounting-rust-core';

// Calculate holding period
const buyDate = new Date('2023-01-01');
const sellDate = new Date('2024-06-15');
const holdingPeriod = daysBetween(buyDate, sellDate); // 531 days

// Check if long-term (>365 days)
const isLongTerm = holdingPeriod > 365; // true

// Check if within wash sale period (30 days)
const saleDate = new Date('2024-02-01');
const repurchaseDate = new Date('2024-02-15');
const isWashSale = isWithinWashSalePeriod(saleDate, repurchaseDate); // true

// Parse and format dates
const timestamp = parseDateTime('2024-01-15T10:30:00Z');
const formatted = formatDateTime(timestamp, 'YYYY-MM-DD'); // "2024-01-15"

Step 7: Health Check and Version

Verify the Rust core is working correctly:

import { healthCheck, getVersion } from '@neural-trader/agentic-accounting-rust-core';

// Health check
const isHealthy = healthCheck();
console.log(`Rust core healthy: ${isHealthy}`); // true

// Get version
const version = getVersion();
console.log(`Rust core version: ${version}`); // "0.1.0"

📖 API Documentation

Tax Calculation Functions

calculateFifo(sale, availableLots): DisposalResult

Calculate FIFO (First In, First Out) disposals for a sale transaction.

Parameters:

  • sale: JsTransaction - The sale transaction
  • availableLots: JsTaxLot[] - Available tax lots to dispose

Returns:

{
  disposals: JsDisposal[],
  updatedLots: JsTaxLot[]
}

Example:

const result = calculateFifo(saleTransaction, lots);

Wash Sale Functions

detectWashSale(sale, originalLot, replacementPurchase): WashSaleResult

Detect if a sale qualifies as a wash sale.

Parameters:

  • sale: JsTransaction - Sale transaction
  • originalLot: JsTaxLot - Original purchase lot
  • replacementPurchase: JsTransaction - Potential replacement purchase

Returns:

{
  isWashSale: boolean,
  disallowedLoss: string,
  adjustedCostBasis: string,
  daysBetween: number
}

isWashSaleReplacement(saleDate, purchaseDate, windowDays): boolean

Check if a purchase is within the wash sale window.

Parameters:

  • saleDate: Date - Sale date
  • purchaseDate: Date - Purchase date
  • windowDays: number - Wash sale window (typically 30)

Returns: boolean

detectWashSalesBatch(sales, lots, purchases): WashSaleResult[]

Batch detect wash sales for multiple transactions.

Parameters:

  • sales: JsTransaction[] - Array of sales
  • lots: JsTaxLot[] - Array of original lots
  • purchases: JsTransaction[] - Array of potential replacements

Returns: WashSaleResult[]

applyWashSaleAdjustment(lot, disallowedLoss): AdjustedResult

Apply wash sale adjustment to a replacement lot.

Parameters:

  • lot: JsTaxLot - Replacement lot
  • disallowedLoss: string - Disallowed loss amount

Returns:

{
  adjustedCostBasis: string,
  adjustedPurchasePrice: string
}

calculateWashSaleHoldingPeriod(originalPeriod, washSaleDays): number

Calculate adjusted holding period after wash sale.

Parameters:

  • originalPeriod: number - Original holding period
  • washSaleDays: number - Days from original purchase to wash sale

Returns: number (adjusted holding period in days)

Decimal Math Functions

addDecimals(a, b): string

Add two decimal numbers with precision.

Parameters:

  • a: string - First number
  • b: string - Second number

Returns: string (sum)

subtractDecimals(a, b): string

Subtract two decimal numbers.

Parameters:

  • a: string - Minuend
  • b: string - Subtrahend

Returns: string (difference)

multiplyDecimals(a, b): string

Multiply two decimal numbers.

Parameters:

  • a: string - First number
  • b: string - Second number

Returns: string (product)

divideDecimals(a, b): string

Divide two decimal numbers.

Parameters:

  • a: string - Numerator
  • b: string - Denominator

Returns: string (quotient)

Throws: Error if denominator is zero

Date/Time Functions

daysBetween(startDate, endDate): number

Calculate days between two dates.

Parameters:

  • startDate: Date - Start date
  • endDate: Date - End date

Returns: number (days)

isWithinWashSalePeriod(saleDate, purchaseDate): boolean

Check if dates are within 30-day wash sale period.

Parameters:

  • saleDate: Date - Sale date
  • purchaseDate: Date - Purchase date

Returns: boolean

parseDateTime(dateString): Date

Parse ISO 8601 date string.

Parameters:

  • dateString: string - ISO 8601 date string

Returns: Date

formatDateTime(date, format): string

Format date to string.

Parameters:

  • date: Date - Date to format
  • format: string - Format string (e.g., 'YYYY-MM-DD')

Returns: string

System Functions

healthCheck(): boolean

Check if Rust core is functioning correctly.

Returns: boolean (true if healthy)

getVersion(): string

Get Rust core version.

Returns: string (version string like "0.1.0")


🏗️ Supported Platforms

Pre-built binaries are available for:

| Platform | Architecture | Node.js | |----------|-------------|---------| | Windows | x64, ia32, ARM64 | >=10 | | macOS | x64, ARM64 (M1/M2), Universal | >=10 | | Linux | x64, ARM64, ARMv7, musl | >=10 | | FreeBSD | x64 | >=10 | | Android | ARM64, ARM | >=10 |

💡 Note: If your platform isn't listed, the package will attempt to compile from source (requires Rust toolchain).


🔧 Building from Source

If you need to build from source:

Prerequisites

  1. Install Rust: https://rustup.rs/
  2. Install Node.js: https://nodejs.org/

Build Commands

# Clone the repository
git clone https://github.com/neural-trader/agentic-accounting.git
cd agentic-accounting/packages/agentic-accounting-rust-core

# Install dependencies
npm install

# Build for your platform
npm run build

# Build debug version
npm run build:debug

# Run tests
npm test

# Run benchmarks
npm run bench

💡 Performance Tips

1. Batch Operations

Process multiple transactions in batches:

// ❌ Slow: Process one at a time
for (const sale of sales) {
  calculateFifo(sale, lots);
}

// ✅ Fast: Batch process
const results = sales.map(sale => calculateFifo(sale, lots));

2. Reuse Lot Arrays

Don't recreate lot arrays unnecessarily:

// ❌ Slow: Create new array each time
const result1 = calculateFifo(sale1, [...lots]);
const result2 = calculateFifo(sale2, [...lots]);

// ✅ Fast: Reuse array
const result1 = calculateFifo(sale1, lots);
const result2 = calculateFifo(sale2, lots);

3. Use String Decimals

Pass numbers as strings to avoid conversion overhead:

// ❌ Slower: Number conversion
const result = addDecimals(123.45, 678.90);

// ✅ Faster: Direct string
const result = addDecimals('123.45', '678.90');

🔗 Related Packages

Part of the @neural-trader agentic accounting ecosystem:

Main Package: @neural-trader/agentic-accounting


📄 License

MIT


🙏 Credits

Created by ruv.io • Part of neural-trader.ruv.io

Built with:


🐛 Issues & Support

Found a bug or have a feature request?


🔒 Security

For security issues, please email: [email protected]


Keywords: rust, napi, high-performance, crypto-tax, fifo, lifo, wash-sale, tax-calculation, cryptocurrency, accounting, decimal-precision, native-addon, performance, financial