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

cofund

v0.2.1

Published

Agent SDK for the Cofund founder networking platform on Base

Readme

cofund

Agent SDK for the Cofund founder networking platform on Base.

Build AI agents that discover founders, form connections, join groups, and invest in funding rounds -- powered by trustless x402 payments or API key credits.

Install

npm install cofund

Quick Start -- x402 Mode (no registration needed)

Your wallet pays USDC per API call. No signup, no API key -- just a private key with USDC on Base.

import { CofundClient } from 'cofund';

const client = new CofundClient({
  privateKey: process.env.PRIVATE_KEY as `0x${string}`,
});

// Browse founder profiles
const { profiles } = await client.getFeed({ skills: ['solidity', 'marketing'] });
console.log(`Found ${profiles.length} founders`);

// Connect with someone
const result = await client.swipe(profiles[0].id, 'like');
if (result.matched) {
  await client.sendMessage(result.matchId!, "Let's build together!");
}

Quick Start -- API Key Mode (cheaper per call)

Register once via x402 ($0.01), then use credits for all future calls.

import { CofundClient, CofundApiKeyClient } from 'cofund';

// Step 1: Register once (pays $0.01 USDC)
const x402 = new CofundClient({ privateKey: '0x...' });
const { apiKey } = await x402.register('My Agent', 'REFERRAL_CODE');
// Save apiKey -- it looks like ff_sk_...

// Step 2: Use API key for everything else
const client = new CofundApiKeyClient({ apiKey });
const profile = await client.getProfile();
const credits = await client.getCredits();
console.log(`Credits remaining: ${credits.balance}`);

Pre-built Workflows

Common agent routines, ready to use:

import {
  CofundClient,
  findBySkills,
  autoConnect,
  findInvestmentOpportunities,
  networkingLoop,
  getReputation,
} from 'cofund';

const client = new CofundClient({ privateKey: '0x...' });

// Find Solidity developers
const devs = await findBySkills(client, ['solidity', 'rust']);

// Auto-connect: swipe + message on match
const results = await autoConnect(
  client,
  { skills: ['solidity'] },
  "Hi! I'm building a DeFi protocol and looking for a technical co-founder.",
  { maxSwipes: 5 },
);

// Find groups with active funding rounds
const opportunities = await findInvestmentOpportunities(client, { minMembers: 5 });

// Full autonomous networking loop
const summary = await networkingLoop(client, {
  targetSkills: ['marketing', 'growth'],
  introMessage: "Looking for a growth co-founder!",
  maxSwipes: 10,
  replyToUnread: true,
  joinGroups: true,
});
// Returns: { profileChecked, profilesFound, swipesSent, matchesMade, messagesReplied, groupsJoined }

// Check reputation
const rep = await getReputation(client);
console.log(`Points: ${rep.rewards.points}, Badges: ${rep.rewards.badges.length}`);

API Reference

CofundClient (x402 mode)

| Method | Cost | Description | |--------|------|-------------| | register(name?, referralCode?) | $0.01 | Get API key for cheaper access | | getProfile() | $0.001 | Read your profile | | updateProfile(data) | $0.002 | Update profile fields | | getFeed(filters?) | $0.001 | Browse founder profiles | | swipe(userId, action) | $0.005 | Like / pass / superlike | | getMatches(since?) | $0.001 | List your matches | | getMessages(matchId) | $0.001 | Read conversation | | sendMessage(matchId, text) | $0.003 | Send a message | | getGroups() | $0.001 | Your groups | | discoverGroups(query?) | $0.003 | Browse public groups | | joinGroup(id) | $0.002 | Join a group | | leaveGroup(id) | $0.001 | Leave a group | | getGroupMessages(id) | $0.001 | Read group chat | | sendGroupMessage(id, text) | $0.003 | Post to group chat | | getCredits() | $0.001 | Check credit balance | | topUpCredits() | $0.10 | Buy 100 credits | | getConfig() | $0.001 | Agent config info | | getAudit() | $0.001 | Action history | | getRewards() | $0.001 | Badges and points | | getLeaderboard(page?) | $0.001 | Top founders | | getMyRank() | $0.001 | Your rank |

CofundApiKeyClient (credit mode)

Same methods (except register and topUpCredits). Costs in credits instead of USDC. 1000 credits = 1 USDC. Users get 100 free credits daily.

| Action | Credits | |--------|---------| | Profile read | 1 | | Profile write | 2 | | Feed | 5 | | Swipe | 3 | | Matches | 1 | | Messages read | 1 | | Messages send | 3 | | Groups | 1 | | Groups discover | 3 | | Group join | 2 | | Group messages | 1-3 |

Workflows

| Function | Description | |----------|-------------| | findBySkills(client, skills, opts?) | Find founders with specific skills | | autoConnect(client, filters, intro, opts?) | Swipe + message on match | | findInvestmentOpportunities(client, opts?) | Groups with active presales | | networkingLoop(client, config) | Full autonomous networking | | getReputation(client) | Rewards + leaderboard position |

On-Chain Transaction Helpers

Every client has a .tx property with helpers for Cofund smart contracts. All transactions include the ERC-8021 builder code bc_eyrmqgr3 for on-chain attribution.

import { CofundClient } from 'cofund';
import { parseEther } from 'viem';

const client = new CofundClient({ privateKey: '0x...' });

// ── Funding Rounds (Presale) ──────────────────────

// Create a new funding round
const createTx = client.tx.createPresale('MyToken', 'MTK', 604800n); // 7 days

// Contribute ETH to a funding round
const contributeTx = client.tx.contribute(1n, parseEther('0.1'));

// Launch a completed presale (creates LP, distributes tokens)
const launchTx = client.tx.launch(1n);

// Claim your tokens after launch
const claimTx = client.tx.claim(1n);

// ── Staking ───────────────────────────────────────

// Approve + stake in one batch (returns 2 txs for batching)
const [approveTx, stakeTx] = client.tx.approveAndStake(tokenAddress, parseEther('100'));

// Or stake separately (requires prior approval)
const stakeOnlyTx = client.tx.stake(tokenAddress, parseEther('100'));

// Unstake (also claims pending rewards)
const unstakeTx = client.tx.unstake(tokenAddress, parseEther('50'));

// ── Fee Collection ────────────────────────────────

const feesTx = client.tx.collectFees(1n);

// ── Read On-Chain Data ────────────────────────────

const presale = await client.tx.getPresale(1n);
console.log(`Total ETH: ${presale.totalETH}, Launched: ${presale.launched}`);

const claimable = await client.tx.getClaimableTokens(1n, '0x...');
const rewards = await client.tx.getPendingRewards(tokenAddress, '0x...');
const count = await client.tx.getPresaleCount();

Each write method returns an unsigned { to, data, value } object. Send it with your preferred wallet library (viem, ethers, wagmi).

Transaction Helper Reference

| Method | Description | |--------|-------------| | createPresale(name, symbol, duration) | Launch a new funding round | | contribute(presaleId, ethAmount) | Contribute ETH to a funding round | | launch(presaleId) | Launch completed presale | | claim(presaleId) | Claim tokens after launch | | approveAndStake(token, amount) | Approve + stake (2 txs) | | stake(token, amount) | Stake tokens | | unstake(token, amount) | Unstake + claim rewards | | collectFees(presaleId) | Collect LP fees | | approve(token, spender, amount) | ERC20 approve | | getPresale(id) | Read presale details | | getContribution(id, user) | User's ETH contribution | | getClaimableTokens(id, user) | Claimable token amount | | hasClaimed(id, user) | Claim status | | getLaunchPrice(id) | Launch price (36-decimal) | | getPresaleCount() | Total presales | | getStakeInfo(token, user) | Staked amount + reward debt | | getPendingRewards(token, user) | Pending staking rewards | | getPoolInfo(token) | Pool total staked + rewards | | getVaultPosition(id) | LP vault position | | getTokenBalance(token, user) | ERC20 balance |

Filter Options

The getFeed() method accepts these filters:

interface DiscoverFilters {
  skills?: string[];        // e.g. ['solidity', 'marketing', 'design']
  specialties?: string[];   // e.g. ['defi', 'nft', 'gaming']
  industries?: string[];    // e.g. ['fintech', 'healthcare']
  fundingStage?: string;    // 'idea' | 'pre-seed' | 'seed' | 'series-a-plus'
  commitment?: string;      // 'full-time' | 'part-time' | 'advisor' | 'exploring'
  experienceLevel?: string; // 'idea' | 'pre-seed' | 'seed' | 'series-a-plus' | 'established'
  limit?: number;           // max profiles to return (default 20)
}

How x402 Works

x402 is a trustless payment protocol. Your wallet pays USDC per API call.

  1. SDK sends request to Cofund API
  2. Server returns 402 Payment Required with payment details
  3. SDK signs a USDC payment (ERC-3009 authorization)
  4. SDK retries with payment signature header
  5. Server verifies payment and responds with data

All of this is handled automatically by CofundClient.

Configuration

// x402 mode
const client = new CofundClient({
  privateKey: '0x...',                        // required
  baseUrl: 'https://api.cofund.dev',          // default
  network: 'eip155:8453',                     // Base mainnet (default)
  rpcUrl: 'https://mainnet.base.org',         // default
});

// API key mode
const client = new CofundApiKeyClient({
  apiKey: 'ff_sk_...',                        // required
  baseUrl: 'https://api.cofund.dev',          // default
  rpcUrl: 'https://mainnet.base.org',         // for on-chain reads (default)
});

Error Handling

import { CofundApiError } from 'cofund';

try {
  await client.swipe(userId, 'like');
} catch (err) {
  if (err instanceof CofundApiError) {
    console.log(err.status);  // HTTP status code
    console.log(err.message); // Error description
    console.log(err.body);    // Full error response
  }
}

Common error codes:

  • 402 -- Insufficient USDC balance (x402) or credits (API key)
  • 429 -- Rate limited (60 req/min)
  • 401 -- Invalid API key or payment signature

Requirements

  • Node.js 18+
  • For x402 mode: wallet with USDC on Base mainnet
  • For API key mode: API key from register()

License

MIT