Skip to content

OpenZeppelin audit remediations: payment/pledge hardening, lifecycle enforcement, accounting fixes, and error-code cleanup#75

Merged
rayedsikder merged 61 commits intomainfrom
oz-audit-fixes
Apr 1, 2026
Merged

OpenZeppelin audit remediations: payment/pledge hardening, lifecycle enforcement, accounting fixes, and error-code cleanup#75
rayedsikder merged 61 commits intomainfrom
oz-audit-fixes

Conversation

@rayedsikder
Copy link
Copy Markdown
Member

@rayedsikder rayedsikder commented Mar 19, 2026

Summary

This PR merges the OpenZeppelin audit remediation set into main and consolidates the issue-by-issue fixes that were previously landed as separate PRs.

Overall, this PR hardens signature-based payment and pledge flows, closes refund / cancellation / fee-disbursement edge cases, tightens campaign and treasury lifecycle enforcement, improves fee and refund accounting, strengthens input validation across core protocol contracts, and standardizes error handling to improve off-chain decoding while reducing bytecode size.

What changed

1. Signature, transfer, and fund-safety hardening

This PR closes the critical issues around token movement and signature use:

  • OZ-01 replaces direct signature-style approval assumptions with Permit2 witness-bound transfers for processCryptoPayment, pledgeForAReward, and pledgeWithoutAReward. The signed witness now commits to the exact payload being executed (for example: payment IDs, item IDs, buyer/backer, amounts, reward hashes, line item hashes, tips/shipping fees), so callers cannot front-run or tamper with signed arguments.
  • OZ-02 rejects the treasury itself as a buyer / backer / token source and adds transfer-accounting checks so internal accounting cannot be inflated through self-transfer behavior.
  • OZ-03 adds nonReentrant protection to BaseTreasury.disburseFees() and moves the fee-disbursed state transition into the protected path.
  • OZ-04 keeps refund claims available after treasury cancellation in PaymentTreasury and TimeConstrainedPaymentTreasury, preventing cancellations from trapping refundable user funds.
  • OZ-12 restricts pledge NFT burning to treasury-only authority (TREASURY_ROLE) instead of allowing arbitrary burn paths.
  • OZ-34 adds explicit non-zero sender validation in meta-tx _msgSender() overrides so a malformed forwarder payload cannot resolve to address(0).
  • OZ-35 adds explicit upper bounds for payment line items, external fee arrays, and batch sizes to keep payment flows bounded and predictable.

2. Treasury lifecycle, campaign lifecycle, and admin-path enforcement

This PR tightens when protocol actions are allowed and who can perform them:

  • OZ-07 allows KeepWhatsRaised.disburseFees() to run even after cancellation so already-accrued fees cannot get trapped.

  • OZ-08 adds missing campaign-state checks to KeepWhatsRaised withdrawal / fee-disbursement paths so those functions respect campaign pause/cancel status consistently.

  • OZ-11 enforces campaign lifecycle rules for treasury onboarding and campaign config updates:

    • campaign config updates are restricted to pre-launch
    • treasury onboarding is blocked once a campaign is cancelled or once the deadline has passed
  • OZ-15 validates withdrawalDelay >= refundDelay in KeepWhatsRaised, ensuring admin fund-claim windows cannot open before the refund window ends.

  • OZ-16 adds the missing campaign time-window restriction to setFeeAndPledge.

  • OZ-20 restricts reward removal to pre-launch only.

  • OZ-27 makes KeepWhatsRaised.configureTreasury() a one-time action and prevents accidental reconfiguration after initial setup.

  • OZ-42 wires TreasuryFactory to CampaignInfoFactory and validates that infoAddress passed into deploy() is a valid factory-created CampaignInfo.

  • A related follow-up changes treasury initialization to stop storing a static trusted forwarder and instead resolve the current platform adapter dynamically from CampaignInfo / GlobalParams, so adapter rotations take effect immediately for deployed treasuries.

3. Accounting, fee, and refund correctness

A large part of this PR is focused on removing ambiguity from treasury accounting:

  • OZ-05 fixes fee-type mixing in KeepWhatsRaised by separating flat fees from percentage fees, validating unique fee keys, and enforcing both per-fee and aggregate percentage bounds.
  • OZ-13 rewrites Colombian creator tax calculation into a single, explicit accounting model and documents the different handling for partial vs final withdrawals.
  • OZ-14 adds a base-level s_feesDisbursed guard so fees cannot be disbursed twice.
  • OZ-19 removes the invalid reward-array-length check from pledge flows; pledges now validate the actual reward contents rather than comparing selection length to reward count.
  • OZ-21 adds canBeAddOn to Reward and enforces add-on eligibility instead of implicitly treating every reward as add-on capable.
  • OZ-25 removes a redundant duration check in BasePaymentTreasury.
  • OZ-32 adds fee-percent validation in GlobalParams, including both per-value caps and combined protocol+platform fee bounds.
  • OZ-33 adds a dedicated “fund already claimed” guard in KeepWhatsRaised.
  • OZ-43 improves BasePaymentTreasury refund validation and error reporting by using the external payment ID in errors and by separating liquidity failures into clearer conditions.
  • OZ-45 removes redundant time and amount checks that were duplicating already-enforced invariants.
  • OZ-47 simplifies fee calculation paths in BasePaymentTreasury.
  • OZ-48 removes an unnecessary assignment in AllOrNothing._pledge.
  • OZ-52 refactors pledge processing in AllOrNothing and KeepWhatsRaised so amounts are consistently handled in token-native decimals at the right boundary.
  • There is also a follow-up fix ensuring AllOrNothing mints the NFT using the actual received pledge amount minus shipping fee, not the pre-transfer nominal pledge amount.

4. Validation, uniqueness, and data-integrity checks

This PR adds a broad set of missing validation checks across protocol state:

  • OZ-10 adds ownership validation to removePlatformData.
  • OZ-18 validates imageURI JSON before accepting updates / initialization.
  • OZ-26 prevents duplicate fiat transaction IDs.
  • OZ-29 clears stored platform adapter values when a platform is delisted.
  • OZ-30 emits an event when CampaignInfoFactory implementation is updated.
  • OZ-31 prevents duplicate accepted tokens in campaign setup.
  • OZ-40 validates that platform data keys being updated are actually owned by the platform being modified.
  • OZ-50 rejects duplicate item IDs in ItemRegistry batch adds.
  • OZ-51 adds explicit item-existence tracking and item removal support to ItemRegistry.
  • OZ-53 standardizes cancellation checks around PausableCancellable instead of relying on duplicate interface definitions.
  • OZ-58 removes unchecked loop increments.
  • OZ-59 reorders struct declarations to match Solidity style guidance.
  • OZ-60 adds named return parameters / getter clarity improvements.
  • OZ-61 adds missing NatSpec for __BaseContract_init.
  • OZ-63 improves revert clarity in treasury contracts by introducing more precise invalid-input / claimability reasons.
  • OZ-64 fixes the incorrect AllOrNothingFeeAlreadyDisbursed docstring.

5. Documentation, storage, and maintainability cleanup

Several changes improve readability and maintainability while keeping behavior aligned with the audited design:

  • OZ-23 updates ERC7201 storage namespace references from outdated ccprotocol.* names to oaknetwork.*.
  • OZ-38 adds constructors with _disableInitializers() in base treasuries.
  • OZ-39 adds NatSpec clarifying _safeMint / IERC721Receiver requirements for pledge recipients.
  • OZ-44 documents the snapshot semantics of platform and protocol fee values.
  • OZ-46 refactors treasury error handling into more specific custom errors.
  • OZ-49 renames campaign-management functions for clarity (pauseCampaign, unpauseCampaign, cancelCampaign, setPlatformInfo).
  • OZ-54 renames variables and internal helpers for readability.
  • OZ-55 uses local variables to reduce repeated SLOADs in KeepWhatsRaised.withdraw.
  • OZ-56 adds detail to previously unclear docstrings.
  • A later follow-up replaces string-based treasury revert reasons with shared enum-backed error codes (TreasuryErrors) and does the same for core contracts via ProtocolErrors, reducing bytecode while preserving machine-readable failure reasons.
  • Another follow-up removes redundant balance-delta checks from the non-Permit2 KeepWhatsRaised transfer path after the Permit2 migration made them unnecessary.

6. Admin model and deployment-path cleanup

The tail of the patch also includes protocol-wide cleanup that supports the remediation set:

  • removes redundant Ownable usage where protocol-admin authority is the real top-level control plane
  • aligns deployment scripts with the updated initialization flows
  • updates CampaignInfoFactory.initialize and related script/test wiring
  • adds the ImmuneFi audit report and updates the README

Notable interface / behavior changes

Reviewers and integrators should pay attention to these externally visible changes:

  • processCryptoPayment(...) now takes PermitData
  • AllOrNothing.pledgeForAReward(...) and pledgeWithoutAReward(...) now take PermitData
  • KeepWhatsRaised.pledgeForAReward(...) and pledgeWithoutAReward(...) now take PermitData
  • treasury initialize(...) no longer accepts a cached trusted-forwarder argument; platform adapter resolution is dynamic
  • CampaignInfoFactory.initialize(...) changed as part of the protocol-admin authority cleanup
  • treasury/core invalid-input errors moved toward enum-coded custom errors
  • refunds remain claimable even after treasury cancellation in payment treasuries

Testing

This PR updates and extends unit / integration / upgrade coverage across:

  • CampaignInfo
  • CampaignInfoFactory
  • GlobalParams
  • TreasuryFactory
  • AllOrNothing
  • KeepWhatsRaised
  • PaymentTreasury
  • TimeConstrainedPaymentTreasury
  • PledgeNFT
  • ItemRegistry

It also adds MockPermit2 test coverage for the new Permit2-based flows and updates deployment / upgrade tests and scripts accordingly.

adnanhq and others added 30 commits March 19, 2026 13:22
…ee disbursement before or after cancellation, ensuring accrued fees are not trapped. (OZ-7) (#18)
…hatsRaised (OZ-9) (#19)

- Enhanced comments to specify the time delay for withdrawals after the campaign deadline, detailing the conditions under which withdrawals are allowed.
* Refactor fee handling in KeepWhatsRaised contract

- Introduced flat and cumulative flat fee values, replacing the previous fee mapping.
- Added checks for unique fee keys and validation for percentage fee limits.
- Updated getFeeValue function to accommodate new fee structure.
- Emitted new errors for duplicate fee keys and percentage fee violations.

* Add unit tests for treasury configuration in KeepWhatsRaised contract

- Implemented tests to ensure proper error handling for duplicate flat and percentage fee keys.
- Added checks for maximum percentage fee limits and aggregate percentage constraints.
- Enhanced test coverage for the configureTreasury function to validate fee configurations.

* Refactor fee calculation in KeepWhatsRaised contract
…16) (#23)

- Introduced a check to ensure the current time is within the launch and deadline range, enhancing the campaign scheduling logic.
…contract (OZ-26) (#25)

- Introduced a new error, FiatEnabledTransactionAlreadyRecorded, to handle cases where a fiat transaction ID has already been recorded.
- Updated the _updateFiatTransaction function to revert with the new error if a duplicate transaction ID is detected.
* Use named parameters for public getter functions

* Add named return params to aggregate getter functions in CampaignInfo
- Introduced a constant PERCENT_DIVIDER to enforce a maximum of 100% for fee percentages.
- Added error handling to revert transactions when fee percentages exceed the allowed limits.
- Updated functions to check both individual and combined fee percentages for protocol and platform fees, ensuring compliance with the new validation rules.
…sed contract (OZ-33) (#27)

- Introduced a new error, KeepWhatsRaisedFundAlreadyClaimed, to handle attempts to claim funds after they have already been claimed.
- Updated the claim functions to revert with this error if the funds have been claimed, enhancing the contract's robustness and clarity in fund management.
…ntract (OZ-40) (#28)

* Add error handling for platform data key ownership in CampaignInfo contract

- Introduced a new error, CampaignInfoPlatformDataKeyNotOwnedByPlatform, to handle cases where a platform data key is not owned by the platform being updated.
- Updated the relevant function to revert with this error if the ownership check fails.

* Refactor test_UpdateSelectedPlatform to simplify platform data handling

- Reduced the number of platform data keys and values from two to one in the test case for updating the selected platform.
- Removed assertions related to the second platform data key to streamline the test and focus on the primary key-value pair.
* Restrict pledge NFT burn function to only treasuries

* Add tests for treasury restricted NFT burn
- Simplified the protocol fee application logic by removing redundant variables and directly calculating the net amount based on whether the protocol fee is applied
…9) (#33)

* Refactor campaign management functions in CampaignInfo contract

- Renamed internal functions to public for better clarity and accessibility: _pauseCampaign to pauseCampaign, _unpauseCampaign to unpauseCampaign, _cancelCampaign to cancelCampaign, and _setPlatformInfo to setPlatformInfo.
- Updated corresponding calls in TreasuryFactory to reflect the new function names.

* Refactor campaign management function calls in unit tests

- Updated unit tests in CampaignInfo and PaymentTreasury contracts to reflect the renaming of internal functions to public: _pauseCampaign to pauseCampaign, _unpauseCampaign to unpauseCampaign, _cancelCampaign to cancelCampaign, and _setPlatformInfo to setPlatformInfo.
- Ensured all relevant test cases are aligned with the new function names for consistency and clarity.
- Introduced a new error for handling duplicate item IDs in batch operations.
- Implemented logic to reject duplicate item IDs within the batch to prevent duplicate event emissions.
…t (OZ-13) (#47)

- Implemented a new internal function `_colombianCreatorTax` to compute the Colombian creator tax based on net and gross amounts, ensuring compliance with local regulations.
- Updated withdrawal logic to clarify tax application for partial and final withdrawals, enhancing documentation for better understanding of fee structures.
…Z-21) (#50)

* Add 'canBeAddOn' field to Reward struct and update validation checks in AllOrNothing and KeepWhatsRaised contracts

- Introduced a new boolean field 'canBeAddOn' in the Reward struct within IReward interface.
- Updated input validation in AllOrNothing and KeepWhatsRaised contracts to check for 'canBeAddOn' alongside 'rewardValue' to ensure proper reward handling.

* Update KeepWhatsRaised unit tests to incorporate 'canBeAddOn' parameter in reward creation and add new test for pledge validation with add-on restrictions

- Modified existing tests to use the updated _createTestReward function, now including the 'canBeAddOn' parameter.
- Added a new test case to validate that pledging for a reward with an invalid add-on configuration correctly reverts the transaction.
#52)

* Add campaign info validation to TreasuryFactory

- Introduced a new function `setCampaignInfoFactory` to set the address of the CampaignInfoFactory, ensuring it is not a zero address.
- Added error handling for invalid campaign info in the deployment process.
- Updated the TreasuryFactoryStorage to include a reference to the campaignInfoFactory.
- Enhanced the ICampaignInfoFactory interface with a method to validate campaign info addresses.

* Update tests to integrate CampaignInfoFactory into TreasuryFactory

- Connected the CampaignInfoFactory to the TreasuryFactory by adding a call to `setCampaignInfoFactory` in the test setup.
- This ensures that the TreasuryFactory can validate the CampaignInfoFactory address during testing.

* Integrate CampaignInfoFactory into TreasuryFactory across deployment scripts

- Added calls to `setCampaignInfoFactory` in multiple deployment scripts to ensure the CampaignInfoFactory is properly wired into the TreasuryFactory for validation during deployment.
- Updated the UpgradeTreasuryFactory script to include a check for the CampaignInfoFactory address, enhancing deployment reliability.

* Refactor deployment scripts to enhance CampaignInfoFactory integration

- Updated multiple deployment scripts to ensure the CampaignInfoFactory is wired into the TreasuryFactory during deployment.
- Modified the condition for wiring to account for both newly deployed and reused contracts, improving deployment reliability.
adnanhq and others added 16 commits March 19, 2026 14:00
* Add s_feesDisbursed check in BaseTreasury for disburseFees

* refactor(AllOrNothing): drop duplicate disburseFees check

Rely on BaseTreasury.disburseFees s_feesDisbursed check and remove
AllOrNothingFeeAlreadyDisbursed.
* Add configuration checks to KeepWhatsRaised contract

- Introduced a new state variable `s_configured` to track if the treasury has been configured.
- Added a new error `KeepWhatsRaisedAlreadyConfigured` to prevent reconfiguration attempts.
- Updated the `configureTreasury` function to revert if called after the treasury has been configured, enhancing contract safety.

* Add treasury reset functionality and update tests

- Introduced a new internal function `_resetTreasury` to deploy a fresh campaign and treasury, facilitating initial configuration in tests.
- Updated existing tests to utilize `_resetTreasury` for setting up fresh treasuries, ensuring accurate state validation and error handling.
- Enhanced clarity in test comments to reflect the purpose of treasury resets during configuration.
…3) (#71)

* Improve error clarity by including revert reasons in treasuries

* fix(errors): use string instead of bytes32 for error reason params

Switch AllOrNothingInvalidInput, AllOrNothingNotClaimable,
KeepWhatsRaisedInvalidInput, and KeepWhatsRaisedNotClaimable to use
string reason for clearer off-chain decoding. Add natspec for reason
params and use more specific reason strings (e.g. REWARD_LENGTH_MISMATCH,
FEE_LENGTH_MISMATCH). Update tests to use abi.encodeWithSelector.

* improve(errors): use distinct reason strings for liquidity failures

- KeepWhatsRaised: split claimRefund checks so liquidity failures revert with
  INSUFFICIENT_LIQUIDITY instead of ZERO_AMOUNT.
- BasePaymentTreasury: add string reason to PaymentTreasuryInvalidInput and
  PaymentTreasuryPaymentNotClaimable; use distinct reasons for each case;
  split combined claimRefund checks (ZERO_AMOUNT, INSUFFICIENT_LIQUIDITY,
  INSUFFICIENT_GOAL_LIQUIDITY, INSUFFICIENT_NON_GOAL_LIQUIDITY,
  INSUFFICIENT_CONTRACT_BALANCE, NOT_NFT_PAYMENT).
…tract (OZ-8) (#49)

* Refactor withdrawal and disbursement functions in KeepWhatsRaised contract

- Updated function modifiers to ensure compliance with campaign status before executing actions.

* Update tests in KeepWhatsRaised unit tests to utilize _resetTreasury for improved state management

- Added calls to _resetTreasury in multiple test cases to ensure a clean state before executing treasury configuration tests.
- Enhanced clarity in tests by ensuring that each test starts with a fresh treasury setup, improving reliability and accuracy of error handling.
…izes in BasePaymentTreasury contract (OZ-35) (#51)

- Introduced constants for maximum line items, external fees, and batch size to ensure input validation.
- Added error handling for exceeding array lengths to improve robustness of payment processing functions.
Remove whenNotCancelled modifier from claimRefund in PaymentTreasury
and TimeConstrainedPaymentTreasury. Previously, treasury cancellation
blocked user refunds while admin sweep functions remained callable,
creating a fund locking vulnerability.
* Add pre campaign launch time constraint to removeReward
* Refactor error handling in BasePaymentTreasury contract

- Updated revert statements to use `paymentId` instead of `internalPaymentId` for better clarity and consistency in error messages related to payment existence, confirmation, and claimability.

* Refactor payment claim validation in BasePaymentTreasury to improve error handling.

* Update tests in KeepWhatsRaised_UnitTest to utilize _resetTreasury for improved state management and error validation in treasury configuration scenarios.

---------

Co-authored-by: rayedsikder <rayedsikder33@gmail.com>
…ontract (OZ-51) (#35)

* Add item existence checks and removal functionality in ItemRegistry contract

- Introduced a mapping to track item existence for each owner.
- Added error handling for adding duplicate items and removing non-existent items.
- Implemented an event for item removal.
- Updated addItem and removeItem functions to incorporate new checks and emit appropriate events.

* Refactor item existence checks in ItemRegistry contract

- Moved the item existence check for duplicates to occur after the initial loop, ensuring proper validation before adding items.
- Maintained error handling for duplicate item IDs and existing items to enhance contract reliability.
…cts (OZ-52) (#36)

* Refactor pledge processing in AllOrNothing and KeepWhatsRaised contracts

- Updated the _pledge function to ensure pledgeAmount and shippingFee are always in the token's native decimals, removing the need for denormalization by the caller.
- Enhanced documentation for the _pledge function to clarify parameter requirements and processing logic.
- Adjusted related calculations and state updates to reflect the new handling of pledge amounts and fees.

* Add token acceptance checks in AllOrNothing and KeepWhatsRaised contracts

- Implemented checks to ensure that the pledge token is accepted before processing pledges.
- Added specific revert messages for each contract to improve error handling and clarity in case of unsupported tokens.

* Block treasury deployment after deadline or when campaign cancelled

Made-with: Cursor

---------

Co-authored-by: adnanhq <adnan.haque1210@gmail.com>
* Refactor error handling in treasury contracts

- Introduced specific error messages for various invalid input scenarios in CampaignInfoFactory, AllOrNothing, KeepWhatsRaised, and BasePaymentTreasury contracts.
- Enhanced clarity and granularity of error handling by replacing generic reverts with more descriptive custom errors, improving debugging and user feedback.

* Update error handling in KeepWhatsRaised unit tests

- Replaced generic revert messages with specific custom errors for invalid input scenarios in the KeepWhatsRaised contract tests, enhancing clarity and improving debugging capabilities.
- Updated tests to reflect changes in error handling for launch time, first reward tier, and claim fund window conditions.
…received amount minus shipping fee

- This change ensures accurate NFT minting based on the net pledge amount.
… (OZ-01) (#74)

* Add off-chain approval and args integrity validation for payment flows using Permit2

* Fix empty permit fallback in KWR, add Uniswap deps and update tests

* Add permit2 submodule gitlink to fix CI builds

* Use Mock Permit2 in tests to avoid solc mismatch

* refactor: extract shared refund logic to helper function

Reduces contract size across PaymentTreasury variants by removing duplicated refund logic.

* Update _validatePaymentForAction function in BasePaymentTreasury contract to accept paymentId for improved clarity in revert messages.

- This change enhances error handling by ensuring that the external payment ID is used in all relevant error scenarios, providing better feedback to users.

---------

Co-authored-by: adnanhq <adnan.haque1210@gmail.com>
Co-authored-by: Mahabub Alahi <mahabub@ccprotocol.xyz>
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cfa314e407

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/storage/AdminAccessCheckerStorage.sol
Comment thread src/storage/GlobalParamsStorage.sol
Comment thread src/storage/CampaignInfoFactoryStorage.sol
Comment thread src/storage/TreasuryFactoryStorage.sol
)

* Replace string errors with error code enums to reduce bytecode size

* update TreasuryErrors natspec

* Update error codes
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8c894c9437

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/TreasuryFactory.sol
Comment thread src/TreasuryFactory.sol
adnanhq added 2 commits April 1, 2026 02:59
…he board (#79)

* refactor core admin access around protocol admin

* Remove redundant _msgSender() instances in core contracts
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6bd5dc9e3a

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/utils/BaseTreasury.sol
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b153c8c602

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/GlobalParams.sol
Comment thread src/CampaignInfoFactory.sol
@rayedsikder rayedsikder self-assigned this Apr 1, 2026
@mahabubAlahi mahabubAlahi self-requested a review April 1, 2026 11:54
@rayedsikder rayedsikder changed the title Oz audit fixes OpenZeppelin audit remediations: payment/pledge hardening, lifecycle enforcement, accounting fixes, and error-code cleanup Apr 1, 2026
@rayedsikder rayedsikder merged commit 11b4167 into main Apr 1, 2026
1 check passed
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.

3 participants