portals
Open a portal

Documentation

How a portal works.

Every portals coin is a normal pump.fun coin with one extra rule: its creator fees leave Solana through two exits, one for buys and one for sells, and arrive as native coins on other chains. This page is the full rulebook, written from the code that runs it.

01

Overview

One coin, two exits. Buys feed one chain, sells feed another, and holders get paid in both.

Tradeon pump.fun
Creator feeper trade
Router walletone per coin
Splitbuy / sell
ExitNEAR Intents

pump.fun pays a creator fee on every trade. When you launch here, that fee is assigned to a router wallet made just for your coin. Once an hour the router collects what has built up, works out how much came from buys and how much from sells, and sends each part out through its own exit.

Exits are delivered by NEAR Intents, which swaps the SOL and sends native coins: real ZEC to a Zcash address, real BTC to a Bitcoin address, and so on. Nobody needs to bridge, wrap or touch another chain's wallet to receive them.

02

Launching a coin

One wallet approval. Up to three transactions, all built and checked by the server before you sign.

  1. 1

    Pick the coin and the rule

    Name, ticker, image, then a buy exit, a sell exit and a destination: holders or one address. The image and metadata are pinned to IPFS through pump.fun.
  2. 2

    Create

    The coin is created on pump.fun with you as the creator, so it shows up as yours everywhere.
  3. 3

    Share fees with the router

    A pump.fun fee-sharing config is created and sets the coin's router wallet as the only shareholder at 100%. The same transaction sends 0.01 SOL of fuel to the router so it can pay its own network fees.
  4. 4

    Optional first buy

    Buy up to 10 SOL of your own coin in the same approval.

03

The rule

The rule is set once, at launch, and can't be changed afterwards.

the rule, as the site prints it
SOLANA ──BUY──► ZCASH
SOLANA ──SELL─► BITCOIN
DEST   ────────► HOLDERS
Buy exit
Any listed exitWhere the share of fees earned from buys goes.
Sell exit
Any listed exitCan be the same coin as the buy exit.
Destination
Holders · One addressHolders split each hour pro rata. One address sends both legs to addresses set at launch.

04

The hourly cycle

Every hour, for every live coin, the engine runs the same five steps.

  1. 1

    Collect

    The router calls pump.fun's fee distribution for the coin. If the unclaimed amount is below pump.fun's own minimum, nothing is collected that hour and it simply keeps building.
  2. 2

    Measure

    Every trade since the last cycle is read from pump.fun and summed into buy SOL and sell SOL.
  3. 3

    Split

    The collected SOL is split between the two exits in proportion to that buy and sell volume.
  4. 4

    Assign

    Holder routes credit every eligible holder's balance. One-address routes send each leg once it passes the minimum delivery size.
  5. 5

    Record

    The cycle, its amounts and its transaction are stored and shown on the coin's page.

Each coin is locked while its cycle runs and can run at most once every 50 minutes, so an hour can never be paid twice.

05

How fees split

pump.fun charges the same creator fee rate on buys and sells, so volume is a fair way to tell the two apart.

engine · lib/engine/run.ts
buyShare  = collected × buyVolume / (buyVolume + sellVolume)
sellShare = collected − buyShare

// no trades recorded this hour → split 50 / 50

Try the split

Example coin routing buys to ZEC and sells to BTC. Same math as the engine.

2.00 SOL
60%
1.0%
Buy exitZEC

0.012 SOL

Loading live price…

Sell exitBTC

0.008 SOL

Loading live price…

pots: 1.2000 SOL → ZEC · 0.8000 SOL → BTC · you get 1.0% of each

06

Holder snapshots

Taken at the moment of each cycle, straight from the chain.

Who counts
Wallets holding the coinAll token accounts are read and added up per owner, so a wallet with several accounts counts once.
Minimum holding
100,000 tokens0.01% of the 1,000,000,000 supply. Smaller holders are skipped for that hour.
Excluded
Curve, pools, routerProgram-owned accounts such as the bonding curve and AMM pools, plus the coin’s own router wallet, never earn.
Your share
your tokens ÷ eligible supplyEligible supply is the total held by the wallets that qualify, not the whole 1B.

07

Claiming

Holder balances wait for you. Claim them whenever you like, to any address you choose.

  1. 1

    Find your balance

    Paste your wallet on Claim or open the coin's page. Balances are tracked per coin and per exit, in SOL.
  2. 2

    Enter where to receive it

    A native address on the exit's chain. It is checked against NEAR Intents before you sign.
  3. 3

    Sign a message

    Your wallet signs a plain-text message. It costs nothing, moves nothing and is valid for 5 minutes.
  4. 4

    Delivery

    The router sends your whole balance for that exit to NEAR Intents, which swaps it and delivers the native coin. The coin's page tracks it until it settles.
the exact message you sign
portals claim
wallet: <your Solana wallet>
coin: <mint>
asset: ZEC
deliver to: <your ZEC address>
issued: 2026-10-01T16:00:00.000Z

The signature proves the wallet that earned the balance chose this address, so nobody else can claim it. If a delivery fails or NEAR refunds it, the balance is put back automatically and you can claim again.

08

One-address routes

For a creator, a treasury or a cause: both legs go straight to addresses set at launch.

With One address there is nothing to claim. Each hour, every leg that has reached 0.02 SOL is sent automatically. Smaller amounts wait for the next hour.

09

Exits

10 exits, each one quoted live from SOL through NEAR Intents before it was listed.

  • ZEC · Zcasht1… or u1… address
  • BTC · Bitcoinbc1… address
  • ETH · Ethereum0x… address
  • SOL · SolanaSent directly on Solana
  • XRP · XRP Ledgerr… address
  • DOGE · DogecoinD… address
  • LTC · Litecoinltc1… or L… address
  • SUI · Sui0x… address
  • TRX · TronT… address
  • DASH · DashX… address

SOL is the one exit that never leaves Solana: it is sent as a plain transfer, with no swap and no bridge cost.

10

Costs and limits

Every number here is read from the code, not typed into this page.

Cycle
Every hourAt most once per 50 minutes per coin.
Router fuel
0.01 SOLSent once at launch so the router can pay its network fees.
Router reserve
0.005 SOLAlways kept back for fees and rent.
Minimum delivery
0.02 SOLSmaller balances stay credited until they grow past it.
Minimum holding
100,000 tokens
Largest first buy
10 SOL
Claim signature
Valid 5 minutes
Delivery costs
Taken by the routeNEAR Intents’ swap spread plus network fees on both chains come out of the delivered amount. They are mostly fixed, so small deliveries lose a larger share: claiming a bigger balance less often keeps more.

11

Custody and risk

Read this before you launch or hold.

pump.fun
Trading and feesCoin creation, the bonding curve, the fee rate and fee sharing are all pump.fun’s. If pump.fun changes them, routes change with them.
NEAR Intents
DeliveryQuotes, swaps and settlement are NEAR’s. If a route stops quoting, the balance stays credited and the claim can be retried.
Rule
Fixed at launchExits and destination can’t be changed after the coin exists.
Not advice
Memecoins are volatileFees depend entirely on trading volume. A coin nobody trades earns nothing.

12

Public API

Read-only and keyless. Data comes from the same sources the site uses.

GET/api/prices

USD price for SOL and every exit.
curl
curl https://useportal.tech/api/prices

GET/api/search?q=<name | ticker | mint>

Live coins matching a name, a ticker or the start of a mint.

GET/api/coins/<mint>/trades

Latest trades: tx, time, user, type, sol, usd, price.

GET/api/coins/<mint>/candles?tf=1m|5m|15m|1h|4h|1d

OHLCV candles in USD per token. Only intervals with trades are returned.

GET/api/claim?mint=<mint>&wallet=<wallet>

A wallet's balances for one coin (owed and delivered in lamports per exit), plus its last 10 deliveries.
JavaScript
const res = await fetch('https://useportal.tech/api/claim?mint=<mint>&wallet=<wallet>')
const { balances } = await res.json()

for (const b of balances) {
  const unclaimed = BigInt(b.owed) - BigInt(b.delivered)
  console.log(b.asset, Number(unclaimed) / 1e9, 'SOL')
}

POST/api/claim

Starts a delivery. Body: mint, wallet, asset, recipient, issued (ISO time) and signature (base58 ed25519 over the claim message above). Errors return { error } with 400, 401, 404, 409 or 503.

13

FAQ

Do I need a Zcash or Bitcoin wallet to buy the coin?

No. You trade with SOL on pump.fun like any other coin. You only need an address on an exit’s chain when you claim to it.

Why is my balance shown in SOL?

Fees are collected in SOL and swapped at the moment you claim, so you get the live rate then, not the rate from when the fee was earned.

I sold. Do I keep what I earned?

Yes. Credited balances stay yours. You just stop earning from the next snapshot.

Does it still work after the coin graduates?

Yes. pump.fun keeps paying creator fees on its AMM, and fee sharing carries over.

Can the launcher change the exits later?

No. The rule is fixed when the coin is created.

Where can I ask something else?

On X at @portalstech.