docs

how the split works.

short version: the cause is a constructor argument, the splitter has no owner, and the function that moves the money is open to anyone.

01 / the path a fee takes

four hops, no discretion in any of them.

  1. 01

    swap

    a buy or sell on the Pons V2 curve pays a 1% fee.

  2. 02

    token

    the token forwards its fee share to the splitter named at deploy time.

  3. 03

    splitter

    holds it. cannot spend it anywhere else — there is one address in it.

  4. 04

    recipient

    the address donate.gg verified for that cause. anyone can call release().

02 / the contract

written, reviewed, not deployed.

it is short on purpose. every line you remove from a contract holding charity money is a line that cannot be exploited or argued about.

// CauseSplitter.sol — the whole trust argument, in ~20 lines
contract CauseSplitter {
    address public immutable recipient;   // set once, in the constructor
    // no owner. no withdraw. no pause. no upgrade path.

    constructor(address _recipient) {
        require(_recipient != address(0), "no recipient");
        recipient = _recipient;
    }

    receive() external payable {}

    /// @notice unguarded on purpose: anyone can push the balance out,
    ///         including the recipient. the promise does not depend on us.
    function release() external {
        uint256 amount = address(this).balance;
        require(amount > 0, "nothing to release");
        (bool ok, ) = recipient.call{value: amount}("");
        require(ok, "transfer failed");
        emit Released(recipient, amount);
    }

    event Released(address indexed to, uint256 amount);
}
contractwhat it doesaddress
LaunchFactorydeploys a token on Pons V2 and writes its cause split in the same transaction.awaiting launch
CauseSplitterholds the fee stream of one launch. the recipient is immutable, there is no owner and no withdraw — release() is external and unguarded, so anyone can push the money out.awaiting launch
CauseRegistrymaps a cause slug to the payout address donate.gg has verified for it. append-only.awaiting launch
$GIVEthe house token, launched through the same factory as everything else.awaiting launch
03 / the chain trap

an address is not portable.

the splitter pays on robinhood chain and cannot bridge. the donation address an organisation publishes is usually a custodial deposit address on ethereum mainnet, and reusing it here would send the money to a contract nobody controls — permanently. that is why a cause needs an address confirmed on this chain, in writing, before it can receive anything.

04 / api

key-less, and honest about being empty.

three read endpoints and one write. the write returns 501 and names the missing environment variable rather than accepting a launch it cannot perform.

curl https://givepad.tech/api/v1/tokens

{
  "live": false,
  "note": "no indexer configured; these are the example rows the site renders",
  "missing": "NEXT_PUBLIC_GIVEPAD_API",
  "tokens": [ … ]
}
  • GET /api/v1/tokensevery token, newest first
  • GET /api/v1/tokens/{address}one token, with its cause and split
  • GET /api/v1/causesthe registry, and which causes have a verified recipient
  • POST /api/v1/launchdeploy — 501 until the factory exists
05 / questions
is a token launched here a donation?+

no, and the site never says otherwise. buying a token is not a charitable gift, it is not tax deductible, and you should assume you can lose all of it. what is true is narrower and checkable: the swap fee stream of that token is routed to a splitter whose recipient cannot be changed.

why does givepad take nothing from the swap fee?+

because a launchpad that takes a cut of a charity fee has to explain the cut on every page. the 0.0005 eth launch fee covers the deploy and the indexer; the swap fee goes to the cause at 100%.

what stops a launcher pointing the split at their own wallet?+

nothing on Pons V2 generally — which is exactly why the recipient here is not a free field. it is read from the on-chain registry by cause slug, and only donate.gg can append to that registry.

why is every counter zero?+

because nothing is deployed. a running donation total on a page like this is a fabricated donation, so the site total reads the indexer or reads zero. the tables carry an example set and say so in a line above the numbers.

what happens when a cause has no verified organisation?+

the launch form refuses to submit. it is one of six interlocks, and it names itself rather than failing silently.

still reading?

the registry is the part that needs people, not code. tell us which cause to open next.