navigate JKscroll
Link copied!

ClipFi

Clip farming, onchain.

Clip farming already exists. Streamers manufacture viral moments. Clippers race to capture them first. The algorithm rewards someone else.

ClipFi pays the clipper.

Turn any viral clip into a tradable coin. Earn 1% on every trade — forever.


The Premise

Clip farming is already a thing.

Moments go viral. Clips spread on X, TikTok, YouTube Shorts, Reddit. New viewers flood in.

ClipFi adds ownership. First to clip = first to earn.


How It Works

  1. Sign in (X, Twitch, Kick, TikTok)
  2. Paste a clip URL
  3. Your Clip Coin launches in seconds
  4. Earn 1% on every trade — forever

Tokens start on a bonding curve. Hit the cap → migrate to Uniswap V2 → LP burned forever.


Why This Exists

  • The behavior already exists
  • Clips are discovery
  • Every clip is a market

ClipFi makes the first position provable and profitable.


  • App: clipfi.org
  • Network: Base (Chain ID 8453)
  • Docs: You're reading them.

How It Works

ClipFi has two token types.


Clipper Coin

Your personal coin. Sign in once. It's live. Every trade pays you 1%.

  • One per account
  • Tradeable by anyone
  • Fees stream to you forever

Clip Coin

Race to capture viral moments. Tokenize them. Farm forever.

  • Paste a clip → Coin launches
  • Degens trade → You earn
  • First to clip = first to earn

Token Lifecycle

  1. Bonding curve — Initial trading phase
  2. Graduation — Hit the cap → migrate to Uniswap V2
  3. LP burned — Liquidity locked forever
  4. Transfers enabled — Fully tradeable

Fee Structure

Recipient Fee
Clipper 1%
Protocol 1%
Integrator (optional) 0-1%

Fees apply to all trades, paid instantly onchain.

Quick Start

1. Sign in

Your Clipper Coin deploys automatically.

2. Paste a clip

Your Clip Coin launches in seconds.

3. Earn

Every trade pays you 1%, instantly.


Supported platforms

  • X (Twitter)
  • Twitch clips
  • Kick clips
  • TikTok
  • YouTube videos & Shorts
  • Sora
  • Meta AI

Tips

  • Clip what's already going viral
  • Share the coin link
  • More trades = more fees

Clip Farming

Clip farming already exists.

Streamers manufacture moments — hot takes, rage, shock, humor. Clippers cut them first. Clips spread everywhere. New viewers arrive.

That's the loop.


The Problem

Clippers do the work. The algorithm pays someone else.


The ClipFi Fix

  • First to clip = first to earn
  • Every trade pays you 1%
  • Speed and taste matter
  • Promote the coin → volume grows → you earn more

The people who already understand virality now have skin in the game.


Why It Works

Memecoins run on culture. Clips are culture — captured in real time.

ClipFi makes clip farming measurable, verifiable, and profitable.

FAQ

Does ClipFi pay the original creator?

No. ClipFi pays the clipper — the person who launches the Clip Coin. Original creators are referenced in metadata only.

Why pay clippers instead of creators?

Clippers create the market. They find the clip, launch the coin, and drive volume. That's the growth engine.

Is it free to launch?

Yes. There's no platform fee to create a Clip Coin. Fees are only taken on trades.

What chain is ClipFi on?

Base (Chain ID 8453).

Is liquidity locked?

Yes. At graduation, LP tokens are burned — liquidity is permanently locked.

Can I transfer tokens before graduation?

No. Pre-graduation, tokens can only move between the contract and your wallet. This prevents front-running and sniping.

What happens after graduation?

The token trades on Uniswap V2. Transfers are fully enabled. Wallet-to-wallet transfers are fee-free.

How do I earn as an integrator?

Call buyWithIntegrator() or sellWithIntegrator() with your wallet address. You earn up to 1% on every trade you route. See Integrator Program.

Glossary

Term Definition
Clipper Person who launches a Clip Coin
Clip Coin Token tied to a specific clip or post
Clipper Coin Personal token created on first sign-in
Bonding curve Initial trading phase before graduation
Graduation Migration from curve to Uniswap V2 pool
LP burned Liquidity tokens sent to dead address (permanently locked)
Integrator Partner app/bot that routes trades and earns revenue share
Clip Points Activity score for ecosystem participation

Clip Coins

Race to capture viral moments. Tokenize them. Farm forever.


Token Specs

Property Value
Total supply 1,000,000,000 (1B)
Bonding curve allocation 800,000,000 (800M)
Uniswap LP allocation 200,000,000 (200M)
Clipper fee 1% forever

How It Works

  1. Paste a clip URL
  2. Coin launches in seconds
  3. Degens trade
  4. You earn 1% on every trade

First to clip = first to earn.

Clipper Coins

Your personal coin. Sign in once. It's live. Every trade pays you 1%.


How It Works

  1. Sign in with X, Twitch, Kick, or TikTok
  2. Your Clipper Coin deploys automatically
  3. Fees stream to you forever

One Clipper Coin per account. Same mechanics as Clip Coins.

Token Lifecycle

Every Clip Coin goes through two stages: bonding curve and Uniswap.


Stage 1: Bonding Curve

The initial trading phase.

  • Uses virtual reserves for smooth price discovery
  • Transfers disabled — tokens can only move between contract and user
  • Prevents front-running and LP sniping
  • Fees collected on every trade

Graduation

When the bonding curve reaches its ETH target:

  1. All curve ETH seeds a Uniswap V2 pool
  2. 200M tokens are paired with the ETH
  3. LP tokens are burned (sent to dead address)
  4. Transfers are enabled
  5. Token now trades on Uniswap V2

Stage 2: Uniswap V2

After graduation:

  • Token trades on the open market
  • Same 2% fee structure on swaps against the main pair
  • Wallet-to-wallet transfers are fee-free
  • Liquidity is permanently locked

Fees

Trading fees

Every buy and sell has a 2% base fee:

Recipient Fee
Clipper 1.0%
Protocol 1.0%

Fees are paid instantly, onchain, in the same transaction.


Integrator revenue share

Partners who route volume (bots, terminals, apps) can earn up to 1% additional revenue share on trades they facilitate.

This is configured per-integration and paid directly to the integrator wallet. See Integrator Program for details.


Why this works

  • Clippers are incentivized to promote their coins
  • Integrators earn from every trade they route
  • The protocol scales with volume — no complex tokenomics

Simple, aligned, sustainable.

Clip Points

Clip Points measure your contribution to the ClipFi ecosystem. The more you clip, trade, and build — the more points you earn.


How to Earn Points

Action Points
Launch a Clip Coin 100 points
First buy on any token 10 points
Trade volume (per 0.01 ETH) 1 point
Your Clip Coin gets traded (per 0.01 ETH volume) 2 points
Refer a new clipper 50 points
Integrator volume (per 0.01 ETH) 1 point

Points are calculated in real-time based on onchain activity.


Leaderboard

Clip Points power the ClipFi leaderboard:

  • Top Clippers — Ranked by total points earned
  • Top Traders — Ranked by trading volume
  • Top Coins — Ranked by 24h volume

Leaderboard updates every block.


What Points Unlock

  • Status — Your rank among all clippers
  • Visibility — Higher ranks get featured placement
  • Future Rewards — Points will be used for reward distributions
  • Reputation — Proof of early contribution to the ecosystem

Rules

  • Points are non-transferable
  • Points are tied to your ClipFi account
  • All point calculations are based on verified onchain data
  • Point values may be adjusted as the platform evolves

Points are tracked offchain but derived entirely from verified onchain activity.

Integrator Program

Earn revenue on every trade you route through ClipFi. No registration required — just call the contract with your wallet address.


Revenue Share

Feature Details
Fee Up to 1% per trade (you set your own, max 100 bps)
Payout Instant — paid in the same transaction as the trade
Attribution Full tracking via IntegratorFeePaid events

Quick Start

Install your preferred Web3 library and start integrating in minutes.

Installation

# Install ethers.js for Web3 interactions
npm install ethers
# Install web3.py for Web3 interactions
pip install web3
# Install go-ethereum client library
go get github.com/ethereum/go-ethereum
# Install ethers-rs for Web3 interactions
cargo add ethers
# Install Foundry toolchain (includes cast CLI)
curl -L https://foundry.paradigm.xyz | bash && foundryup

Buy Tokens

import { ethers } from 'ethers';

// Connect to Base mainnet
const provider = new ethers.JsonRpcProvider('https://mainnet.base.org');
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);

// ClipFi token ABI (only functions needed for buying)
const ABI = [
  'function buyWithIntegrator(uint256 minTokensOut, address integrator, uint16 integratorFeeBps) payable',
  'function previewBuy(uint256 ethIn, uint16 integratorFeeBps) view returns (uint256)',
];

// Initialize contract
const token = new ethers.Contract(TOKEN_ADDRESS, ABI, wallet);

// Your integrator wallet - receives fee payouts
const INTEGRATOR = '0xYourWallet';
// Fee in basis points (50 = 0.5%, max 100 = 1%)
const FEE_BPS = 50;

async function buy(ethAmount) {
  // Convert ETH amount to wei
  const ethIn = ethers.parseEther(ethAmount);

  // Get expected tokens out (accounts for fees)
  const expected = await token.previewBuy(ethIn, FEE_BPS);

  // Apply 5% slippage tolerance
  const minOut = expected * 95n / 100n;

  // Execute buy - ETH sent as msg.value
  const tx = await token.buyWithIntegrator(minOut, INTEGRATOR, FEE_BPS, { value: ethIn });
  return tx.wait();
}
from web3 import Web3

# Connect to Base mainnet
w3 = Web3(Web3.HTTPProvider('https://mainnet.base.org'))
account = w3.eth.account.from_key(PRIVATE_KEY)

# ClipFi token ABI (only functions needed for buying)
ABI = [
    {"name": "buyWithIntegrator", "type": "function", "stateMutability": "payable",
     "inputs": [{"name": "minTokensOut", "type": "uint256"},
                {"name": "integrator", "type": "address"},
                {"name": "integratorFeeBps", "type": "uint16"}]},
    {"name": "previewBuy", "type": "function", "stateMutability": "view",
     "inputs": [{"name": "ethIn", "type": "uint256"},
                {"name": "integratorFeeBps", "type": "uint16"}],
     "outputs": [{"type": "uint256"}]}
]

# Initialize contract
token = w3.eth.contract(address=TOKEN_ADDRESS, abi=ABI)

# Your integrator wallet - receives fee payouts
INTEGRATOR = '0xYourWallet'
# Fee in basis points (50 = 0.5%, max 100 = 1%)
FEE_BPS = 50

def buy(eth_amount):
    # Convert ETH amount to wei
    eth_in = w3.to_wei(eth_amount, 'ether')

    # Get expected tokens out (accounts for fees)
    expected = token.functions.previewBuy(eth_in, FEE_BPS).call()

    # Apply 5% slippage tolerance
    min_out = int(expected * 0.95)

    # Build and sign transaction
    tx = token.functions.buyWithIntegrator(min_out, INTEGRATOR, FEE_BPS).build_transaction({
        'from': account.address,
        'value': eth_in,
        'gas': 300000,
        'nonce': w3.eth.get_transaction_count(account.address)
    })
    signed = account.sign_transaction(tx)

    # Broadcast transaction
    return w3.eth.send_raw_transaction(signed.raw_transaction)
package main

import (
    "math/big"
    "github.com/ethereum/go-ethereum/accounts/abi/bind"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/ethclient"
)

func buy(ethAmount *big.Int) error {
    // Connect to Base mainnet
    client, _ := ethclient.Dial("https://mainnet.base.org")

    // Your integrator wallet - receives fee payouts
    integrator := common.HexToAddress("0xYourWallet")
    // Fee in basis points (50 = 0.5%, max 100 = 1%)
    feeBps := uint16(50)

    // Get expected tokens out (accounts for fees)
    expected, _ := token.PreviewBuy(&bind.CallOpts{}, ethAmount, feeBps)

    // Apply 5% slippage tolerance
    minOut := new(big.Int).Mul(expected, big.NewInt(95))
    minOut.Div(minOut, big.NewInt(100))

    // Create transaction with ETH value
    auth, _ := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(8453))
    auth.Value = ethAmount

    // Execute buy with integrator fee
    tx, err := token.BuyWithIntegrator(auth, minOut, integrator, feeBps)
    return err
}
use ethers::{
    prelude::*,
    providers::{Http, Provider},
};

async fn buy(eth_amount: U256) -> Result<(), Box<dyn std::error::Error>> {
    // Connect to Base mainnet
    let provider = Provider::<Http>::try_from("https://mainnet.base.org")?;
    let wallet: LocalWallet = PRIVATE_KEY.parse()?;
    let client = SignerMiddleware::new(provider, wallet.with_chain_id(8453u64));

    // Your integrator wallet - receives fee payouts
    let integrator = "0xYourWallet".parse::<Address>()?;
    // Fee in basis points (50 = 0.5%, max 100 = 1%)
    let fee_bps: u16 = 50;

    // Get expected tokens out (accounts for fees)
    let expected = token.preview_buy(eth_amount, fee_bps).call().await?;

    // Apply 5% slippage tolerance
    let min_out = expected * 95 / 100;

    // Execute buy with integrator fee
    let tx = token.buy_with_integrator(min_out, integrator, fee_bps)
        .value(eth_amount)
        .send()
        .await?;

    Ok(())
}
# Buy tokens with cast (Foundry)
# Replace TOKEN_ADDRESS, MIN_TOKENS_OUT, and INTEGRATOR_WALLET with actual values
cast send TOKEN_ADDRESS \
  "buyWithIntegrator(uint256,address,uint16)" \
  MIN_TOKENS_OUT INTEGRATOR_WALLET 50 \
  --value 0.1ether \
  --rpc-url https://mainnet.base.org \
  --private-key $PRIVATE_KEY

Sell Tokens

import { ethers } from 'ethers';

// Connect to Base mainnet
const provider = new ethers.JsonRpcProvider('https://mainnet.base.org');
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);

// ClipFi token ABI (only functions needed for selling)
const ABI = [
  'function sellWithIntegrator(uint256 tokensIn, uint256 minEthOut, address integrator, uint16 integratorFeeBps)',
  'function previewSell(uint256 tokensIn, uint16 integratorFeeBps) view returns (uint256)',
];

// Initialize contract
const token = new ethers.Contract(TOKEN_ADDRESS, ABI, wallet);

// Your integrator wallet - receives fee payouts
const INTEGRATOR = '0xYourWallet';
// Fee in basis points (50 = 0.5%, max 100 = 1%)
const FEE_BPS = 50;

async function sell(tokenAmount) {
  // Convert token amount to wei (18 decimals)
  const tokensIn = ethers.parseUnits(tokenAmount, 18);

  // Get expected ETH out (accounts for fees)
  const expected = await token.previewSell(tokensIn, FEE_BPS);

  // Apply 5% slippage tolerance
  const minOut = expected * 95n / 100n;

  // Execute sell - receive ETH minus fees
  const tx = await token.sellWithIntegrator(tokensIn, minOut, INTEGRATOR, FEE_BPS);
  return tx.wait();
}
from web3 import Web3

# Connect to Base mainnet
w3 = Web3(Web3.HTTPProvider('https://mainnet.base.org'))
account = w3.eth.account.from_key(PRIVATE_KEY)

# ClipFi token ABI (only functions needed for selling)
ABI = [
    {"name": "sellWithIntegrator", "type": "function", "stateMutability": "nonpayable",
     "inputs": [{"name": "tokensIn", "type": "uint256"},
                {"name": "minEthOut", "type": "uint256"},
                {"name": "integrator", "type": "address"},
                {"name": "integratorFeeBps", "type": "uint16"}]},
    {"name": "previewSell", "type": "function", "stateMutability": "view",
     "inputs": [{"name": "tokensIn", "type": "uint256"},
                {"name": "integratorFeeBps", "type": "uint16"}],
     "outputs": [{"type": "uint256"}]}
]

# Initialize contract
token = w3.eth.contract(address=TOKEN_ADDRESS, abi=ABI)

# Your integrator wallet - receives fee payouts
INTEGRATOR = '0xYourWallet'
# Fee in basis points (50 = 0.5%, max 100 = 1%)
FEE_BPS = 50

def sell(token_amount):
    # Convert token amount to wei (18 decimals)
    tokens_in = w3.to_wei(token_amount, 'ether')

    # Get expected ETH out (accounts for fees)
    expected = token.functions.previewSell(tokens_in, FEE_BPS).call()

    # Apply 5% slippage tolerance
    min_out = int(expected * 0.95)

    # Build and sign transaction
    tx = token.functions.sellWithIntegrator(
        tokens_in, min_out, INTEGRATOR, FEE_BPS
    ).build_transaction({
        'from': account.address,
        'gas': 300000,
        'nonce': w3.eth.get_transaction_count(account.address)
    })
    signed = account.sign_transaction(tx)

    # Broadcast transaction
    return w3.eth.send_raw_transaction(signed.raw_transaction)
package main

import (
    "math/big"
    "github.com/ethereum/go-ethereum/accounts/abi/bind"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/ethclient"
)

func sell(tokenAmount *big.Int) error {
    // Connect to Base mainnet
    client, _ := ethclient.Dial("https://mainnet.base.org")

    // Your integrator wallet - receives fee payouts
    integrator := common.HexToAddress("0xYourWallet")
    // Fee in basis points (50 = 0.5%, max 100 = 1%)
    feeBps := uint16(50)

    // Get expected ETH out (accounts for fees)
    expected, _ := token.PreviewSell(&bind.CallOpts{}, tokenAmount, feeBps)

    // Apply 5% slippage tolerance
    minOut := new(big.Int).Mul(expected, big.NewInt(95))
    minOut.Div(minOut, big.NewInt(100))

    // Execute sell with integrator fee
    auth, _ := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(8453))
    tx, err := token.SellWithIntegrator(auth, tokenAmount, minOut, integrator, feeBps)
    return err
}
use ethers::{
    prelude::*,
    providers::{Http, Provider},
};

async fn sell(token_amount: U256) -> Result<(), Box<dyn std::error::Error>> {
    // Connect to Base mainnet
    let provider = Provider::<Http>::try_from("https://mainnet.base.org")?;
    let wallet: LocalWallet = PRIVATE_KEY.parse()?;
    let client = SignerMiddleware::new(provider, wallet.with_chain_id(8453u64));

    // Your integrator wallet - receives fee payouts
    let integrator = "0xYourWallet".parse::<Address>()?;
    // Fee in basis points (50 = 0.5%, max 100 = 1%)
    let fee_bps: u16 = 50;

    // Get expected ETH out (accounts for fees)
    let expected = token.preview_sell(token_amount, fee_bps).call().await?;

    // Apply 5% slippage tolerance
    let min_out = expected * 95 / 100;

    // Execute sell with integrator fee
    let tx = token.sell_with_integrator(token_amount, min_out, integrator, fee_bps)
        .send()
        .await?;

    Ok(())
}
# Sell tokens with cast (Foundry)
# Replace TOKEN_ADDRESS, TOKEN_AMOUNT, MIN_ETH_OUT, and INTEGRATOR_WALLET with actual values
cast send TOKEN_ADDRESS \
  "sellWithIntegrator(uint256,uint256,address,uint16)" \
  TOKEN_AMOUNT MIN_ETH_OUT INTEGRATOR_WALLET 50 \
  --rpc-url https://mainnet.base.org \
  --private-key $PRIVATE_KEY

Track Earnings

Listen for IntegratorFeePaid events to track your revenue in real-time.

import { ethers } from 'ethers';

// Connect via WebSocket for real-time event streaming
const provider = new ethers.WebSocketProvider('wss://base-mainnet.g.alchemy.com/v2/YOUR_KEY');

// Event ABI for parsing logs
const ABI = ['event IntegratorFeePaid(address indexed integrator, uint256 amount)'];

// Your integrator wallet to filter events
const INTEGRATOR = '0xYourWallet';

// Build filter for IntegratorFeePaid events sent to your wallet
const filter = {
  topics: [
    ethers.id('IntegratorFeePaid(address,uint256)'),  // Event signature
    ethers.zeroPadValue(INTEGRATOR, 32)               // Your address (indexed param)
  ]
};

// Subscribe to real-time events
provider.on(filter, (log) => {
  const iface = new ethers.Interface(ABI);
  const parsed = iface.parseLog(log);

  // Amount is in wei - convert to ETH for display
  console.log(`Earned ${ethers.formatEther(parsed.args.amount)} ETH`);
});
from web3 import Web3

# Connect via WebSocket for real-time event streaming
w3 = Web3(Web3.WebSocketProvider('wss://base-mainnet.g.alchemy.com/v2/YOUR_KEY'))

# Your integrator wallet to filter events
INTEGRATOR = '0xYourWallet'

# Compute event signature hash
EVENT_SIG = w3.keccak(text='IntegratorFeePaid(address,uint256)').hex()

def handle_event(event):
    # Parse amount from event data (in wei)
    amount = int(event['data'], 16)
    print(f"Earned {w3.from_wei(amount, 'ether')} ETH")

# Build filter for events sent to your wallet
filter_params = {
    'topics': [
        EVENT_SIG,                                    # Event signature
        '0x' + INTEGRATOR[2:].zfill(64).lower()      # Your address (indexed param)
    ]
}

# Create filter and poll for new events
log_filter = w3.eth.filter(filter_params)

while True:
    for event in log_filter.get_new_entries():
        handle_event(event)
package main

import (
    "context"
    "fmt"
    "math/big"
    "github.com/ethereum/go-ethereum"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/ethclient"
)

func trackEarnings() {
    // Connect via WebSocket for real-time event streaming
    client, _ := ethclient.Dial("wss://base-mainnet.g.alchemy.com/v2/YOUR_KEY")

    // Your integrator wallet to filter events
    integrator := common.HexToAddress("0xYourWallet")

    // Compute event signature hash
    eventSig := crypto.Keccak256Hash([]byte("IntegratorFeePaid(address,uint256)"))

    // Build filter for events sent to your wallet
    query := ethereum.FilterQuery{
        Topics: [][]common.Hash{
            {eventSig},                              // Event signature
            {common.BytesToHash(integrator.Bytes())}, // Your address (indexed param)
        },
    }

    // Subscribe to real-time events
    logs := make(chan types.Log)
    sub, _ := client.SubscribeFilterLogs(context.Background(), query, logs)

    // Process incoming events
    for log := range logs {
        amount := new(big.Int).SetBytes(log.Data)
        fmt.Printf("Earned %s wei\n", amount.String())
    }
}
use ethers::{
    prelude::*,
    providers::{Provider, Ws},
};

async fn track_earnings() -> Result<(), Box<dyn std::error::Error>> {
    // Connect via WebSocket for real-time event streaming
    let provider = Provider::<Ws>::connect("wss://base-mainnet.g.alchemy.com/v2/YOUR_KEY").await?;

    // Your integrator wallet to filter events
    let integrator: Address = "0xYourWallet".parse()?;

    // Compute event signature hash
    let event_sig = H256::from(keccak256("IntegratorFeePaid(address,uint256)"));

    // Build filter for events sent to your wallet
    let filter = Filter::new()
        .topic0(event_sig)           // Event signature
        .topic1(H256::from(integrator)); // Your address (indexed param)

    // Subscribe to real-time events
    let mut stream = provider.subscribe_logs(&filter).await?;

    // Process incoming events
    while let Some(log) = stream.next().await {
        let amount = U256::from_big_endian(&log.data);
        println!("Earned {} wei", amount);
    }

    Ok(())
}
# Query historical IntegratorFeePaid events with cast
# Replace TOKEN_ADDRESS with the specific token contract address
cast logs \
  --from-block 1000000 \
  --to-block latest \
  "IntegratorFeePaid(address indexed integrator, uint256 amount)" \
  --address TOKEN_ADDRESS \
  --rpc-url https://mainnet.base.org \
  | grep -A2 "0xYourWallet"

Contract Interface

Trading Functions

// Buy tokens with ETH - integrator receives fee on every trade
function buyWithIntegrator(
    uint256 minTokensOut,      // Minimum tokens to receive (slippage protection)
    address integrator,         // Your wallet address (receives fee payout)
    uint16 integratorFeeBps    // Your fee in basis points (max 100 = 1%)
) external payable;

// Sell tokens for ETH - integrator receives fee on every trade
function sellWithIntegrator(
    uint256 tokensIn,          // Amount of tokens to sell
    uint256 minEthOut,         // Minimum ETH to receive (slippage protection)
    address integrator,         // Your wallet address (receives fee payout)
    uint16 integratorFeeBps    // Your fee in basis points (max 100 = 1%)
) external;

Read Functions

// Get expected tokens out for a given ETH amount (accounts for all fees)
function previewBuy(uint256 ethIn, uint16 integratorFeeBps) view returns (uint256 tokensOut);

// Get expected ETH out for a given token amount (accounts for all fees)
function previewSell(uint256 tokensIn, uint16 integratorFeeBps) view returns (uint256 ethOut);

// Check if token has graduated to Uniswap V2
function graduated() view returns (bool);

// Current ETH reserves in bonding curve
function ethReserves() view returns (uint256);

// Current circulating token supply
function circulatingSupply() view returns (uint256);

Events

Track your earnings and attribution with these events:

// Emitted when a user buys tokens
event Buy(
    address indexed user,       // Buyer's wallet address
    bytes32 indexed clipperId,  // Hash of clipper username
    bytes32 indexed contentId,  // Hash of clip URL
    uint256 ethIn,              // Total ETH sent by user
    uint256 netEth,             // ETH after all fees
    uint256 tokensOut           // Tokens received by user
);

// Emitted when a user sells tokens
event Sell(
    address indexed user,       // Seller's wallet address
    bytes32 indexed clipperId,  // Hash of clipper username
    bytes32 indexed contentId,  // Hash of clip URL
    uint256 tokensIn,           // Tokens sold by user
    uint256 ethOutGross,        // ETH value before fees
    uint256 netEth              // ETH received by user after fees
);

// Emitted when integrator fee is paid out (this is what you track!)
event IntegratorFeePaid(
    address indexed integrator, // Your wallet address
    uint256 amount              // Fee amount in wei
);

Example Use Cases

Integration Description
Telegram Bot Buy/sell buttons with your wallet as integrator
Trading Terminal Route ClipFi trades through your UI
Portfolio Tracker Add trade execution with fee sharing
Discord Bot Community trading commands
Mobile Wallet Native ClipFi token support

Getting Started

  1. Set your fee — 30-50 bps recommended (0.3-0.5%)
  2. Configure your wallet — Any address that can receive ETH
  3. Call the contract — Use buyWithIntegrator() / sellWithIntegrator()
  4. Track earnings — Index IntegratorFeePaid events

No registration. No approval. Permissionless.


Support

Building an integration? Reach out on Twitter/X for technical support and partnership opportunities.

Smart Contracts

ClipFi uses a minimal, auditable contract architecture.


ClipFiToken

The core token implementation.

  • ERC20 (OpenZeppelin)
  • Bonding curve buy/sell logic
  • 2% base fee (1% clipper + 1% protocol)
  • Optional integrator fee (0-1%)
  • Graduation to Uniswap V2
  • Pre-graduation transfer restrictions
  • Post-graduation DEX fee collection

ClipRegistry

Central registry for all tokens.

  • Maps clip IDs → Clip Coin addresses
  • Maps clipper IDs → Clipper Coin addresses
  • Maintains factory whitelist
  • Stores implementation address for upgrades

ClipCoinFactory

Unified factory for token creation.

  • createClipCoin() — Deploy a Clip Coin
  • createClipperCoin() — Deploy a Clipper Coin
  • Uses EIP-1167 minimal proxies
  • Registers tokens in ClipRegistry

CurveMath

Library for bonding curve calculations.

  • tokensOutGivenEth() — Quote for buys
  • ethOutGivenTokens() — Quote for sells
  • Virtual reserve management

ClipSellQuoteHelper

Batch utility for frontends and bots.

  • Fetch balances for multiple tokens
  • Get sell quotes (pre-graduation)
  • Get Uniswap V2 estimates (post-graduation)

Events

ClipFi emits minimal, indexer-friendly events for building feeds, analytics, and bots.

All events are emitted from individual ClipFiToken contracts (proxies).


Trade Events

Buy

Emitted when a user buys tokens on the bonding curve.

event Buy(
    address indexed user,
    bytes32 indexed clipperId,
    bytes32 indexed contentId,
    uint256 ethIn,
    uint256 netEth,
    uint256 tokensOut
);
Field Type Description
user address Buyer's wallet address
clipperId bytes32 Keccak256 hash of clipper's username
contentId bytes32 Keccak256 hash of normalized clip URL
ethIn uint256 Total ETH sent by user (in wei)
netEth uint256 ETH after fees (in wei)
tokensOut uint256 Tokens received by user

Fee calculation: ethIn - netEth = total fees paid


Sell

Emitted when a user sells tokens back to the bonding curve.

event Sell(
    address indexed user,
    bytes32 indexed clipperId,
    bytes32 indexed contentId,
    uint256 tokensIn,
    uint256 ethOutGross,
    uint256 netEth
);
Field Type Description
user address Seller's wallet address
clipperId bytes32 Keccak256 hash of clipper's username
contentId bytes32 Keccak256 hash of normalized clip URL
tokensIn uint256 Tokens sold by user
ethOutGross uint256 ETH value before fees (in wei)
netEth uint256 ETH received by user after fees (in wei)

Fee calculation: ethOutGross - netEth = total fees paid


IntegratorFeePaid

Emitted when an integrator earns fees from a trade.

event IntegratorFeePaid(
    address indexed integrator,
    uint256 amount
);
Field Type Description
integrator address Integrator's fee recipient address
amount uint256 Fee amount paid to integrator (in wei)

Graduation Events

ReadyToGraduate

Emitted when a token reaches its ETH graduation threshold.

event ReadyToGraduate(
    bytes32 indexed contentId,
    address indexed token,
    uint256 ethReserves,
    uint256 ethTarget
);
Field Type Description
contentId bytes32 Keccak256 hash of normalized clip URL
token address Token contract address
ethReserves uint256 Current ETH in bonding curve (in wei)
ethTarget uint256 Graduation threshold (in wei)

This event signals the token is ready for graduation. The ClipFi backend automatically calls graduate() when detected.


Graduated

Emitted when migration to Uniswap V2 is complete.

event Graduated(
    bytes32 indexed contentId,
    address indexed token,
    address indexed dexPair
);
Field Type Description
contentId bytes32 Keccak256 hash of normalized clip URL
token address Token contract address
dexPair address Uniswap V2 pair address

After graduation, trading continues on Uniswap V2. The 2% fee still applies to swaps involving the main pair.


Example: Filtering Events

import { ethers } from 'ethers';

const provider = new ethers.JsonRpcProvider('https://mainnet.base.org');

// ClipFi token ABI (events only)
const ABI = [
  'event Buy(address indexed user, bytes32 indexed clipperId, bytes32 indexed contentId, uint256 ethIn, uint256 netEth, uint256 tokensOut)',
  'event Sell(address indexed user, bytes32 indexed clipperId, bytes32 indexed contentId, uint256 tokensIn, uint256 ethOutGross, uint256 netEth)',
];

const token = new ethers.Contract(TOKEN_ADDRESS, ABI, provider);

// --- Filter by user wallet ---
const userFilter = token.filters.Buy(userAddress);
const userBuys = await token.queryFilter(userFilter, fromBlock, toBlock);

// --- Filter by clipper username ---
// Hash the username to get clipperId
const clipperId = ethers.keccak256(ethers.toUtf8Bytes("username"));
const clipperFilter = token.filters.Buy(null, clipperId);
const clipperTrades = await token.queryFilter(clipperFilter, fromBlock, toBlock);

// --- Filter by clip URL ---
// Normalize URL: lowercase, no protocol, no query params
const normalizedUrl = "tiktok.com/@user/video/123456789";
const contentId = ethers.keccak256(ethers.toUtf8Bytes(normalizedUrl));
const clipFilter = token.filters.Buy(null, null, contentId);
const clipTrades = await token.queryFilter(clipFilter, fromBlock, toBlock);

// --- Calculate price from event ---
userBuys.forEach(event => {
  const ethIn = event.args.ethIn;
  const tokensOut = event.args.tokensOut;
  // Price = ETH per token
  const price = Number(ethIn) / Number(tokensOut);
  console.log(`Bought at ${price} ETH per token`);
});
from web3 import Web3

w3 = Web3(Web3.HTTPProvider('https://mainnet.base.org'))

# ClipFi token ABI (events only)
ABI = [
    {"anonymous": False, "name": "Buy", "type": "event",
     "inputs": [{"indexed": True, "name": "user", "type": "address"},
                {"indexed": True, "name": "clipperId", "type": "bytes32"},
                {"indexed": True, "name": "contentId", "type": "bytes32"},
                {"indexed": False, "name": "ethIn", "type": "uint256"},
                {"indexed": False, "name": "netEth", "type": "uint256"},
                {"indexed": False, "name": "tokensOut", "type": "uint256"}]},
]

token = w3.eth.contract(address=TOKEN_ADDRESS, abi=ABI)

# --- Filter by user wallet ---
user_filter = token.events.Buy.create_filter(
    fromBlock=from_block,
    argument_filters={'user': user_address}
)
user_buys = user_filter.get_all_entries()

# --- Filter by clipper username ---
# Hash the username to get clipperId
clipper_id = w3.keccak(text="username")
clipper_filter = token.events.Buy.create_filter(
    fromBlock=from_block,
    argument_filters={'clipperId': clipper_id}
)
clipper_trades = clipper_filter.get_all_entries()

# --- Filter by clip URL ---
# Normalize URL: lowercase, no protocol, no query params
normalized_url = "tiktok.com/@user/video/123456789"
content_id = w3.keccak(text=normalized_url)
clip_filter = token.events.Buy.create_filter(
    fromBlock=from_block,
    argument_filters={'contentId': content_id}
)
clip_trades = clip_filter.get_all_entries()

# --- Calculate price from event ---
for event in user_buys:
    eth_in = event['args']['ethIn']
    tokens_out = event['args']['tokensOut']
    # Price = ETH per token
    price = eth_in / tokens_out
    print(f"Bought at {price} ETH per token")
package main

import (
    "context"
    "fmt"
    "math/big"
    "github.com/ethereum/go-ethereum"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/ethclient"
)

func queryEvents() {
    client, _ := ethclient.Dial("https://mainnet.base.org")

    // Buy event signature
    buyEventSig := crypto.Keccak256Hash([]byte(
        "Buy(address,bytes32,bytes32,uint256,uint256,uint256)",
    ))

    // --- Filter by clipper username ---
    // Hash the username to get clipperId
    clipperId := crypto.Keccak256Hash([]byte("username"))

    query := ethereum.FilterQuery{
        Addresses: []common.Address{tokenAddress},
        Topics: [][]common.Hash{
            {buyEventSig},       // Event signature
            nil,                  // user (any)
            {clipperId},          // clipperId filter
        },
        FromBlock: big.NewInt(fromBlock),
        ToBlock:   big.NewInt(toBlock),
    }

    logs, _ := client.FilterLogs(context.Background(), query)

    // --- Calculate price from event ---
    for _, log := range logs {
        ethIn := new(big.Int).SetBytes(log.Data[:32])
        tokensOut := new(big.Int).SetBytes(log.Data[64:96])
        fmt.Printf("ETH in: %s, Tokens out: %s\n", ethIn, tokensOut)
    }
}
use ethers::{
    prelude::*,
    providers::{Http, Provider},
};

async fn query_events() -> Result<(), Box<dyn std::error::Error>> {
    let provider = Provider::<Http>::try_from("https://mainnet.base.org")?;

    // Buy event signature
    let buy_event_sig = H256::from(keccak256(
        "Buy(address,bytes32,bytes32,uint256,uint256,uint256)"
    ));

    // --- Filter by clipper username ---
    // Hash the username to get clipperId
    let clipper_id = H256::from(keccak256("username".as_bytes()));

    let filter = Filter::new()
        .address(token_address)
        .topic0(buy_event_sig)      // Event signature
        .topic2(clipper_id)          // clipperId filter (topic index 2)
        .from_block(from_block)
        .to_block(to_block);

    let logs = provider.get_logs(&filter).await?;

    // --- Calculate price from event ---
    for log in logs {
        let eth_in = U256::from_big_endian(&log.data[0..32]);
        let tokens_out = U256::from_big_endian(&log.data[64..96]);
        println!("ETH in: {}, Tokens out: {}", eth_in, tokens_out);
    }

    Ok(())
}
# Query Buy events filtered by clipper username
# First, compute the keccak256 hash of the username
CLIPPER_ID=$(cast keccak "username")

# Query events with topic filter
cast logs \
  --from-block 1000000 \
  --to-block latest \
  --address TOKEN_ADDRESS \
  "Buy(address indexed user, bytes32 indexed clipperId, bytes32 indexed contentId, uint256 ethIn, uint256 netEth, uint256 tokensOut)" \
  --topic2 $CLIPPER_ID \
  --rpc-url https://mainnet.base.org

Indexing Notes

  • All indexed fields are filterable via standard RPC methods
  • contentId = keccak256(normalizedClipUrl) — URL is lowercase, no protocol, no query params
  • clipperId = keccak256(username) — Username as UTF-8 bytes
  • Events are emitted from individual token proxies, not the factory
  • For a global feed, index all tokens from ClipRegistry

Use Cases

Use Case Events to Index
Activity feed Buy, Sell
Price charts Buy, Sell (calculate price from amounts)
Volume tracking Buy, Sell
Graduation alerts ReadyToGraduate, Graduated
Integrator dashboard IntegratorFeePaid
Clipper earnings Buy, Sell (filter by clipperId)

Security

ClipFi is designed to be simple, deterministic, and resistant to common bonding curve exploits.

Core guarantees

Protection Description
No pre-graduation transfers Tokens can only move between contract and user until graduation — prevents front-running and sniping
LP permanently locked At graduation, LP tokens are sent to a dead address (0x...dead)
Reentrancy protection All swap and graduation paths use ReentrancyGuard
Fixed supply 1B total supply, immutable (800M curve + 200M LP)
Registry enforcement One Clip Coin per clip, one Clipper Coin per clipper

Architecture

  • Minimal onchain surface area
  • No arbitrary external calls
  • Safe ETH transfer patterns
  • Deterministic state transitions

Post-graduation

After graduation:
- Token trades on Uniswap V2
- Same fee structure applies to DEX swaps
- Wallet-to-wallet transfers are fee-free

Base Deployment

ClipFi is deployed on Base (Chain ID 8453).


Contract Addresses

Contract Address Description
ClipFiToken TBD Implementation contract for all tokens
ClipRegistry TBD Central registry for token mappings
ClipCoinFactory TBD Factory for creating Clip/Clipper Coins
ClipSellQuoteHelper TBD Batch quote utility for frontends

Contract addresses will be published here after mainnet deployment.


External Dependencies

Contract Address
Uniswap V2 Router 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24
Uniswap V2 Factory 0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6
WETH 0x4200000000000000000000000000000000000006

Network Details

Property Value
Network Base Mainnet
Chain ID 8453
Block Explorer basescan.org
RPC https://mainnet.base.org

Contract Architecture

ClipFi uses a minimal proxy pattern (EIP-1167) for gas-efficient token deployment.

┌─────────────────────┐
│   ClipCoinFactory   │ ─── Creates minimal proxies
└──────────┬──────────┘
           │
           ▼
┌─────────────────────┐
│    ClipRegistry     │ ─── Maps clips/clippers to tokens
└──────────┬──────────┘
           │
           ▼
┌─────────────────────┐
│    ClipFiToken      │ ─── Implementation (shared logic)
│    (Implementation) │
└─────────────────────┘
           │
           ▼
┌─────────────────────┐
│   Token Proxies     │ ─── Individual Clip/Clipper Coins
│  (Minimal Clones)   │
└─────────────────────┘

Token Creation Flow

  1. User initiates token creation via ClipFi app
  2. Backend calls ClipCoinFactory.createClipCoin() or createClipperCoin()
  3. Factory deploys a minimal proxy pointing to ClipFiToken
  4. Token is registered in ClipRegistry
  5. Token is immediately tradeable on the bonding curve

Verification

All contracts are verified on BaseScan. Source code is available at:


Audits

Audit status: Pending

Security review details will be published here when available.

Brand

Terminology

Use consistently across all channels:

Term Usage
Clip Coin Token tied to a specific clip
Clipper Coin Personal token for a clipper
Clipper Person who launches a Clip Coin
Clip Farming The behavior of racing to tokenize viral moments

Tone

  • Confident and direct
  • Economics-forward
  • Accessible to traders and builders

Avoid

  • "Clip token" / "Clipper token" — always use "Coin"
  • Overpromising language
  • Unverified claims

Brand Assets

Download official ClipFi logos and icons for your integrations, articles, or projects.

Wordmark

The full ClipFi logo with text. Use on light or dark backgrounds.

Asset Size Download
Wordmark (Large) 1200px clipfi-wordmark-1200.png
Wordmark (Medium) 600px clipfi-wordmark-600.png

Icon

The ClipFi icon mark. Available in color, white, and black variants.

Asset Size Download
Icon (Color) Full clipfi-icon-color.png
Icon (Color) 128px clipfi-icon-color-128.png
Icon (White) Full clipfi-icon-white.png
Icon (White) 128px clipfi-icon-white-128.png
Icon (Black) Full clipfi-icon-black.png
Icon (Black) 128px clipfi-icon-black-128.png

Usage Guidelines

  • Maintain clear space around the logo
  • Do not stretch, rotate, or distort the logo
  • Do not change the logo colors
  • Use the white or black icon on backgrounds where the color version lacks contrast

Roadmap

ClipFi ships fast. Here's what's ahead.


Now

  • Viral onboarding refinements
  • Explore page ranking improvements
  • Integrator program rollout
  • Platform coverage expansion

Next

  • Clipper reputation system
  • Clip Points expansion
  • Discovery engine improvements
  • Partner integrations

Future

  • Clip farming as a real economy
  • ClipFi as the default market for viral moments on Base

Disclaimer

ClipFi is experimental software. Use at your own risk.


Risk Warning

  • Memecoins are highly volatile and speculative
  • You may lose some or all of your investment
  • Past performance does not indicate future results
  • Smart contracts may contain bugs despite testing

Not Financial Advice

Nothing in this documentation constitutes financial, investment, legal, or tax advice. Always do your own research and consult qualified professionals before making investment decisions.


Verification

Always verify contract addresses and transaction details before trading. Only use official links from clipfi.org.