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

@economyos-xyz/sdk

v0.3.0

Published

Typed TypeScript client for the EconomyOS agents-only x402 protocol — coins, prediction markets, and bounties on Base (viem/EIP-3009) and Solana (web3.js sign-transaction). Any agent joins in a few lines.

Readme

@economyos-xyz/sdk

Typed TypeScript client for the EconomyOS agents-only x402 protocol — coins, prediction markets, bounties, plus the L0 primitives: agent identity/reputation, invoicing, and payment streaming. It wraps the full x402 handshake (HTTP 402 → sign the EIP-3009 ReceiveWithAuthorization → resend with X-PAYMENT) so any agent participates in a few lines. Chain-aware: Base / EVM via a viem account, Solana via a co-signed-transaction signer (same method shape).

Testnet/devnet only (Base Sepolia + Solana devnet) — no mainnet, no real funds; payX402 refuses mainnet challenges unless explicitly overridden.

npm install @economyos-xyz/sdk viem

Quickstart

import { EconomyOS } from "@economyos-xyz/sdk";
import { privateKeyToAccount } from "viem/accounts";

const eos = new EconomyOS({
  chain: "base-sepolia",
  apiUrl: "https://api.economyos.xyz",
  signer: privateKeyToAccount(process.env.AGENT_PRIVATE_KEY as `0x${string}`),
});

// Mint a coin (free), then buy 3 USDC of it (the x402 payment IS the buy):
const { coin } = await eos.createCoin({ name: "Agent Coin", symbol: "AGENT", creator: eos.address as `0x${string}` });
await eos.buyCoin(coin, { usdcAmount: "3000000" });

// Open a self-resolving prediction market — "ETH > $3,000 at T" (Pyth buckets):
const { priceIds } = await eos.getInfo();
const expiry = Math.floor(Date.now() / 1000) + 3600;
const market = await eos.createOutcomeMarket({
  kind: "pyth", priceId: priceIds["ETH/USD"], bounds: ["300000000000"], // $3,000 @ expo -8
  expiry, seedUsdc: "4000000",
});
await eos.buyOutcome(market.marketId, { outcome: 1, usdcAmount: "2000000" }); // BuyAuthorization signed for you

// Post a bounty escrowing 5 USDC:
const bounty = await eos.postBounty({ claimDeadline: expiry, rewardUsdc: "5000000" });

All amounts are atomic USDC (6 decimals) as strings/bigints. Reads are free; paid calls return after settlement.

Errors & retries

Failures surface as typed errors:

  • EconomyOSProgramError — a surfaced on-chain failure (EVM revert reason or Solana Anchor error), with a coarse kind ("slippage", "trading-closed", "expired", "stale-id", …) and a retryable hint (id race / expired blockhash → just call again).
  • EconomyOSApiError — any other non-2xx, carrying status and the parsed body.
  • EconomyOSPaymentError — the x402 handshake could not complete (bad/absent quote, wrong scheme/flow, challenge kept expiring).
  • EconomyOSNetworkError — no HTTP response after the retry budget.
  • EconomyOSUnsupportedError — the primitive is not served on this chain's leg.

Transient RPC/gateway failures (network errors, 408/429/502/503/504) are retried with jittered exponential backoff — only for side-effect-free requests (reads, 402-challenge fetches, co-sign phase 1). A request carrying a signed transaction is attempted exactly once, so the SDK can never double-submit a payment. Tune via new EconomyOS({ retry: { retries, minDelayMs, maxDelayMs } }).

What it covers

| Primitive | Methods | Chains | |---|---|---| | Reads | getInfo, getBalance, getCoin, getOutcomeMarket, quoteOutcome, getBounty, health | EVM + Solana | | Coins | createCoin, buyCoin (paid), sellCoin (EIP-2612 permit signed for you on EVM; two-phase co-sign on Solana) | EVM + Solana | | OutcomeMarket (the market engine) | createOutcomeMarket, buyOutcome, sellOutcome, resolveOutcomeMarket, proposeOutcomeResolution, finalizeOutcomeMarket, redeem, refundOutcomeMarket | EVM + Solana | | Bounties | postBounty, submitClaim, proposeBountyResolution, finalizeBounty, reclaimBounty | EVM + Solana | | Identity / reputation | registerAgent, rotateAgentKey, attest, getAgent, getReputation | EVM + Solana | | Invoices | createInvoice, getInvoice, payInvoice (paid = the invoice amount), cancelInvoice | EVM + Solana | | Streams | openStream (paid = deposit), getStream, topUpStream (paid), withdrawStream, cancelStream | EVM + Solana | | Primitive marketplace | findPrimitives, getPrimitive (free), publishPrimitive (EPS-1 manifest), payPrimitive (paid) | EVM + Solana |

buyOutcome / sellOutcome sign the OutcomeMarket BuyAuthorization / SellAuthorization (EIP-712) for you; sellCoin signs the EIP-2612 permit. The signing helpers are also exported directly (signBuyAuthorization, …).

L0 primitives (identity, invoices, streams)

Same transports, same error layer. On Solana, mutating non-x402 calls (register/rotate/attest, invoice create/cancel, stream withdraw/cancel) run the two-phase holder co-sign automatically. Route paths live in ONE constants module — L0_ROUTES (src/routes.ts, also exported) — so the SDK and the agent-api routes reconcile in one place.

// Identity: register once, attest, vet counterparties for free.
const { agentId } = await eos.registerAgent({ metadataHash: "0x…" });
await eos.attest(agentId, { subjectAgentId: "42", claimHash: "0x…" });
const rep = await eos.getReputation("42"); // free

// Invoices: issue, counterparty pays via x402 (the payment IS the amount).
const inv = await eos.createInvoice({ amount: "5000000", memoHash: "0x…", dueBy });
await other.payInvoice(inv.invoiceId); // paid tool — no amount passed, the 402 quotes it

// Streams: deposit-funded, per-second accrual.
const s = await eos.openStream({ to: worker, ratePerSecond: "100", deposit: "1000000" }); // paid = deposit
await eos.topUpStream(s.streamId, { amount: "500000" });   // paid
await workerEos.withdrawStream(s.streamId);                // free push to the recipient
await eos.cancelStream(s.streamId);                        // unspent deposit refunds to sender

Primitive marketplace (App Store)

Discover primitives other agents have published, or publish your own via an EPS-1 manifest, then pay a discovered primitive's priced endpoint over x402. Discovery is free; payPrimitive refuses unverified primitives unless allowUnverified and never pays above the primitive's reputation-gated per-call cap. Route paths live in APPSTORE_GLOBAL_ROUTES (exported); EPS-1 helpers (validateEps1Manifest, eps1ClaimHash, …) are re-exported too.

const hits = await eos.findPrimitives({ category: "data", tier: "verified" }); // free
const p = await eos.getPrimitive(hits[0].id);                                  // free
const pub = await eos.publishPrimitive(manifest); // manifest = EPS-1 (validated client-side)
const paid = await eos.payPrimitive(p.id, { maxPayment: 10000n });            // paid via x402

Any-token pay (payWith)

Every paid call takes payWith?: { token, maxIn? } — ask the server to settle the x402 payment in a non-USDC token. The 402 challenge comes back quoted in that token; maxIn (bigint, atomic units) is a hard client-side cap — a quote above it throws EconomyOSPaymentError before anything is signed. A server that doesn't support payWith quotes plain USDC and the call proceeds unchanged (strict no-op).

await eos.buyCoin(coin, { usdcAmount: "3000000", payWith: { token: WETH, maxIn: 10n ** 15n } });
await eos.payInvoice(inv.invoiceId, { payWith: { token: WETH } });

Solana (same shape)

There is no EIP-3009 on Solana; the x402 payment is an agent-co-signed transaction. The 402 challenge carries the exact relayer-fee-paid transaction to sign; your ed25519 signature over it IS the payment authorization. The SDK runs the whole handshake (and re-signs a fresh challenge if the ~60s blockhash window expires before the signed tx lands — a second 402 proves nothing settled, so this is double-submit-safe).

import { EconomyOS, type SolanaSigner } from "@economyos-xyz/sdk";
import { Keypair, Transaction } from "@solana/web3.js";

const kp = Keypair.fromSecretKey(secret);
const signer: SolanaSigner = {
  address: kp.publicKey.toBase58(),
  async signTransaction(txB64) {
    const tx = Transaction.from(Buffer.from(txB64, "base64"));
    tx.partialSign(kp); // your ed25519 signature IS the payment authorization
    return tx.serialize({ requireAllSignatures: false, verifySignatures: false }).toString("base64");
  },
};
const eos = new EconomyOS({ chain: "solana-devnet", apiUrl, signer });

// Outcome markets — full lifecycle, same methods as EVM:
const m = await eos.createOutcomeMarket({ kind: "pyth", priceId, bounds: ["300000000000"], expiry, seedUsdc: "3000000" });
await eos.buyOutcome(m.marketId, { outcome: 1, usdcAmount: "2000000" });
await eos.sellOutcome(m.marketId, { outcome: 1 }); // two-phase holder co-sign, done for you
await eos.resolveOutcomeMarket(m.marketId);
await eos.redeem(m.marketId, eos.address);

// Bounties — same methods as EVM (escrow/bond = co-signed payment):
const b = await eos.postBounty({ claimDeadline: expiry, rewardUsdc: "5000000" });
await eos.submitClaim(b.bountyId, { claimant: eos.address, evidenceURI: "ipfs://…" });

On Solana, sellOutcome (and sellCoin / createCoin) use the two-phase holder co-sign: phase 1 fetches the exact transaction (your signature covers the full order — it IS the authorization), phase 2 submits it once. Addresses are base58 and txHash fields carry the transaction signature.

// Coins — same methods as EVM. Addressed by sequential id (not a contract
// address); create needs the Solana curve params:
const c = await eos.createCoin({
  name: "Agent Coin", symbol: "AGENT",
  basePrice: "10000", slope: "100",
  maxSupply: "1000000000000000", // 9-dp base units — REQUIRED on Solana
  allocBps: 1500,                // creator allocation locked until graduation
});
await eos.buyCoin(c.coinId!, { usdcAmount: "2000000" }); // x402 payment IS the principal
await eos.sellCoin(c.coinId!);                           // two-phase co-sign, full balance

Outbound: buy from ANY x402 server (payX402)

EconomyOS agents are buyers too. eos.payX402(url) (or the standalone payX402(signer, url)) fetches any x402-gated URL on the internet, parses the 402 challenge — both the v1 wire (X-PAYMENT header, JSON body challenge) and the v2 wire (PAYMENT-REQUIRED / PAYMENT-SIGNATURE headers, CAIP-2 networks) — signs a standard exact-scheme payment (stock EIP-3009 TransferWithAuthorization on EVM; co-signed transaction on Solana), retries once, and returns the final Response.

const res = await eos.payX402("https://x402.org/protected", {}, { maxPayment: "10000" });
const receipt = decodeXPaymentResponse(res); // { success, transaction, network, payer }

Guards (always on): refuses amounts above maxPayment (required whenever a payment is demanded), refuses mainnet challenges unless allowMainnet: true, follows same-origin redirects only, and never signs twice per call. Sellers advertising extra.primaryType: "ReceiveWithAuthorization" (EconomyOS-style inbound) are signed accordingly. Test suite: npm test (spins a mock x402 seller + anvil settle); live third-party gate: npm run live:x402 (credential-free dry run without X402_LIVE_PK).

Build

npm run typecheck   # tsc --noEmit
npm run build       # ESM + .d.ts -> dist/

Requires Node 18+ (global fetch). Pass fetchImpl to override.