⚠️ This implementation is not audited and is not intended for production use. For mainnet security token deployments, use the audited Tokeny T-REX reference implementation and engage a professional audit firm.
| Version | Supported |
|---|---|
Raptor 5.x (main) |
✅ |
< 5.0 |
❌ |
Do not open a public issue for a security bug.
Please email adam.boudjemaa@protonmail.com (or open a GitHub private security advisory) with:
- A description of the issue and its impact.
- Steps to reproduce (a minimal PoC is strongly preferred).
- Suggested fix, if any.
- Your GitHub handle for credit (or request anonymity).
Response targets:
| Severity | Initial reply | Fix or mitigation |
|---|---|---|
| Critical | 24h | 7 days |
| High | 48h | 14 days |
| Medium / Low | 7 days | Next minor release |
- Unauthorized state change — bypass of
AccessControlrole gating. - Compliance bypass — transferring to an unverified wallet or against compliance rules.
- Balance inflation — mint without
AGENT_ROLE, or double-spend via frozen-balance accounting. - Reentrancy — via compliance modules or identity contracts called during
_transfer. - Denial of service — unbounded loops, griefing via claim issuer list, out-of-gas on batch operations.
- Front-running / MEV — privileged transactions where ordering matters (e.g.,
recoveryAddress).
- Gas optimization suggestions that don't affect correctness.
- Typos / doc issues (please open a normal PR).
- Vulnerabilities in dependencies that are already disclosed upstream — report to the dependency instead.
- Theoretical issues without PoC.
- Issues only reproducible on unsupported Solidity versions (<0.8.17) or forks.
Contributors: do not break these. Every PR is checked against them.
- Total supply = sum of balances.
totalSupplymutates only via_mint/_burn. - Frozen tokens ≤ balance.
_frozenAmounts[a] <= _balances[a]always. - Verified recipient.
_transferalways checksidentityRegistry.isVerified(to). - Compliance consent.
_transferalways checkscompliance.canTransfer(from, to, amount)before moving tokens. - Pause honored.
transfer/transferFrom/batchTransferhonorwhenNotPaused. Forced / admin functions may bypass — but user wallets may not. - Role-gated mutations. Every state-mutating external function is either role-gated or whitelisted as public (pure reads, approvals).
- Zero-address guards. Every function that stores an
addressto state checks it is non-zero. - Events on state changes. Every mutation emits an event. Offchain indexers depend on this.
forcedTransfer,batchForcedTransfer,recoveryAddress,mint,burnintentionally bypasswhenNotPausedso agents can act during incidents.BasicCompliance.canTransferreturnstrueunconditionally — replace it before production use.recoveryAddressrequires the new wallet to be registered as a key purpose1on the lost investor's ONCHAINID. Key compromise on the ONCHAINID side compromises recovery.- The
DEFAULT_ADMIN_ROLEon each contract is granted to the deployer in the constructor. Transfer or renounce it before mainnet deployment.
- CI runs on every PR: lint, compile, tests, coverage, Slither static analysis.
- Dependencies tracked by Dependabot; security alerts enabled.
- Solidity version pinned.
- No secrets in the repository.
.env.exampledocuments required vars. - Conventional Commits + signed commits recommended.
Thanks to:
- The Tokeny Solutions team — authors of the original T-REX standard.
- Everyone who responsibly discloses issues here.