Files
smom-dbis-138/docs/operations/status-reports/DECISION_TREE.md
T
defiQUG 1fb7266469 Add Oracle Aggregator and CCIP Integration
- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control.
- Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities.
- Created .gitmodules to include OpenZeppelin contracts as a submodule.
- Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment.
- Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks.
- Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring.
- Created scripts for resource import and usage validation across non-US regions.
- Added tests for CCIP error handling and integration to ensure robust functionality.
- Included various new files and directories for the orchestration portal and deployment scripts.
2025-12-12 14:57:48 -08:00

8.2 KiB

Decision Tree: OpenZeppelin vs Custom Implementation

Overview

This decision tree helps you choose between OpenZeppelin and custom implementations when creating new contracts.

Decision Tree

Start
  |
  ├─ Do you need token operations?
  |   |
  |   ├─ Yes → Standard ERC20 tokens?
  |   |   |
  |   |   ├─ Yes → Use Minimal IERC20 Interface ✅
  |   |   |   (Reference: CCIPWETH9Bridge.sol)
  |   |   |
  |   |   └─ No → Non-standard tokens?
  |   |       |
  |   |       ├─ Yes → Use SafeERC20 (OpenZeppelin) ⚠️
  |   |       |
  |   |       └─ No → Use Minimal IERC20 Interface ✅
  |   |
  |   └─ No → Continue
  |
  ├─ Do you need access control?
  |   |
  |   ├─ Yes → Simple admin pattern?
  |   |   |
  |   |   ├─ Yes → Use Custom Admin Pattern ✅
  |   |   |   (Reference: CCIPWETH9Bridge.sol)
  |   |   |
  |   |   └─ No → Complex access control?
  |   |       |
  |   |       ├─ Yes → Use OpenZeppelin Access Control ⚠️
  |   |       |
  |   |       └─ No → Use Custom Admin Pattern ✅
  |   |
  |   └─ No → Continue
  |
  ├─ Do you need security features?
  |   |
  |   ├─ Yes → Battle-tested needed?
  |   |   |
  |   |   ├─ Yes → Use OpenZeppelin ⚠️
  |   |   |
  |   |   └─ No → Use Custom Implementation ✅
  |   |
  |   └─ No → Continue
  |
  ├─ Gas optimization critical?
  |   |
  |   ├─ Yes → Use Custom Implementation ✅
  |   |
  |   └─ No → Continue
  |
  ├─ Code size critical?
  |   |
  |   ├─ Yes → Use Custom Implementation ✅
  |   |
  |   └─ No → Continue
  |
  └─ Default: Use Custom Implementation ✅

Decision Matrix

Token Operations

Scenario Recommendation Reason
Standard ERC20 tokens ✅ Minimal IERC20 Interface No external dependency, smaller code
Non-standard ERC20 tokens ⚠️ SafeERC20 (OpenZeppelin) Handles non-standard tokens
Unknown token types ⚠️ SafeERC20 (OpenZeppelin) Safety first
Known standard tokens ✅ Minimal IERC20 Interface Optimized for known tokens

Access Control

Scenario Recommendation Reason
Simple admin pattern ✅ Custom Admin Pattern No external dependency, simpler
Complex access control ⚠️ OpenZeppelin Access Control Battle-tested, complex features
Multi-role access ⚠️ OpenZeppelin Access Control Complex features needed
Single admin ✅ Custom Admin Pattern Simple, no dependency

Security Features

Scenario Recommendation Reason
Battle-tested needed ⚠️ OpenZeppelin Proven security
Simple security ✅ Custom Implementation No external dependency
Complex security ⚠️ OpenZeppelin Complex features needed
Standard patterns ✅ Custom Implementation Simple, maintainable

Gas Optimization

Scenario Recommendation Reason
Gas optimization critical ✅ Custom Implementation Lower gas costs
Gas not critical Either Choose based on other factors
High-frequency operations ✅ Custom Implementation Lower gas costs
Low-frequency operations Either Choose based on other factors

Code Size

Scenario Recommendation Reason
Code size critical ✅ Custom Implementation Smaller code size
Code size not critical Either Choose based on other factors
Contract size limits ✅ Custom Implementation Smaller code size
No size constraints Either Choose based on other factors

Use Cases

Use Custom Implementation When:

  1. ✅ Standard ERC20 tokens only

    • Use minimal IERC20 interface
    • Reference: CCIPWETH9Bridge.sol
  2. ✅ Simple admin pattern

    • Use custom admin pattern
    • Reference: CCIPWETH9Bridge.sol
  3. ✅ Gas optimization critical

    • Use custom implementation
    • Lower gas costs
  4. ✅ Code size critical

    • Use custom implementation
    • Smaller code size
  5. ✅ No external dependencies desired

    • Use custom implementation
    • Better maintainability

Use OpenZeppelin When:

  1. ⚠️ Non-standard ERC20 tokens

    • Use SafeERC20
    • Handles non-standard tokens
  2. ⚠️ Complex access control

    • Use OpenZeppelin Access Control
    • Complex features needed
  3. ⚠️ Battle-tested security needed

    • Use OpenZeppelin
    • Proven security
  4. ⚠️ Time constraints

    • Use OpenZeppelin
    • Faster development
  5. ⚠️ Standard patterns needed

    • Use OpenZeppelin
    • Industry standard

Examples

Example 1: Token Bridge

Scenario: Cross-chain token bridge with standard ERC20 tokens

Decision: ✅ Custom Implementation

  • Use minimal IERC20 interface
  • Use custom admin pattern
  • No external dependencies

Reference: contracts/ccip/CCIPWETH9Bridge.sol


Example 2: Multi-Sig Wallet

Scenario: Multi-signature wallet with complex access control

Decision: ⚠️ OpenZeppelin (or Gnosis Safe)

  • Complex access control needed
  • Battle-tested security required
  • Consider Gnosis Safe for production

Reference: contracts/governance/MultiSig.sol


Example 3: Token Staking

Scenario: Token staking with standard ERC20 tokens

Decision: ✅ Custom Implementation

  • Use minimal IERC20 interface
  • Use custom admin pattern
  • No external dependencies

Example 4: Voting Contract

Scenario: Simple voting contract with admin functions

Decision: ✅ Custom Implementation

  • Use custom admin pattern
  • No external dependencies
  • Simple access control

Reference: contracts/governance/Voting.sol (currently uses Ownable, can be refactored)


Checklist

Before Choosing Custom Implementation

  • Standard ERC20 tokens only?
  • Simple access control sufficient?
  • Gas optimization important?
  • Code size important?
  • No external dependencies desired?
  • Time available for custom implementation?

Before Choosing OpenZeppelin

  • Non-standard tokens needed?
  • Complex access control needed?
  • Battle-tested security required?
  • Time constraints?
  • Standard patterns needed?
  • External dependency acceptable?

Recommendations

For New Contracts

  1. Start with Custom Implementation

    • Use minimal interfaces
    • Use custom admin pattern
    • No external dependencies
  2. Use OpenZeppelin Only When Needed

    • Non-standard tokens
    • Complex access control
    • Battle-tested security required
  3. Follow Patterns from New WETH Contracts

    • CCIPWETH9Bridge.sol
    • CCIPWETH10Bridge.sol
    • WETH10.sol

For Existing Contracts

  1. Refactor When Possible

    • Replace SafeERC20 with standard ERC20 calls
    • Replace Ownable with custom admin pattern
    • Reduce external dependencies
  2. Keep OpenZeppelin When Needed

    • Non-standard tokens
    • Complex access control
    • Battle-tested security required

References

Contract Examples

  • contracts/ccip/CCIPWETH9Bridge.sol - Custom implementation ✅
  • contracts/ccip/CCIPWETH10Bridge.sol - Custom implementation ✅
  • contracts/tokens/WETH10.sol - Custom implementation ✅
  • contracts/ccip/CCIPSender.sol - Uses OpenZeppelin ⚠️
  • contracts/governance/MultiSig.sol - Uses OpenZeppelin ⚠️

Documentation


Summary

Default Recommendation: ✅ Custom Implementation

  • Use minimal interfaces
  • Use custom admin pattern
  • No external dependencies
  • Better maintainability
  • Lower gas costs
  • Smaller code size

Use OpenZeppelin When: ⚠️

  • Non-standard tokens needed
  • Complex access control needed
  • Battle-tested security required
  • Time constraints

Questions?

For questions about choosing between OpenZeppelin and custom implementations, refer to: