-
Notifications
You must be signed in to change notification settings - Fork 0
Add goal based PaymentTreasury model #16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 2.0-rc
Are you sure you want to change the base?
Conversation
There was a problem hiding this 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.
ℹ️ 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".
mahabubAlahi
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me
* Fix incorrect description of the `claimFund` function (#6) (immunefi)(issue#06) - Updated the NatSpec comment for claimFund() * Refactor `platformDataKey` parameter validation optimization (#7) (immunefi)(issue#09) - Move `platformDataKey` parameter validation to an earlier stage of the `createCampaign` flow * Add configuring platform data during `updateSelectedPlatform` (#8) (immunefi)(issue#10) * Add creator's non-zero validation during `createCampaign` (#9) (immunefi)(issue#16) * Add zero validation for `platformDataValue` in `createCampaign` (#10) (immunefi)(issue#12) * Add reward value zero validation in pledge (#11) (immunefi)(issue#14) * Fix `updateDeadline` allowing past deadline that blocks `claimRefund` (#12) (immunefi)(issue#05) - Added check to ensure new deadline is after current block timestamp * Fix blocking KeepWhatsRaised pledge functions via front-running (#13) (immunefi)(issue#04) - Add internal pledge ID generation using msg.sender and pledgeId * Add fee configuration via configure treasury (#14) (immunefi)(issue#11) - Update configure treasury to support fee values - Add getter function for fee value * Add campaign data validation in configure treasury (#15) (immunefi)(issue#20) - Update fee values js doc - Update custom error * Fix Gateway fee bypass (#16) (immunefi)(issue#19) - When `setFeeAndPledge` is called, tokens are transferred from the admin's wallet (msg.sender) - When `pledgeWithoutAReward` or `pledgeForAReward` is called directly, tokens are transferred from the backer's wallet * Add expected fee description in create campaign jsdoc (#17) (immunefi)(issue#03) * Refactor withdrawal and pledge calculation (#19) (immunefi)(issue#15) (immunefi)(issue#18) - Restrict access to the withdrawal function so that only the campaign owner and platform administrator can use it. - Move the protocol fee calculation from the withdrawal process to the pledge stage. - For withdrawals: - Partial Withdrawals: - Conditions: amount > 0 and amount + fees ≤ available balance. - The creator must specify the exact withdrawal amount, and the system will ensure there are sufficient funds to cover both the withdrawal and the fees. - Final Withdrawals: - Conditions: available balance > 0 and fees ≤ available balance. - The creator can withdraw the entire remaining balance. The system will check if there are enough funds to cover the fees and will then provide the remainder to the creator. --------- Co-authored-by: mahabubAlahi <mahabub@ccprotocol.xyz>
|
We plan to use the GoalBasedPaymentTreasury in the standalone application. For fiat pledges, our intention is to charge cards only after the campaign has ended and has been deemed successful. However, the current success condition is defined as As a result, fiat pledges would not be taken into account when determining whether the campaign has met its success condition. What would be the best way to handle the scenario of charging the cards and confirming the payments after the campaign has ended succesfully? |
I believe there is a slight misunderstanding regarding how the contract defines "success" for different operations. The strict check you noticed ( However, for determining campaign success (blocking refunds), the contract uses an optimistic approach during the buffer period. Here is the logic from function _checkRefundAllowed() internal view {
if (block.timestamp >= INFO.getDeadline()) {
uint256 progress = block.timestamp > INFO.getDeadline() + INFO.getBufferTime()
? getRaisedAmount() // After buffer: confirmed only
: getRaisedAmount() + getExpectedAmount(); // During buffer: confirmed + pending
if (progress >= INFO.getGoalAmount()) {
revert GoalBasedPaymentTreasuryNotRefundable();
}
}
}This ensures your "charge later" workflow is fully supported. Here is how the lifecycle works technically:
Why the distinction? |
Thanks for your response. This clarifies a lot. |
|
@AdnanHKx , @adnanhq how should the above implementation suppose to work from a UX point of view? For instance, when we check to see if cc: @lucian-calian |
This is ultimately a product/business decision that needs to be defined by the platform. The expected UX depends on how much abstraction the platform wants to keep versus how explicitly it wants to surface intermediate states (e.g. unconfirmed vs confirmed payments) to creators. From a development perspective, multiple approaches can be implemented, but the source of truth and messaging rules must be clearly specified by the platform to avoid contradictory states (such as marking a campaign successful and later failed). For this PR, the discussion should remain focused on development and technical implementation only. Broader UX or product-level discussions should be moved to other channels (e.g. Discord or Confluence) and brought back here as concrete, agreed-upon code requirements if needed. |
| public | ||
| override | ||
| whenNotPaused | ||
| whenNotCancelled |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't the whenNotCancelled be removed? If a campaign is cancelled, the backers would not be able to reclaim funds. Same for TimeConstrainedPaymentTreasury.
See discussion: https://discord.com/channels/1150443607313092750/1434891866746392756/1464204507717046283
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're correct. Let me remove the constraint and redeploy the treasury implementation contract. Thanks for bringing it up.
Overview
Introduces
GoalBasedPaymentTreasury- a payment treasury with goal-based success conditions and time constraints.Key Features
Time Constraints:
launchTimeanddeadlinelaunchTimeanddeadline + bufferdeadline, requires goal to be metRefund Behavior (
claimRefund):deadlineanddeadline + buffer): Blocked ifconfirmed + pending >= goalconfirmed >= goalDuring the buffer period, the success condition uses the optimistic total (confirmed + pending). This prevents preemptive refunds while pending payments are still being processed. Once the buffer ends, payment processing halts - if pending payments failed to settle and the confirmed total falls short of the goal, users can claim refunds.
Withdraw/DisburseeFees:
confirmed >= goal)Changelog
GoalBasedPaymentTreasury.solBasePaymentTreasury: ChangedgetExpectedAmountvisibility fromexternaltopublicas it is called insideGoalBasedPaymentTreasury.