New:Introducing Socket Scanning for VS Code Marketplace Extensions.Learn more →
Get Started

@layerhop/sdk

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@layerhop/sdk

LayerHop SDK — best-price cross-chain and same-chain swaps

latest
Source
npmnpm
Version
0.7.0
Version published
Weekly downloads
906
Maintainers
1
Weekly downloads
 
Created
Source

@layerhop/sdk

npm license docs

Typed TypeScript client for the LayerHop API: best-price cross-chain and same-chain swaps across EVM chains and Solana through one non-custodial API.

  • Zero runtime dependencies. Uses the global fetch; works in Node 18+, browsers, Deno, Bun, edge runtimes and React Native.
  • ESM + CommonJS builds with bundled type definitions.
  • Never holds keys. It fetches quotes and builds unsigned transactions; your wallet signs.

Install

npm install @layerhop/sdk
# or: pnpm add @layerhop/sdk / yarn add @layerhop/sdk / bun add @layerhop/sdk

Quickstart

Amounts are always integer strings in base units (100 USDC = "100000000"), never floats.

import { LayerHop, LayerHopApiError } from "@layerhop/sdk";

const lh = new LayerHop({ apiKey: process.env.LAYERHOP_API_KEY, integrator: "myapp" });

// 1. Quote every provider; `best` is the highest output for the user.
const { best } = await lh.quote({
  srcChain: "base", srcToken: "USDC", amount: "100000000",
  dstChain: "solana", dstToken: "SOL",
  sender: "0xYourEvmAddress", recipient: "YourSolanaAddress",
});

// 2. Build the unsigned transaction (EVM txs may include an `approval` to send first).
const tx = await lh.buildTx(best.quoteId);

// 3. Sign and send with your own wallet stack (viem, ethers, wallet adapter...), then report it.
//    const hash = await wallet.sendTransaction(tx);
//    await lh.reportSubmitted(best.quoteId, hash);

// 4. Track until filled / refunded / failed.
//    for await (const s of lh.watch(best.provider, hash)) console.log(s.state);

Errors are thrown as LayerHopApiError with a stable code (see the error catalog):

try {
  await lh.buildTx(quoteId);
} catch (e) {
  if (e instanceof LayerHopApiError && e.code === "QUOTE_EXPIRED") {
    // re-quote
  }
}

API

MethodEndpointWhat
quote(params)GET /v1/quoteEvery successful quote, best for the user first.
buildTx(quoteId)POST /v1/ordersThe unsigned transaction for a quote (EvmTx or SvmTx).
submit(quoteId, signedTx)POST /v1/orders/submitSolana txs with submitViaApi: send the signed tx through LayerHop.
reportSubmitted(quoteId, txHash)POST /v1/orders/{quoteId}/submittedTell LayerHop the tx was broadcast.
simulate(quoteId)POST /v1/simulateDry-run the tx (EVM eth_call + gas, Solana simulateTransaction).
listOrders(params)GET /v1/ordersOrders from or to an address, newest first.
status(provider, id)GET /v1/orders/{provider}/{id}Order status.
watch(provider, id, opts?)polls statusAsync generator yielding each state change until final.
serviceStatus()GET /v1/statusPlatform status (status.layerhop.com): components, 90-day uptime, incidents.
checkout.create / get / list / expire / quote / stream/v1/checkout/sessionsCheckout sessions ("pay with any token").
checkout.products.*/v1/checkout/productsFixed-price products for payment buttons and /buy/{id} links.
checkout.refunds.create(sessionId, params?) / .list(sessionId)/v1/checkout/sessions/{id}/refundsRefund a paid session from your own wallet (build, sign, report).
invoices.create / get / list / update / send / void/v1/invoicesInvoices emailed to a customer and paid through checkout (API key).
invoices.publicView(id) / invoices.pay(id)/v1/invoices/{id}/public, /payThe customer's side (public).
subscriptions.create / get / list / update / cancel / pause / resume / invoices/v1/subscriptionsRecurring billing: an invoice emailed every period (API key).
depositAddresses.create / get / list / refresh / disable / simulate/v1/deposit-addressesDeposit addresses (beta): your user sends tokens to an address, no wallet connection (API key).

Invoices and refunds

const lh = new LayerHop({ apiKey: process.env.LAYERHOP_API_KEY });

// Bill a customer: emailed from billing@layerhop.com, paid at layerhop.com/invoice/{id}.
const invoice = await lh.invoices.create({
  customerEmail: "ap@client.example",
  lineItems: [{ description: "Design work", quantity: 2, unitAmount: "500000000" }], // 2 × 500 USDC
  settleChain: "base", settleToken: "USDC", recipient: "0xYourPayoutAddress",
  send: true,
});

// Bill every month: LayerHop emails each period's invoice; unpaid → past_due, reminders, cancel after 7 days.
const sub = await lh.subscriptions.create({
  customerEmail: "ada@example.com", interval: "month", description: "Pro plan",
  amount: "49000000", settleChain: "base", settleToken: "USDC", recipient: "0xYourPayoutAddress",
});
await lh.subscriptions.cancel(sub.id, { atPeriodEnd: true });

// Refund a paid session from your wallet (non-custodial): build, sign, report.
const { refund, quote } = await lh.checkout.refunds.create("cs_...", { amount: "10000000", reason: "Partial refund" });
const tx = await lh.buildTx(quote.quoteId);            // sign and broadcast from quote.from
await lh.reportSubmitted(quote.quoteId, "0xTxHash");   // the refund completes when the order fills

Deposit addresses (beta)

// Your user sends USDC on Base to da.address; USDC arrives on Arbitrum. Each deposit is an order.
const da = await lh.depositAddresses.create({
  srcChain: "base", srcToken: "USDC", dstChain: "arbitrum", dstToken: "USDC",
  recipient: "0xUserOnArbitrum", refundTo: "0xUserOnBase",
});
await lh.depositAddresses.refresh(da.id);                                 // "I sent it": check now
const { deposits } = await lh.depositAddresses.get(da.id);               // orders with depositAddressId
await lh.depositAddresses.simulate(da.id, { amount: "25000000" });       // test keys only

Options for new LayerHop(options): baseUrl (default https://api.layerhop.com), apiKey, channel, integrator, integratorFeeBps, fetch, streaming ("auto" | "fetch" | "xhr": how Server-Sent Events streams are read; auto falls back to XMLHttpRequest where fetch can't stream, as in React Native).

The package also exports the chain and token registry (CHAINS, getChain, TOKENS, findToken, SOLANA_CHAIN_ID, EVM_NATIVE, SOL_NATIVE) and all request/response types.

Full reference: https://docs.layerhop.com/sdk.

License

MIT

Keywords

layerhop

FAQs

Package last updated on 19 Oct 2026

Related posts