Protocol
Contracts
The Phase 1 contracts, the v2 additions (fee tiers, referrals, rewards), what each does, and their addresses.
Source: pinarc-contracts (Foundry). Fork tests run against Robinhood Chain mainnet with the real Uniswap V2 deployment.
| Contract | Role |
|---|---|
| PinarcConfig | Platform parameters (curve shape, fees, guards) and the guardian. Owned by the admin. Curves snapshot values at creation, so changes only affect new launches. |
| PinarcFactory | createToken(CreateParams): deploys the token and a curve clone, collects the launch fee, escrows bond and dev buy, registers the launch. allTokens, curveOf(token). |
| PinarcToken | Fixed-supply ERC-20 (burnable, permit) with a creator-editable metadataURI. |
| BondingCurve | One minimal-proxy clone per token. Batch auction, anti-sniper window, constant-product trading, graduation. |
| CreatorBond | USDG escrow per token; released after graduation + lock, or slashed by the guardian into the floor reserve. |
| FloorReserve | USDG per token; redeem burns tokens for reserve / totalSupply each. |
| VestingVault | Cliff + linear schedules; team allocation at launch, standalone for anyone. |
| LPLocker | Time-locks any ERC-20; lock id = certificate. |
Addresses (Robinhood Chain mainnet, chain id 4663)
Deployed from pinarc-contracts (deployments/4663.json); the indexer starts at block 65,381,613. All seven contracts are verified on Sourcify (exact match) — each address links to its Blockscout page, where the Sourcify verification is picked up.
| Contract | Address |
|---|---|
| PinarcFactory | 0x0cF1cdf2e85b324Ea422AeA5Bd16764217703c5E |
| PinarcConfig | 0xE2B2aF83537C56995294d189a5E80b281c3B2F7e |
| BondingCurve implementation | 0xcf6D0a9D28A44200C862774Cb4F0fe528564706b |
| CreatorBond | 0xFe16E9e6FA0F95F6b3a1d4849Af0e66AA1A25390 |
| FloorReserve | 0x02c2e0460B75A68C9E76F3015A378dfFA8Ef4F42 |
| LPLocker | 0xC49ade379b89F0bD1Cb08D21eE6440B12Ad9894d |
| VestingVault | 0x380b3D5fafbfDaC70108d3A1D4208d6f4b4BBf88 |
| USDG (Global Dollar) | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| Uniswap V2 Router02 | 0x89e5DB8B5aA49aA85AC63f691524311AEB649eba |
| Uniswap V2 factory | 0x8bcEaA40B9AcdfAedF85AdF4FF01F5Ad6517937f |
Every launched token gets its own PinarcToken and a BondingCurve clone of the implementation above; PinarcFactory.curveOf(token) maps one to the other.
v2 contracts (2026-09-18): fee tiers, referrals, rewards
Deployed on top of the same Config / LPLocker / FloorReserve / VestingVault (deployments/4663.v2.json, all Sourcify exact-match). New launches go through factory v2; the v1 factory above stays indexed and its launches keep the flat fee.
| Contract | Address | Role |
|---|---|---|
| PinarcFactory v2 | 0xA2f9201875548De77AeECDDed362fB869ddB156d | Same createToken; wires each new curve to the FeePolicy |
| BondingCurve implementation v2 | 0xCE128400d506af33aF37DBAba7354daa4aC139fe | Adds buyReferred, feeBpsFor(trader), tiered fees at trade time, ReferralPaid |
| FeePolicy | 0xaF51a2373AC05e52ad2A9b55639A2783Cdcb61d3 | $PINA holder tiers (feeBpsFor), referral share (20%), referrer registry (referrerOf, bind callable only by v2 curves) |
| CreatorBond v2 | 0x9C5d9Cf4aDef103937c889F48C98A735E018AA3f | Same contract, bound to factory v2 |
| RewardsDistributor | 0x123508dFCe1Bd5Dc5e25f627030F6a7C754429b1 | Merkle-claimable reward rounds (Points seasons, weekly boards, creator grants); see Rewards |
| $PINA | 0x050a18c9e14D2a13dE99762AC28CB70C8D702303 | ERC-20, 9 decimals, 1,000,000,000 supply; the balance FeePolicy reads |
FeePolicy and RewardsDistributor are the only owned contracts besides PinarcConfig; what their owner can and cannot do is listed on the Security model page.
| Role | Address |
|---|---|
| Treasury (platform fees) | 0x4db8587bb156FA02501b23800cC302D0Ba3e656E |
| Guardian (may slash bonds into the floor) | 0x4db8587bb156FA02501b23800cC302D0Ba3e656E |
| PinarcConfig owner | Deployer 0x595EDF40d3400eE8506b705d29deA38E418F7f34 until the pending two-step transfer to the treasury address is accepted |
Verification: Sourcify (exact match for all seven).
Key functions
// PinarcFactory
function createToken(CreateParams calldata p) external returns (address token, address curve);
struct CreateParams { string name; string symbol; string metadataURI; uint16 floorBps; uint32 lpLockSeconds;
uint16 teamBps; uint64 teamCliff; uint64 teamDuration; uint128 bond; uint128 devBuyUsdc; }
// BondingCurve
function commitBatch(uint256 usdcIn) external; function settleBatch() external;
function claimBatch() external returns (uint256 tokensOut, uint256 refund);
function buy(uint256 usdcIn, uint256 minTokensOut, address to) external returns (uint256 tokensOut);
function sell(uint256 tokensIn, uint256 minUsdcOut, address to) external returns (uint256 usdcOut);
function quoteBuy(uint256 usdcIn) external view returns (uint256 tokensOut, uint256 usdcUsed, uint256 fee);
function quoteSell(uint256 tokensIn) external view returns (uint256 usdcOut, uint256 fee);
function price() external view returns (uint256); // 18-dec USDG per whole token
function progressBps() external view returns (uint256); function isGraduated() external view returns (bool);
// CreatorBond // FloorReserve // VestingVault // LPLocker
function release(address token); function redeem(address token, uint256 amount); function release(uint256 id); function withdraw(uint256 id, address to);
function slash(address token, string calldata reason); // guardian only
Events the indexer follows
TokenCreated, Launched, BatchCommitted, BatchSettled, BatchClaimed, Trade, Graduated, token Transfer and MetadataUpdated, Locked / Extended / Withdrawn / LockTransferred, ScheduleCreated / Released, Posted / Released / Slashed, Deposited / Redeemed, and Uniswap pair Swap / Sync for graduated tokens.
Trust model
- Curves, the vault, the locker and the floor have no admin functions.
PinarcConfigowner sets parameters for future launches and the guardian address.- The guardian can only move a bond into that token's floor reserve.
- Metadata is the only thing a creator can change after launch.