Mainnet Test — On-Chain Proof
To prove that everything works as designed, we performed a full mainnet test on Abstract Chain with the exact same contract code as the production raise contract. The only changes were:
LAUNCH_TIMEchanged to1775031640(short delay for testing)EMERGENCY_DEADLINEchanged to1775031940(LAUNCH_TIME + 5 minutes, instead of 30 days)Token name changed to "PGMTest" / "PGMT" (instead of "PGM")
The raise contract is immutable — no admin functions, no upgrades, no proxy. What you see on-chain is what you get.
Deployed Contracts
Test Wallets
Deployment
All contracts were deployed on Abstract Chain mainnet using Foundry (forge script --broadcast). Each step below was executed as a separate transaction from the specified wallet.
Transaction Reference
All transactions are on Abstract Chain mainnet. Click any TX hash to verify on Abscan.
DEX trades (W2 sell, W4b buys/sells) are visible in the wallet histories linked in the Test Wallets table above, and on DexScreener.
Test Execution — Step by Step
Test Phase 1: Pre-Launch Deposits
Step 1 — W0 deploys all contracts
Deploys Governor, Truth, AddressBook, RoleMapping, Authority, all Routers, SacrificeProxies, ReferralRegistry, and Raise
Raise constructor creates PGMTest token and pulls 0.02 USDT for pool tick positioning
Deploy TXs: W0 wallet history on Abscan
Pool fund TX: 0xd417ad26...
Step 2 — W1 deposits 10 USDT
TX: 0xfe4f4da3...
Result: allocation = 10,000 PGM, buybackReserve += 10 USDT
Step 3 — W2 deposits 5 USDT (first)
TX: 0x7dd02827...
Step 4 — W2 deposits 5 USDT (second)
TX: 0x3d0ee3aa...
Proves: multiple deposits add correctly — allocation now 10,000 PGM
Step 5 — W3 deposits 10 USDT
TX: 0xeb002032...
Step 6a — W3 sacrifices 1 USDT to Shop
TX: 0x451b05b0...
Step 6b — W3 sacrifices 1 USDT to Game
TX: 0x0a73ab96...
Step 6c — W3 sacrifices 1 USDT to Staking
TX: 0x9581d216...
Step 6d — W3 sacrifices 1 USDT to Badge
TX: 0x91eb0cee...
Proves: all 4 sacrifice paths work, reserve reduces proportionally
Step 7 — W5 deposits 10 USDT
TX: 0xbaa1cc65...
Step 7b — W6 deposits 5 USDT
TX: 0x9fbd82b2...
State after all deposits: Total 45 USDT deposited, buybackReserve = 41 USDT (after 4 USDT sacrifice)
Test Phase 2: Launch
Step 8 — W2 calls launch() (not deployer!)
TX: 0x87dd68c8...
Proves: launch is permissionless — any wallet can call it
Test Phase 2b: Emergency Withdraw
Step 8b — W6 calls emergencyWithdraw()
TX: 0xbae48802...
Result: W6 receives 5 USDT back (full deposit)
Proves: emergency withdraw safety net works
Test Phase 3: Finalize
Step 9 — W1 calls finalize() (not deployer!)
TX: 0xafd84f51...
Creates LP pool on Aborean, mints PGM, renounces minter permanently
Proves: finalize is permissionless
Test Phase 4: Claim
Step 10 — W1 claims ALL (10,000 PGM)
TX: 0xbf691de6...
Step 11a — W2 partial claim (5,000 PGM)
TX: 0x313ab62d...
Proves: partial claims work
Step 11b — W2 claims remaining (5,000 PGM)
TX: 0xac2f1ae8...
Step 12a — W3 tries to over-claim (REVERT)
Tries
claim(10,000 PGM)but only 6,000 available after sacrificeResult: reverts with "bad amount"
Step 12b — W3 claims correct amount (6,000 PGM)
TX: 0x94554cea...
Step 13 — W5 claims ALL (10,000 PGM)
TX: 0xf8d12946...
Test Phase 5: Redeem
Step 14 — W1 redeems ALL — THE KEY PROOF
TX: 0xc92c925e...
Result: W1 receives 10 USDT (exact deposit amount)
Passive investor deposits 10 USDT, gets 10 USDT back. Zero loss.
Step 15a — W2 redeems 9,000 PGM (90%)
TX: 0xf053307e...
Result: W2 receives 9 USDT, still holds 1,000 PGM
Proves: partial redeem works
Step 15b — W3 tries to over-redeem (REVERT)
Tries
redeem(10,000 PGM)but only holds 6,000Result: reverts with "insufficient PGM"
Step 15c — W3 redeems ALL after sacrifice (6,000 PGM)
TX: 0x4ec6a01f...
Result: W3 receives 6 USDT (10 deposited - 4 sacrificed)
Proves: sacrifice math is correct
Test Phase 6: Price Drop and Buyback
Step 16 — W2 sells remaining 1,000 PGM on DEX
W2 swaps PGM for USDT on Aborean instead of using redeem()
Result: PGM price drops below $0.001
TX visible in W2 wallet history
Step 17 — W4 triggers buyback (never invested!)
TX: 0xfc82ff9c...
Calls
triggerBuyback(500000)— spends 0.5 USDT from reserve, buys 836 PGM, burns themProves: buyback is permissionless — anyone can defend the floor
Test Phase 7: Trading
Step 18a/b — W4b buys PGM on DEX (2 + 8 USDT)
TXs visible in W4b wallet history
Result: W4b receives ~2,993 PGM, price goes above $0.001
Step 19a/b — W4b sells PGM on DEX
Sells ~1,496 PGM then ~1,346 PGM
TXs visible in W4b wallet history
Step 19c — W4b redeems remaining ~150 PGM
TX: 0x7f2d0e66...
Note: redeeming at floor makes no economic sense normally — done to prove redeem works after trading
Step 20 — W3 calls collectTradingFees()
Result: 0.031 USDT in LP fees sent to TradingFeeRouter
Proves: only trading fees (LP earnings) are collected — not investor funds
TX visible in W3 wallet history
Test Phase 8: Excess USDT Collection
Step 21 — W1 calls collectExcessUSDT()
TX: 0xea84782b...
Result: 0.346 USDT excess sent to ExcessUSDTRouter
Excess arose because W2 sold PGM on DEX (Step 16) instead of redeem, then buyback burned PGM — reducing circulating supply below what the reserve was backing
Proves: excess collection cannot drain the floor — the invariant holds
Test Phase 9: Last Investor Redeems (Refund Mode)
Step 22 — W5 redeems ALL — REFUND MODE
TX: 0x6c96709d...
buybackReserve was 8.2 USDT but W5 needs 10 USDT
Within this single TX,
redeem()automatically activates refund mode:Dissolves floor protection LP NFT
Recovers USDT from LP into refundReserve
Burns PGM recovered from LP
Completes redemption from buybackReserve + refundReserve
Result: W5 receives 10 USDT (full deposit)
Proves: even the last investor gets full principal back — refund mode works automatically
Additional Revert Tests (proven on-chain)
During the test, we also verified that the contract correctly prevents invalid operations:
W1 tries claim() before finalize
"not finalized"
✅ Reverted correctly
W1 tries redeem() before finalize
"insufficient PGM"
✅ Reverted correctly
W2 tries launch() again after launch
"already launched"
✅ Reverted correctly
W3 tries deposit() after launch
"launched"
✅ Reverted correctly
W6 tries emergencyWithdraw() before deadline
"too early"
✅ Reverted correctly
W3 tries claim(10000 PGM) with only 6000 available
"bad amount"
✅ Reverted correctly
W3 tries redeem(10000 PGM) with only 6000 held
"insufficient PGM"
✅ Reverted correctly
End State
After all test steps completed, verified on-chain:
W0 (Deployer)
0
0
Never invested, only deployed
W1 (Passive)
0
10 USDT
Full principal returned via redeem
W2 (Multi-Deposit)
0
9 USDT + 0.64 USDT from DEX sale
Partial redeem + DEX sell
W3 (Sacrifice)
0
6 USDT
Correct: 10 deposited - 4 sacrificed = 6 returned
W4 (Buyback)
0
0
Never invested, triggered buyback with 0.5 USDT from reserve
W4b (Trader)
0
~9.97 USDT (from DEX trading + redeem)
Bought 10 USDT of PGM, sold + redeemed
W5 (Late)
0
10 USDT
Full principal returned — triggered refund mode automatically
W6 (Emergency)
0
5 USDT
Full principal returned via emergency withdraw
Final contract state:
buybackReserve: 0 USDT (fully used)refundReserve: 0.013 USDT (dust remaining after refund mode)refundMode: true (activated by W5's redeem)totalPGMMinted: 40,000 PGMtotalPGMBurned: 35,987 PGMExcessUSDTRouterreceived: 0.346 USDT (real excess from DEX sell + buyback burn)TradingFeeRouterreceived: 0.031 USDT (LP trading fees only)
PGM supply remaining: only the upside price discovery PGM locked in the upside LP NFT. All investor PGM has been burned through redeems and buybacks. No wallet holds any PGM.
How to Verify
Every transaction is on-chain and verifiable. Click any wallet address in the table above to see all transactions chronologically on Abscan. The Raise contract address shows all interactions from all wallets.
Key verification links:
Summary of On-Chain Proofs
Passive investor loses $0
W1: deposit 10 → redeem 10
✅
Multiple deposits work
W2: deposit 5 + 5 = 10
✅
Partial claim works
W2: claim 5000, then claim 5000 more
✅
Over-claim reverts
W3: tries to claim 10000 with only 6000 available
✅
Over-redeem reverts
W3: tries to redeem 10000 with only 6000 held
✅
Partial redeem works
W2: redeem 9000 of 10000
✅
All 4 sacrifice paths work
W3: sacrifice to Shop, Game, Staking, Badge (1 USDT each)
✅
Sacrifice math is correct
W3: deposit 10, sacrifice 4, redeem 6
✅
Emergency withdraw works
W6: deposit 5, emergency withdraw 5
✅
Emergency withdraw before deadline reverts
W6: "too early"
✅
Launch is permissionless
W2 (not deployer) calls launch()
✅
Finalize is permissionless
W1 (not deployer) calls finalize()
✅
Double launch reverts
W2: "already launched"
✅
Deposit after launch reverts
W3: "launched"
✅
Claim before finalize reverts
W1: "not finalized"
✅
Buyback is permissionless
W4 (non-investor) triggers buyback
✅
Buyback buys + burns PGM
Reserve decreased, totalPGMBurned increased
✅
Trading works on DEX
W4b buys and sells PGM on Aborean
✅
Trading fees collected correctly
collectTradingFees() → 0.031 USDT to TradingFeeRouter
✅
Excess only takes real excess
collectExcessUSDT() → 0.346 USDT to ExcessUSDTRouter
✅
Redeem works after trading
W4b redeems after buy/sell activity
✅
Refund mode activates automatically
W5 redeem triggers LP dissolution in single TX
✅
Late investors are protected
W5: deposit 10 → redeem 10 (via refund mode)
✅
Minter permanently renounced
After finalize, no new PGM possible
✅
Every single transaction listed above is verifiable on Abscan. The contract source code matches the production raise contract byte-for-byte (only LAUNCH_TIME, EMERGENCY_DEADLINE, and token name differ — all visible as constructor arguments on Abscan).
Last updated
Was this helpful?
