Quantstamp reviewed Origami (Governance & Membership tokens) on 29 Jun 2022: 5 findings, 0 critical; 4 marked fixed, 1 acknowledged.
Report hosted on certificate.quantstamp.com.
Trustblock does not review code.
Statuses are the security firm’s own, from its report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 0 | 0 |
| Medium | 0 | 0 | 0 |
| Low | 0 | 1 | 4 |
Smart contracts will often have `owner` variables to designate the person with special privileges to make modifications to the smart contract. The `OrigamiGovernanceToken.sol` contract contains the following privileged roles: - `DEFAULT_ADMIN_ROLE`, as initialized during the `initialize()` function to the `_admin` address parameter: - **Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`**. - Add/Remove arbitrary addresses from the used roles (`DEFAULT_ADMIN_ROLE`, `PAUSER_ROLE` and `MINTER_ROLE`), by calling `grantRole()`/`revokeRole()`. - Enable/Disable the burning of tokens, by calling `enableBurn()`/`disableBurn()`. - Enable/Disable the transfer of tokens, by calling `enableTransfer()`/`disableTransfer()`. - `PAUSER_ROLE`, as initialized during the `initialize()` function to the `_admin` address parameter: - Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`. - Transition the contract in and out of the paused state (impacting the ability to transfer or burn tokens), by calling `pause()`/`unpause()`. - `MINTER_ROLE`, as initialized during the `initialize()` function to the `_admin` address parameter: - Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`. - Mint an arbitrary amount of tokens to any address, by calling `mint()` (**Note: As only the holder can burn ones tokens, a malicious minter could mint an arbitrary amount of tokens to himself and retain them**). The `OrigamiGovernanceTokenFactory.sol` contract contains the following privileged roles: - `DEFAULT_ADMIN_ROLE`, as initialized during the `initialize()` function to the `msg.sender`: - Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`. - Add/Remove arbitrary addresses from the `DEFAULT_ADMIN_ROLE` role, by calling `grantRole()`/`revokeRole()`. - Create new Origami governance token clones, by calling `createOrigamiGovernanceToken()`. - Retrieve deployed contract addresses by index on-chain (Note: The corresponding array `proxiedContracts[]` is readable off-chain by anyone), by calling `getProxyContractAddress()`. - The implicit role of the `TransparentUpgradeableProxy` admin, as set as the message sender, when creating the proxy: - **Renounce his role and thereby disable all followingly listed actions, by calling `changeAdmin()` with an uncontrolled address**. - Upgrade the proxy, by calling `upgradeTo()`/`upgradeToAndCall()`. - Change the current admin role to an arbitrary other address, by calling `changeAdmin()` (**Note: Even when the initial admin gets stripped of his `DEFAULT_ADMIN_ROLE` role, he may independently still remain admin of the proxy**). The `OrigamiMembershipToken.sol` contract contains the following privileged roles: - `DEFAULT_ADMIN_ROLE`, as initialized during the `initialize()` function to the `_admin` address parameter: - **Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`**. - Add/Remove arbitrary addresses from the used roles (`DEFAULT_ADMIN_ROLE`, `PAUSER_ROLE`, `MINTER_ROLE` and `REVOKER_ROLE`), by calling `grantRole()`/`revokeRole()`. - Change the tokens base URI, by calling `setBaseURI()`. - Enable/Disable the transfer of tokens, by calling `enableTransfer()`/`disableTransfer()`. - `PAUSER_ROLE`, as initialized during the `initialize()` function to the `_admin` address parameter: - Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`. - Transition the contract in and out of the paused state (impacting the ability to transfer tokens), by calling `pause()`/`unpause()`. - `MINTER_ROLE`, as initialized during the `initialize()` function to the `_admin` address parameter: - Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`. - Mint tokens to any address, by calling `safeMint()`. - `REVOKER_ROLE`, as initialized during the `initialize()` function to the `_admin` address parameter: - Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`. - Burn/Revoke the token of any address, by calling `revoke()`. The `OrigamiMembershipTokenFactory.sol` contract contains the following privileged roles: - `DEFAULT_ADMIN_ROLE`, as initialized during the `initialize()` function to the `msg.sender`: - Renounce his role and thereby disable all followingly listed actions, by calling `renounceRole()`. - Add/Remove arbitrary addresses from the `DEFAULT_ADMIN_ROLE` role, by calling `grantRole()`/`revokeRole()`. - Create new Origami governance token clones, by calling `createOrigamiMembershipToken()`. - Retrieve deployed contract addresses by index on-chain (Note: The corresponding array `proxiedContracts[]` is readable off-chain by anyone), by calling `getProxyContractAddress()`. - The implicit role of the `TransparentUp
The report names a repository or files. Open the report to see its scope.
Repository and files the report names (4)
236 projects reviewed · 332 reports · latest Oct 2026
See Quantstamp’s auditsSomething wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.
Tell us