Skip to content

feat: token bucket rate limiting + NFT tier contracts - #108

Open
Malik6828 wants to merge 1 commit into
GruftNet:mainfrom
Malik6828:feature/rate-limiting-and-nft-tiers
Open

feat: token bucket rate limiting + NFT tier contracts#108
Malik6828 wants to merge 1 commit into
GruftNet:mainfrom
Malik6828:feature/rate-limiting-and-nft-tiers

Conversation

@Malik6828

@Malik6828 Malik6828 commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Summary

Implements two related issues:

Closes #79 — NFT-Based Market Participation

File: contracts/NFTTier.sol

Tier Name Fee Discount Voting Power Beta Markets
1 Basic 10%
2 VIP 25%
3 Elite 50%
  • Full ERC-721 transfer support (transferFrom, safeTransferFrom, approve, setApprovalForAll) — tradeable on OpenSea/LooksRare
  • Admin: mint(), upgradeTier(), downgradeTier() — downgrade handled correctly (access revoked immediately)
  • View helpers: tierOf(), feeDiscountBps(), votingPower(), hasEliteAccess()
  • One-NFT-per-wallet invariant enforced on all transfers

contracts/AMM.sol — NFT fee discount integration

  • effectiveFeeBps(trader) applies NFT discount to base fee
  • computeFee(trader, amountIn) helper
  • swap() stub wires in discounted fee and emits tier info

contracts/Market.sol — Exclusive market access gating

  • isEliteMarket mapping + createEliteMarket() / openMarketToAll() admin functions
  • onlyIfAccessible(marketId) modifier gates enterMarket()
  • canAccess(marketId, user) view helper for off-chain checks

Token Bucket Rate Limiting Middleware

File: backend/src/middleware/rate-limit.middleware.ts

  • Token bucket algorithm via Redis INCR + TTL
  • Per-user tier limits: basic 1×, standard 2×, premium 5×, elite 10×
  • Per-endpoint defaults: /markets 100/min, /orders 10/sec, /auth/login 10/min
  • Burst allowance: burstLimit() factory grants 2× the effective limit
  • Bypass list via RATE_LIMIT_BYPASS_LIST env var + premium/elite tiers never throttled
  • X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset + Retry-After headers
  • Structured audit log on every throttled request

Supporting files: AppError, logger, cache.service, error.middleware, requireAdminJwt.middleware

Tests: 29/29 passing (rate-limit 9, error 12, requireAdminJwt 8)

Rate Limiting (backend)
- Add AppError, logger (pino, plain-object export for Jest), cache.service (ioredis)
- Implement rateLimit() middleware with token bucket algorithm
  - Per-user tier multipliers: basic 1×, standard 2×, premium 5×, elite 10×
  - Burst mode: 2× effective limit for 10-second burst windows
  - Static bypass list via RATE_LIMIT_BYPASS_LIST env var
  - Premium/Elite tiers bypass rate limiting entirely
  - X-RateLimit-{Limit,Remaining,Reset} headers on every response
  - Retry-After header + 429 AppError when limit exceeded
  - Structured audit log (pino warn) for every throttled request
- Add burstLimit() and endpointLimit() convenience factories
- Per-endpoint defaults: /markets 100/min, /orders 10/sec, /auth/login 10/min
- Add error.middleware and requireAdminJwt.middleware
- All 29 middleware tests passing (rate-limit 9/9, error 12/12, adminJwt 8/8)

NFT Tier Contracts (Solidity)
- Add contracts/NFTTier.sol — ERC-721 membership tokens
  - Tier 1 Basic:  10% fee discount, 1× voting power
  - Tier 2 VIP:    25% fee discount, 2× voting power
  - Tier 3 Elite:  50% fee discount, 5× voting power + beta market access
  - mint(), upgradeTier(), downgradeTier() (admin only)
  - Full ERC-721 transfer support (transferFrom, safeTransferFrom, approve, etc.)
  - feeDiscountBps(), votingPower(), hasEliteAccess(), tierOf() view helpers
  - One-NFT-per-wallet invariant enforced on transfer
- Update contracts/AMM.sol — integrate NFT tier fee discounts
  - effectiveFeeBps(trader) computes discounted fee
  - computeFee(trader, amountIn) helper
  - swap() stub wires in fee discount + emits SwapExecuted with tier info
- Update contracts/Market.sol — enforce exclusive market access
  - isEliteMarket mapping + createEliteMarket() / openMarketToAll() admin fns
  - onlyIfAccessible(marketId) modifier gates enterMarket()
  - canAccess(marketId, user) view helper for off-chain checks

Closes #rate-limiting-middleware #nft-tier-contracts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement NFT-Based Market Participation

1 participant