Protocol
Contracts
The eight Phase 1 contracts, 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.
| 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.