This project has TWO SEPARATE staking systems with confusingly similar names. Do NOT mix them up!
Location: /staking page
What it does: Users stake PLR tokens to earn WETH rewards. They receive stkPLR tokens representing their stake.
Contract: 0x826a26e65266c5834977D4f552d31b9e29F668d4 (Polygon mainnet)
Token: stkPLR 0x99b4071d2509f3bfb4c1f9cbe174da1f3dc43480
| Component | File | Purpose |
|---|---|---|
StakingHero |
src/components/staking-hero.jsx |
Unstake section |
UnstakeButton |
src/components/staking/unstake-button.jsx |
Checks stkPLR balance |
PlrStakingBuilder |
src/components/staking/staking-flow.jsx |
Uses Etherspot for staking UI |
- Checks wallet for stkPLR token balance (not NFT!)
- User approves stkPLR contract
- Calls
unstake()function - Returns original PLR + rewards
Location: /plr-dao-staking page
What it does: Users stake PLR to get an NFT that grants DAO voting rights.
Contract:
- Mainnet:
0xc380f15Db7be87441d0723F19fBb440AEaa734aB - Testnet:
0xf1a8685519D456f47a9F3505035F4Bad5d9a9ce0
Token: PLR token (locked in contract, NFT minted)
| Component | File | Purpose |
|---|---|---|
DaoMemberNftTx |
src/components/dao/nft-transaction.jsx |
Stake section |
DaoUnstakeButton |
src/components/dao/dao-unstake-button.jsx |
Checks NFT membership |
PlrDaoStakingBuilderUnstake |
src/components/dao/unstake-gov-nft-flow.jsx |
Unstake flow wrapper |
MemberInfo |
src/components/dao/member-info.jsx |
Shows NFT details |
- Checks wallet for NFT membership ID (not tokens!)
- No approval needed
- Calls
withdraw()function - Burns NFT, returns staked PLR
// staking-hero.jsx (regular staking page)
import PlrDaoStakingBuilderUnstake from './dao/unstake-gov-nft-flow'; // ❌ WRONG!
// This checks for NFT membership, not stkPLR tokens!
<PlrDaoStakingBuilderUnstake />// staking-hero.jsx (regular staking page)
import UnstakeButton from './staking/unstake-button'; // ✅ CORRECT
// This checks for stkPLR token balance
<UnstakeButton
chainId={137}
contract="0x826a26e65266c5834977D4f552d31b9e29F668d4"
explorer="https://polygonscan.com/tx/"
networkName="Polygon Mainnet"
/>| Feature | Regular Staking | DAO Governance |
|---|---|---|
| URL | /staking |
/plr-dao-staking |
| Checks for | stkPLR token balance | NFT membership ID |
| Unstake Component | UnstakeButton |
DaoUnstakeButton |
| Contract Function | unstake() |
withdraw() |
| Approval Needed? | Yes (stkPLR) | No |
| Returns | PLR + WETH rewards | Staked PLR |
| Token Received | stkPLR (ERC20) | NFT (ERC721) |
1. Which page am I working on?
/staking→ UseUnstakeButton/plr-dao-staking→ UseDaoUnstakeButton
2. What does the user have in their wallet?
- stkPLR tokens → Use
UnstakeButton - DAO membership NFT → Use
DaoUnstakeButton
3. What contract am I calling?
0x826a26...(staking contract) → UseUnstakeButton0xc380f1...or0xf1a868...(DAO contract) → UseDaoUnstakeButton
src/
├── components/
│ ├── staking-hero.jsx ← Regular staking page hero (uses UnstakeButton)
│ ├── staking/
│ │ ├── unstake-button.jsx ← FOR REGULAR STAKING (stkPLR)
│ │ └── staking-flow.jsx ← Etherspot integration
│ └── dao/
│ ├── nft-transaction.jsx ← DAO staking/unstaking
│ ├── dao-unstake-button.jsx ← FOR DAO GOVERNANCE (NFT)
│ ├── unstake-gov-nft-flow.jsx ← DAO unstake wrapper
│ └── member-info.jsx ← NFT membership info
Before deploying, verify:
-
/stakingpage showsUnstakeButtoncomponent -
/plr-dao-stakingpage showsDaoUnstakeButtoncomponent -
UnstakeButtonchecks for stkPLR balance (0x99b40...) -
DaoUnstakeButtonchecks for NFT membership - No component mixing between the two systems
- Correct contract addresses for mainnet vs testnet
- ✅ This is correct if user has no stkPLR tokens
- ❌ Check you're using
UnstakeButton, notDaoUnstakeButton
- ❌ WRONG! You're using
DaoUnstakeButtonon the regular staking page - ✅ Use
UnstakeButtoninstead
- ✅ This is correct if user has no NFT membership
- ❌ Check the contract address is correct for your network (mainnet/testnet)
- TESTNET_MODE.md - Testnet vs Mainnet configuration
- src/config/contracts.js - Contract address configuration
- DEPLOYMENT.md - Deployment guide
Remember: Same staking concept, but completely different smart contracts and tokens!
- Regular Staking = PLR → stkPLR tokens → rewards
- DAO Governance = PLR → NFT membership → voting rights
Never mix the components between these two systems!