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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@pricexyz/ts-sdk

v2.1.0

Published

The official Price SDK for TypeScript and JavaScript applications

Readme

@pricexyz/ts-sdk

The official Price SDK for TypeScript and JavaScript applications. Build powerful crypto applications with secure wallet management, real-time transaction monitoring, and seamless deposit/withdrawal flows.

npm version TypeScript

Installation

npm install @pricexyz/ts-sdk
# or
yarn add @pricexyz/ts-sdk
# or
pnpm add @pricexyz/ts-sdk
# or
bun add @pricexyz/ts-sdk

Quick Start

import { Price } from "@pricexyz/ts-sdk";

const price = new Price("sk_development_your_api_key_here");

// Create a wallet for a new user
const wallet = await price.wallets.create({
  type: "USER_WALLET",
  label: "User Wallet",
  externalUserId: "user_123",
});

// Get or create a deposit address when user requests it
const btcAddress = await price.wallets.getAddress(wallet.id, "BTC");
if (!btcAddress) {
  const newAddress = await price.wallets.createAddress(wallet.id, "BTC");
  console.log("New BTC address:", newAddress.address);
} else {
  console.log("Existing BTC address:", btcAddress.address);
}

// Listen for completed deposits
price.events.on("transaction.completed", (event) => {
  if (event.data.type === "INBOUND") {
    console.log("Deposit received:", event.data);
  }
});

User Registration Flow

When a user signs up on your website, create a Price wallet and store the wallet ID in your database:

import { Price } from "@pricexyz/ts-sdk";

const price = new Price("sk_development_your_api_key");

// User signs up on your website
async function handleUserSignup(userId: string, email: string) {
  // Create Price wallet
  const wallet = await price.wallets.create({
    type: "USER_WALLET",
    label: `User ${userId}`,
    externalUserId: userId,
    publicMetadata: { email },
  });

  // Store wallet ID in your database
  await db.users.update(userId, {
    priceWalletId: wallet.id,
  });

  return wallet;
}

Note: Price automatically generates some default asset addresses for the wallet, but not all supported assets.

Deposit Address Generation

When a user goes to the deposit page or requests a deposit address for a specific cryptocurrency:

// User requests deposit address for a specific asset
async function getDepositAddress(userId: string, assetId: string) {
  // Get user's wallet ID from your database
  const user = await db.users.findById(userId);
  const walletId = user.priceWalletId;

  // Check if address already exists
  const existingAddress = await price.wallets.getAddress(walletId, assetId);

  if (existingAddress) {
    // Address exists, return it
    return {
      address: existingAddress.address,
      assetId: existingAddress.assetId,
      balance: existingAddress.balance?.total || "0",
    };
  } else {
    // Address doesn't exist, create it
    const newAddress = await price.wallets.createAddress(walletId, assetId);
    return {
      address: newAddress.address,
      assetId: newAddress.assetId,
      balance: newAddress.balance?.total || "0",
    };
  }
}

// Example usage
const usdcAddress = await getDepositAddress("user_123", "USDC_ERC20");
console.log("USDC deposit address:", usdcAddress.address);

Deposit Monitoring

There are two ways to monitor deposits:

Option 1: Using Price SDK Events (Recommended)

// Listen for completed transactions (verified and confirmed deposits)
price.events.on("transaction.completed", async (event) => {
  const transaction = event.data;

  // Only process inbound transactions (deposits)
  if (transaction.type !== "INBOUND") return;

  // Get the wallet that received the deposit
  const wallet = await price.wallets.get(transaction.parentId);

  // Only process user wallets (not treasury/merchant wallets)
  if (wallet.type !== "USER_WALLET") return;

  const userId = wallet.externalUserId;
  if (!userId) return;

  // Credit the user's account in your database
  await db.transactions.create({
    userId,
    type: "deposit",
    amount: transaction.amount.base,
    usdAmount: transaction.amount.usd,
    assetId: transaction.assetId,
    status: "completed",
    blockchainTxHash: transaction.chainInfo.transactionHash,
    priceTransactionId: transaction.id,
  });

  console.log(
    `Deposit completed: ${transaction.amount.base} ${transaction.assetId} for user ${userId}`
  );
});

// Optional: Listen for transaction creation (for immediate notifications before confirmation)
price.events.on("transaction.created", async (event) => {
  const transaction = event.data;

  // Only process inbound transactions
  if (transaction.type !== "INBOUND") return;

  // Get the wallet that received the deposit
  const wallet = await price.wallets.get(transaction.parentId);

  // Only process user wallets
  if (wallet.type !== "USER_WALLET") return;

  const userId = wallet.externalUserId;
  if (!userId) return;

  // Send immediate notification to user (before blockchain confirmation)
  await notifyUser(userId, "deposit_detected", transaction);

  // Optional: Log pending deposit in your database
  await db.pendingDeposits.create({
    userId,
    amount: transaction.amount.base,
    assetId: transaction.assetId,
    priceTransactionId: transaction.id,
    status: "pending",
  });
});

Option 2: Using Webhooks

import { Webhooks } from "@pricexyz/ts-sdk";

// Set up webhook endpoint
const webhook = await price.webhooks.create({
  url: "https://yoursite.com/webhooks/price",
  events: ["transaction.completed", "transaction.created"],
});

console.log("Webhook secret:", webhook.secret); // Store this securely for signature verification

// In your webhook handler (Express.js example)
app.post("/webhooks/price", async (req, res) => {
  // Get signature from headers
  const signature = req.headers["x-webhook-signature"] as string;
  const rawBody = JSON.stringify(req.body);

  // Verify webhook signature for security
  const isValid = await Webhooks.verifySignature(
    rawBody,
    signature,
    webhook.secret
  );
  if (!isValid) {
    console.error("Invalid webhook signature");
    return res.status(401).send("Unauthorized");
  }

  const event = req.body;

  if (event.type === "transaction.completed" && event.data.type === "INBOUND") {
    const transaction = event.data;

    // Get the wallet that received the deposit
    const wallet = await price.wallets.get(transaction.parentId);

    // Only process user wallets
    if (wallet.type === "USER_WALLET" && wallet.externalUserId) {
      // Credit completed deposit
      await db.transactions.create({
        userId: wallet.externalUserId,
        type: "deposit",
        amount: transaction.amount.base,
        usdAmount: transaction.amount.usd,
        assetId: transaction.assetId,
        status: "completed",
        blockchainTxHash: transaction.chainInfo.transactionHash,
        priceTransactionId: transaction.id,
      });
    }
  }

  if (event.type === "transaction.created" && event.data.type === "INBOUND") {
    const transaction = event.data;

    // Get the wallet that received the deposit
    const wallet = await price.wallets.get(transaction.parentId);

    // Only process user wallets
    if (wallet.type === "USER_WALLET" && wallet.externalUserId) {
      // Send notification for pending deposit
      await notifyUser(wallet.externalUserId, "deposit_detected", transaction);
    }
  }

  res.status(200).send("OK");
});

Withdrawal Flow

When a user requests a withdrawal, use your merchant treasury wallet to send funds:

// Find treasury wallet (created by default) - do this once and store internally
let treasuryWallet = null;

async function getTreasuryWallet() {
  if (!treasuryWallet) {
    const wallets = await price.wallets.list();
    treasuryWallet = wallets.find((w) => w.type === "MERCHANT_WALLET");

    if (!treasuryWallet) {
      throw new Error("Treasury wallet not found");
    }
  }

  return treasuryWallet;
}

// Process withdrawal request
async function processWithdrawal(
  userId: string,
  assetId: string,
  amount: string,
  destinationAddress: string
) {
  // Verify user has sufficient balance in your database
  const userBalance = await db.userBalances.findOne({ userId, assetId });
  if (parseFloat(userBalance.amount) < parseFloat(amount)) {
    throw new Error("Insufficient balance");
  }

  // Get treasury wallet
  const treasury = await getTreasuryWallet();

  // Get or create treasury address for this asset
  let treasuryAddress = await price.wallets.getAddress(treasury.id, assetId);
  if (!treasuryAddress) {
    treasuryAddress = await price.wallets.createAddress(treasury.id, assetId);
  }

  // Create withdrawal transfer
  const transfer = await price.transfers.create({
    assetId,
    sourceAddressId: treasuryAddress.id,
    amount: { input: "NATIVE", amount }, // Use exact crypto amount
    destinationAddress: {
      type: "ONE_TIME_ADDRESS",
      address: destinationAddress,
    },
    metadata: {
      userId,
      type: "withdrawal",
      requestId: `withdrawal_${Date.now()}`,
    },
  });

  // Deduct from user's balance in your database
  await db.userBalances.decrement({ userId, assetId, amount });

  // Record withdrawal transaction
  await db.transactions.create({
    userId,
    type: "withdrawal",
    amount,
    assetId,
    status: "pending",
    destinationAddress,
    priceTransactionId: transfer.id,
  });

  return transfer;
}

// Example withdrawal
await processWithdrawal(
  "user_123",
  "USDC_ERC20",
  "100.50",
  "0x742d35Cc6634C0532925a3b8D6d0b7e5C7b9f1e5"
);

Core API Reference

Wallets

price.wallets.create(params)

Create a new wallet for a user or merchant.

const wallet = await price.wallets.create({
  type: 'USER_WALLET' | 'MERCHANT_WALLET',
  label?: string,
  externalUserId?: string,
  publicMetadata?: Record<string, any>,
  privateMetadata?: Record<string, any>
});

price.wallets.get(walletId)

Get wallet details by ID.

const wallet = await price.wallets.get("wallet_id");

price.wallets.list()

Get all wallets for your account.

const wallets = await price.wallets.list();

price.wallets.getAddress(walletId, assetId)

Get existing address for a cryptocurrency (returns null if doesn't exist).

const address = await price.wallets.getAddress(wallet.id, "BTC");

price.wallets.createAddress(walletId, assetId)

Create a new address for a cryptocurrency.

const address = await price.wallets.createAddress(wallet.id, "BTC");

price.wallets.listAddresses(walletId)

Get all addresses for a wallet.

const addresses = await price.wallets.listAddresses(wallet.id);

Transfers

price.transfers.create(params)

Create a transfer between addresses.

const transfer = await price.transfers.create({
  assetId: 'USDC_ERC20',
  sourceAddressId: 'source_address_id',
  amount: { input: 'NATIVE', amount: '100.50' }, // Exact crypto amount
  // OR
  amount: { input: 'USD', amount: 10050 }, // USD amount in cents
  destinationAddress: {
    type: 'ONE_TIME_ADDRESS',
    address: '0x742d35Cc6634C0532925a3b8D6d0b7e5C7b9f1e5'
  },
  // OR for internal transfers
  destinationAddress: {
    type: 'INTERNAL',
    addressId: 'destination_address_id'
  },
  metadata?: Record<string, any>
});

Transactions

price.transactions.get(transactionId)

Get transaction details and status.

const transaction = await price.transactions.get("txn_id");
console.log(transaction.status); // 'COMPLETED', 'PENDING_CONFIRMATION', etc.
console.log(transaction.chainInfo.transactionHash); // Blockchain hash

Assets

price.assets.list()

Get all supported cryptocurrencies.

const assets = await price.assets.list();

price.assets.get(assetId)

Get details for a specific cryptocurrency.

const bitcoin = await price.assets.get("BTC");
console.log(bitcoin.rate); // Current USD rate

Events

price.events.on(eventType, handler)

Listen for real-time events.

price.events.on("transaction.completed", (event) => {
  console.log("Transaction completed:", event.data);
});

price.events.on("transaction.created", (event) => {
  console.log("Transaction created:", event.data);
});

price.events.on("wallet.created", (event) => {
  console.log("Wallet created:", event.data);
});

Webhooks

price.webhooks.create(params)

Set up webhooks for server-to-server notifications.

const webhook = await price.webhooks.create({
  url: "https://yoursite.com/webhooks/price",
  events: ["transaction.completed", "transaction.created"],
});

price.webhooks.list()

Get all configured webhooks.

const webhooks = await price.webhooks.list();

price.webhooks.update(webhookId, params)

Update webhook configuration.

await price.webhooks.update(webhook.id, {
  events: ["transaction.completed"],
  url: "https://newsite.com/webhooks",
});

price.webhooks.delete(webhookId)

Delete a webhook.

await price.webhooks.delete(webhook.id);

Webhooks.verifySignature(rawBody, signature, secret)

Verify webhook signature for security.

// In your webhook handler
const signature = req.headers["x-webhook-signature"] as string;
const rawBody = JSON.stringify(req.body);
const isValid = await Webhooks.verifySignature(
  rawBody,
  signature,
  webhook.secret
);

if (!isValid) {
  return res.status(401).send("Unauthorized");
}

Supported Assets

  • Bitcoin: BTC
  • Ethereum: ETH, ETH_BASE
  • Stablecoins: USDC_ERC20, USDT_ERC20, USDC_POLYGON, USDT_TRC20, USDC_SOL, USDT_SOL, USDC_BASE, USDT_TON
  • Altcoins: ADA, AVAX, BCH, BNB, BNB_ERC20, DOGE, LTC, LTC_BEP20, MATIC, POL, SOL, SOL_BEP20, TRX, TRX_BEP20, XLM, XRP, TON, DASH, ETC
  • DeFi Tokens: UNI, SHIB, DAI_ERC20

Error Handling

import {
  PriceError,
  PriceAPIError,
  PriceAuthenticationError,
  PriceConnectionError,
} from "@pricexyz/ts-sdk";

try {
  const wallet = await price.wallets.create({
    type: "USER_WALLET",
    label: "Test Wallet",
  });
} catch (error) {
  if (error instanceof PriceAuthenticationError) {
    console.error("Invalid API key");
  } else if (error instanceof PriceAPIError) {
    console.error(`API error: ${error.statusCode} - ${error.message}`);
  } else if (error instanceof PriceConnectionError) {
    console.error("Connection failed");
  } else {
    console.error("Unexpected error:", error);
  }
}

TypeScript Support

import type {
  Wallet,
  Address,
  Asset,
  Transaction,
  Event,
  AssetId,
} from "@pricexyz/ts-sdk";

// All responses are fully typed
const wallet: Wallet = await price.wallets.create({
  type: "USER_WALLET",
  label: "Typed Wallet",
});

// Asset IDs are strongly typed
const supportedAssets: AssetId[] = ["BTC", "ETH", "USDC_ERC20"];