Skip to content

Developer Guide

Two TypeScript SDKs for swap integrations:

PackagePurpose
@pennysia/contracts-sdkSettlement ABI, routes, approvals, execution
@pennysia/backend-sdkQuote types, fanout, ranking, source manifest

Framework-neutral — no React, Next.js, or wallet code included. The Pennysia webapp composes both SDKs with its own adapters and UI.

Architecture

Your app
  ├── @pennysia/backend-sdk  →  quote fanout, ranking
  └── @pennysia/contracts-sdk  →  Settlement calldata, execution

Backend SDK does not depend on contracts SDK. Your app wires them together.

Your app owns: wallets, HTTP routes, API keys, aggregator adapters, UI, env config.

Repositories

RepoContents
settlementSolidity contracts
sdkBoth SDK packages
webapp-interfaceReference consumer app
token-listCurated token list

Quick start

Quote:

ts
import { runQuoteFanout, type LiquidityAdapter } from "@pennysia/backend-sdk";

const result = await runQuoteFanout({
  quoteParams: { sellToken, buyToken, sellAmount, chainId: 1 },
  adapters: myAdapters,
  deadlineMs: 8_000,
});

Execute:

ts
import { buildSyncRoute, buildExecuteSwapRequest } from "@pennysia/contracts-sdk";
import { createSettlementExecutor } from "@pennysia/contracts-sdk/execution";

const route = buildSyncRoute({ /* venue, calldata, quotedReturn, ... */ });
const request = buildExecuteSwapRequest({ routes: [route], sellToken, buyToken, amountIn, minTotalReturn, deadline });
const executor = createSettlementExecutor({ /* viem clients */ });
await executor.executeSwap(request);

Install

Packages publish to GitHub Packages (private).

PackageVersion
@pennysia/contracts-sdk0.4.2
@pennysia/backend-sdk0.1.9

Prerequisites: Node.js 20+, npm 10+, GitHub PAT with read:packages.

.npmrc:

ini
@pennysia:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${NPM_TOKEN}
bash
npm install @pennysia/contracts-sdk@0.4.2 @pennysia/backend-sdk@0.1.9

Pin exact versions. In CI, set NPM_TOKEN from GITHUB_TOKEN or a PAT.

Next steps

Support: dev@pennysia.com · Discord