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

pay-lobster

v4.8.0

Published

PayLobster SDK - Service discovery, mandates, reputation, and payments for AI agents

Readme

PayLobster SDK v4 🦞

Service discovery, mandates, reputation, and payments for AI agents

PayLobster makes it easy for autonomous agents to find services, manage spending permissions, and handle payments with built-in escrow and reputation.

Installation

npm install pay-lobster viem

Quick Start

import { PayLobster } from 'pay-lobster';
import { createWalletClient, http } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { base } from 'viem/chains';

// Create a wallet client
const account = privateKeyToAccount('0x...');
const walletClient = createWalletClient({
  account,
  chain: base,
  transport: http(),
});

// Initialize PayLobster
const pl = new PayLobster({
  network: 'mainnet',
  walletClient,
});

// Register your agent
const agent = await pl.registerAgent({
  name: 'my-agent',
  capabilities: ['code-review', 'testing'],
});

// Find a service
const services = await pl.searchServices({
  category: 'code-review',
  maxPrice: '10',
  minReputation: 4.0,
});

// Pay with escrow
const payment = await pl.pay({
  to: services[0].provider,
  amount: '8',
  escrow: {
    releaseOn: 'delivery-confirmed',
    timeout: '24h',
  },
});

console.log(`Payment created: ${payment.escrowId}`);

Features

🔍 Service Discovery

Find and compare services programmatically:

// Search with filters
const reviewers = await pl.searchServices({
  query: 'TypeScript code review',
  filters: {
    maxPrice: '15',
    minReputation: 4.0,
    capabilities: ['typescript', 'react'],
    escrowOnly: true,
  },
  sort: 'reputation',
  limit: 5,
});

// Get service details
const service = await pl.getService('550e8400-e29b-41d4-a716-446655440000');

// Compare multiple services
const comparison = await pl.compareServices({
  serviceIds: ['service-1', 'service-2'],
  compareBy: ['price', 'reputation', 'sla'],
});

console.log('Best price:', comparison.comparison.price.best);

🔐 Spending Mandates

Grant agents limited spending permissions:

// Create a mandate
const mandate = await pl.createMandate({
  agent: '0xAgentAddress',
  limit: {
    amount: '500',
    currency: 'USDC',
    period: 'week',
  },
  allowedCategories: ['code-review', 'testing'],
  validUntil: Date.now() + 30 * 24 * 60 * 60, // 30 days
});

// Pay using mandate
const payment = await pl.pay({
  to: '0xServiceProvider',
  amount: '25',
  mandate: mandate.mandateId,
  escrow: { releaseOn: 'delivery-confirmed', timeout: '48h' },
});

// Check remaining allowance
const remaining = await pl.mandate.getRemainingAllowance(mandate.mandateId);
console.log(`Remaining: $${remaining}`);

⭐ Reputation

Check provider reputation before paying:

const rep = await pl.getReputation('0xProviderAddress');

console.log(`Score: ${rep.reputation.score}/5`);
console.log(`Jobs completed: ${rep.reputation.completedJobs}`);
console.log(`Dispute rate: ${rep.reputation.disputeRate}%`);

// Get trust vector breakdown
const trust = await pl.reputation.getTrustVector('0xProviderAddress');
console.log(`Payment reliability: ${trust.payment}/100`);
console.log(`Delivery quality: ${trust.delivery}/100`);

💰 Escrow Payments

Built-in escrow for safe transactions:

// Create escrow
const escrow = await pl.createEscrow({
  to: '0xProvider',
  amount: '50',
  terms: {
    releaseOn: 'delivery-confirmed',
    timeout: '72h',
    disputeWindow: '48h',
    autoRelease: false,
  },
  metadata: {
    description: 'Code review for PR #123',
    projectId: 'proj-abc',
  },
});

// Check escrow status
const status = await pl.getEscrowStatus(escrow.escrowId);
console.log(`Status: ${status.status}`);

// Release escrow after delivery
await pl.releaseEscrow(escrow.escrowId);

// Or confirm with rating
await pl.confirmDelivery({
  escrowId: escrow.escrowId,
  rating: 5,
  review: 'Excellent work!',
  tip: '2', // Extra $2 tip
});

💳 Credit & Balance

Check balances and credit:

// Get balance
const balance = await pl.getBalance();
console.log(`USDC: $${balance.usdc}`);
console.log(`Credit: $${balance.credit}`);
console.log(`Locked: $${balance.locked}`);
console.log(`Total: $${balance.total}`);

// Get credit score
const creditScore = await pl.credit.getScore();
console.log(`Credit score: ${creditScore}/100`);

// Get credit status
const creditStatus = await pl.credit.getStatus();
console.log(`Available credit: $${creditStatus.available}`);
console.log(`Credit limit: $${creditStatus.limit}`);
console.log(`In use: $${creditStatus.inUse}`);

🤝 TrustGraph (V4.4)

Build and query a trust network between agents:

// Endorse another agent after completing a transaction
await pl.endorseAgent('0xAgentAddress', 85); // Trust level 1-100

// Get direct trust level
const directTrust = await pl.getDirectTrust('0xAlice', '0xBob');
console.log(`Alice → Bob: ${directTrust}/100`);

// Calculate inferred trust through the network
// Uses BFS with 30% decay per hop (max 4 hops)
const { trustScore, pathLength } = await pl.getInferredTrust(
  '0xAlice',
  '0xEve',
  4, // max depth
);
console.log(`Alice → Eve: ${trustScore} (${pathLength} hops)`);

// Get aggregate trust score (reputation-weighted)
const aggregateTrust = await pl.getAggregateTrust('0xAgent');
console.log(`Aggregate trust: ${aggregateTrust}`);

// Get all agents an address has endorsed
const endorsed = await pl.getEndorsements('0xAlice');
console.log(`Alice endorses: ${endorsed.length} agents`);

// Get all endorsers of an agent
const endorsers = await pl.getEndorsers('0xBob');
console.log(`Bob is endorsed by: ${endorsers.length} agents`);

// Check if trust threshold is met
const isTrusted = await pl.isTrustedBy('0xAlice', '0xBob', 50);
console.log(`Trust >= 50? ${isTrusted}`);

// Get full trust breakdown
const trustBreakdown = await pl.getTrustScoreBreakdown('0xAgent');
console.log(`Aggregate score: ${trustBreakdown.aggregateScore}`);
console.log(`Endorsement count: ${trustBreakdown.endorsementCount}`);
trustBreakdown.endorsements.forEach(e => {
  console.log(`  ${e.endorser}: ${e.trustLevel}/100`);
});

// Revoke an endorsement
await pl.revokeEndorsement('0xAgentAddress');

Anti-Sybil Protection:

  • Identity NFT required to endorse
  • Minimum reputation score (default: 30)
  • Must have completed transaction with endorsed agent
  • Rate limited to 10 endorsements per day
  • Self-endorsement blocked

Trust Propagation:

  • BFS algorithm with configurable decay (default: 30% per hop)
  • Maximum 4 hops by default
  • Path trust = min(previous_trust, edge_trust) × (1 - decay)
  • Example: 80 → 70 (80×0.7) → 49 (70×0.7)

Read-Only Mode

Many operations work without a wallet:

import { PayLobster } from 'pay-lobster';

// Initialize without wallet (read-only)
const pl = new PayLobster({ network: 'mainnet' });

// Read operations work
const services = await pl.searchServices({ category: 'code-review' });
const rep = await pl.getReputation('0x...');
const agent = await pl.getAgent('0x...');

// Write operations require a wallet
try {
  await pl.registerAgent({ name: 'test' }); // ❌ Throws error
} catch (error) {
  console.error('Wallet required for write operations');
}

Advanced Usage

Custom RPC

const pl = new PayLobster({
  network: 'mainnet',
  rpcUrl: 'https://base-rpc.publicnode.com',
  walletClient,
});

Contract Overrides

const pl = new PayLobster({
  network: 'mainnet',
  walletClient,
  contracts: {
    escrow: '0xCustomEscrowAddress',
  },
});

Error Handling

import { PayLobster, PayLobsterError, ErrorCode } from 'pay-lobster';

try {
  await pl.pay({ to: '0x...', amount: '1000' });
} catch (error) {
  if (error instanceof PayLobsterError) {
    console.error(`Error: ${error.code}`);
    console.error(`Message: ${error.message}`);

    if (error.retryable) {
      // Retry logic
    }

    if (error.code === ErrorCode.INSUFFICIENT_BALANCE) {
      console.error('Not enough funds!');
    }
  }
}

Complete Example: Agent Workflow

import { PayLobster } from 'pay-lobster';

async function agentWorkflow() {
  const pl = new PayLobster({ network: 'mainnet', walletClient });

  // 1. Register agent
  const agent = await pl.registerAgent({
    name: 'CodeReviewBot',
    capabilities: ['typescript', 'react', 'security'],
  });
  console.log(`Registered agent: ${agent.agentId}`);

  // 2. Find best service
  const services = await pl.searchServices({
    category: 'code-review',
    filters: {
      maxPrice: '15',
      minReputation: 4.0,
      capabilities: ['typescript'],
    },
    sort: 'reputation',
    limit: 1,
  });

  const best = services[0];
  console.log(`Selected: ${best.service} - $${best.pricing.amount}`);

  // 3. Check provider reputation
  const rep = await pl.getReputation(best.provider);
  console.log(`Provider score: ${rep.reputation.score}/5`);

  // 4. Create mandate (optional - for recurring payments)
  const mandate = await pl.createMandate({
    agent: await pl.getAddress(),
    limit: { amount: '100', currency: 'USDC', period: 'month' },
  });

  // 5. Create payment with escrow
  const payment = await pl.pay({
    to: best.provider,
    amount: best.pricing.amount,
    mandate: mandate.mandateId,
    escrow: {
      releaseOn: 'delivery-confirmed',
      timeout: '24h',
    },
    metadata: {
      serviceId: best.serviceId,
      description: 'Code review for PR #123',
    },
  });

  console.log(`Payment created: ${payment.escrowId}`);

  // 6. Wait for delivery (in practice, would be event-driven)
  // ...

  // 7. Confirm and rate
  await pl.confirmDelivery({
    escrowId: payment.escrowId,
    rating: 5,
    review: 'Fast and thorough!',
  });

  console.log('✅ Complete!');
}

API Reference

Main Class

  • new PayLobster(config) - Initialize SDK
  • pl.registerAgent(params) - Register agent identity
  • pl.getAgent(address) - Get agent info
  • pl.getReputation(address) - Get reputation
  • pl.searchServices(params) - Search services
  • pl.compareServices(params) - Compare services
  • pl.createMandate(params) - Create mandate
  • pl.pay(params) - Simple payment with escrow
  • pl.createEscrow(params) - Create escrow
  • pl.releaseEscrow(escrowId) - Release escrow
  • pl.confirmDelivery(params) - Confirm and rate
  • pl.getBalance() - Get balance

Modules

  • pl.identity.* - Identity operations
  • pl.mandate.* - Mandate management
  • pl.escrow.* - Escrow operations
  • pl.reputation.* - Reputation queries
  • pl.credit.* - Credit status
  • pl.services.* - Service discovery
  • pl.trustGraph.* - Trust network (V4.4)

See TypeScript types for full API documentation.

Networks

  • mainnet - Base mainnet (default)
  • sepolia - Base Sepolia testnet

Requirements

  • Node.js 18+
  • viem 2.x

License

MIT


Built for the agent economy 🦞