Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
960c5c3
Fix outdated protocol name references for ERC7201 storage (#41)
adnanhq Mar 19, 2026
270f7e7
Refactor disburseFees function in KeepWhatsRaised contract to allow f…
mahabubAlahi Mar 19, 2026
c0b778b
Update Config documentation to clarify withdrawal conditions in KeepW…
mahabubAlahi Mar 19, 2026
b6dd085
Fee Types Mixing in Storage With Lack of Validation (OZ-5) (#22)
mahabubAlahi Mar 19, 2026
bd5dd74
Add setFeeAndPledge time restriction in KeepWhatsRaised contract (OZ-…
mahabubAlahi Mar 19, 2026
75faa27
Add NatSpec noting _safeMint backer requirements (#72)
adnanhq Mar 19, 2026
11f6498
Remove redundant time and amount checks (#70)
adnanhq Mar 19, 2026
171f4f6
Remove redundant duration check in BasePaymentTreasury contract (OZ-2…
mahabubAlahi Mar 19, 2026
e8cc973
Add non-zero sender check in _msgSender overrides (#69)
adnanhq Mar 19, 2026
54ada6b
Fix docstring for AllOrNothingFeeAlreadyDisbursed (#68)
adnanhq Mar 19, 2026
f3eb641
Reorder struct declarations to adhere to solidity style guide (#67)
adnanhq Mar 19, 2026
19b7a9e
Add error handling for duplicate fiat transaction IDs in FiatEnabled …
mahabubAlahi Mar 19, 2026
f8cb375
Remove usage of unchecked blocks in loops (#66)
adnanhq Mar 19, 2026
b9c5b44
Use named parameters for public getter functions (OZ-60) (#65)
adnanhq Mar 19, 2026
a12b883
Add fee percentage validation in GlobalParams contract (OZ-32) (#26)
mahabubAlahi Mar 19, 2026
ec617a1
Add error handling for already claimed treasury funds in KeepWhatsRai…
mahabubAlahi Mar 19, 2026
e86feb5
Add details to unclear docstrings (#64)
adnanhq Mar 19, 2026
fbd5186
Use local variables to reduce gas usage from repeated SLOADs in KwR w…
adnanhq Mar 19, 2026
35df4e2
Add error handling for platform data key ownership in CampaignInfo co…
mahabubAlahi Mar 19, 2026
7f6ed46
Restrict pledge NFT burn function to only treasuries (OZ-12) (#38)
adnanhq Mar 19, 2026
ceb7c78
Add JSON validation for imageURI (#39)
adnanhq Mar 19, 2026
751d6d4
Refactor fee calculation in BasePaymentTreasury contract (OZ-47) (#31)
mahabubAlahi Mar 19, 2026
9181723
Refactor unnecessary Assignment in AllOrNothing._pledge (OZ-48) (#32)
mahabubAlahi Mar 19, 2026
ff0a799
Refactor campaign management functions in CampaignInfo contract (OZ-4…
mahabubAlahi Mar 19, 2026
7cbe940
Add duplicate item ID validation in ItemRegistry contract (OZ-50) (#34)
mahabubAlahi Mar 19, 2026
04aa2ba
Refactor Colombian creator tax calculation to KeepWhatsRaised contrac…
mahabubAlahi Mar 19, 2026
fff7fdd
Add canBeAddOn field to Reward struct and update validation checks (O…
mahabubAlahi Mar 19, 2026
6c06c87
Add campaign info validation and integrate CampaignInfoFactory (OZ-42…
mahabubAlahi Mar 19, 2026
d73e80d
Clear platform adapter value while delisting a platform (#42)
adnanhq Mar 19, 2026
c966bfa
Add event for CampaignInfoFactory implementation update (#43)
adnanhq Mar 19, 2026
1c1d53d
Add check to ensure accepted tokens list cannot contain duplicates (#44)
adnanhq Mar 19, 2026
f15865c
Add platform fee percent documentation in BasePaymentTreasury and Bas…
mahabubAlahi Mar 19, 2026
13905c8
Refactor cancellation checks in CampaignInfo and related contracts (O…
mahabubAlahi Mar 19, 2026
0974aa8
Add constructors with disableInitializers calls in base treasuries (#45)
adnanhq Mar 19, 2026
a0b63c7
Update platform adapter references to dynamically fetch current adapt…
adnanhq Mar 19, 2026
0cc355c
Add nonReentrant check to disburseFees in BaseTreasury (OZ-03) (#55)
adnanhq Mar 19, 2026
e7d38fe
Reject treasury as tokenSource/backer and add balance checks to confi…
adnanhq Mar 19, 2026
de16755
Add data ownership check in removePlatformData (OZ-10) (#61)
adnanhq Mar 19, 2026
f63b4ab
Add documentation for __BaseContract_init (#59)
adnanhq Mar 19, 2026
4e7e6ca
Add validation for withdrawal and refund delays in KeepWhatsRaised co…
mahabubAlahi Mar 19, 2026
398679f
Add s_feesDisbursed check in BaseTreasury for disburseFees (OZ-14) (#58)
adnanhq Mar 19, 2026
8a4f8d3
Remove reward length check from pledges (#60)
adnanhq Mar 19, 2026
4dc46a9
Enhance treasury configuration and add reset functionality (OZ-27) (#54)
mahabubAlahi Mar 19, 2026
c8d5244
Rename variables and internal functions for increased clarity (#62)
adnanhq Mar 19, 2026
acd726c
Improve error clarity by including revert reasons in treasuries (OZ-6…
adnanhq Mar 19, 2026
c68b28c
Refactor withdrawal and disbursement functions in KeepWhatsRaised con…
mahabubAlahi Mar 19, 2026
ba0b13b
Add maximum limits for payment line items, external fees, and batch s…
mahabubAlahi Mar 19, 2026
e5745cd
ix: allow refund claims after treasury cancellation (#73)
adnanhq Mar 19, 2026
8f2034f
Add pre campaign launch constraint to removeReward (OZ-20) (#40)
adnanhq Mar 19, 2026
d0c7a18
Enforce campaign lifecycle for treasury onboarding and config updates…
adnanhq Mar 19, 2026
9fcc553
Refactor error handling in BasePaymentTreasury contract (OZ-43) (#29)
mahabubAlahi Mar 19, 2026
9d290ec
Add item existence checks and removal functionality in ItemRegistry c…
mahabubAlahi Mar 19, 2026
770564e
Refactor pledge processing in AllOrNothing and KeepWhatsRaised contra…
mahabubAlahi Mar 19, 2026
4f3ebda
Refactor error handling in treasury contracts (OZ-46) (#30)
mahabubAlahi Mar 19, 2026
5e90e11
Fix pledge amount calculation in AllOrNothing contract to use actual …
mahabubAlahi Mar 19, 2026
cfa314e
Fix frontrunning vulnerability with Permit2 signature-based approvals…
rayedsikder Mar 19, 2026
8c894c9
Replace string errors with error code enums to reduce bytecode size (…
adnanhq Mar 31, 2026
8d787ab
Remove redundant balance-delta checks from KeepWhatsRaised token tran…
adnanhq Mar 31, 2026
6bd5dc9
Remove Ownable and use Protocol Admin as top level authority across t…
adnanhq Mar 31, 2026
b153c8c
add InvalidInput error codes for core contracts (#82)
adnanhq Mar 31, 2026
9fd0910
Update readme and add ImmuneFi Audit Report
rayedsikder Apr 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ Before contributing, please read our detailed [Contributing Guidelines](./CONTRI

### Community

Join our community on [Discord](https://discord.gg/tnBhVxSDDS) for questions and discussions.
Join our community on [Discord](https://discord.gg/NnPKaB2Qdr) for questions and discussions.

Read our [Code of Conduct](./CODE_OF_CONDUCT.md) to keep our community approachable and respectful.

Expand Down
Binary file not shown.
4 changes: 0 additions & 4 deletions docs/src/src/TestUSD.sol/contract.TestUSD.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
# TestUSD
<<<<<<< Updated upstream
[Git Source](https://github.com/ccprotocol/reference-client-sc/blob/32b7b1617200d0c6f3248845ef972180411f1f65/src/TestUSD.sol)
=======
[Git Source](https://github.com/ccprotocol/ccprotocol-contracts-internal/blob/4245ef0ad7914158999986aa0d8b5d2614efc6c2/src/TestUSD.sol)
>>>>>>> Stashed changes

**Inherits:**
[ERC20](/src/.deps/npm/@openzeppelin/contracts/token/ERC20/ERC20.sol/abstract.ERC20.md), [Ownable](/src/.deps/npm/@openzeppelin/contracts/access/Ownable.sol/abstract.Ownable.md)
Expand Down
4 changes: 3 additions & 1 deletion script/DeployAll.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ contract DeployAll is DeployBase {
// Prepare initialization data for CampaignInfoFactory
bytes memory campaignFactoryInitData = abi.encodeWithSelector(
CampaignInfoFactory.initialize.selector,
deployerAddress,
IGlobalParams(address(globalParamsProxy)),
address(campaignInfoImplementation),
address(treasuryFactoryProxy)
Expand All @@ -90,6 +89,9 @@ contract DeployAll is DeployBase {
ERC1967Proxy campaignFactoryProxy = new ERC1967Proxy(address(campaignFactoryImpl), campaignFactoryInitData);
console2.log("CampaignInfoFactory proxy deployed at:", address(campaignFactoryProxy));

// Wire CampaignInfoFactory into TreasuryFactory so deploy() validation passes
TreasuryFactory(address(treasuryFactoryProxy)).setCampaignInfoFactory(address(campaignFactoryProxy));

// Configure registry values
uint256 bufferTime = vm.envOr("BUFFER_TIME", uint256(0));
uint256 campaignLaunchBuffer = vm.envOr("CAMPAIGN_LAUNCH_BUFFER", uint256(0));
Expand Down
20 changes: 10 additions & 10 deletions script/DeployAllAndSetupAllOrNothing.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,6 @@ contract DeployAllAndSetupAllOrNothing is DeployBase {
campaignInfoFactoryImplementation = address(campaignFactoryImpl);
bytes memory campaignFactoryInitData = abi.encodeWithSelector(
CampaignInfoFactory.initialize.selector,
deployerAddress,
IGlobalParams(globalParams),
campaignInfoImplementation,
treasuryFactory
Expand All @@ -216,6 +215,14 @@ contract DeployAllAndSetupAllOrNothing is DeployBase {
console2.log("Reusing CampaignInfoFactory at:", campaignInfoFactory);
}

// Wire CampaignInfoFactory into TreasuryFactory so deploy() validation passes.
// Must run when either contract is freshly deployed: a new TF needs initial wiring,
// and a new CIF deployed against a reused TF must update the existing proxy.
if (treasuryFactoryDeployed || campaignInfoFactoryDeployed) {
TreasuryFactory(treasuryFactory).setCampaignInfoFactory(campaignInfoFactory);
console2.log("CampaignInfoFactory wired into TreasuryFactory");
}

// Deploy or reuse AllOrNothing implementation
if (allOrNothingImplementation == address(0)) {
allOrNothingImplementation = address(new AllOrNothing());
Expand Down Expand Up @@ -350,13 +357,7 @@ contract DeployAllAndSetupAllOrNothing is DeployBase {
console2.log("Transferring protocol admin rights to:", finalProtocolAdmin);
GlobalParams(globalParams).updateProtocolAdminAddress(finalProtocolAdmin);

//Transfer admin rights to the final protocol admin
GlobalParams(globalParams).transferOwnership(finalProtocolAdmin);
console2.log("GlobalParams transferred to:", finalProtocolAdmin);
if (campaignInfoFactoryDeployed) {
CampaignInfoFactory(campaignInfoFactory).transferOwnership(finalProtocolAdmin);
console2.log("CampaignInfoFactory transferred to:", finalProtocolAdmin);
}
// CampaignInfoFactory reads admin from GlobalParams, no separate transfer needed
}

if (simulate) {
Expand Down Expand Up @@ -428,8 +429,7 @@ contract DeployAllAndSetupAllOrNothing is DeployBase {
console2.log("Protocol Admin:", finalProtocolAdmin);
console2.log("Platform Admin:", finalPlatformAdmin);
console2.log("Platform Adapter (Trusted Forwarder):", platformAdapter);
console2.log("GlobalParams owner:", GlobalParams(globalParams).owner());
console2.log("CampaignInfoFactory owner:", CampaignInfoFactory(campaignInfoFactory).owner());
console2.log("Protocol Admin (GlobalParams):", GlobalParams(globalParams).getProtocolAdminAddress());

console2.log("\n--- Supported Currencies & Tokens ---");
string memory currenciesConfig = vm.envOr("CURRENCIES", string(""));
Expand Down
20 changes: 10 additions & 10 deletions script/DeployAllAndSetupKeepWhatsRaised.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,6 @@ contract DeployAllAndSetupKeepWhatsRaised is DeployBase {
campaignInfoFactoryImplementation = address(campaignFactoryImpl);
bytes memory campaignFactoryInitData = abi.encodeWithSelector(
CampaignInfoFactory.initialize.selector,
deployerAddress,
IGlobalParams(globalParams),
campaignInfo,
treasuryFactory
Expand All @@ -212,6 +211,14 @@ contract DeployAllAndSetupKeepWhatsRaised is DeployBase {
console2.log("Reusing CampaignInfoFactory at:", campaignInfoFactory);
}

// Wire CampaignInfoFactory into TreasuryFactory so deploy() validation passes.
// Must run when either contract is freshly deployed: a new TF needs initial wiring,
// and a new CIF deployed against a reused TF must update the existing proxy.
if (treasuryFactoryDeployed || campaignInfoFactoryDeployed) {
TreasuryFactory(treasuryFactory).setCampaignInfoFactory(campaignInfoFactory);
console2.log("CampaignInfoFactory wired into TreasuryFactory");
}

// Deploy or reuse KeepWhatsRaised implementation
if (keepWhatsRaisedImplementation == address(0)) {
keepWhatsRaisedImplementation = address(new KeepWhatsRaised());
Expand Down Expand Up @@ -346,13 +353,7 @@ contract DeployAllAndSetupKeepWhatsRaised is DeployBase {
console2.log("Transferring protocol admin rights to:", finalProtocolAdmin);
GlobalParams(globalParams).updateProtocolAdminAddress(finalProtocolAdmin);

//Transfer admin rights to the final protocol admin
GlobalParams(globalParams).transferOwnership(finalProtocolAdmin);
console2.log("GlobalParams transferred to:", finalProtocolAdmin);
if (campaignInfoFactoryDeployed) {
CampaignInfoFactory(campaignInfoFactory).transferOwnership(finalProtocolAdmin);
console2.log("CampaignInfoFactory transferred to:", finalProtocolAdmin);
}
// CampaignInfoFactory reads admin from GlobalParams, no separate transfer needed
}

if (simulate) {
Expand Down Expand Up @@ -424,8 +425,7 @@ contract DeployAllAndSetupKeepWhatsRaised is DeployBase {
console2.log("Protocol Admin:", finalProtocolAdmin);
console2.log("Platform Admin:", finalPlatformAdmin);
console2.log("Platform Adapter (Trusted Forwarder):", platformAdapter);
console2.log("GlobalParams owner:", GlobalParams(globalParams).owner());
console2.log("CampaignInfoFactory owner:", CampaignInfoFactory(campaignInfoFactory).owner());
console2.log("Protocol Admin (GlobalParams):", GlobalParams(globalParams).getProtocolAdminAddress());

console2.log("\n--- Supported Currencies & Tokens ---");
string memory currenciesConfig = vm.envOr("CURRENCIES", string(""));
Expand Down
20 changes: 10 additions & 10 deletions script/DeployAllAndSetupPaymentTreasury.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,6 @@ contract DeployAllAndSetupPaymentTreasury is DeployBase {
campaignInfoFactoryImplementation = address(campaignFactoryImpl);
bytes memory campaignFactoryInitData = abi.encodeWithSelector(
CampaignInfoFactory.initialize.selector,
deployerAddress,
IGlobalParams(globalParams),
campaignInfoImplementation,
treasuryFactory
Expand All @@ -247,6 +246,14 @@ contract DeployAllAndSetupPaymentTreasury is DeployBase {
console2.log("Reusing CampaignInfoFactory at:", campaignInfoFactory);
}

// Wire CampaignInfoFactory into TreasuryFactory so deploy() validation passes.
// Must run when either contract is freshly deployed: a new TF needs initial wiring,
// and a new CIF deployed against a reused TF must update the existing proxy.
if (treasuryFactoryDeployed || campaignInfoFactoryDeployed) {
TreasuryFactory(treasuryFactory).setCampaignInfoFactory(campaignInfoFactory);
console2.log("CampaignInfoFactory wired into TreasuryFactory");
}

// Deploy or reuse PaymentTreasury implementation
if (paymentTreasuryImplementation == address(0)) {
paymentTreasuryImplementation = address(new PaymentTreasury());
Expand Down Expand Up @@ -381,13 +388,7 @@ contract DeployAllAndSetupPaymentTreasury is DeployBase {
console2.log("Transferring protocol admin rights to:", finalProtocolAdmin);
GlobalParams(globalParams).updateProtocolAdminAddress(finalProtocolAdmin);

//Transfer admin rights to the final protocol admin
GlobalParams(globalParams).transferOwnership(finalProtocolAdmin);
console2.log("GlobalParams transferred to:", finalProtocolAdmin);
if (campaignInfoFactoryDeployed) {
CampaignInfoFactory(campaignInfoFactory).transferOwnership(finalProtocolAdmin);
console2.log("CampaignInfoFactory transferred to:", finalProtocolAdmin);
}
// CampaignInfoFactory reads admin from GlobalParams, no separate transfer needed
}

if (simulate) {
Expand Down Expand Up @@ -460,8 +461,7 @@ contract DeployAllAndSetupPaymentTreasury is DeployBase {
console2.log("Protocol Admin:", finalProtocolAdmin);
console2.log("Platform Admin:", finalPlatformAdmin);
console2.log("Platform Adapter (Trusted Forwarder):", platformAdapter);
console2.log("GlobalParams owner:", GlobalParams(globalParams).owner());
console2.log("CampaignInfoFactory owner:", CampaignInfoFactory(campaignInfoFactory).owner());
console2.log("Protocol Admin (GlobalParams):", GlobalParams(globalParams).getProtocolAdminAddress());

console2.log("\n--- Supported Currencies & Tokens ---");
string memory currenciesConfig = vm.envOr("CURRENCIES", string(""));
Expand Down
20 changes: 10 additions & 10 deletions script/DeployAllAndSetupTimeConstrainedPaymentTreasury.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,6 @@ contract DeployAllAndSetupTimeConstrainedPaymentTreasury is DeployBase {
campaignInfoFactoryImplementation = address(campaignFactoryImpl);
bytes memory campaignFactoryInitData = abi.encodeWithSelector(
CampaignInfoFactory.initialize.selector,
deployerAddress,
IGlobalParams(globalParams),
campaignInfoImplementation,
treasuryFactory
Expand All @@ -248,6 +247,14 @@ contract DeployAllAndSetupTimeConstrainedPaymentTreasury is DeployBase {
console2.log("Reusing CampaignInfoFactory at:", campaignInfoFactory);
}

// Wire CampaignInfoFactory into TreasuryFactory so deploy() validation passes.
// Must run when either contract is freshly deployed: a new TF needs initial wiring,
// and a new CIF deployed against a reused TF must update the existing proxy.
if (treasuryFactoryDeployed || campaignInfoFactoryDeployed) {
TreasuryFactory(treasuryFactory).setCampaignInfoFactory(campaignInfoFactory);
console2.log("CampaignInfoFactory wired into TreasuryFactory");
}

// Deploy or reuse TimeConstrainedPaymentTreasury implementation
if (timeConstrainedPaymentTreasuryImplementation == address(0)) {
timeConstrainedPaymentTreasuryImplementation = address(new TimeConstrainedPaymentTreasury());
Expand Down Expand Up @@ -388,13 +395,7 @@ contract DeployAllAndSetupTimeConstrainedPaymentTreasury is DeployBase {
console2.log("Transferring protocol admin rights to:", finalProtocolAdmin);
GlobalParams(globalParams).updateProtocolAdminAddress(finalProtocolAdmin);

//Transfer admin rights to the final protocol admin
GlobalParams(globalParams).transferOwnership(finalProtocolAdmin);
console2.log("GlobalParams transferred to:", finalProtocolAdmin);
if (campaignInfoFactoryDeployed) {
CampaignInfoFactory(campaignInfoFactory).transferOwnership(finalProtocolAdmin);
console2.log("CampaignInfoFactory transferred to:", finalProtocolAdmin);
}
// CampaignInfoFactory reads admin from GlobalParams, no separate transfer needed
}

if (simulate) {
Expand Down Expand Up @@ -467,8 +468,7 @@ contract DeployAllAndSetupTimeConstrainedPaymentTreasury is DeployBase {
console2.log("Protocol Admin:", finalProtocolAdmin);
console2.log("Platform Admin:", finalPlatformAdmin);
console2.log("Platform Adapter (Trusted Forwarder):", platformAdapter);
console2.log("GlobalParams owner:", GlobalParams(globalParams).owner());
console2.log("CampaignInfoFactory owner:", CampaignInfoFactory(campaignInfoFactory).owner());
console2.log("Protocol Admin (GlobalParams):", GlobalParams(globalParams).getProtocolAdminAddress());

console2.log("\n--- Supported Currencies & Tokens ---");
string memory currenciesConfig = vm.envOr("CURRENCIES", string(""));
Expand Down
1 change: 0 additions & 1 deletion script/DeployCampaignInfoFactory.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ contract DeployCampaignInfoFactory is DeployBase {
// Prepare initialization data
bytes memory initData = abi.encodeWithSelector(
CampaignInfoFactory.initialize.selector,
deployer,
IGlobalParams(globalParams),
campaignInfo,
treasuryFactory
Expand Down
6 changes: 6 additions & 0 deletions script/UpgradeTreasuryFactory.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ contract UpgradeTreasuryFactory is Script {
function run() external {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
address proxyAddress = vm.envAddress("TREASURY_FACTORY_ADDRESS");
address campaignInfoFactoryAddress = vm.envAddress("CAMPAIGN_INFO_FACTORY_ADDRESS");

require(proxyAddress != address(0), "Proxy address must be set");
require(campaignInfoFactoryAddress != address(0), "CAMPAIGN_INFO_FACTORY_ADDRESS must be set");

vm.startBroadcast(deployerKey);

Expand All @@ -31,6 +33,10 @@ contract UpgradeTreasuryFactory is Script {
console2.log("Proxy address:", proxyAddress);
console2.log("New implementation address:", address(newImplementation));

// Wire in CampaignInfoFactory so the new validation guard does not brick deploy()
proxy.setCampaignInfoFactory(campaignInfoFactoryAddress);
console2.log("CampaignInfoFactory wired into TreasuryFactory:", campaignInfoFactoryAddress);

vm.stopBroadcast();
}
}
Loading
Loading