navigate JKscroll
Link copied!

Clip farming, onchain.

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

ClipFi brings that activity onchain.

Fees flow to the clipper on every trade.

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


The Premise

Clip farming is already a behavior.

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

ClipFi creates onchain markets around viral moments and rewards early discovery.

First to clip = first to earn.


How It Works

  1. Sign in
  2. Paste a clip URL
  3. Your Clip Coin launches in seconds — free
  4. Earn 1% on every trade — forever

No gas fees. No setup. ClipFi covers deployment costs.

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

Supported clips
X Twitch YouTube TikTok Kick Reddit Sora Meta AI
Support expands as new content formats emerge.

Why This Exists

  • The behavior already exists
  • Clips are discovery
  • Every viral moment becomes a market

Early discovery becomes provable, onchain, and economically aligned.


Official project links can be found here.

How It Works

ClipFi has two token types, each serving a different role in the ecosystem.


Clipper Coin

Your personal coin.

Sign in once. It goes live automatically. Every trade pays you 1%.

  • One Clipper Coin per account
  • Tradeable by anyone
  • Fees stream to you on every trade

Designed to represent your identity and participation on ClipFi.


Clip Coin

Coins tied to viral moments.

Clips already spread across the internet. ClipFi turns early discovery into an onchain market.

  • Paste a clip → a Clip Coin launches
  • Anyone can trade the coin
  • First to clip = first to earn
Supported clips
X Twitch YouTube TikTok Kick Reddit Sora Meta AI

Token Lifecycle

Every Clip Coin follows the same lifecycle:

  1. Bonding curve — Initial trading phase with price discovery
  2. Graduation — Market cap reached → migrate to Uniswap V2
  3. LP burned — Liquidity permanently locked
  4. Transfers enabled — Token trades freely on the open market

Fee Structure

Every trade on ClipFi pays a fixed base fee:

Recipient Fee
Clipper 1%
Protocol 1%

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


Integrator fees

Trades routed through third-party integrators (bots, terminals, or apps) outside the ClipFi app may incur an additional 0–1% integrator fee.

These fees are set by the integrator, not ClipFi, and are paid directly to the integrator’s wallet.

Quick Start

Launch in seconds. No setup. No gas.


1. Sign in

Your Clipper Coin goes live immediately — free.

One per account. Fees stream to you on every trade.


2. Paste a clip

Paste a viral clip URL.

Your Clip Coin launches within seconds — free.

Supported clips
X Twitch YouTube TikTok Kick Reddit Sora Meta AI

3. Earn

Every trade pays you 1%, instantly and onchain.

No claiming. No delays.


Tips

  • Clip moments that are already spreading
  • Speed matters — first to clip earns
  • Share the coin link to drive volume
  • More trades = more fees

Clip Farming

Clip farming already exists.

Streamers create moments — hot takes, shock, humor, chaos.
Clippers capture them first.
Clips spread everywhere. New viewers arrive.

That loop already runs the internet.
It’s not just streaming — it’s how all content spreads online.


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 finally 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

Is it free to launch?

Yes. Clipper Coins and Clip Coins are both free to launch.

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 A user who submits a clip and launches a Clip Coin
Clip Coin A token tied to a specific clip, post, or viral moment
Clipper Coin A personal token automatically created on a user’s first sign-in
Bonding Curve The initial trading phase where price discovery occurs via a bonding curve
Graduation The transition from the bonding curve to a Uniswap V2 liquidity pool
LP Burned Liquidity provider tokens sent to a dead address, permanently locking liquidity
Integrator A partner application or bot that routes trades and earns revenue share
Clip Points A non-transferable activity score reflecting participation across the ClipFi ecosystem

Clip Coins

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

Free to launch. No gas fees. No setup.

Supported clips
X Twitch YouTube TikTok Kick Reddit Sora Meta AI

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 — free
  3. Degens trade
  4. You earn 1% on every trade

First to clip = first to earn.

Clipper Coins

Your identity coin as a clipper. Sign in once. It’s live. Every trade pays you 1%.

Free to launch. No gas fees. No setup.


How It Works

  1. Sign in
  2. Your Clipper Coin launches immediately — free
  3. Fees stream to you on every trade

One Clipper Coin per account. Uses the same lifecycle and mechanics as Clip Coins.

Token Lifecycle

Every Clip Coin follows a two-stage lifecycle: an initial bonding curve phase, followed by open market trading on Uniswap.


Stage 1: Bonding Curve

The initial trading phase.

  • Uses virtual reserves for smooth price discovery
  • Transfers disabled — tokens can only move between the user and the bonding curve contract
  • All initial trading occurs on the bonding curve

Graduation

When the bonding curve reaches its ETH target:

  1. All ETH from the bonding curve seeds a Uniswap V2 pool
  2. A fixed supply of tokens is paired with the ETH
  3. LP tokens are burned (sent to a dead address)
  4. Transfers are enabled
  5. The token begins trading on Uniswap V2

Stage 2: Uniswap V2

After graduation:

  • The token trades on the open market
  • Liquidity is permanently locked (LP tokens burned)

Fees

Trading Fees

Every buy and sell incurs a 2% base trading fee:

Recipient Fee
Clipper 1.0%
Protocol 1.0%

Fees are distributed instantly, onchain, within the same transaction.


Integrator Revenue Share

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

Revenue share is configured per integration and paid directly to the integrator’s wallet.
See the Integrator Program for details.


Why This Works

  • Clippers are directly incentivized to promote and grow their coins
  • Integrators earn from the volume they route
  • The protocol scales linearly with usage — no complex tokenomics

Simple. Aligned. Sustainable.

Clip Points

Clip Points track participation across the ClipFi ecosystem.

They reflect activity such as clipping, trading, discovery, and ecosystem growth. Clip Points are experimental, non-transferable, and subject to change as ClipFi evolves.

Clip Points are designed to measure early participation, not financial value.


How Clip Points Are Earned

Clip Points are accumulated through onchain and platform activity. Examples include:

Action Example Contribution
Launching a Clip Coin Early creation signal
Trading on ClipFi Activity and liquidity
Volume generated Scaled participation
Your Clip Coin being traded Discovery impact
Referring new clippers Network growth
Integrator activity Ecosystem expansion

Note:
Point weights, formulas, and relative importance are not final and may change over time.

Points are calculated dynamically and may be reweighted as the system matures.


Leaderboards

Clip Points power public leaderboards that surface early contributors:

  • Top Clippers — ranked by Clip Points
  • Top Traders — ranked by trading activity
  • Top Clip Coins — ranked by recent engagement

Leaderboards reflect relative participation, not guarantees or rewards.


What Clip Points Unlock

Clip Points act as internal signals across ClipFi, including:

  • Status — relative standing among clippers
  • Visibility — higher participation may unlock featured placement
  • Reputation — proof of early ecosystem contribution
  • Future Experiments — Clip Points may be referenced in future protocol or community initiatives

Clip Points do not represent ownership, equity, or guaranteed rewards.


Important Notes

  • Clip Points are not transferable
  • Clip Points are tied to your ClipFi account
  • Clip Points have no fixed monetary value
  • Calculations may be adjusted retroactively
  • Participation does not guarantee future benefits

ClipFi may introduce new uses, adjustments, or resets as the system evolves.


Transparency

Clip Points are derived from verified activity, including onchain signals and platform interactions.

The system is intentionally flexible and will evolve as ClipFi scales.

Integrator Program

Earn revenue on every trade you route through ClipFi. No registration required — integrator fees are set and paid entirely onchain.


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

Integrator fees are optional and only apply when explicitly specified by the integrator.


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

// integratorFeeBps must be <= 100 (1%). Higher values will revert.
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

// integratorFeeBps must be <= 100 (1%). Higher values will revert.
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 integrator 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);

Check your Integrator Stats (UI)

You can view your integration performance directly on the ClipFi landing page:

  • Open clipfi.org/#api
  • Click Check Stats
  • Enter your integrator wallet address (0x...) or the integrator name you pass into buyWithIntegrator / sellWithIntegrator

This shows your routed volume and fee earnings for that integrator identity.


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 an integrator fee is paid
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 by design.


Support

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

Smart Contracts

ClipFi uses a minimal, auditable smart contract architecture designed for clarity and composability.


ClipFiToken

The core token implementation used by both Clip Coins and Clipper Coins.

  • ERC-20 (OpenZeppelin)
  • Bonding curve buy and sell logic
  • 2% base trading fee (1% clipper + 1% protocol)
  • Optional integrator fee (0–1%)
  • Automated graduation to Uniswap V2
  • Transfers restricted before graduation
  • Post-graduation DEX fee collection

ClipRegistry

Central registry for all ClipFi tokens.

  • Maps clip IDs → Clip Coin addresses
  • Maps clipper IDs → Clipper Coin addresses
  • Enforces one-to-one relationships
  • Maintains factory whitelist

ClipCoinFactory

Unified factory for token deployment.

  • createClipCoin() — Deploys a Clip Coin
  • createClipperCoin() — Deploys a Clipper Coin
  • Uses EIP-1167 minimal proxy pattern
  • Registers all tokens in ClipRegistry

CurveMath

Pure library for bonding curve calculations.

  • tokensOutGivenEth() — Buy quote calculation
  • ethOutGivenTokens() — Sell quote calculation
  • Virtual reserve management

ClipSellQuoteHelper

Read-only helper for frontends and bots.

  • Batch balance lookups across tokens
  • Pre-graduation sell quotes (bonding curve)
  • Post-graduation Uniswap V2 estimates

Events

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

All events are emitted from individual ClipFiToken contracts.


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 contracts, 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 exploit patterns.

Core guarantees

Protection Description
No pre-graduation transfers Tokens can only move between the user and the bonding curve until graduation
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 (enforced at contract level)

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 Uniswap V2 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 Token implementation contract
ClipRegistry TBD Central registry for token mappings
ClipCoinFactory TBD Factory for creating Clip and Clipper Coins
ClipSellQuoteHelper TBD Batch quote utility for frontends and bots

Contract addresses will be published here following 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 Endpoint 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. A user initiates token creation via the ClipFi interface
  2. The system calls ClipCoinFactory.createClipCoin() or createClipperCoin()
  3. The factory deploys a minimal proxy instance
  4. The token is registered in ClipRegistry
  5. The token becomes tradeable on its bonding curve

Verification

All contracts are verified on BaseScan.

Brand

This page defines how ClipFi should be referenced, described, and presented across all channels.

Consistency matters.


Terminology

Use the following terms exactly and consistently:

Term Definition
Clip Coin A token tied to a specific clip
Clipper Coin A personal token created for a clipper
Clipper A user who launches a Clip Coin
Clip Farming The behavior of racing to capture and tokenize viral moments

Tone

ClipFi communication should be:

  • Confident and direct
  • Economics-forward
  • Clear to traders, builders, and creators
  • Minimal, factual, and grounded in mechanics

Avoid

  • “Clip token” or “Clipper token” — always use Coin
  • Overpromising or hype language
  • Unverified, speculative, or forward-looking claims
  • Marketing language that implies guarantees or outcomes

Brand Assets

Official ClipFi brand assets for integrations, articles, dashboards, and media.

Wordmark

The full ClipFi logo with text. Use when space allows.

Asset Size Download
Wordmark 1200px clipfi-wordmark-1200.png
Wordmark 600px clipfi-wordmark-600.png

Icon

The ClipFi icon mark. Use when space is constrained.

Asset Variant Download
Icon Color clipfi-icon-color.png
Icon Color (128px) clipfi-icon-color-128.png
Icon White clipfi-icon-white.png
Icon White (128px) clipfi-icon-white-128.png
Icon Black 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 brand assets
  • Do not alter colors or apply effects
  • Use white or black icons when contrast requires it
  • Prefer the wordmark over the icon when space allows

Only use assets from this page. Anything else is unofficial.

Roadmap

ClipFi is live. This is what’s next.


Now

  • Viral onboarding improvements
  • Explore page ranking refinements
  • Integrator program rollout
  • Expanded clip source coverage

Next

  • Clipper reputation and credibility signals
  • Clip Points expansion and dynamic weighting
  • Onchain activity and participation scoring
  • Discovery engine upgrades
  • Ecosystem and partner integrations

Future

  • Clip farming as a native onchain economy
  • Protocol incentives aligned with early discovery and sustained activity
  • ClipFi as the default market for viral moments on Base

Disclaimer

ClipFi is experimental software. Use at your own risk.

By accessing or using ClipFi, you agree to the applicable Terms of Service and acknowledge the practices described in the Privacy Policy.


Risk Warning

  • Memecoins are highly volatile and speculative
  • You may lose some or all of your investment
  • Digital assets may have little or no liquidity
  • Smart contracts may contain bugs or unintended behavior
  • Blockchain transactions are irreversible

No Guarantees

ClipFi is provided on an “as is” and “as available” basis. No guarantees are made regarding functionality, availability, security, or outcomes. Use of the protocol and any associated interfaces is entirely at your own discretion and risk.


Not Financial Advice

Nothing in this documentation constitutes financial, investment, legal, or tax advice. Nothing here should be interpreted as a recommendation to buy, sell, or hold any asset.

You are solely responsible for your own decisions and actions. Always conduct your own research before participating.


Limitation of Responsibility

To the maximum extent permitted by law, ClipFi contributors, developers, and participants are not responsible for losses, damages, or claims arising from:

  • Use of the protocol or interface
  • Smart contract behavior
  • Market conditions or price movements
  • Third-party integrations, services, or content

Verification

Always verify contract addresses, transaction details, and links before trading. Only trust links listed in the Official Links.