diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 80f7cba..0000000 --- a/.eslintrc +++ /dev/null @@ -1,26 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "quotes": ["warn", "double"], - "semi": ["warn", "never"], - "indent": ["warn", 2], - "no-multi-spaces": ["warn"], - "no-console": "off", - "no-undef": "off", - "object-curly-spacing": ["warn", "always"], - "react-hooks/exhaustive-deps": "off", - "space-infix-ops": ["warn", { "int32Hint": false }], - "@typescript-eslint/no-explicit-any": ["off"], - "@typescript-eslint/no-non-null-assertion": ["off"], - "@typescript-eslint/no-unused-vars": ["off"] - } -} \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..bb7e047 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,17 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "react-hooks/exhaustive-deps": "off", + "space-infix-ops": ["warn", { "int32Hint": false }], + "@typescript-eslint/no-explicit-any": ["off"], + "@next/next/no-img-element": ["off"], + "@typescript-eslint/no-non-null-assertion": ["off"] + } +} diff --git a/.prettierrc.yml b/.prettierrc.yml deleted file mode 100644 index ac27486..0000000 --- a/.prettierrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -overrides: - - files: ".sol" - options: - semi: true - tabWidth: 4 diff --git a/deploy/00-deploy-crowdFunder.ts b/deploy/00-deploy-crowdFunder.ts index 83e1730..1f3c68e 100644 --- a/deploy/00-deploy-crowdFunder.ts +++ b/deploy/00-deploy-crowdFunder.ts @@ -1,64 +1,69 @@ -import { network, ethers } from "hardhat" +import { network } from "hardhat" import { DeployFunction } from "hardhat-deploy/dist/types" import { HardhatRuntimeEnvironment } from "hardhat/types" import { developmentChains } from "../helper-hardhat-config" import verify from "../utils/verify" -const deployCrowdFunder: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployments, getNamedAccounts } = hre - const { deploy, log } = deployments - const { deployer } = await getNamedAccounts() - const chainId = network.config.chainId - const waitBlockConfirmations = chainId?.toString() == "31337" ? 1 : 5 +const deployCrowdFunder: DeployFunction = async function ( + hre: HardhatRuntimeEnvironment +) { + const { deployments, getNamedAccounts } = hre + const { deploy, log } = deployments + const { deployer } = await getNamedAccounts() + const chainId = network.config.chainId + const waitBlockConfirmations = chainId?.toString() == "31337" ? 1 : 5 - log("==========================") - const refunderLib = await deploy("RefunderLib", { - from: deployer, - args: [], - log: true, - waitConfirmations: waitBlockConfirmations - }) + log("==========================") + const refunderLib = await deploy("RefunderLib", { + from: deployer, + args: [], + log: true, + waitConfirmations: waitBlockConfirmations, + }) - const campaignFactory = await deploy("CampaignFactory", { - from: deployer, - args: [], - log: true, - libraries: { - RefunderLib: refunderLib.address - }, - waitConfirmations: waitBlockConfirmations - }) + const campaignFactory = await deploy("CampaignFactory", { + from: deployer, + args: [], + log: true, + libraries: { + RefunderLib: refunderLib.address, + }, + waitConfirmations: waitBlockConfirmations, + }) - const rewardFactory = await deploy("RewardFactory", { - from: deployer, - args: [], - log: true, - libraries: { - RefunderLib: refunderLib.address - }, - waitConfirmations: waitBlockConfirmations - }) + const rewardFactory = await deploy("RewardFactory", { + from: deployer, + args: [], + log: true, + libraries: { + RefunderLib: refunderLib.address, + }, + waitConfirmations: waitBlockConfirmations, + }) - const args:any[] = [campaignFactory.address, rewardFactory.address] - const crowdFunder = await deploy("CrowdFunder", { - from: deployer, - args: args, - log: true, - libraries: { - RefunderLib: refunderLib.address - }, - waitConfirmations: waitBlockConfirmations - }) + const args: any[] = [campaignFactory.address, rewardFactory.address] + const crowdFunder = await deploy("CrowdFunder", { + from: deployer, + args: args, + log: true, + libraries: { + RefunderLib: refunderLib.address, + }, + waitConfirmations: waitBlockConfirmations, + }) - if(!developmentChains.includes(network.name) && process.env.ETHERSCAN_API_KEY) { - log("Verifying...") - await verify(refunderLib.address, []) - await verify(campaignFactory.address, []) - await verify(rewardFactory.address, []) - await verify(crowdFunder.address, args) - } - log("==========================") + if ( + !developmentChains.includes(network.name) && + process.env.ETHERSCAN_API_KEY + ) { + log("Verifying...") + await verify(refunderLib.address, []) + await verify(campaignFactory.address, []) + await verify(rewardFactory.address, []) + await verify(crowdFunder.address, args) + } + log("==========================") } export default deployCrowdFunder -deployCrowdFunder.tags = ["all", "crowdfunder"] \ No newline at end of file +deployCrowdFunder.tags = ["all", "crowdfunder"] diff --git a/deployments/sepolia/CampaignFactory.json b/deployments/sepolia/CampaignFactory.json index a3a4841..5d10e0b 100644 --- a/deployments/sepolia/CampaignFactory.json +++ b/deployments/sepolia/CampaignFactory.json @@ -1,5 +1,5 @@ { - "address": "0x5EDD1F7Bd905D5b2cca5571cc85d00B3679b73B2", + "address": "0x49106a712b3b06Ee1a330F571cF200EFEaFA4869", "abi": [ { "inputs": [ @@ -73,30 +73,30 @@ "type": "function" } ], - "transactionHash": "0x8f636dd67bca8f673a3a4faa19930c3f7cf56b31ce67b1a2548e021005b17202", + "transactionHash": "0xbc4145121db26fd57d1bf9a348f837026cb9e44c161cbbd3970a216852dbb0d8", "receipt": { "to": null, - "from": "0x3f3c2A0AB4E3c081979FaCB10Bf3c9E1A4DB44A3", - "contractAddress": "0x5EDD1F7Bd905D5b2cca5571cc85d00B3679b73B2", - "transactionIndex": 46, - "gasUsed": "2794819", + "from": "0x571Dac692B7b76301c7c2BFD2dB0BD8fDf6eD54C", + "contractAddress": "0x49106a712b3b06Ee1a330F571cF200EFEaFA4869", + "transactionIndex": 36, + "gasUsed": "2794807", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x5725a6e33e1cb2761311cbbf51d1108b543c7f14aa9c7958b26470bb702aeea2", - "transactionHash": "0x8f636dd67bca8f673a3a4faa19930c3f7cf56b31ce67b1a2548e021005b17202", + "blockHash": "0x6cf3d4c5125a545e718560757c6a582fb100bff76645c82913e93e34040590d8", + "transactionHash": "0xbc4145121db26fd57d1bf9a348f837026cb9e44c161cbbd3970a216852dbb0d8", "logs": [], - "blockNumber": 3634555, - "cumulativeGasUsed": "10972225", + "blockNumber": 4190606, + "cumulativeGasUsed": "11386539", "status": 1, "byzantium": true }, "args": [], - "numDeployments": 2, - "solcInputHash": "d728c752d0773b76f850663011342c47", - "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_crf\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rwdFactory\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"_title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_category\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_tags\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_goalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_imageURI\",\"type\":\"string\"}],\"internalType\":\"struct CampaignFactory.cmpInput\",\"name\":\"_cmp\",\"type\":\"tuple\"}],\"name\":\"createCampaign\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/factories/CampaignFactory.sol\":\"CampaignFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n/**\\n * @notice This is a deprecated interface. Please use AutomationCompatibleInterface directly.\\n */\\npragma solidity ^0.8.0;\\nimport {AutomationCompatibleInterface as KeeperCompatibleInterface} from \\\"./AutomationCompatibleInterface.sol\\\";\\n\",\"keccak256\":\"0xac76a31c20c6d66196247376d113a0f19229569ab8c123989649d50be3333e0a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x0e9621f60b2faabe65549f7ed0f24e8853a45c1b7990d47e8160e523683f3935\",\"license\":\"MIT\"},\"contracts/Campaign.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\r\\nimport \\\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\\\";\\r\\nimport { Reward } from \\\"./Reward.sol\\\";\\r\\nimport { RewardFactory } from \\\"./factories/RewardFactory.sol\\\";\\r\\nimport { RefunderLib } from \\\"./libraries/campaign/RefunderLib.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Cmp_NIS(); /**not in state */\\r\\n// error Cmp_NotCrtr();\\r\\n// error Cmp_DIC(); /**donator is creator */\\r\\n// error Cmp_NoDns();\\r\\n// error Cmp_RefF();\\r\\n// error Cmp_UpkNN();\\r\\n// error Cmp_NotRef();\\r\\n// error Cmp_Bankrupt();\\r\\n\\r\\ncontract Campaign is KeeperCompatibleInterface, ReentrancyGuard{\\r\\n\\r\\n // enums\\r\\n enum C_State {\\r\\n Fundraising,\\r\\n Expired,\\r\\n Canceled\\r\\n }\\r\\n\\r\\n // c_state variables\\r\\n address immutable public i_crf;\\r\\n address payable immutable public i_creator;\\r\\n address immutable public i_rwdFactory;\\r\\n string public s_title;\\r\\n string public s_description;\\r\\n string public s_category;\\r\\n string public s_imageURI;\\r\\n string public s_campaignURI;\\r\\n string public s_tags;\\r\\n uint256 public goalAmount;\\r\\n uint256 public duration;\\r\\n uint256 public currentBalance;\\r\\n uint256 private immutable i_initTimeStamp;\\r\\n uint256 private constant i_maxDur = 5184000;\\r\\n uint256 public deadline;\\r\\n uint256 private rId;\\r\\n C_State public c_state = C_State.Fundraising; // default c_state\\r\\n\\r\\n struct CampaignObject {\\r\\n address i_creator;\\r\\n string s_title;\\r\\n string s_description;\\r\\n string s_category;\\r\\n string s_tags;\\r\\n uint256 goalAmount;\\r\\n uint256 duration;\\r\\n uint256 currentBalance;\\r\\n C_State currentC_State;\\r\\n string s_imageURI;\\r\\n string s_campaignURI;\\r\\n uint256 deadline;\\r\\n }\\r\\n\\r\\n struct refunder_pckg {\\r\\n uint256 currentBalance;\\r\\n C_State c_state;\\r\\n }\\r\\n\\r\\n // mapping (uint256 => reward) public rewards;\\r\\n mapping (uint256 => address) public rewards;\\r\\n mapping (address => uint256[]) public entDonations;\\r\\n mapping (address => uint256) public aggrDonations;\\r\\n\\r\\n uint256[] public rKeys;\\r\\n\\r\\n // events\\r\\n event FundingRecieved (\\r\\n address indexed contributor,\\r\\n uint256 amount,\\r\\n uint256 currentBalance\\r\\n );\\r\\n event CreatorPaid(address creator, address campaignAddress);\\r\\n event CampaignExpired(address campaignAddress);\\r\\n event CampaignCanceled();\\r\\n\\r\\n // modifiers\\r\\n modifier isCreator() {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n _;\\r\\n }\\r\\n\\r\\n refunder_pckg _refP;\\r\\n\\r\\n constructor (\\r\\n address _crowdfunder,\\r\\n address _creator,\\r\\n address _rwdFactory,\\r\\n string memory _title,\\r\\n string memory _description,\\r\\n string memory _category,\\r\\n string memory _tags,\\r\\n uint256 _goalAmount,\\r\\n uint256 _duration,\\r\\n string memory _imageURI\\r\\n ) {\\r\\n i_rwdFactory = _rwdFactory;\\r\\n i_crf = _crowdfunder;\\r\\n i_creator = payable(_creator);\\r\\n s_title = _title;\\r\\n s_description = _description;\\r\\n s_category = _category;\\r\\n s_tags = _tags;\\r\\n goalAmount = _goalAmount;\\r\\n i_initTimeStamp = block.timestamp;\\r\\n duration = _duration > i_maxDur ? i_maxDur : _duration;\\r\\n deadline = i_initTimeStamp + duration;\\r\\n s_imageURI = _imageURI;\\r\\n currentBalance = 0;\\r\\n }\\r\\n\\r\\n\\r\\n function donate(address _donator, bool _rewardable) public payable nonReentrant{\\r\\n if(msg.sender != i_crf){revert();}\\r\\n if(c_state != C_State.Fundraising){revert();}\\r\\n if(_donator == i_creator){revert();}\\r\\n currentBalance = currentBalance + msg.value;\\r\\n if(_rewardable){\\r\\n if(rewards[msg.value] != address(0)){\\r\\n (bool success, ) = rewards[msg.value].call(abi.encodeWithSignature(\\\"addDonator(address)\\\", _donator));\\r\\n if(!success){revert();}\\r\\n entDonations[_donator].push(msg.value);\\r\\n }else{revert();}\\r\\n }\\r\\n aggrDonations[_donator] = aggrDonations[_donator] + msg.value; \\r\\n emit FundingRecieved(_donator, msg.value, currentBalance);\\r\\n }\\r\\n\\r\\n /**\\r\\n @dev this is the function chainlink keepers calls\\r\\n chekupkeep returns true to trigger the action after the interval has passed\\r\\n */\\r\\n function checkUpkeep(bytes memory /**checkData */) public view override\\r\\n returns (bool upkeepNeeded, bytes memory /**performData */) \\r\\n {\\r\\n bool isOpen = c_state == C_State.Fundraising;\\r\\n bool timePassed = ((block.timestamp - i_initTimeStamp) > duration);\\r\\n upkeepNeeded = (timePassed && isOpen);\\r\\n return (upkeepNeeded, \\\"0x0\\\");\\r\\n }\\r\\n\\r\\n function performUpkeep(bytes calldata /**performData */) external override {\\r\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\r\\n if(!upkeepNeeded){revert();}\\r\\n c_state = C_State.Expired;\\r\\n emit CampaignExpired(address(this));\\r\\n }\\r\\n\\r\\n function payout() external isCreator{\\r\\n if(c_state != C_State.Expired){revert();}\\r\\n uint256 totalRaised = currentBalance;\\r\\n currentBalance = 0;\\r\\n (bool success, ) = i_creator.call{value: totalRaised}(\\\"\\\");\\r\\n if(success){\\r\\n emit CreatorPaid(i_creator, address(this));\\r\\n }\\r\\n else{revert();}\\r\\n }\\r\\n\\r\\n\\r\\n function refund(address _donator) external nonReentrant{\\r\\n _refP = refunder_pckg(currentBalance, c_state);\\r\\n RefunderLib.refund(i_crf, _refP, rewards, aggrDonations, entDonations, _donator);\\r\\n }\\r\\n\\r\\n function makeReward(RewardFactory.rwdInput memory _rwd) external isCreator {\\r\\n if(rewards[_rwd._price] != address(0)){revert();}\\r\\n rKeys.push(_rwd._price);\\r\\n address newReward = RewardFactory(i_rwdFactory).createReward(address(this), i_creator, _rwd);\\r\\n rewards[_rwd._price] = newReward;\\r\\n }\\r\\n\\r\\n function endCampaign() external isCreator {\\r\\n if(c_state == C_State.Expired){revert();}\\r\\n c_state = C_State.Canceled;\\r\\n emit CampaignCanceled();\\r\\n }\\r\\n\\r\\n // update functions\\r\\n function updateCampaignURI(string memory _campaignURI) external isCreator {\\r\\n s_campaignURI = _campaignURI;\\r\\n }\\r\\n\\r\\n function updateDur(uint256 _addedDur) external isCreator {\\r\\n duration = (((duration + _addedDur)) > i_maxDur) ? i_maxDur : (duration + _addedDur);\\r\\n deadline = i_initTimeStamp + duration;\\r\\n }\\r\\n\\r\\n // getter functions\\r\\n function getRewardKeys() external view returns(uint256[] memory){\\r\\n return rKeys;\\r\\n }\\r\\n \\r\\n function getReward(uint256 _priceID) external view returns(Reward.RewardObject memory) {\\r\\n Reward reward = Reward(rewards[_priceID]);\\r\\n return reward.getRewardDetails();\\r\\n }\\r\\n\\r\\n function getCampaignDetails() external view returns(CampaignObject memory) {\\r\\n return CampaignObject(\\r\\n i_creator,\\r\\n s_title, \\r\\n s_description,\\r\\n s_category,\\r\\n s_tags,\\r\\n goalAmount,\\r\\n duration,\\r\\n currentBalance,\\r\\n c_state,\\r\\n s_imageURI,\\r\\n s_campaignURI,\\r\\n deadline\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0xba4854907f5316e4e515f78099f50c65545c9a72971d15b7a6cdc607a93f548f\",\"license\":\"MIT\"},\"contracts/Reward.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\ncontract Reward {\\r\\n address public immutable i_campaignAddress;\\r\\n // address public immutable i_crf;\\r\\n address public immutable i_creator;\\r\\n\\r\\n uint256 public immutable i_price;\\r\\n string public title;\\r\\n string public description;\\r\\n string public rpic;\\r\\n string[] public perks;\\r\\n uint256 public delDate;\\r\\n uint256 public quantity;\\r\\n bool public infinite = true;\\r\\n string[] public shipsTo;\\r\\n address[] public donators;\\r\\n string public surveyLink;\\r\\n\\r\\n struct RewardObject {\\r\\n uint256 price;\\r\\n string title;\\r\\n string description;\\r\\n string rpic;\\r\\n string[] perks;\\r\\n uint256 delDate;\\r\\n uint256 quantity;\\r\\n bool infinite;\\r\\n string[] shipsTo;\\r\\n address[] donators;\\r\\n string surveyLink;\\r\\n }\\r\\n\\r\\n mapping (address => uint256) public true_donator; \\r\\n mapping (address => string) public surveyResponses;\\r\\n\\r\\n constructor ( \\r\\n address _campaignAddress, \\r\\n address _creator,\\r\\n uint256 _price, \\r\\n string memory _title, \\r\\n string memory _description, \\r\\n string memory _rpic,\\r\\n string[] memory _perks, \\r\\n uint256 _deadline, \\r\\n uint256 _quantity, \\r\\n bool _infinite, \\r\\n string[] memory _shipsTo\\r\\n ) {\\r\\n i_price = _price;\\r\\n i_campaignAddress = _campaignAddress;\\r\\n i_creator = _creator;\\r\\n\\r\\n title = _title;\\r\\n description = _description;\\r\\n rpic = _rpic;\\r\\n perks = _perks;\\r\\n delDate = _deadline;\\r\\n quantity = _quantity;\\r\\n infinite = _infinite;\\r\\n shipsTo = _shipsTo;\\r\\n }\\r\\n\\r\\n function updateSurveyLink(string memory _surveylink) external {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n surveyLink = _surveylink;\\r\\n }\\r\\n\\r\\n function addDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if((true_donator[_donator] > 0)){revert();} // already has id ...has therefor donated for this reward before\\r\\n\\r\\n if(!infinite){\\r\\n if(quantity > 0){\\r\\n quantity = quantity - 1;\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }else{revert();} // rwd has finished no longer available\\r\\n }else{\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }\\r\\n }\\r\\n\\r\\n function getDonators() external view returns(address[] memory){\\r\\n return donators;\\r\\n }\\r\\n\\r\\n function removeDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if(!(true_donator[_donator] > 0)){revert();} // not a donator\\r\\n uint256 index = true_donator[_donator] - 1;\\r\\n delete donators[index];\\r\\n delete true_donator[_donator];\\r\\n }\\r\\n\\r\\n function respondToSurvey(string memory _response) external {\\r\\n if(!(true_donator[msg.sender] > 0)){revert();} // not a donator\\r\\n surveyResponses[msg.sender] = _response;\\r\\n }\\r\\n\\r\\n function getRewardDetails() external view returns(RewardObject memory){\\r\\n return RewardObject(\\r\\n i_price,\\r\\n title,\\r\\n description,\\r\\n rpic,\\r\\n perks,\\r\\n delDate,\\r\\n quantity,\\r\\n infinite,\\r\\n shipsTo,\\r\\n donators,\\r\\n surveyLink\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0x16520b0d7ec2ca2e9c34cc0738e1db48661eef392ca464f8b0ee003169d06603\",\"license\":\"MIT\"},\"contracts/factories/CampaignFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../Campaign.sol\\\";\\r\\n\\r\\ncontract CampaignFactory {\\r\\n struct cmpInput {\\r\\n string _title; \\r\\n string _description;\\r\\n string _category;\\r\\n string _tags; \\r\\n uint256 _goalAmount;\\r\\n uint256 _duration;\\r\\n string _imageURI;\\r\\n }\\r\\n\\r\\n function createCampaign(address _crf, address _creator, address _rwdFactory, cmpInput memory _cmp) external returns (address) {\\r\\n Campaign cmp = new Campaign(\\r\\n _crf,\\r\\n payable(_creator),\\r\\n _rwdFactory,\\r\\n _cmp._title,\\r\\n _cmp._description,\\r\\n _cmp._category,\\r\\n _cmp._tags,\\r\\n _cmp._goalAmount,\\r\\n _cmp._duration,\\r\\n _cmp._imageURI\\r\\n );\\r\\n\\r\\n return address(cmp);\\r\\n }\\r\\n}\",\"keccak256\":\"0xae3a189ad6f1504c63d874152a930c38bf2289506a36db75d26107500f0b79a6\",\"license\":\"MIT\"},\"contracts/factories/RewardFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Reward } from \\\"../Reward.sol\\\";\\r\\n\\r\\ncontract RewardFactory {\\r\\n struct rwdInput {\\r\\n uint256 _price;\\r\\n string _title; \\r\\n string _description; \\r\\n string _rpic;\\r\\n string[] _perks; \\r\\n uint256 _deadline; \\r\\n uint256 _quantity; \\r\\n bool _infinite; \\r\\n string[] _shipsTo;\\r\\n }\\r\\n\\r\\n function createReward(address _cmpAddress, address _creator, rwdInput memory _rwd) public returns (address) {\\r\\n Reward rwd = new Reward(\\r\\n _cmpAddress, \\r\\n _creator,\\r\\n _rwd._price,\\r\\n _rwd._title,\\r\\n _rwd._description,\\r\\n _rwd._rpic,\\r\\n _rwd._perks,\\r\\n _rwd._deadline,\\r\\n _rwd._quantity,\\r\\n _rwd._infinite,\\r\\n _rwd._shipsTo \\r\\n );\\r\\n\\r\\n return address(rwd);\\r\\n }\\r\\n}\",\"keccak256\":\"0x025667572f11f51d96b92b058b304512b26a9394374f509ec337a822c2133729\",\"license\":\"MIT\"},\"contracts/libraries/campaign/RefunderLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../../Campaign.sol\\\";\\r\\nimport { Reward } from \\\"../../Reward.sol\\\";\\r\\n\\r\\nlibrary RefunderLib {\\r\\n function refund (\\r\\n address _i_crf,\\r\\n Campaign.refunder_pckg storage _refP, \\r\\n mapping (uint256 => address) storage _rewards, \\r\\n mapping (address => uint256) storage _aggrDons, \\r\\n mapping (address => uint256[]) storage _entDons, \\r\\n address _donator\\r\\n ) external {\\r\\n if(msg.sender != _i_crf){revert();}\\r\\n if(_refP.c_state == Campaign.C_State.Expired){revert();}\\r\\n if(_aggrDons[_donator] == 0 ){revert();}\\r\\n\\r\\n uint256 amountToRefund = _aggrDons[_donator];\\r\\n\\r\\n if(_refP.currentBalance < amountToRefund){revert();}\\r\\n _refP.currentBalance = _refP.currentBalance - amountToRefund;\\r\\n\\r\\n (bool success, ) = payable(_donator).call{value: amountToRefund}(\\\"\\\");\\r\\n if(!success){revert();}\\r\\n\\r\\n delete _aggrDons[_donator];\\r\\n\\r\\n if(_entDons[_donator].length > 0){ \\r\\n for(uint i=0; i<_entDons[_donator].length; i++){\\r\\n if(!(_rewards[_entDons[_donator][i]] != address(0))){\\r\\n Reward(_rewards[_entDons[_donator][i]]).removeDonator(_donator);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n delete _entDons[_donator];\\r\\n }\\r\\n}\",\"keccak256\":\"0xacea134a5959c86c7ca67a50b965a2ad2666dccf020c1e3d97b908a79937da03\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506131c5806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200002e5760003560e01c8063884f30ec1462000033575b600080fd5b6200004a620000443660046200039a565b62000062565b60405162000059919062000436565b60405180910390f35b600080858585856000015186602001518760400151886060015189608001518a60a001518b60c001516040516200009990620000d6565b620000ae9a99989796959493929190620004ec565b604051809103906000f080158015620000cb573d6000803e3d6000fd5b509695505050505050565b612bd880620005b883390190565b60006001600160a01b0382165b92915050565b6200010281620000e4565b81146200010e57600080fd5b50565b8035620000f181620000f7565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156200015d576200015d6200011e565b6040525050565b60006200017060405190565b90506200017e828262000134565b919050565b600067ffffffffffffffff821115620001a057620001a06200011e565b601f19601f83011660200192915050565b82818337506000910152565b6000620001d4620001ce8462000183565b62000164565b905082815260208101848484011115620001f157620001f1600080fd5b620001fe848285620001b1565b509392505050565b600082601f8301126200021c576200021c600080fd5b81356200022e848260208601620001bd565b949350505050565b8062000102565b8035620000f18162000236565b600060e08284031215620002615762000261600080fd5b6200026d60e062000164565b9050813567ffffffffffffffff8111156200028b576200028b600080fd5b620002998482850162000206565b825250602082013567ffffffffffffffff811115620002bb57620002bb600080fd5b620002c98482850162000206565b602083015250604082013567ffffffffffffffff811115620002ee57620002ee600080fd5b620002fc8482850162000206565b604083015250606082013567ffffffffffffffff811115620003215762000321600080fd5b6200032f8482850162000206565b606083015250608062000345848285016200023d565b60808301525060a06200035b848285016200023d565b60a08301525060c082013567ffffffffffffffff811115620003805762000380600080fd5b6200038e8482850162000206565b60c08301525092915050565b60008060008060808587031215620003b557620003b5600080fd5b6000620003c3878762000111565b9450506020620003d68782880162000111565b9350506040620003e98782880162000111565b925050606085013567ffffffffffffffff8111156200040b576200040b600080fd5b62000419878288016200024a565b91505092959194509250565b6200043081620000e4565b82525050565b60208101620000f1828462000425565b60006001600160a01b038216620000f1565b6000620000f18262000446565b6000620000f18262000458565b620004308162000465565b60005b838110156200049a57818101518382015260200162000480565b83811115620004aa576000848401525b50505050565b6000620004bb825190565b808452602084019350620004d48185602086016200047d565b601f01601f19169290920192915050565b8062000430565b6101408101620004fd828d62000425565b6200050c602083018c62000472565b6200051b604083018b62000425565b81810360608301526200052f818a620004b0565b90508181036080830152620005458189620004b0565b905081810360a08301526200055b8188620004b0565b905081810360c0830152620005718187620004b0565b90506200058260e0830186620004e5565b62000592610100830185620004e5565b818103610120830152620005a78184620004b0565b9c9b50505050505050505050505056fe610100604052600c805460ff191690553480156200001c57600080fd5b5060405162002bd838038062002bd88339810160408190526200003f9162000349565b600160008190556001600160a01b03808a1660c0528b81166080528a1660a052875162000072919060208a019062000118565b5085516200008890600290602089019062000118565b5084516200009e90600390602088019062000118565b508351620000b490600690602087019062000118565b5060078390554260e052624f1a008211620000d05781620000d5565b624f1a005b600881905560e051620000e99190620004dd565b600a5580516200010190600490602084019062000118565b50506000600955506200053f975050505050505050565b82805462000126906200050e565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b60006001600160a01b0382165b92915050565b620001dc81620001be565b8114620001e857600080fd5b50565b8051620001cb81620001d1565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715620002365762000236620001f8565b6040525050565b60006200024960405190565b90506200025782826200020e565b919050565b60006001600160401b03821115620002785762000278620001f8565b601f19601f83011660200192915050565b60005b83811015620002a65781810151838201526020016200028c565b83811115620002b6576000848401525b50505050565b6000620002d3620002cd846200025c565b6200023d565b905082815260208101848484011115620002f057620002f0600080fd5b620002fd84828562000289565b509392505050565b600082601f8301126200031b576200031b600080fd5b81516200032d848260208601620002bc565b949350505050565b80620001dc565b8051620001cb8162000335565b6000806000806000806000806000806101408b8d0312156200036e576200036e600080fd5b60006200037c8d8d620001eb565b9a505060206200038f8d828e01620001eb565b9950506040620003a28d828e01620001eb565b98505060608b01516001600160401b03811115620003c357620003c3600080fd5b620003d18d828e0162000305565b97505060808b01516001600160401b03811115620003f257620003f2600080fd5b620004008d828e0162000305565b96505060a08b01516001600160401b03811115620004215762000421600080fd5b6200042f8d828e0162000305565b95505060c08b01516001600160401b03811115620004505762000450600080fd5b6200045e8d828e0162000305565b94505060e0620004718d828e016200033c565b935050610100620004858d828e016200033c565b9250506101208b01516001600160401b03811115620004a757620004a7600080fd5b620004b58d828e0162000305565b9150509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b60008219821115620004f357620004f3620004c7565b500190565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806200052357607f821691505b60208210811415620005395762000539620004f8565b50919050565b60805160a05160c05160e0516125fd620005db60003960008181610da9015261135c0152600081816104d0015261122001526000818161042d015281816105d201528181610bca01528181610c4401528181610ca401528181610d4801528181610e1101528181610f22015281816111840152818161124f01526112f801526000818161059a01528181610ed3015261143c01526125fd6000f3fe6080604052600436106101cd5760003560e01c80636e04ff0d116100f7578063ce2a057211610095578063f764f87911610064578063f764f87914610528578063fa6ded3914610548578063fa89401a14610568578063fd6b30fa1461058857600080fd5b8063ce2a057214610493578063ce845d1d146104a8578063ea0ec1c6146104be578063f301af42146104f257600080fd5b806399a8502d116100d157806399a8502d14610406578063b145603e1461041b578063bf66e2c81461045c578063c5cd50781461047e57600080fd5b80636e04ff0d146103b057806371aac7f9146103de5780637be4bae1146103f357600080fd5b806329dcb0cf1161016f5780634ef897191161013e5780634ef897191461033f57806360fa9a72146103545780636235887a1461037b57806363bd1d4a1461039b57600080fd5b806329dcb0cf146102d25780634278ac8b146102e85780634585e33b146102fd5780634d695bdb1461031f57600080fd5b806315a46ee6116101ab57806315a46ee61461024d5780631774d9601461026f5780631c4b774b1461028f5780632636b945146102bc57600080fd5b806309917c50146101d25780630c611f24146102155780630fb5a6b414610237575b600080fd5b3480156101de57600080fd5b506101ff6101ed3660046115f3565b600f6020526000908152604090205481565b60405161020c9190611624565b60405180910390f35b34801561022157600080fd5b5061022a6105bc565b60405161020c9190611806565b34801561024357600080fd5b506101ff60085481565b34801561025957600080fd5b506102626109a2565b60405161020c9190611817565b34801561027b57600080fd5b506101ff61028a366004611839565b610a30565b34801561029b57600080fd5b506102af6102aa366004611876565b610a61565b60405161020c9190611a7f565b3480156102c857600080fd5b506101ff60075481565b3480156102de57600080fd5b506101ff600a5481565b3480156102f457600080fd5b50610262610b41565b34801561030957600080fd5b5061031d610318366004611ae1565b610b4e565b005b34801561032b57600080fd5b5061031d61033a366004611c14565b610bbf565b34801561034b57600080fd5b50610262610c0b565b34801561036057600080fd5b50600c5461036e9060ff1681565b60405161020c9190611c4e565b34801561038757600080fd5b506101ff610396366004611876565b610c18565b3480156103a757600080fd5b5061031d610c39565b3480156103bc57600080fd5b506103d06103cb366004611c14565b610d82565b60405161020c929190611c5c565b3480156103ea57600080fd5b5061031d610e06565b61031d610401366004611c8f565b610e97565b34801561041257600080fd5b506102626110fa565b34801561042757600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b60405161020c9190611cc2565b34801561046857600080fd5b50610471611107565b60405161020c9190611d1a565b34801561048a57600080fd5b5061026261115f565b34801561049f57600080fd5b5061026261116c565b3480156104b457600080fd5b506101ff60095481565b3480156104ca57600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fe57600080fd5b5061044f61050d366004611876565b600d602052600090815260409020546001600160a01b031681565b34801561053457600080fd5b5061031d610543366004611f45565b611179565b34801561055457600080fd5b5061031d610563366004611876565b6112ed565b34801561057457600080fd5b5061031d6105833660046115f3565b611386565b34801561059457600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b6105c46114aa565b6040518061018001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020016001805461060c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461063890611f95565b80156106855780601f1061065a57610100808354040283529160200191610685565b820191906000526020600020905b81548152906001019060200180831161066857829003601f168201915b505050505081526020016002805461069c90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546106c890611f95565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b505050505081526020016003805461072c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461075890611f95565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001600680546107bc90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546107e890611f95565b80156108355780601f1061080a57610100808354040283529160200191610835565b820191906000526020600020905b81548152906001019060200180831161081857829003601f168201915b5050509183525050600754602082015260085460408201526009546060820152600c5460809091019060ff1660028111156108725761087261169d565b81526020016004805461088490611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090611f95565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b505050505081526020016005805461091490611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461094090611f95565b801561098d5780601f106109625761010080835404028352916020019161098d565b820191906000526020600020905b81548152906001019060200180831161097057829003601f168201915b50505050508152602001600a54815250905090565b600580546109af90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546109db90611f95565b8015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b505050505081565b600e6020528160005260406000208181548110610a4c57600080fd5b90600052602060002001600091509150505481565b610ac0604051806101600160405280600081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000151581526020016060815260200160608152602001606081525090565b6000828152600d6020526040808220548151636862013b60e11b815291516001600160a01b0390911692839263d0c4027692600480830193928290030181865afa158015610b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3a91908101906122fd565b9392505050565b600380546109af90611f95565b6000610b6860405180602001604052806000815250610d82565b50905080610b7557600080fd5b600c805460ff191660011790556040517f5cf8cd2bd40f758a95257bed666285eb82801f1bf9223b8ec1481e510ba2e82d90610bb2903090611cc2565b60405180910390a1505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf457600080fd5b8051610c07906005906020840190611525565b5050565b600280546109af90611f95565b60108181548110610c2857600080fd5b600091825260209091200154905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c6e57600080fd5b6001600c5460ff166002811115610c8757610c8761169d565b14610c9157600080fd5b60006009549050600060098190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682604051610cd990612337565b60006040518083038185875af1925050503d8060008114610d16576040519150601f19603f3d011682016040523d82523d6000602084013e610d1b565b606091505b5050905080156101cd577fba5e837743d81ad0e6deb16089dbb65b549fdda8ad802fd8d4822884d70dc8b27f000000000000000000000000000000000000000000000000000000000000000030604051610d7692919061236f565b60405180910390a15050565b600060608180600c5460ff166002811115610d9f57610d9f61169d565b14905060006008547f000000000000000000000000000000000000000000000000000000000000000042610dd391906123a0565b119050808015610de05750815b60408051808201909152600381526203078360ec1b602082015290969095509350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e3b57600080fd5b6001600c5460ff166002811115610e5457610e5461169d565b1415610e5f57600080fd5b600c805460ff191660021790556040517fb83ebe09f40e9293bdea1d6567fae3175119d3d0ff13c4b4df15994837dd7f5190600090a1565b60026000541415610ec35760405162461bcd60e51b8152600401610eba906123b7565b60405180910390fd5b6002600055336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610efd57600080fd5b6000600c5460ff166002811115610f1657610f1661169d565b14610f2057600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415610f5f57600080fd5b34600954610f6d91906123f2565b600955801561107357346000908152600d60205260409020546001600160a01b0316156101cd57346000908152600d60205260408082205490516001600160a01b0390911690610fc1908590602401611cc2565b60408051601f198184030181529181526020820180516001600160e01b0316632814bc0960e21b17905251610ff6919061242c565b6000604051808303816000865af19150503d8060008114611033576040519150601f19603f3d011682016040523d82523d6000602084013e611038565b606091505b505090508061104657600080fd5b506001600160a01b0382166000908152600e60209081526040822080546001810182559083529120349101555b6001600160a01b0382166000908152600f60205260409020546110979034906123f2565b6001600160a01b0383166000818152600f60205260409081902092909255600954915190917fe76ad748537a48e778fef43dda4a6bd1b50cd62385f9f21a9ca2674923551208916110e9913491612438565b60405180910390a250506001600055565b600180546109af90611f95565b6060601080548060200260200160405190810160405280929190818152602001828054801561115557602002820191906000526020600020905b815481526020019060010190808311611141575b5050505050905090565b600680546109af90611f95565b600480546109af90611f95565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ae57600080fd5b80516000908152600d60205260409020546001600160a01b0316156111d257600080fd5b80516010805460018101825560009182527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019190915560405163d52116e960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d52116e9906112799030907f0000000000000000000000000000000000000000000000000000000000000000908790600401612523565b6020604051808303816000875af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc9190612550565b91516000908152600d6020526040902080546001600160a01b0319166001600160a01b039093169290921790915550565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461132257600080fd5b624f1a008160085461133491906123f2565b1161134c578060085461134791906123f2565b611351565b624f1a005b6008819055611380907f00000000000000000000000000000000000000000000000000000000000000006123f2565b600a5550565b600260005414156113a95760405162461bcd60e51b8152600401610eba906123b7565b60026000819055604080518082019091526009548152600c549091602083019160ff16908111156113dc576113dc61169d565b90528051601190815560208201516012805460ff191660018360028111156114065761140661169d565b021790555050604051631cc535e760e21b815273C9bDfa0822e14bcc54e68229C1EDb13539c43E469150637314d79c90611472907f000000000000000000000000000000000000000000000000000000000000000090601190600d90600f90600e908990600401612571565b60006040518083038186803b15801561148a57600080fd5b505af415801561149e573d6000803e3d6000fd5b50506001600055505050565b60405180610180016040528060006001600160a01b03168152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000600281111561150a5761150a61169d565b81526020016060815260200160608152602001600081525090565b82805461153190611f95565b90600052602060002090601f0160209004810192826115535760008555611599565b82601f1061156c57805160ff1916838001178555611599565b82800160010185558215611599579182015b8281111561159957825182559160200191906001019061157e565b506115a59291506115a9565b5090565b5b808211156115a557600081556001016115aa565b60006001600160a01b0382165b92915050565b6115da816115be565b81146115e557600080fd5b50565b80356115cb816115d1565b60006020828403121561160857611608600080fd5b600061161484846115e8565b949350505050565b805b82525050565b602081016115cb828461161c565b61161e816115be565b60005b8381101561165657818101518382015260200161163e565b83811115611665576000848401525b50505050565b6000611675825190565b80845260208401935061168c81856020860161163b565b601f01601f19169290920192915050565b634e487b7160e01b600052602160045260246000fd5b600381106115e5576115e561169d565b806116cd816116b3565b919050565b60006115cb826116c3565b61161e816116d2565b80516000906101808401906116fb8582611632565b5060208301518482036020860152611713828261166b565b9150506040830151848203604086015261172d828261166b565b91505060608301518482036060860152611747828261166b565b91505060808301518482036080860152611761828261166b565b91505060a083015161177660a086018261161c565b5060c083015161178960c086018261161c565b5060e083015161179c60e086018261161c565b506101008301516117b16101008601826116dd565b506101208301518482036101208601526117cb828261166b565b9150506101408301518482036101408601526117e7828261166b565b9150506101608301516117fe61016086018261161c565b509392505050565b60208082528101610b3a81846116e6565b60208082528101610b3a818461166b565b806115da565b80356115cb81611828565b6000806040838503121561184f5761184f600080fd5b600061185b85856115e8565b925050602061186c8582860161182e565b9150509250929050565b60006020828403121561188b5761188b600080fd5b6000611614848461182e565b6000610b3a838361166b565b60006118ad825190565b808452602084019350836020820285016118c78560200190565b8060005b858110156118fc57848403895281516118e48582611897565b94506020830160209a909a01999250506001016118cb565b5091979650505050505050565b80151561161e565b600061191d8383611632565b505060200190565b600061192f825190565b80845260209384019383018060005b838110156119635781516119528882611911565b97506020830192505060010161193e565b509495945050505050565b8051600090610160840190611983858261161c565b506020830151848203602086015261199b828261166b565b915050604083015184820360408601526119b5828261166b565b915050606083015184820360608601526119cf828261166b565b915050608083015184820360808601526119e982826118a3565b91505060a08301516119fe60a086018261161c565b5060c0830151611a1160c086018261161c565b5060e0830151611a2460e0860182611909565b50610100830151848203610100860152611a3e82826118a3565b915050610120830151848203610120860152611a5a8282611925565b915050610140830151848203610140860152611a76828261166b565b95945050505050565b60208082528101610b3a818461196e565b60008083601f840112611aa557611aa5600080fd5b5081356001600160401b03811115611abf57611abf600080fd5b602083019150836001820283011115611ada57611ada600080fd5b9250929050565b60008060208385031215611af757611af7600080fd5b82356001600160401b03811115611b1057611b10600080fd5b611b1c85828601611a90565b92509250509250929050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715611b6357611b63611b28565b6040525050565b6000611b7560405190565b90506116cd8282611b3e565b60006001600160401b03821115611b9a57611b9a611b28565b601f19601f83011660200192915050565b82818337506000910152565b6000611bca611bc584611b81565b611b6a565b905082815260208101848484011115611be557611be5600080fd5b6117fe848285611bab565b600082601f830112611c0457611c04600080fd5b8135611614848260208601611bb7565b600060208284031215611c2957611c29600080fd5b81356001600160401b03811115611c4257611c42600080fd5b61161484828501611bf0565b602081016115cb82846116dd565b60408101611c6a8285611909565b8181036020830152611614818461166b565b8015156115da565b80356115cb81611c7c565b60008060408385031215611ca557611ca5600080fd5b6000611cb185856115e8565b925050602061186c85828601611c84565b602081016115cb8284611632565b600061191d838361161c565b6000611ce6825190565b80845260209384019383018060005b83811015611963578151611d098882611cd0565b975060208301925050600101611cf5565b60208082528101610b3a8184611cdc565b60006001600160401b03821115611d4457611d44611b28565b5060209081020190565b6000611d5c611bc584611d2b565b83815290506020808201908402830185811115611d7b57611d7b600080fd5b835b81811015611dbb5780356001600160401b03811115611d9e57611d9e600080fd5b808601611dab8982611bf0565b8552505060209283019201611d7d565b5050509392505050565b600082601f830112611dd957611dd9600080fd5b8135611614848260208601611d4e565b60006101208284031215611dff57611dff600080fd5b611e0a610120611b6a565b90506000611e18848461182e565b82525060208201356001600160401b03811115611e3757611e37600080fd5b611e4384828501611bf0565b60208301525060408201356001600160401b03811115611e6557611e65600080fd5b611e7184828501611bf0565b60408301525060608201356001600160401b03811115611e9357611e93600080fd5b611e9f84828501611bf0565b60608301525060808201356001600160401b03811115611ec157611ec1600080fd5b611ecd84828501611dc5565b60808301525060a0611ee18482850161182e565b60a08301525060c0611ef58482850161182e565b60c08301525060e0611f0984828501611c84565b60e0830152506101008201356001600160401b03811115611f2c57611f2c600080fd5b611f3884828501611dc5565b6101008301525092915050565b600060208284031215611f5a57611f5a600080fd5b81356001600160401b03811115611f7357611f73600080fd5b61161484828501611de9565b634e487b7160e01b600052602260045260246000fd5b600281046001821680611fa957607f821691505b60208210811415611fbc57611fbc611f7f565b50919050565b80516115cb81611828565b6000611fdb611bc584611b81565b905082815260208101848484011115611ff657611ff6600080fd5b6117fe84828561163b565b600082601f83011261201557612015600080fd5b8151611614848260208601611fcd565b6000612033611bc584611d2b565b8381529050602080820190840283018581111561205257612052600080fd5b835b81811015611dbb5780516001600160401b0381111561207557612075600080fd5b8086016120828982612001565b8552505060209283019201612054565b600082601f8301126120a6576120a6600080fd5b8151611614848260208601612025565b80516115cb81611c7c565b80516115cb816115d1565b60006120da611bc584611d2b565b838152905060208082019084028301858111156120f9576120f9600080fd5b835b81811015611dbb578061210e88826120c1565b845250602092830192016120fb565b600082601f83011261213157612131600080fd5b81516116148482602086016120cc565b6000610160828403121561215757612157600080fd5b612162610160611b6a565b905060006121708484611fc2565b82525060208201516001600160401b0381111561218f5761218f600080fd5b61219b84828501612001565b60208301525060408201516001600160401b038111156121bd576121bd600080fd5b6121c984828501612001565b60408301525060608201516001600160401b038111156121eb576121eb600080fd5b6121f784828501612001565b60608301525060808201516001600160401b0381111561221957612219600080fd5b61222584828501612092565b60808301525060a061223984828501611fc2565b60a08301525060c061224d84828501611fc2565b60c08301525060e0612261848285016120b6565b60e0830152506101008201516001600160401b0381111561228457612284600080fd5b61229084828501612092565b610100830152506101208201516001600160401b038111156122b4576122b4600080fd5b6122c08482850161211d565b610120830152506101408201516001600160401b038111156122e4576122e4600080fd5b6122f084828501612001565b6101408301525092915050565b60006020828403121561231257612312600080fd5b81516001600160401b0381111561232b5761232b600080fd5b61161484828501612141565b6000816115cb565b60006001600160a01b0382166115cb565b60006115cb8261233f565b60006115cb82612350565b61161e8161235b565b6040810161237d8285612366565b610b3a6020830184611632565b634e487b7160e01b600052601160045260246000fd5b6000828210156123b2576123b261238a565b500390565b602080825281016115cb81601f81527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00602082015260400190565b600082198211156124055761240561238a565b500190565b6000612414825190565b61242281856020860161163b565b9290920192915050565b6000610b3a828461240a565b60408101612446828561161c565b610b3a602083018461161c565b8051600090610120840190612468858261161c565b5060208301518482036020860152612480828261166b565b9150506040830151848203604086015261249a828261166b565b915050606083015184820360608601526124b4828261166b565b915050608083015184820360808601526124ce82826118a3565b91505060a08301516124e360a086018261161c565b5060c08301516124f660c086018261161c565b5060e083015161250960e0860182611909565b50610100830151848203610100860152611a7682826118a3565b606081016125318286611632565b61253e6020830185612366565b8181036040830152611a768184612453565b60006020828403121561256557612565600080fd5b600061161484846120c1565b60c0810161257f8289611632565b61258b60208301889052565b61259760408301879052565b6125a360608301869052565b6125af60808301859052565b6125bc60a0830184611632565b97965050505050505056fea26469706673582212207355c3d8a94ef37f95b24cb07f2fbca2f05f04eb07521b6e87ad980e9290648664736f6c634300080b0033a264697066735822122095549e19097956ef129dab6402ba52b056f12a6d386cab161eb7aac9ed35910164736f6c634300080b0033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200002e5760003560e01c8063884f30ec1462000033575b600080fd5b6200004a620000443660046200039a565b62000062565b60405162000059919062000436565b60405180910390f35b600080858585856000015186602001518760400151886060015189608001518a60a001518b60c001516040516200009990620000d6565b620000ae9a99989796959493929190620004ec565b604051809103906000f080158015620000cb573d6000803e3d6000fd5b509695505050505050565b612bd880620005b883390190565b60006001600160a01b0382165b92915050565b6200010281620000e4565b81146200010e57600080fd5b50565b8035620000f181620000f7565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156200015d576200015d6200011e565b6040525050565b60006200017060405190565b90506200017e828262000134565b919050565b600067ffffffffffffffff821115620001a057620001a06200011e565b601f19601f83011660200192915050565b82818337506000910152565b6000620001d4620001ce8462000183565b62000164565b905082815260208101848484011115620001f157620001f1600080fd5b620001fe848285620001b1565b509392505050565b600082601f8301126200021c576200021c600080fd5b81356200022e848260208601620001bd565b949350505050565b8062000102565b8035620000f18162000236565b600060e08284031215620002615762000261600080fd5b6200026d60e062000164565b9050813567ffffffffffffffff8111156200028b576200028b600080fd5b620002998482850162000206565b825250602082013567ffffffffffffffff811115620002bb57620002bb600080fd5b620002c98482850162000206565b602083015250604082013567ffffffffffffffff811115620002ee57620002ee600080fd5b620002fc8482850162000206565b604083015250606082013567ffffffffffffffff811115620003215762000321600080fd5b6200032f8482850162000206565b606083015250608062000345848285016200023d565b60808301525060a06200035b848285016200023d565b60a08301525060c082013567ffffffffffffffff811115620003805762000380600080fd5b6200038e8482850162000206565b60c08301525092915050565b60008060008060808587031215620003b557620003b5600080fd5b6000620003c3878762000111565b9450506020620003d68782880162000111565b9350506040620003e98782880162000111565b925050606085013567ffffffffffffffff8111156200040b576200040b600080fd5b62000419878288016200024a565b91505092959194509250565b6200043081620000e4565b82525050565b60208101620000f1828462000425565b60006001600160a01b038216620000f1565b6000620000f18262000446565b6000620000f18262000458565b620004308162000465565b60005b838110156200049a57818101518382015260200162000480565b83811115620004aa576000848401525b50505050565b6000620004bb825190565b808452602084019350620004d48185602086016200047d565b601f01601f19169290920192915050565b8062000430565b6101408101620004fd828d62000425565b6200050c602083018c62000472565b6200051b604083018b62000425565b81810360608301526200052f818a620004b0565b90508181036080830152620005458189620004b0565b905081810360a08301526200055b8188620004b0565b905081810360c0830152620005718187620004b0565b90506200058260e0830186620004e5565b62000592610100830185620004e5565b818103610120830152620005a78184620004b0565b9c9b50505050505050505050505056fe610100604052600c805460ff191690553480156200001c57600080fd5b5060405162002bd838038062002bd88339810160408190526200003f9162000349565b600160008190556001600160a01b03808a1660c0528b81166080528a1660a052875162000072919060208a019062000118565b5085516200008890600290602089019062000118565b5084516200009e90600390602088019062000118565b508351620000b490600690602087019062000118565b5060078390554260e052624f1a008211620000d05781620000d5565b624f1a005b600881905560e051620000e99190620004dd565b600a5580516200010190600490602084019062000118565b50506000600955506200053f975050505050505050565b82805462000126906200050e565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b60006001600160a01b0382165b92915050565b620001dc81620001be565b8114620001e857600080fd5b50565b8051620001cb81620001d1565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715620002365762000236620001f8565b6040525050565b60006200024960405190565b90506200025782826200020e565b919050565b60006001600160401b03821115620002785762000278620001f8565b601f19601f83011660200192915050565b60005b83811015620002a65781810151838201526020016200028c565b83811115620002b6576000848401525b50505050565b6000620002d3620002cd846200025c565b6200023d565b905082815260208101848484011115620002f057620002f0600080fd5b620002fd84828562000289565b509392505050565b600082601f8301126200031b576200031b600080fd5b81516200032d848260208601620002bc565b949350505050565b80620001dc565b8051620001cb8162000335565b6000806000806000806000806000806101408b8d0312156200036e576200036e600080fd5b60006200037c8d8d620001eb565b9a505060206200038f8d828e01620001eb565b9950506040620003a28d828e01620001eb565b98505060608b01516001600160401b03811115620003c357620003c3600080fd5b620003d18d828e0162000305565b97505060808b01516001600160401b03811115620003f257620003f2600080fd5b620004008d828e0162000305565b96505060a08b01516001600160401b03811115620004215762000421600080fd5b6200042f8d828e0162000305565b95505060c08b01516001600160401b03811115620004505762000450600080fd5b6200045e8d828e0162000305565b94505060e0620004718d828e016200033c565b935050610100620004858d828e016200033c565b9250506101208b01516001600160401b03811115620004a757620004a7600080fd5b620004b58d828e0162000305565b9150509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b60008219821115620004f357620004f3620004c7565b500190565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806200052357607f821691505b60208210811415620005395762000539620004f8565b50919050565b60805160a05160c05160e0516125fd620005db60003960008181610da9015261135c0152600081816104d0015261122001526000818161042d015281816105d201528181610bca01528181610c4401528181610ca401528181610d4801528181610e1101528181610f22015281816111840152818161124f01526112f801526000818161059a01528181610ed3015261143c01526125fd6000f3fe6080604052600436106101cd5760003560e01c80636e04ff0d116100f7578063ce2a057211610095578063f764f87911610064578063f764f87914610528578063fa6ded3914610548578063fa89401a14610568578063fd6b30fa1461058857600080fd5b8063ce2a057214610493578063ce845d1d146104a8578063ea0ec1c6146104be578063f301af42146104f257600080fd5b806399a8502d116100d157806399a8502d14610406578063b145603e1461041b578063bf66e2c81461045c578063c5cd50781461047e57600080fd5b80636e04ff0d146103b057806371aac7f9146103de5780637be4bae1146103f357600080fd5b806329dcb0cf1161016f5780634ef897191161013e5780634ef897191461033f57806360fa9a72146103545780636235887a1461037b57806363bd1d4a1461039b57600080fd5b806329dcb0cf146102d25780634278ac8b146102e85780634585e33b146102fd5780634d695bdb1461031f57600080fd5b806315a46ee6116101ab57806315a46ee61461024d5780631774d9601461026f5780631c4b774b1461028f5780632636b945146102bc57600080fd5b806309917c50146101d25780630c611f24146102155780630fb5a6b414610237575b600080fd5b3480156101de57600080fd5b506101ff6101ed3660046115f3565b600f6020526000908152604090205481565b60405161020c9190611624565b60405180910390f35b34801561022157600080fd5b5061022a6105bc565b60405161020c9190611806565b34801561024357600080fd5b506101ff60085481565b34801561025957600080fd5b506102626109a2565b60405161020c9190611817565b34801561027b57600080fd5b506101ff61028a366004611839565b610a30565b34801561029b57600080fd5b506102af6102aa366004611876565b610a61565b60405161020c9190611a7f565b3480156102c857600080fd5b506101ff60075481565b3480156102de57600080fd5b506101ff600a5481565b3480156102f457600080fd5b50610262610b41565b34801561030957600080fd5b5061031d610318366004611ae1565b610b4e565b005b34801561032b57600080fd5b5061031d61033a366004611c14565b610bbf565b34801561034b57600080fd5b50610262610c0b565b34801561036057600080fd5b50600c5461036e9060ff1681565b60405161020c9190611c4e565b34801561038757600080fd5b506101ff610396366004611876565b610c18565b3480156103a757600080fd5b5061031d610c39565b3480156103bc57600080fd5b506103d06103cb366004611c14565b610d82565b60405161020c929190611c5c565b3480156103ea57600080fd5b5061031d610e06565b61031d610401366004611c8f565b610e97565b34801561041257600080fd5b506102626110fa565b34801561042757600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b60405161020c9190611cc2565b34801561046857600080fd5b50610471611107565b60405161020c9190611d1a565b34801561048a57600080fd5b5061026261115f565b34801561049f57600080fd5b5061026261116c565b3480156104b457600080fd5b506101ff60095481565b3480156104ca57600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fe57600080fd5b5061044f61050d366004611876565b600d602052600090815260409020546001600160a01b031681565b34801561053457600080fd5b5061031d610543366004611f45565b611179565b34801561055457600080fd5b5061031d610563366004611876565b6112ed565b34801561057457600080fd5b5061031d6105833660046115f3565b611386565b34801561059457600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b6105c46114aa565b6040518061018001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020016001805461060c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461063890611f95565b80156106855780601f1061065a57610100808354040283529160200191610685565b820191906000526020600020905b81548152906001019060200180831161066857829003601f168201915b505050505081526020016002805461069c90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546106c890611f95565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b505050505081526020016003805461072c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461075890611f95565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001600680546107bc90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546107e890611f95565b80156108355780601f1061080a57610100808354040283529160200191610835565b820191906000526020600020905b81548152906001019060200180831161081857829003601f168201915b5050509183525050600754602082015260085460408201526009546060820152600c5460809091019060ff1660028111156108725761087261169d565b81526020016004805461088490611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090611f95565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b505050505081526020016005805461091490611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461094090611f95565b801561098d5780601f106109625761010080835404028352916020019161098d565b820191906000526020600020905b81548152906001019060200180831161097057829003601f168201915b50505050508152602001600a54815250905090565b600580546109af90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546109db90611f95565b8015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b505050505081565b600e6020528160005260406000208181548110610a4c57600080fd5b90600052602060002001600091509150505481565b610ac0604051806101600160405280600081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000151581526020016060815260200160608152602001606081525090565b6000828152600d6020526040808220548151636862013b60e11b815291516001600160a01b0390911692839263d0c4027692600480830193928290030181865afa158015610b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3a91908101906122fd565b9392505050565b600380546109af90611f95565b6000610b6860405180602001604052806000815250610d82565b50905080610b7557600080fd5b600c805460ff191660011790556040517f5cf8cd2bd40f758a95257bed666285eb82801f1bf9223b8ec1481e510ba2e82d90610bb2903090611cc2565b60405180910390a1505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf457600080fd5b8051610c07906005906020840190611525565b5050565b600280546109af90611f95565b60108181548110610c2857600080fd5b600091825260209091200154905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c6e57600080fd5b6001600c5460ff166002811115610c8757610c8761169d565b14610c9157600080fd5b60006009549050600060098190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682604051610cd990612337565b60006040518083038185875af1925050503d8060008114610d16576040519150601f19603f3d011682016040523d82523d6000602084013e610d1b565b606091505b5050905080156101cd577fba5e837743d81ad0e6deb16089dbb65b549fdda8ad802fd8d4822884d70dc8b27f000000000000000000000000000000000000000000000000000000000000000030604051610d7692919061236f565b60405180910390a15050565b600060608180600c5460ff166002811115610d9f57610d9f61169d565b14905060006008547f000000000000000000000000000000000000000000000000000000000000000042610dd391906123a0565b119050808015610de05750815b60408051808201909152600381526203078360ec1b602082015290969095509350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e3b57600080fd5b6001600c5460ff166002811115610e5457610e5461169d565b1415610e5f57600080fd5b600c805460ff191660021790556040517fb83ebe09f40e9293bdea1d6567fae3175119d3d0ff13c4b4df15994837dd7f5190600090a1565b60026000541415610ec35760405162461bcd60e51b8152600401610eba906123b7565b60405180910390fd5b6002600055336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610efd57600080fd5b6000600c5460ff166002811115610f1657610f1661169d565b14610f2057600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415610f5f57600080fd5b34600954610f6d91906123f2565b600955801561107357346000908152600d60205260409020546001600160a01b0316156101cd57346000908152600d60205260408082205490516001600160a01b0390911690610fc1908590602401611cc2565b60408051601f198184030181529181526020820180516001600160e01b0316632814bc0960e21b17905251610ff6919061242c565b6000604051808303816000865af19150503d8060008114611033576040519150601f19603f3d011682016040523d82523d6000602084013e611038565b606091505b505090508061104657600080fd5b506001600160a01b0382166000908152600e60209081526040822080546001810182559083529120349101555b6001600160a01b0382166000908152600f60205260409020546110979034906123f2565b6001600160a01b0383166000818152600f60205260409081902092909255600954915190917fe76ad748537a48e778fef43dda4a6bd1b50cd62385f9f21a9ca2674923551208916110e9913491612438565b60405180910390a250506001600055565b600180546109af90611f95565b6060601080548060200260200160405190810160405280929190818152602001828054801561115557602002820191906000526020600020905b815481526020019060010190808311611141575b5050505050905090565b600680546109af90611f95565b600480546109af90611f95565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ae57600080fd5b80516000908152600d60205260409020546001600160a01b0316156111d257600080fd5b80516010805460018101825560009182527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019190915560405163d52116e960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d52116e9906112799030907f0000000000000000000000000000000000000000000000000000000000000000908790600401612523565b6020604051808303816000875af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc9190612550565b91516000908152600d6020526040902080546001600160a01b0319166001600160a01b039093169290921790915550565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461132257600080fd5b624f1a008160085461133491906123f2565b1161134c578060085461134791906123f2565b611351565b624f1a005b6008819055611380907f00000000000000000000000000000000000000000000000000000000000000006123f2565b600a5550565b600260005414156113a95760405162461bcd60e51b8152600401610eba906123b7565b60026000819055604080518082019091526009548152600c549091602083019160ff16908111156113dc576113dc61169d565b90528051601190815560208201516012805460ff191660018360028111156114065761140661169d565b021790555050604051631cc535e760e21b815273__$9f85faa081bdc7133e3fbd199bfea18136$__9150637314d79c90611472907f000000000000000000000000000000000000000000000000000000000000000090601190600d90600f90600e908990600401612571565b60006040518083038186803b15801561148a57600080fd5b505af415801561149e573d6000803e3d6000fd5b50506001600055505050565b60405180610180016040528060006001600160a01b03168152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000600281111561150a5761150a61169d565b81526020016060815260200160608152602001600081525090565b82805461153190611f95565b90600052602060002090601f0160209004810192826115535760008555611599565b82601f1061156c57805160ff1916838001178555611599565b82800160010185558215611599579182015b8281111561159957825182559160200191906001019061157e565b506115a59291506115a9565b5090565b5b808211156115a557600081556001016115aa565b60006001600160a01b0382165b92915050565b6115da816115be565b81146115e557600080fd5b50565b80356115cb816115d1565b60006020828403121561160857611608600080fd5b600061161484846115e8565b949350505050565b805b82525050565b602081016115cb828461161c565b61161e816115be565b60005b8381101561165657818101518382015260200161163e565b83811115611665576000848401525b50505050565b6000611675825190565b80845260208401935061168c81856020860161163b565b601f01601f19169290920192915050565b634e487b7160e01b600052602160045260246000fd5b600381106115e5576115e561169d565b806116cd816116b3565b919050565b60006115cb826116c3565b61161e816116d2565b80516000906101808401906116fb8582611632565b5060208301518482036020860152611713828261166b565b9150506040830151848203604086015261172d828261166b565b91505060608301518482036060860152611747828261166b565b91505060808301518482036080860152611761828261166b565b91505060a083015161177660a086018261161c565b5060c083015161178960c086018261161c565b5060e083015161179c60e086018261161c565b506101008301516117b16101008601826116dd565b506101208301518482036101208601526117cb828261166b565b9150506101408301518482036101408601526117e7828261166b565b9150506101608301516117fe61016086018261161c565b509392505050565b60208082528101610b3a81846116e6565b60208082528101610b3a818461166b565b806115da565b80356115cb81611828565b6000806040838503121561184f5761184f600080fd5b600061185b85856115e8565b925050602061186c8582860161182e565b9150509250929050565b60006020828403121561188b5761188b600080fd5b6000611614848461182e565b6000610b3a838361166b565b60006118ad825190565b808452602084019350836020820285016118c78560200190565b8060005b858110156118fc57848403895281516118e48582611897565b94506020830160209a909a01999250506001016118cb565b5091979650505050505050565b80151561161e565b600061191d8383611632565b505060200190565b600061192f825190565b80845260209384019383018060005b838110156119635781516119528882611911565b97506020830192505060010161193e565b509495945050505050565b8051600090610160840190611983858261161c565b506020830151848203602086015261199b828261166b565b915050604083015184820360408601526119b5828261166b565b915050606083015184820360608601526119cf828261166b565b915050608083015184820360808601526119e982826118a3565b91505060a08301516119fe60a086018261161c565b5060c0830151611a1160c086018261161c565b5060e0830151611a2460e0860182611909565b50610100830151848203610100860152611a3e82826118a3565b915050610120830151848203610120860152611a5a8282611925565b915050610140830151848203610140860152611a76828261166b565b95945050505050565b60208082528101610b3a818461196e565b60008083601f840112611aa557611aa5600080fd5b5081356001600160401b03811115611abf57611abf600080fd5b602083019150836001820283011115611ada57611ada600080fd5b9250929050565b60008060208385031215611af757611af7600080fd5b82356001600160401b03811115611b1057611b10600080fd5b611b1c85828601611a90565b92509250509250929050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715611b6357611b63611b28565b6040525050565b6000611b7560405190565b90506116cd8282611b3e565b60006001600160401b03821115611b9a57611b9a611b28565b601f19601f83011660200192915050565b82818337506000910152565b6000611bca611bc584611b81565b611b6a565b905082815260208101848484011115611be557611be5600080fd5b6117fe848285611bab565b600082601f830112611c0457611c04600080fd5b8135611614848260208601611bb7565b600060208284031215611c2957611c29600080fd5b81356001600160401b03811115611c4257611c42600080fd5b61161484828501611bf0565b602081016115cb82846116dd565b60408101611c6a8285611909565b8181036020830152611614818461166b565b8015156115da565b80356115cb81611c7c565b60008060408385031215611ca557611ca5600080fd5b6000611cb185856115e8565b925050602061186c85828601611c84565b602081016115cb8284611632565b600061191d838361161c565b6000611ce6825190565b80845260209384019383018060005b83811015611963578151611d098882611cd0565b975060208301925050600101611cf5565b60208082528101610b3a8184611cdc565b60006001600160401b03821115611d4457611d44611b28565b5060209081020190565b6000611d5c611bc584611d2b565b83815290506020808201908402830185811115611d7b57611d7b600080fd5b835b81811015611dbb5780356001600160401b03811115611d9e57611d9e600080fd5b808601611dab8982611bf0565b8552505060209283019201611d7d565b5050509392505050565b600082601f830112611dd957611dd9600080fd5b8135611614848260208601611d4e565b60006101208284031215611dff57611dff600080fd5b611e0a610120611b6a565b90506000611e18848461182e565b82525060208201356001600160401b03811115611e3757611e37600080fd5b611e4384828501611bf0565b60208301525060408201356001600160401b03811115611e6557611e65600080fd5b611e7184828501611bf0565b60408301525060608201356001600160401b03811115611e9357611e93600080fd5b611e9f84828501611bf0565b60608301525060808201356001600160401b03811115611ec157611ec1600080fd5b611ecd84828501611dc5565b60808301525060a0611ee18482850161182e565b60a08301525060c0611ef58482850161182e565b60c08301525060e0611f0984828501611c84565b60e0830152506101008201356001600160401b03811115611f2c57611f2c600080fd5b611f3884828501611dc5565b6101008301525092915050565b600060208284031215611f5a57611f5a600080fd5b81356001600160401b03811115611f7357611f73600080fd5b61161484828501611de9565b634e487b7160e01b600052602260045260246000fd5b600281046001821680611fa957607f821691505b60208210811415611fbc57611fbc611f7f565b50919050565b80516115cb81611828565b6000611fdb611bc584611b81565b905082815260208101848484011115611ff657611ff6600080fd5b6117fe84828561163b565b600082601f83011261201557612015600080fd5b8151611614848260208601611fcd565b6000612033611bc584611d2b565b8381529050602080820190840283018581111561205257612052600080fd5b835b81811015611dbb5780516001600160401b0381111561207557612075600080fd5b8086016120828982612001565b8552505060209283019201612054565b600082601f8301126120a6576120a6600080fd5b8151611614848260208601612025565b80516115cb81611c7c565b80516115cb816115d1565b60006120da611bc584611d2b565b838152905060208082019084028301858111156120f9576120f9600080fd5b835b81811015611dbb578061210e88826120c1565b845250602092830192016120fb565b600082601f83011261213157612131600080fd5b81516116148482602086016120cc565b6000610160828403121561215757612157600080fd5b612162610160611b6a565b905060006121708484611fc2565b82525060208201516001600160401b0381111561218f5761218f600080fd5b61219b84828501612001565b60208301525060408201516001600160401b038111156121bd576121bd600080fd5b6121c984828501612001565b60408301525060608201516001600160401b038111156121eb576121eb600080fd5b6121f784828501612001565b60608301525060808201516001600160401b0381111561221957612219600080fd5b61222584828501612092565b60808301525060a061223984828501611fc2565b60a08301525060c061224d84828501611fc2565b60c08301525060e0612261848285016120b6565b60e0830152506101008201516001600160401b0381111561228457612284600080fd5b61229084828501612092565b610100830152506101208201516001600160401b038111156122b4576122b4600080fd5b6122c08482850161211d565b610120830152506101408201516001600160401b038111156122e4576122e4600080fd5b6122f084828501612001565b6101408301525092915050565b60006020828403121561231257612312600080fd5b81516001600160401b0381111561232b5761232b600080fd5b61161484828501612141565b6000816115cb565b60006001600160a01b0382166115cb565b60006115cb8261233f565b60006115cb82612350565b61161e8161235b565b6040810161237d8285612366565b610b3a6020830184611632565b634e487b7160e01b600052601160045260246000fd5b6000828210156123b2576123b261238a565b500390565b602080825281016115cb81601f81527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00602082015260400190565b600082198211156124055761240561238a565b500190565b6000612414825190565b61242281856020860161163b565b9290920192915050565b6000610b3a828461240a565b60408101612446828561161c565b610b3a602083018461161c565b8051600090610120840190612468858261161c565b5060208301518482036020860152612480828261166b565b9150506040830151848203604086015261249a828261166b565b915050606083015184820360608601526124b4828261166b565b915050608083015184820360808601526124ce82826118a3565b91505060a08301516124e360a086018261161c565b5060c08301516124f660c086018261161c565b5060e083015161250960e0860182611909565b50610100830151848203610100860152611a7682826118a3565b606081016125318286611632565b61253e6020830185612366565b8181036040830152611a768184612453565b60006020828403121561256557612565600080fd5b600061161484846120c1565b60c0810161257f8289611632565b61258b60208301889052565b61259760408301879052565b6125a360608301869052565b6125af60808301859052565b6125bc60a0830184611632565b97965050505050505056fea26469706673582212207355c3d8a94ef37f95b24cb07f2fbca2f05f04eb07521b6e87ad980e9290648664736f6c634300080b0033a264697066735822122095549e19097956ef129dab6402ba52b056f12a6d386cab161eb7aac9ed35910164736f6c634300080b0033", + "numDeployments": 3, + "solcInputHash": "29f2960a323d69a7be5b01d1ca776898", + "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_crf\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rwdFactory\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"_title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_category\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_tags\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_goalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_imageURI\",\"type\":\"string\"}],\"internalType\":\"struct CampaignFactory.cmpInput\",\"name\":\"_cmp\",\"type\":\"tuple\"}],\"name\":\"createCampaign\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/factories/CampaignFactory.sol\":\"CampaignFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n/**\\n * @notice This is a deprecated interface. Please use AutomationCompatibleInterface directly.\\n */\\npragma solidity ^0.8.0;\\nimport {AutomationCompatibleInterface as KeeperCompatibleInterface} from \\\"./AutomationCompatibleInterface.sol\\\";\\n\",\"keccak256\":\"0xac76a31c20c6d66196247376d113a0f19229569ab8c123989649d50be3333e0a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x0e9621f60b2faabe65549f7ed0f24e8853a45c1b7990d47e8160e523683f3935\",\"license\":\"MIT\"},\"contracts/Campaign.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\r\\nimport \\\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\\\";\\r\\nimport {Reward} from \\\"./Reward.sol\\\";\\r\\nimport {RewardFactory} from \\\"./factories/RewardFactory.sol\\\";\\r\\nimport {RefunderLib} from \\\"./libraries/campaign/RefunderLib.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Cmp_NIS(); /**not in state */\\r\\n// error Cmp_NotCrtr();\\r\\n// error Cmp_DIC(); /**donator is creator */\\r\\n// error Cmp_NoDns();\\r\\n// error Cmp_RefF();\\r\\n// error Cmp_UpkNN();\\r\\n// error Cmp_NotRef();\\r\\n// error Cmp_Bankrupt();\\r\\n\\r\\ncontract Campaign is KeeperCompatibleInterface, ReentrancyGuard {\\r\\n // enums\\r\\n enum C_State {\\r\\n Fundraising,\\r\\n Expired,\\r\\n Canceled\\r\\n }\\r\\n\\r\\n // c_state variables\\r\\n address public immutable i_crf;\\r\\n address payable public immutable i_creator;\\r\\n address public immutable i_rwdFactory;\\r\\n string public s_title;\\r\\n string public s_description;\\r\\n string public s_category;\\r\\n string public s_imageURI;\\r\\n string public s_campaignURI;\\r\\n string public s_tags;\\r\\n uint256 public goalAmount;\\r\\n uint256 public duration;\\r\\n uint256 public currentBalance;\\r\\n uint256 private immutable i_initTimeStamp;\\r\\n uint256 private constant i_maxDur = 5184000;\\r\\n uint256 public deadline;\\r\\n uint256 private rId;\\r\\n C_State public c_state = C_State.Fundraising; // default c_state\\r\\n\\r\\n struct CampaignObject {\\r\\n address i_creator;\\r\\n string s_title;\\r\\n string s_description;\\r\\n string s_category;\\r\\n string s_tags;\\r\\n uint256 goalAmount;\\r\\n uint256 duration;\\r\\n uint256 currentBalance;\\r\\n C_State currentC_State;\\r\\n string s_imageURI;\\r\\n string s_campaignURI;\\r\\n uint256 deadline;\\r\\n }\\r\\n\\r\\n struct refunder_pckg {\\r\\n uint256 currentBalance;\\r\\n C_State c_state;\\r\\n }\\r\\n\\r\\n // mapping (uint256 => reward) public rewards;\\r\\n mapping(uint256 => address) public rewards;\\r\\n mapping(address => uint256[]) public entDonations;\\r\\n mapping(address => uint256) public aggrDonations;\\r\\n\\r\\n uint256[] public rKeys;\\r\\n\\r\\n // events\\r\\n event FundingRecieved(\\r\\n address indexed contributor,\\r\\n uint256 amount,\\r\\n uint256 currentBalance\\r\\n );\\r\\n event CreatorPaid(address creator, address campaignAddress);\\r\\n event CampaignExpired(address campaignAddress);\\r\\n event CampaignCanceled();\\r\\n\\r\\n // modifiers\\r\\n modifier isCreator() {\\r\\n if (msg.sender != i_creator) {\\r\\n revert();\\r\\n }\\r\\n _;\\r\\n }\\r\\n\\r\\n refunder_pckg _refP;\\r\\n\\r\\n constructor(\\r\\n address _crowdfunder,\\r\\n address _creator,\\r\\n address _rwdFactory,\\r\\n string memory _title,\\r\\n string memory _description,\\r\\n string memory _category,\\r\\n string memory _tags,\\r\\n uint256 _goalAmount,\\r\\n uint256 _duration,\\r\\n string memory _imageURI\\r\\n ) {\\r\\n i_rwdFactory = _rwdFactory;\\r\\n i_crf = _crowdfunder;\\r\\n i_creator = payable(_creator);\\r\\n s_title = _title;\\r\\n s_description = _description;\\r\\n s_category = _category;\\r\\n s_tags = _tags;\\r\\n goalAmount = _goalAmount;\\r\\n i_initTimeStamp = block.timestamp;\\r\\n duration = _duration > i_maxDur ? i_maxDur : _duration;\\r\\n deadline = i_initTimeStamp + duration;\\r\\n s_imageURI = _imageURI;\\r\\n currentBalance = 0;\\r\\n }\\r\\n\\r\\n function donate(\\r\\n address _donator,\\r\\n bool _rewardable\\r\\n ) public payable nonReentrant {\\r\\n if (msg.sender != i_crf) {\\r\\n revert();\\r\\n }\\r\\n if (c_state != C_State.Fundraising) {\\r\\n revert();\\r\\n }\\r\\n if (_donator == i_creator) {\\r\\n revert();\\r\\n }\\r\\n currentBalance = currentBalance + msg.value;\\r\\n if (_rewardable) {\\r\\n if (rewards[msg.value] != address(0)) {\\r\\n (bool success, ) = rewards[msg.value].call(\\r\\n abi.encodeWithSignature(\\\"addDonator(address)\\\", _donator)\\r\\n );\\r\\n if (!success) {\\r\\n revert();\\r\\n }\\r\\n entDonations[_donator].push(msg.value);\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n aggrDonations[_donator] = aggrDonations[_donator] + msg.value;\\r\\n emit FundingRecieved(_donator, msg.value, currentBalance);\\r\\n }\\r\\n\\r\\n /**\\r\\n @dev this is the function chainlink keepers calls\\r\\n chekupkeep returns true to trigger the action after the interval has passed\\r\\n */\\r\\n function checkUpkeep(\\r\\n bytes memory /**checkData */\\r\\n )\\r\\n public\\r\\n view\\r\\n override\\r\\n returns (bool upkeepNeeded, bytes memory /**performData */)\\r\\n {\\r\\n bool isOpen = c_state == C_State.Fundraising;\\r\\n bool timePassed = ((block.timestamp - i_initTimeStamp) > duration);\\r\\n upkeepNeeded = (timePassed && isOpen);\\r\\n return (upkeepNeeded, \\\"0x0\\\");\\r\\n }\\r\\n\\r\\n function performUpkeep(bytes calldata /**performData */) external override {\\r\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\r\\n if (!upkeepNeeded) {\\r\\n revert();\\r\\n }\\r\\n c_state = C_State.Expired;\\r\\n emit CampaignExpired(address(this));\\r\\n }\\r\\n\\r\\n function payout() external isCreator {\\r\\n if (c_state != C_State.Expired) {\\r\\n revert();\\r\\n }\\r\\n uint256 totalRaised = currentBalance;\\r\\n currentBalance = 0;\\r\\n (bool success, ) = i_creator.call{value: totalRaised}(\\\"\\\");\\r\\n if (success) {\\r\\n emit CreatorPaid(i_creator, address(this));\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n\\r\\n function refund(address _donator) external nonReentrant {\\r\\n _refP = refunder_pckg(currentBalance, c_state);\\r\\n RefunderLib.refund(\\r\\n i_crf,\\r\\n _refP,\\r\\n rewards,\\r\\n aggrDonations,\\r\\n entDonations,\\r\\n _donator\\r\\n );\\r\\n }\\r\\n\\r\\n function makeReward(RewardFactory.rwdInput memory _rwd) external isCreator {\\r\\n if (rewards[_rwd._price] != address(0)) {\\r\\n revert();\\r\\n }\\r\\n rKeys.push(_rwd._price);\\r\\n address newReward = RewardFactory(i_rwdFactory).createReward(\\r\\n address(this),\\r\\n i_creator,\\r\\n _rwd\\r\\n );\\r\\n rewards[_rwd._price] = newReward;\\r\\n }\\r\\n\\r\\n function endCampaign() external isCreator {\\r\\n if (c_state == C_State.Expired) {\\r\\n revert();\\r\\n }\\r\\n c_state = C_State.Canceled;\\r\\n emit CampaignCanceled();\\r\\n }\\r\\n\\r\\n // update functions\\r\\n function updateCampaignURI(string memory _campaignURI) external isCreator {\\r\\n s_campaignURI = _campaignURI;\\r\\n }\\r\\n\\r\\n function updateDur(uint256 _addedDur) external isCreator {\\r\\n duration = (((duration + _addedDur)) > i_maxDur)\\r\\n ? i_maxDur\\r\\n : (duration + _addedDur);\\r\\n deadline = i_initTimeStamp + duration;\\r\\n }\\r\\n\\r\\n // getter functions\\r\\n function getRewardKeys() external view returns (uint256[] memory) {\\r\\n return rKeys;\\r\\n }\\r\\n\\r\\n function getReward(\\r\\n uint256 _priceID\\r\\n ) external view returns (Reward.RewardObject memory) {\\r\\n Reward reward = Reward(rewards[_priceID]);\\r\\n return reward.getRewardDetails();\\r\\n }\\r\\n\\r\\n function getCampaignDetails()\\r\\n external\\r\\n view\\r\\n returns (CampaignObject memory)\\r\\n {\\r\\n return\\r\\n CampaignObject(\\r\\n i_creator,\\r\\n s_title,\\r\\n s_description,\\r\\n s_category,\\r\\n s_tags,\\r\\n goalAmount,\\r\\n duration,\\r\\n currentBalance,\\r\\n c_state,\\r\\n s_imageURI,\\r\\n s_campaignURI,\\r\\n deadline\\r\\n );\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x05c5518a752b38ef051b073ae318d9756c394760487680397e447357299626bc\",\"license\":\"MIT\"},\"contracts/Reward.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\ncontract Reward {\\r\\n address public immutable i_campaignAddress;\\r\\n // address public immutable i_crf;\\r\\n address public immutable i_creator;\\r\\n\\r\\n uint256 public immutable i_price;\\r\\n string public title;\\r\\n string public description;\\r\\n string public rpic;\\r\\n string[] public perks;\\r\\n uint256 public delDate;\\r\\n uint256 public quantity;\\r\\n bool public infinite = true;\\r\\n string[] public shipsTo;\\r\\n address[] public donators;\\r\\n string public surveyLink;\\r\\n\\r\\n struct RewardObject {\\r\\n uint256 price;\\r\\n string title;\\r\\n string description;\\r\\n string rpic;\\r\\n string[] perks;\\r\\n uint256 delDate;\\r\\n uint256 quantity;\\r\\n bool infinite;\\r\\n string[] shipsTo;\\r\\n address[] donators;\\r\\n string surveyLink;\\r\\n }\\r\\n\\r\\n mapping (address => uint256) public true_donator; \\r\\n mapping (address => string) public surveyResponses;\\r\\n\\r\\n constructor ( \\r\\n address _campaignAddress, \\r\\n address _creator,\\r\\n uint256 _price, \\r\\n string memory _title, \\r\\n string memory _description, \\r\\n string memory _rpic,\\r\\n string[] memory _perks, \\r\\n uint256 _deadline, \\r\\n uint256 _quantity, \\r\\n bool _infinite, \\r\\n string[] memory _shipsTo\\r\\n ) {\\r\\n i_price = _price;\\r\\n i_campaignAddress = _campaignAddress;\\r\\n i_creator = _creator;\\r\\n\\r\\n title = _title;\\r\\n description = _description;\\r\\n rpic = _rpic;\\r\\n perks = _perks;\\r\\n delDate = _deadline;\\r\\n quantity = _quantity;\\r\\n infinite = _infinite;\\r\\n shipsTo = _shipsTo;\\r\\n }\\r\\n\\r\\n function updateSurveyLink(string memory _surveylink) external {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n surveyLink = _surveylink;\\r\\n }\\r\\n\\r\\n function addDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if((true_donator[_donator] > 0)){revert();} // already has id ...has therefor donated for this reward before\\r\\n\\r\\n if(!infinite){\\r\\n if(quantity > 0){\\r\\n quantity = quantity - 1;\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }else{revert();} // rwd has finished no longer available\\r\\n }else{\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }\\r\\n }\\r\\n\\r\\n function getDonators() external view returns(address[] memory){\\r\\n return donators;\\r\\n }\\r\\n\\r\\n function removeDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if(!(true_donator[_donator] > 0)){revert();} // not a donator\\r\\n uint256 index = true_donator[_donator] - 1;\\r\\n delete donators[index];\\r\\n delete true_donator[_donator];\\r\\n }\\r\\n\\r\\n function respondToSurvey(string memory _response) external {\\r\\n if(!(true_donator[msg.sender] > 0)){revert();} // not a donator\\r\\n surveyResponses[msg.sender] = _response;\\r\\n }\\r\\n\\r\\n function getRewardDetails() external view returns(RewardObject memory){\\r\\n return RewardObject(\\r\\n i_price,\\r\\n title,\\r\\n description,\\r\\n rpic,\\r\\n perks,\\r\\n delDate,\\r\\n quantity,\\r\\n infinite,\\r\\n shipsTo,\\r\\n donators,\\r\\n surveyLink\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0x16520b0d7ec2ca2e9c34cc0738e1db48661eef392ca464f8b0ee003169d06603\",\"license\":\"MIT\"},\"contracts/factories/CampaignFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../Campaign.sol\\\";\\r\\n\\r\\ncontract CampaignFactory {\\r\\n struct cmpInput {\\r\\n string _title; \\r\\n string _description;\\r\\n string _category;\\r\\n string _tags; \\r\\n uint256 _goalAmount;\\r\\n uint256 _duration;\\r\\n string _imageURI;\\r\\n }\\r\\n\\r\\n function createCampaign(address _crf, address _creator, address _rwdFactory, cmpInput memory _cmp) external returns (address) {\\r\\n Campaign cmp = new Campaign(\\r\\n _crf,\\r\\n payable(_creator),\\r\\n _rwdFactory,\\r\\n _cmp._title,\\r\\n _cmp._description,\\r\\n _cmp._category,\\r\\n _cmp._tags,\\r\\n _cmp._goalAmount,\\r\\n _cmp._duration,\\r\\n _cmp._imageURI\\r\\n );\\r\\n\\r\\n return address(cmp);\\r\\n }\\r\\n}\",\"keccak256\":\"0xae3a189ad6f1504c63d874152a930c38bf2289506a36db75d26107500f0b79a6\",\"license\":\"MIT\"},\"contracts/factories/RewardFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Reward } from \\\"../Reward.sol\\\";\\r\\n\\r\\ncontract RewardFactory {\\r\\n struct rwdInput {\\r\\n uint256 _price;\\r\\n string _title; \\r\\n string _description; \\r\\n string _rpic;\\r\\n string[] _perks; \\r\\n uint256 _deadline; \\r\\n uint256 _quantity; \\r\\n bool _infinite; \\r\\n string[] _shipsTo;\\r\\n }\\r\\n\\r\\n function createReward(address _cmpAddress, address _creator, rwdInput memory _rwd) public returns (address) {\\r\\n Reward rwd = new Reward(\\r\\n _cmpAddress, \\r\\n _creator,\\r\\n _rwd._price,\\r\\n _rwd._title,\\r\\n _rwd._description,\\r\\n _rwd._rpic,\\r\\n _rwd._perks,\\r\\n _rwd._deadline,\\r\\n _rwd._quantity,\\r\\n _rwd._infinite,\\r\\n _rwd._shipsTo \\r\\n );\\r\\n\\r\\n return address(rwd);\\r\\n }\\r\\n}\",\"keccak256\":\"0x025667572f11f51d96b92b058b304512b26a9394374f509ec337a822c2133729\",\"license\":\"MIT\"},\"contracts/libraries/campaign/RefunderLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../../Campaign.sol\\\";\\r\\nimport { Reward } from \\\"../../Reward.sol\\\";\\r\\n\\r\\nlibrary RefunderLib {\\r\\n function refund (\\r\\n address _i_crf,\\r\\n Campaign.refunder_pckg storage _refP, \\r\\n mapping (uint256 => address) storage _rewards, \\r\\n mapping (address => uint256) storage _aggrDons, \\r\\n mapping (address => uint256[]) storage _entDons, \\r\\n address _donator\\r\\n ) external {\\r\\n if(msg.sender != _i_crf){revert();}\\r\\n if(_refP.c_state == Campaign.C_State.Expired){revert();}\\r\\n if(_aggrDons[_donator] == 0 ){revert();}\\r\\n\\r\\n uint256 amountToRefund = _aggrDons[_donator];\\r\\n\\r\\n if(_refP.currentBalance < amountToRefund){revert();}\\r\\n _refP.currentBalance = _refP.currentBalance - amountToRefund;\\r\\n\\r\\n (bool success, ) = payable(_donator).call{value: amountToRefund}(\\\"\\\");\\r\\n if(!success){revert();}\\r\\n\\r\\n delete _aggrDons[_donator];\\r\\n\\r\\n if(_entDons[_donator].length > 0){ \\r\\n for(uint i=0; i<_entDons[_donator].length; i++){\\r\\n if(!(_rewards[_entDons[_donator][i]] != address(0))){\\r\\n Reward(_rewards[_entDons[_donator][i]]).removeDonator(_donator);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n delete _entDons[_donator];\\r\\n }\\r\\n}\",\"keccak256\":\"0xacea134a5959c86c7ca67a50b965a2ad2666dccf020c1e3d97b908a79937da03\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506131c5806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200002e5760003560e01c8063884f30ec1462000033575b600080fd5b6200004a620000443660046200039a565b62000062565b60405162000059919062000436565b60405180910390f35b600080858585856000015186602001518760400151886060015189608001518a60a001518b60c001516040516200009990620000d6565b620000ae9a99989796959493929190620004ec565b604051809103906000f080158015620000cb573d6000803e3d6000fd5b509695505050505050565b612bd880620005b883390190565b60006001600160a01b0382165b92915050565b6200010281620000e4565b81146200010e57600080fd5b50565b8035620000f181620000f7565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156200015d576200015d6200011e565b6040525050565b60006200017060405190565b90506200017e828262000134565b919050565b600067ffffffffffffffff821115620001a057620001a06200011e565b601f19601f83011660200192915050565b82818337506000910152565b6000620001d4620001ce8462000183565b62000164565b905082815260208101848484011115620001f157620001f1600080fd5b620001fe848285620001b1565b509392505050565b600082601f8301126200021c576200021c600080fd5b81356200022e848260208601620001bd565b949350505050565b8062000102565b8035620000f18162000236565b600060e08284031215620002615762000261600080fd5b6200026d60e062000164565b9050813567ffffffffffffffff8111156200028b576200028b600080fd5b620002998482850162000206565b825250602082013567ffffffffffffffff811115620002bb57620002bb600080fd5b620002c98482850162000206565b602083015250604082013567ffffffffffffffff811115620002ee57620002ee600080fd5b620002fc8482850162000206565b604083015250606082013567ffffffffffffffff811115620003215762000321600080fd5b6200032f8482850162000206565b606083015250608062000345848285016200023d565b60808301525060a06200035b848285016200023d565b60a08301525060c082013567ffffffffffffffff811115620003805762000380600080fd5b6200038e8482850162000206565b60c08301525092915050565b60008060008060808587031215620003b557620003b5600080fd5b6000620003c3878762000111565b9450506020620003d68782880162000111565b9350506040620003e98782880162000111565b925050606085013567ffffffffffffffff8111156200040b576200040b600080fd5b62000419878288016200024a565b91505092959194509250565b6200043081620000e4565b82525050565b60208101620000f1828462000425565b60006001600160a01b038216620000f1565b6000620000f18262000446565b6000620000f18262000458565b620004308162000465565b60005b838110156200049a57818101518382015260200162000480565b83811115620004aa576000848401525b50505050565b6000620004bb825190565b808452602084019350620004d48185602086016200047d565b601f01601f19169290920192915050565b8062000430565b6101408101620004fd828d62000425565b6200050c602083018c62000472565b6200051b604083018b62000425565b81810360608301526200052f818a620004b0565b90508181036080830152620005458189620004b0565b905081810360a08301526200055b8188620004b0565b905081810360c0830152620005718187620004b0565b90506200058260e0830186620004e5565b62000592610100830185620004e5565b818103610120830152620005a78184620004b0565b9c9b50505050505050505050505056fe610100604052600c805460ff191690553480156200001c57600080fd5b5060405162002bd838038062002bd88339810160408190526200003f9162000349565b600160008190556001600160a01b03808a1660c0528b81166080528a1660a052875162000072919060208a019062000118565b5085516200008890600290602089019062000118565b5084516200009e90600390602088019062000118565b508351620000b490600690602087019062000118565b5060078390554260e052624f1a008211620000d05781620000d5565b624f1a005b600881905560e051620000e99190620004dd565b600a5580516200010190600490602084019062000118565b50506000600955506200053f975050505050505050565b82805462000126906200050e565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b60006001600160a01b0382165b92915050565b620001dc81620001be565b8114620001e857600080fd5b50565b8051620001cb81620001d1565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715620002365762000236620001f8565b6040525050565b60006200024960405190565b90506200025782826200020e565b919050565b60006001600160401b03821115620002785762000278620001f8565b601f19601f83011660200192915050565b60005b83811015620002a65781810151838201526020016200028c565b83811115620002b6576000848401525b50505050565b6000620002d3620002cd846200025c565b6200023d565b905082815260208101848484011115620002f057620002f0600080fd5b620002fd84828562000289565b509392505050565b600082601f8301126200031b576200031b600080fd5b81516200032d848260208601620002bc565b949350505050565b80620001dc565b8051620001cb8162000335565b6000806000806000806000806000806101408b8d0312156200036e576200036e600080fd5b60006200037c8d8d620001eb565b9a505060206200038f8d828e01620001eb565b9950506040620003a28d828e01620001eb565b98505060608b01516001600160401b03811115620003c357620003c3600080fd5b620003d18d828e0162000305565b97505060808b01516001600160401b03811115620003f257620003f2600080fd5b620004008d828e0162000305565b96505060a08b01516001600160401b03811115620004215762000421600080fd5b6200042f8d828e0162000305565b95505060c08b01516001600160401b03811115620004505762000450600080fd5b6200045e8d828e0162000305565b94505060e0620004718d828e016200033c565b935050610100620004858d828e016200033c565b9250506101208b01516001600160401b03811115620004a757620004a7600080fd5b620004b58d828e0162000305565b9150509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b60008219821115620004f357620004f3620004c7565b500190565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806200052357607f821691505b60208210811415620005395762000539620004f8565b50919050565b60805160a05160c05160e0516125fd620005db60003960008181610da9015261135c0152600081816104d0015261122001526000818161042d015281816105d201528181610bca01528181610c4401528181610ca401528181610d4801528181610e1101528181610f22015281816111840152818161124f01526112f801526000818161059a01528181610ed3015261143c01526125fd6000f3fe6080604052600436106101cd5760003560e01c80636e04ff0d116100f7578063ce2a057211610095578063f764f87911610064578063f764f87914610528578063fa6ded3914610548578063fa89401a14610568578063fd6b30fa1461058857600080fd5b8063ce2a057214610493578063ce845d1d146104a8578063ea0ec1c6146104be578063f301af42146104f257600080fd5b806399a8502d116100d157806399a8502d14610406578063b145603e1461041b578063bf66e2c81461045c578063c5cd50781461047e57600080fd5b80636e04ff0d146103b057806371aac7f9146103de5780637be4bae1146103f357600080fd5b806329dcb0cf1161016f5780634ef897191161013e5780634ef897191461033f57806360fa9a72146103545780636235887a1461037b57806363bd1d4a1461039b57600080fd5b806329dcb0cf146102d25780634278ac8b146102e85780634585e33b146102fd5780634d695bdb1461031f57600080fd5b806315a46ee6116101ab57806315a46ee61461024d5780631774d9601461026f5780631c4b774b1461028f5780632636b945146102bc57600080fd5b806309917c50146101d25780630c611f24146102155780630fb5a6b414610237575b600080fd5b3480156101de57600080fd5b506101ff6101ed3660046115f3565b600f6020526000908152604090205481565b60405161020c9190611624565b60405180910390f35b34801561022157600080fd5b5061022a6105bc565b60405161020c9190611806565b34801561024357600080fd5b506101ff60085481565b34801561025957600080fd5b506102626109a2565b60405161020c9190611817565b34801561027b57600080fd5b506101ff61028a366004611839565b610a30565b34801561029b57600080fd5b506102af6102aa366004611876565b610a61565b60405161020c9190611a7f565b3480156102c857600080fd5b506101ff60075481565b3480156102de57600080fd5b506101ff600a5481565b3480156102f457600080fd5b50610262610b41565b34801561030957600080fd5b5061031d610318366004611ae1565b610b4e565b005b34801561032b57600080fd5b5061031d61033a366004611c14565b610bbf565b34801561034b57600080fd5b50610262610c0b565b34801561036057600080fd5b50600c5461036e9060ff1681565b60405161020c9190611c4e565b34801561038757600080fd5b506101ff610396366004611876565b610c18565b3480156103a757600080fd5b5061031d610c39565b3480156103bc57600080fd5b506103d06103cb366004611c14565b610d82565b60405161020c929190611c5c565b3480156103ea57600080fd5b5061031d610e06565b61031d610401366004611c8f565b610e97565b34801561041257600080fd5b506102626110fa565b34801561042757600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b60405161020c9190611cc2565b34801561046857600080fd5b50610471611107565b60405161020c9190611d1a565b34801561048a57600080fd5b5061026261115f565b34801561049f57600080fd5b5061026261116c565b3480156104b457600080fd5b506101ff60095481565b3480156104ca57600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fe57600080fd5b5061044f61050d366004611876565b600d602052600090815260409020546001600160a01b031681565b34801561053457600080fd5b5061031d610543366004611f45565b611179565b34801561055457600080fd5b5061031d610563366004611876565b6112ed565b34801561057457600080fd5b5061031d6105833660046115f3565b611386565b34801561059457600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b6105c46114aa565b6040518061018001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020016001805461060c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461063890611f95565b80156106855780601f1061065a57610100808354040283529160200191610685565b820191906000526020600020905b81548152906001019060200180831161066857829003601f168201915b505050505081526020016002805461069c90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546106c890611f95565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b505050505081526020016003805461072c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461075890611f95565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001600680546107bc90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546107e890611f95565b80156108355780601f1061080a57610100808354040283529160200191610835565b820191906000526020600020905b81548152906001019060200180831161081857829003601f168201915b5050509183525050600754602082015260085460408201526009546060820152600c5460809091019060ff1660028111156108725761087261169d565b81526020016004805461088490611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090611f95565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b505050505081526020016005805461091490611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461094090611f95565b801561098d5780601f106109625761010080835404028352916020019161098d565b820191906000526020600020905b81548152906001019060200180831161097057829003601f168201915b50505050508152602001600a54815250905090565b600580546109af90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546109db90611f95565b8015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b505050505081565b600e6020528160005260406000208181548110610a4c57600080fd5b90600052602060002001600091509150505481565b610ac0604051806101600160405280600081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000151581526020016060815260200160608152602001606081525090565b6000828152600d6020526040808220548151636862013b60e11b815291516001600160a01b0390911692839263d0c4027692600480830193928290030181865afa158015610b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3a91908101906122fd565b9392505050565b600380546109af90611f95565b6000610b6860405180602001604052806000815250610d82565b50905080610b7557600080fd5b600c805460ff191660011790556040517f5cf8cd2bd40f758a95257bed666285eb82801f1bf9223b8ec1481e510ba2e82d90610bb2903090611cc2565b60405180910390a1505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf457600080fd5b8051610c07906005906020840190611525565b5050565b600280546109af90611f95565b60108181548110610c2857600080fd5b600091825260209091200154905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c6e57600080fd5b6001600c5460ff166002811115610c8757610c8761169d565b14610c9157600080fd5b60006009549050600060098190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682604051610cd990612337565b60006040518083038185875af1925050503d8060008114610d16576040519150601f19603f3d011682016040523d82523d6000602084013e610d1b565b606091505b5050905080156101cd577fba5e837743d81ad0e6deb16089dbb65b549fdda8ad802fd8d4822884d70dc8b27f000000000000000000000000000000000000000000000000000000000000000030604051610d7692919061236f565b60405180910390a15050565b600060608180600c5460ff166002811115610d9f57610d9f61169d565b14905060006008547f000000000000000000000000000000000000000000000000000000000000000042610dd391906123a0565b119050808015610de05750815b60408051808201909152600381526203078360ec1b602082015290969095509350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e3b57600080fd5b6001600c5460ff166002811115610e5457610e5461169d565b1415610e5f57600080fd5b600c805460ff191660021790556040517fb83ebe09f40e9293bdea1d6567fae3175119d3d0ff13c4b4df15994837dd7f5190600090a1565b60026000541415610ec35760405162461bcd60e51b8152600401610eba906123b7565b60405180910390fd5b6002600055336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610efd57600080fd5b6000600c5460ff166002811115610f1657610f1661169d565b14610f2057600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415610f5f57600080fd5b34600954610f6d91906123f2565b600955801561107357346000908152600d60205260409020546001600160a01b0316156101cd57346000908152600d60205260408082205490516001600160a01b0390911690610fc1908590602401611cc2565b60408051601f198184030181529181526020820180516001600160e01b0316632814bc0960e21b17905251610ff6919061242c565b6000604051808303816000865af19150503d8060008114611033576040519150601f19603f3d011682016040523d82523d6000602084013e611038565b606091505b505090508061104657600080fd5b506001600160a01b0382166000908152600e60209081526040822080546001810182559083529120349101555b6001600160a01b0382166000908152600f60205260409020546110979034906123f2565b6001600160a01b0383166000818152600f60205260409081902092909255600954915190917fe76ad748537a48e778fef43dda4a6bd1b50cd62385f9f21a9ca2674923551208916110e9913491612438565b60405180910390a250506001600055565b600180546109af90611f95565b6060601080548060200260200160405190810160405280929190818152602001828054801561115557602002820191906000526020600020905b815481526020019060010190808311611141575b5050505050905090565b600680546109af90611f95565b600480546109af90611f95565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ae57600080fd5b80516000908152600d60205260409020546001600160a01b0316156111d257600080fd5b80516010805460018101825560009182527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019190915560405163d52116e960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d52116e9906112799030907f0000000000000000000000000000000000000000000000000000000000000000908790600401612523565b6020604051808303816000875af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc9190612550565b91516000908152600d6020526040902080546001600160a01b0319166001600160a01b039093169290921790915550565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461132257600080fd5b624f1a008160085461133491906123f2565b1161134c578060085461134791906123f2565b611351565b624f1a005b6008819055611380907f00000000000000000000000000000000000000000000000000000000000000006123f2565b600a5550565b600260005414156113a95760405162461bcd60e51b8152600401610eba906123b7565b60026000819055604080518082019091526009548152600c549091602083019160ff16908111156113dc576113dc61169d565b90528051601190815560208201516012805460ff191660018360028111156114065761140661169d565b021790555050604051631cc535e760e21b815273aba71389D5f81a8C1380D88AF36F7823d5e0cb809150637314d79c90611472907f000000000000000000000000000000000000000000000000000000000000000090601190600d90600f90600e908990600401612571565b60006040518083038186803b15801561148a57600080fd5b505af415801561149e573d6000803e3d6000fd5b50506001600055505050565b60405180610180016040528060006001600160a01b03168152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000600281111561150a5761150a61169d565b81526020016060815260200160608152602001600081525090565b82805461153190611f95565b90600052602060002090601f0160209004810192826115535760008555611599565b82601f1061156c57805160ff1916838001178555611599565b82800160010185558215611599579182015b8281111561159957825182559160200191906001019061157e565b506115a59291506115a9565b5090565b5b808211156115a557600081556001016115aa565b60006001600160a01b0382165b92915050565b6115da816115be565b81146115e557600080fd5b50565b80356115cb816115d1565b60006020828403121561160857611608600080fd5b600061161484846115e8565b949350505050565b805b82525050565b602081016115cb828461161c565b61161e816115be565b60005b8381101561165657818101518382015260200161163e565b83811115611665576000848401525b50505050565b6000611675825190565b80845260208401935061168c81856020860161163b565b601f01601f19169290920192915050565b634e487b7160e01b600052602160045260246000fd5b600381106115e5576115e561169d565b806116cd816116b3565b919050565b60006115cb826116c3565b61161e816116d2565b80516000906101808401906116fb8582611632565b5060208301518482036020860152611713828261166b565b9150506040830151848203604086015261172d828261166b565b91505060608301518482036060860152611747828261166b565b91505060808301518482036080860152611761828261166b565b91505060a083015161177660a086018261161c565b5060c083015161178960c086018261161c565b5060e083015161179c60e086018261161c565b506101008301516117b16101008601826116dd565b506101208301518482036101208601526117cb828261166b565b9150506101408301518482036101408601526117e7828261166b565b9150506101608301516117fe61016086018261161c565b509392505050565b60208082528101610b3a81846116e6565b60208082528101610b3a818461166b565b806115da565b80356115cb81611828565b6000806040838503121561184f5761184f600080fd5b600061185b85856115e8565b925050602061186c8582860161182e565b9150509250929050565b60006020828403121561188b5761188b600080fd5b6000611614848461182e565b6000610b3a838361166b565b60006118ad825190565b808452602084019350836020820285016118c78560200190565b8060005b858110156118fc57848403895281516118e48582611897565b94506020830160209a909a01999250506001016118cb565b5091979650505050505050565b80151561161e565b600061191d8383611632565b505060200190565b600061192f825190565b80845260209384019383018060005b838110156119635781516119528882611911565b97506020830192505060010161193e565b509495945050505050565b8051600090610160840190611983858261161c565b506020830151848203602086015261199b828261166b565b915050604083015184820360408601526119b5828261166b565b915050606083015184820360608601526119cf828261166b565b915050608083015184820360808601526119e982826118a3565b91505060a08301516119fe60a086018261161c565b5060c0830151611a1160c086018261161c565b5060e0830151611a2460e0860182611909565b50610100830151848203610100860152611a3e82826118a3565b915050610120830151848203610120860152611a5a8282611925565b915050610140830151848203610140860152611a76828261166b565b95945050505050565b60208082528101610b3a818461196e565b60008083601f840112611aa557611aa5600080fd5b5081356001600160401b03811115611abf57611abf600080fd5b602083019150836001820283011115611ada57611ada600080fd5b9250929050565b60008060208385031215611af757611af7600080fd5b82356001600160401b03811115611b1057611b10600080fd5b611b1c85828601611a90565b92509250509250929050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715611b6357611b63611b28565b6040525050565b6000611b7560405190565b90506116cd8282611b3e565b60006001600160401b03821115611b9a57611b9a611b28565b601f19601f83011660200192915050565b82818337506000910152565b6000611bca611bc584611b81565b611b6a565b905082815260208101848484011115611be557611be5600080fd5b6117fe848285611bab565b600082601f830112611c0457611c04600080fd5b8135611614848260208601611bb7565b600060208284031215611c2957611c29600080fd5b81356001600160401b03811115611c4257611c42600080fd5b61161484828501611bf0565b602081016115cb82846116dd565b60408101611c6a8285611909565b8181036020830152611614818461166b565b8015156115da565b80356115cb81611c7c565b60008060408385031215611ca557611ca5600080fd5b6000611cb185856115e8565b925050602061186c85828601611c84565b602081016115cb8284611632565b600061191d838361161c565b6000611ce6825190565b80845260209384019383018060005b83811015611963578151611d098882611cd0565b975060208301925050600101611cf5565b60208082528101610b3a8184611cdc565b60006001600160401b03821115611d4457611d44611b28565b5060209081020190565b6000611d5c611bc584611d2b565b83815290506020808201908402830185811115611d7b57611d7b600080fd5b835b81811015611dbb5780356001600160401b03811115611d9e57611d9e600080fd5b808601611dab8982611bf0565b8552505060209283019201611d7d565b5050509392505050565b600082601f830112611dd957611dd9600080fd5b8135611614848260208601611d4e565b60006101208284031215611dff57611dff600080fd5b611e0a610120611b6a565b90506000611e18848461182e565b82525060208201356001600160401b03811115611e3757611e37600080fd5b611e4384828501611bf0565b60208301525060408201356001600160401b03811115611e6557611e65600080fd5b611e7184828501611bf0565b60408301525060608201356001600160401b03811115611e9357611e93600080fd5b611e9f84828501611bf0565b60608301525060808201356001600160401b03811115611ec157611ec1600080fd5b611ecd84828501611dc5565b60808301525060a0611ee18482850161182e565b60a08301525060c0611ef58482850161182e565b60c08301525060e0611f0984828501611c84565b60e0830152506101008201356001600160401b03811115611f2c57611f2c600080fd5b611f3884828501611dc5565b6101008301525092915050565b600060208284031215611f5a57611f5a600080fd5b81356001600160401b03811115611f7357611f73600080fd5b61161484828501611de9565b634e487b7160e01b600052602260045260246000fd5b600281046001821680611fa957607f821691505b60208210811415611fbc57611fbc611f7f565b50919050565b80516115cb81611828565b6000611fdb611bc584611b81565b905082815260208101848484011115611ff657611ff6600080fd5b6117fe84828561163b565b600082601f83011261201557612015600080fd5b8151611614848260208601611fcd565b6000612033611bc584611d2b565b8381529050602080820190840283018581111561205257612052600080fd5b835b81811015611dbb5780516001600160401b0381111561207557612075600080fd5b8086016120828982612001565b8552505060209283019201612054565b600082601f8301126120a6576120a6600080fd5b8151611614848260208601612025565b80516115cb81611c7c565b80516115cb816115d1565b60006120da611bc584611d2b565b838152905060208082019084028301858111156120f9576120f9600080fd5b835b81811015611dbb578061210e88826120c1565b845250602092830192016120fb565b600082601f83011261213157612131600080fd5b81516116148482602086016120cc565b6000610160828403121561215757612157600080fd5b612162610160611b6a565b905060006121708484611fc2565b82525060208201516001600160401b0381111561218f5761218f600080fd5b61219b84828501612001565b60208301525060408201516001600160401b038111156121bd576121bd600080fd5b6121c984828501612001565b60408301525060608201516001600160401b038111156121eb576121eb600080fd5b6121f784828501612001565b60608301525060808201516001600160401b0381111561221957612219600080fd5b61222584828501612092565b60808301525060a061223984828501611fc2565b60a08301525060c061224d84828501611fc2565b60c08301525060e0612261848285016120b6565b60e0830152506101008201516001600160401b0381111561228457612284600080fd5b61229084828501612092565b610100830152506101208201516001600160401b038111156122b4576122b4600080fd5b6122c08482850161211d565b610120830152506101408201516001600160401b038111156122e4576122e4600080fd5b6122f084828501612001565b6101408301525092915050565b60006020828403121561231257612312600080fd5b81516001600160401b0381111561232b5761232b600080fd5b61161484828501612141565b6000816115cb565b60006001600160a01b0382166115cb565b60006115cb8261233f565b60006115cb82612350565b61161e8161235b565b6040810161237d8285612366565b610b3a6020830184611632565b634e487b7160e01b600052601160045260246000fd5b6000828210156123b2576123b261238a565b500390565b602080825281016115cb81601f81527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00602082015260400190565b600082198211156124055761240561238a565b500190565b6000612414825190565b61242281856020860161163b565b9290920192915050565b6000610b3a828461240a565b60408101612446828561161c565b610b3a602083018461161c565b8051600090610120840190612468858261161c565b5060208301518482036020860152612480828261166b565b9150506040830151848203604086015261249a828261166b565b915050606083015184820360608601526124b4828261166b565b915050608083015184820360808601526124ce82826118a3565b91505060a08301516124e360a086018261161c565b5060c08301516124f660c086018261161c565b5060e083015161250960e0860182611909565b50610100830151848203610100860152611a7682826118a3565b606081016125318286611632565b61253e6020830185612366565b8181036040830152611a768184612453565b60006020828403121561256557612565600080fd5b600061161484846120c1565b60c0810161257f8289611632565b61258b60208301889052565b61259760408301879052565b6125a360608301869052565b6125af60808301859052565b6125bc60a0830184611632565b97965050505050505056fea264697066735822122047fa4b4768452e3b56bd5c572c8b006064835dbb2e753022bc5f48f28740715764736f6c634300080b0033a264697066735822122092eed391931eb19c176cca8a822ed2688da0780ae312e08f29e3870dd12c01cf64736f6c634300080b0033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200002e5760003560e01c8063884f30ec1462000033575b600080fd5b6200004a620000443660046200039a565b62000062565b60405162000059919062000436565b60405180910390f35b600080858585856000015186602001518760400151886060015189608001518a60a001518b60c001516040516200009990620000d6565b620000ae9a99989796959493929190620004ec565b604051809103906000f080158015620000cb573d6000803e3d6000fd5b509695505050505050565b612bd880620005b883390190565b60006001600160a01b0382165b92915050565b6200010281620000e4565b81146200010e57600080fd5b50565b8035620000f181620000f7565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156200015d576200015d6200011e565b6040525050565b60006200017060405190565b90506200017e828262000134565b919050565b600067ffffffffffffffff821115620001a057620001a06200011e565b601f19601f83011660200192915050565b82818337506000910152565b6000620001d4620001ce8462000183565b62000164565b905082815260208101848484011115620001f157620001f1600080fd5b620001fe848285620001b1565b509392505050565b600082601f8301126200021c576200021c600080fd5b81356200022e848260208601620001bd565b949350505050565b8062000102565b8035620000f18162000236565b600060e08284031215620002615762000261600080fd5b6200026d60e062000164565b9050813567ffffffffffffffff8111156200028b576200028b600080fd5b620002998482850162000206565b825250602082013567ffffffffffffffff811115620002bb57620002bb600080fd5b620002c98482850162000206565b602083015250604082013567ffffffffffffffff811115620002ee57620002ee600080fd5b620002fc8482850162000206565b604083015250606082013567ffffffffffffffff811115620003215762000321600080fd5b6200032f8482850162000206565b606083015250608062000345848285016200023d565b60808301525060a06200035b848285016200023d565b60a08301525060c082013567ffffffffffffffff811115620003805762000380600080fd5b6200038e8482850162000206565b60c08301525092915050565b60008060008060808587031215620003b557620003b5600080fd5b6000620003c3878762000111565b9450506020620003d68782880162000111565b9350506040620003e98782880162000111565b925050606085013567ffffffffffffffff8111156200040b576200040b600080fd5b62000419878288016200024a565b91505092959194509250565b6200043081620000e4565b82525050565b60208101620000f1828462000425565b60006001600160a01b038216620000f1565b6000620000f18262000446565b6000620000f18262000458565b620004308162000465565b60005b838110156200049a57818101518382015260200162000480565b83811115620004aa576000848401525b50505050565b6000620004bb825190565b808452602084019350620004d48185602086016200047d565b601f01601f19169290920192915050565b8062000430565b6101408101620004fd828d62000425565b6200050c602083018c62000472565b6200051b604083018b62000425565b81810360608301526200052f818a620004b0565b90508181036080830152620005458189620004b0565b905081810360a08301526200055b8188620004b0565b905081810360c0830152620005718187620004b0565b90506200058260e0830186620004e5565b62000592610100830185620004e5565b818103610120830152620005a78184620004b0565b9c9b50505050505050505050505056fe610100604052600c805460ff191690553480156200001c57600080fd5b5060405162002bd838038062002bd88339810160408190526200003f9162000349565b600160008190556001600160a01b03808a1660c0528b81166080528a1660a052875162000072919060208a019062000118565b5085516200008890600290602089019062000118565b5084516200009e90600390602088019062000118565b508351620000b490600690602087019062000118565b5060078390554260e052624f1a008211620000d05781620000d5565b624f1a005b600881905560e051620000e99190620004dd565b600a5580516200010190600490602084019062000118565b50506000600955506200053f975050505050505050565b82805462000126906200050e565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b60006001600160a01b0382165b92915050565b620001dc81620001be565b8114620001e857600080fd5b50565b8051620001cb81620001d1565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715620002365762000236620001f8565b6040525050565b60006200024960405190565b90506200025782826200020e565b919050565b60006001600160401b03821115620002785762000278620001f8565b601f19601f83011660200192915050565b60005b83811015620002a65781810151838201526020016200028c565b83811115620002b6576000848401525b50505050565b6000620002d3620002cd846200025c565b6200023d565b905082815260208101848484011115620002f057620002f0600080fd5b620002fd84828562000289565b509392505050565b600082601f8301126200031b576200031b600080fd5b81516200032d848260208601620002bc565b949350505050565b80620001dc565b8051620001cb8162000335565b6000806000806000806000806000806101408b8d0312156200036e576200036e600080fd5b60006200037c8d8d620001eb565b9a505060206200038f8d828e01620001eb565b9950506040620003a28d828e01620001eb565b98505060608b01516001600160401b03811115620003c357620003c3600080fd5b620003d18d828e0162000305565b97505060808b01516001600160401b03811115620003f257620003f2600080fd5b620004008d828e0162000305565b96505060a08b01516001600160401b03811115620004215762000421600080fd5b6200042f8d828e0162000305565b95505060c08b01516001600160401b03811115620004505762000450600080fd5b6200045e8d828e0162000305565b94505060e0620004718d828e016200033c565b935050610100620004858d828e016200033c565b9250506101208b01516001600160401b03811115620004a757620004a7600080fd5b620004b58d828e0162000305565b9150509295989b9194979a5092959850565b634e487b7160e01b600052601160045260246000fd5b60008219821115620004f357620004f3620004c7565b500190565b634e487b7160e01b600052602260045260246000fd5b6002810460018216806200052357607f821691505b60208210811415620005395762000539620004f8565b50919050565b60805160a05160c05160e0516125fd620005db60003960008181610da9015261135c0152600081816104d0015261122001526000818161042d015281816105d201528181610bca01528181610c4401528181610ca401528181610d4801528181610e1101528181610f22015281816111840152818161124f01526112f801526000818161059a01528181610ed3015261143c01526125fd6000f3fe6080604052600436106101cd5760003560e01c80636e04ff0d116100f7578063ce2a057211610095578063f764f87911610064578063f764f87914610528578063fa6ded3914610548578063fa89401a14610568578063fd6b30fa1461058857600080fd5b8063ce2a057214610493578063ce845d1d146104a8578063ea0ec1c6146104be578063f301af42146104f257600080fd5b806399a8502d116100d157806399a8502d14610406578063b145603e1461041b578063bf66e2c81461045c578063c5cd50781461047e57600080fd5b80636e04ff0d146103b057806371aac7f9146103de5780637be4bae1146103f357600080fd5b806329dcb0cf1161016f5780634ef897191161013e5780634ef897191461033f57806360fa9a72146103545780636235887a1461037b57806363bd1d4a1461039b57600080fd5b806329dcb0cf146102d25780634278ac8b146102e85780634585e33b146102fd5780634d695bdb1461031f57600080fd5b806315a46ee6116101ab57806315a46ee61461024d5780631774d9601461026f5780631c4b774b1461028f5780632636b945146102bc57600080fd5b806309917c50146101d25780630c611f24146102155780630fb5a6b414610237575b600080fd5b3480156101de57600080fd5b506101ff6101ed3660046115f3565b600f6020526000908152604090205481565b60405161020c9190611624565b60405180910390f35b34801561022157600080fd5b5061022a6105bc565b60405161020c9190611806565b34801561024357600080fd5b506101ff60085481565b34801561025957600080fd5b506102626109a2565b60405161020c9190611817565b34801561027b57600080fd5b506101ff61028a366004611839565b610a30565b34801561029b57600080fd5b506102af6102aa366004611876565b610a61565b60405161020c9190611a7f565b3480156102c857600080fd5b506101ff60075481565b3480156102de57600080fd5b506101ff600a5481565b3480156102f457600080fd5b50610262610b41565b34801561030957600080fd5b5061031d610318366004611ae1565b610b4e565b005b34801561032b57600080fd5b5061031d61033a366004611c14565b610bbf565b34801561034b57600080fd5b50610262610c0b565b34801561036057600080fd5b50600c5461036e9060ff1681565b60405161020c9190611c4e565b34801561038757600080fd5b506101ff610396366004611876565b610c18565b3480156103a757600080fd5b5061031d610c39565b3480156103bc57600080fd5b506103d06103cb366004611c14565b610d82565b60405161020c929190611c5c565b3480156103ea57600080fd5b5061031d610e06565b61031d610401366004611c8f565b610e97565b34801561041257600080fd5b506102626110fa565b34801561042757600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b60405161020c9190611cc2565b34801561046857600080fd5b50610471611107565b60405161020c9190611d1a565b34801561048a57600080fd5b5061026261115f565b34801561049f57600080fd5b5061026261116c565b3480156104b457600080fd5b506101ff60095481565b3480156104ca57600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fe57600080fd5b5061044f61050d366004611876565b600d602052600090815260409020546001600160a01b031681565b34801561053457600080fd5b5061031d610543366004611f45565b611179565b34801561055457600080fd5b5061031d610563366004611876565b6112ed565b34801561057457600080fd5b5061031d6105833660046115f3565b611386565b34801561059457600080fd5b5061044f7f000000000000000000000000000000000000000000000000000000000000000081565b6105c46114aa565b6040518061018001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020016001805461060c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461063890611f95565b80156106855780601f1061065a57610100808354040283529160200191610685565b820191906000526020600020905b81548152906001019060200180831161066857829003601f168201915b505050505081526020016002805461069c90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546106c890611f95565b80156107155780601f106106ea57610100808354040283529160200191610715565b820191906000526020600020905b8154815290600101906020018083116106f857829003601f168201915b505050505081526020016003805461072c90611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461075890611f95565b80156107a55780601f1061077a576101008083540402835291602001916107a5565b820191906000526020600020905b81548152906001019060200180831161078857829003601f168201915b50505050508152602001600680546107bc90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546107e890611f95565b80156108355780601f1061080a57610100808354040283529160200191610835565b820191906000526020600020905b81548152906001019060200180831161081857829003601f168201915b5050509183525050600754602082015260085460408201526009546060820152600c5460809091019060ff1660028111156108725761087261169d565b81526020016004805461088490611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090611f95565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b505050505081526020016005805461091490611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461094090611f95565b801561098d5780601f106109625761010080835404028352916020019161098d565b820191906000526020600020905b81548152906001019060200180831161097057829003601f168201915b50505050508152602001600a54815250905090565b600580546109af90611f95565b80601f01602080910402602001604051908101604052809291908181526020018280546109db90611f95565b8015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b505050505081565b600e6020528160005260406000208181548110610a4c57600080fd5b90600052602060002001600091509150505481565b610ac0604051806101600160405280600081526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000151581526020016060815260200160608152602001606081525090565b6000828152600d6020526040808220548151636862013b60e11b815291516001600160a01b0390911692839263d0c4027692600480830193928290030181865afa158015610b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3a91908101906122fd565b9392505050565b600380546109af90611f95565b6000610b6860405180602001604052806000815250610d82565b50905080610b7557600080fd5b600c805460ff191660011790556040517f5cf8cd2bd40f758a95257bed666285eb82801f1bf9223b8ec1481e510ba2e82d90610bb2903090611cc2565b60405180910390a1505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bf457600080fd5b8051610c07906005906020840190611525565b5050565b600280546109af90611f95565b60108181548110610c2857600080fd5b600091825260209091200154905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c6e57600080fd5b6001600c5460ff166002811115610c8757610c8761169d565b14610c9157600080fd5b60006009549050600060098190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682604051610cd990612337565b60006040518083038185875af1925050503d8060008114610d16576040519150601f19603f3d011682016040523d82523d6000602084013e610d1b565b606091505b5050905080156101cd577fba5e837743d81ad0e6deb16089dbb65b549fdda8ad802fd8d4822884d70dc8b27f000000000000000000000000000000000000000000000000000000000000000030604051610d7692919061236f565b60405180910390a15050565b600060608180600c5460ff166002811115610d9f57610d9f61169d565b14905060006008547f000000000000000000000000000000000000000000000000000000000000000042610dd391906123a0565b119050808015610de05750815b60408051808201909152600381526203078360ec1b602082015290969095509350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e3b57600080fd5b6001600c5460ff166002811115610e5457610e5461169d565b1415610e5f57600080fd5b600c805460ff191660021790556040517fb83ebe09f40e9293bdea1d6567fae3175119d3d0ff13c4b4df15994837dd7f5190600090a1565b60026000541415610ec35760405162461bcd60e51b8152600401610eba906123b7565b60405180910390fd5b6002600055336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610efd57600080fd5b6000600c5460ff166002811115610f1657610f1661169d565b14610f2057600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415610f5f57600080fd5b34600954610f6d91906123f2565b600955801561107357346000908152600d60205260409020546001600160a01b0316156101cd57346000908152600d60205260408082205490516001600160a01b0390911690610fc1908590602401611cc2565b60408051601f198184030181529181526020820180516001600160e01b0316632814bc0960e21b17905251610ff6919061242c565b6000604051808303816000865af19150503d8060008114611033576040519150601f19603f3d011682016040523d82523d6000602084013e611038565b606091505b505090508061104657600080fd5b506001600160a01b0382166000908152600e60209081526040822080546001810182559083529120349101555b6001600160a01b0382166000908152600f60205260409020546110979034906123f2565b6001600160a01b0383166000818152600f60205260409081902092909255600954915190917fe76ad748537a48e778fef43dda4a6bd1b50cd62385f9f21a9ca2674923551208916110e9913491612438565b60405180910390a250506001600055565b600180546109af90611f95565b6060601080548060200260200160405190810160405280929190818152602001828054801561115557602002820191906000526020600020905b815481526020019060010190808311611141575b5050505050905090565b600680546109af90611f95565b600480546109af90611f95565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ae57600080fd5b80516000908152600d60205260409020546001600160a01b0316156111d257600080fd5b80516010805460018101825560009182527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019190915560405163d52116e960e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d52116e9906112799030907f0000000000000000000000000000000000000000000000000000000000000000908790600401612523565b6020604051808303816000875af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc9190612550565b91516000908152600d6020526040902080546001600160a01b0319166001600160a01b039093169290921790915550565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461132257600080fd5b624f1a008160085461133491906123f2565b1161134c578060085461134791906123f2565b611351565b624f1a005b6008819055611380907f00000000000000000000000000000000000000000000000000000000000000006123f2565b600a5550565b600260005414156113a95760405162461bcd60e51b8152600401610eba906123b7565b60026000819055604080518082019091526009548152600c549091602083019160ff16908111156113dc576113dc61169d565b90528051601190815560208201516012805460ff191660018360028111156114065761140661169d565b021790555050604051631cc535e760e21b815273__$9f85faa081bdc7133e3fbd199bfea18136$__9150637314d79c90611472907f000000000000000000000000000000000000000000000000000000000000000090601190600d90600f90600e908990600401612571565b60006040518083038186803b15801561148a57600080fd5b505af415801561149e573d6000803e3d6000fd5b50506001600055505050565b60405180610180016040528060006001600160a01b03168152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000600281111561150a5761150a61169d565b81526020016060815260200160608152602001600081525090565b82805461153190611f95565b90600052602060002090601f0160209004810192826115535760008555611599565b82601f1061156c57805160ff1916838001178555611599565b82800160010185558215611599579182015b8281111561159957825182559160200191906001019061157e565b506115a59291506115a9565b5090565b5b808211156115a557600081556001016115aa565b60006001600160a01b0382165b92915050565b6115da816115be565b81146115e557600080fd5b50565b80356115cb816115d1565b60006020828403121561160857611608600080fd5b600061161484846115e8565b949350505050565b805b82525050565b602081016115cb828461161c565b61161e816115be565b60005b8381101561165657818101518382015260200161163e565b83811115611665576000848401525b50505050565b6000611675825190565b80845260208401935061168c81856020860161163b565b601f01601f19169290920192915050565b634e487b7160e01b600052602160045260246000fd5b600381106115e5576115e561169d565b806116cd816116b3565b919050565b60006115cb826116c3565b61161e816116d2565b80516000906101808401906116fb8582611632565b5060208301518482036020860152611713828261166b565b9150506040830151848203604086015261172d828261166b565b91505060608301518482036060860152611747828261166b565b91505060808301518482036080860152611761828261166b565b91505060a083015161177660a086018261161c565b5060c083015161178960c086018261161c565b5060e083015161179c60e086018261161c565b506101008301516117b16101008601826116dd565b506101208301518482036101208601526117cb828261166b565b9150506101408301518482036101408601526117e7828261166b565b9150506101608301516117fe61016086018261161c565b509392505050565b60208082528101610b3a81846116e6565b60208082528101610b3a818461166b565b806115da565b80356115cb81611828565b6000806040838503121561184f5761184f600080fd5b600061185b85856115e8565b925050602061186c8582860161182e565b9150509250929050565b60006020828403121561188b5761188b600080fd5b6000611614848461182e565b6000610b3a838361166b565b60006118ad825190565b808452602084019350836020820285016118c78560200190565b8060005b858110156118fc57848403895281516118e48582611897565b94506020830160209a909a01999250506001016118cb565b5091979650505050505050565b80151561161e565b600061191d8383611632565b505060200190565b600061192f825190565b80845260209384019383018060005b838110156119635781516119528882611911565b97506020830192505060010161193e565b509495945050505050565b8051600090610160840190611983858261161c565b506020830151848203602086015261199b828261166b565b915050604083015184820360408601526119b5828261166b565b915050606083015184820360608601526119cf828261166b565b915050608083015184820360808601526119e982826118a3565b91505060a08301516119fe60a086018261161c565b5060c0830151611a1160c086018261161c565b5060e0830151611a2460e0860182611909565b50610100830151848203610100860152611a3e82826118a3565b915050610120830151848203610120860152611a5a8282611925565b915050610140830151848203610140860152611a76828261166b565b95945050505050565b60208082528101610b3a818461196e565b60008083601f840112611aa557611aa5600080fd5b5081356001600160401b03811115611abf57611abf600080fd5b602083019150836001820283011115611ada57611ada600080fd5b9250929050565b60008060208385031215611af757611af7600080fd5b82356001600160401b03811115611b1057611b10600080fd5b611b1c85828601611a90565b92509250509250929050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715611b6357611b63611b28565b6040525050565b6000611b7560405190565b90506116cd8282611b3e565b60006001600160401b03821115611b9a57611b9a611b28565b601f19601f83011660200192915050565b82818337506000910152565b6000611bca611bc584611b81565b611b6a565b905082815260208101848484011115611be557611be5600080fd5b6117fe848285611bab565b600082601f830112611c0457611c04600080fd5b8135611614848260208601611bb7565b600060208284031215611c2957611c29600080fd5b81356001600160401b03811115611c4257611c42600080fd5b61161484828501611bf0565b602081016115cb82846116dd565b60408101611c6a8285611909565b8181036020830152611614818461166b565b8015156115da565b80356115cb81611c7c565b60008060408385031215611ca557611ca5600080fd5b6000611cb185856115e8565b925050602061186c85828601611c84565b602081016115cb8284611632565b600061191d838361161c565b6000611ce6825190565b80845260209384019383018060005b83811015611963578151611d098882611cd0565b975060208301925050600101611cf5565b60208082528101610b3a8184611cdc565b60006001600160401b03821115611d4457611d44611b28565b5060209081020190565b6000611d5c611bc584611d2b565b83815290506020808201908402830185811115611d7b57611d7b600080fd5b835b81811015611dbb5780356001600160401b03811115611d9e57611d9e600080fd5b808601611dab8982611bf0565b8552505060209283019201611d7d565b5050509392505050565b600082601f830112611dd957611dd9600080fd5b8135611614848260208601611d4e565b60006101208284031215611dff57611dff600080fd5b611e0a610120611b6a565b90506000611e18848461182e565b82525060208201356001600160401b03811115611e3757611e37600080fd5b611e4384828501611bf0565b60208301525060408201356001600160401b03811115611e6557611e65600080fd5b611e7184828501611bf0565b60408301525060608201356001600160401b03811115611e9357611e93600080fd5b611e9f84828501611bf0565b60608301525060808201356001600160401b03811115611ec157611ec1600080fd5b611ecd84828501611dc5565b60808301525060a0611ee18482850161182e565b60a08301525060c0611ef58482850161182e565b60c08301525060e0611f0984828501611c84565b60e0830152506101008201356001600160401b03811115611f2c57611f2c600080fd5b611f3884828501611dc5565b6101008301525092915050565b600060208284031215611f5a57611f5a600080fd5b81356001600160401b03811115611f7357611f73600080fd5b61161484828501611de9565b634e487b7160e01b600052602260045260246000fd5b600281046001821680611fa957607f821691505b60208210811415611fbc57611fbc611f7f565b50919050565b80516115cb81611828565b6000611fdb611bc584611b81565b905082815260208101848484011115611ff657611ff6600080fd5b6117fe84828561163b565b600082601f83011261201557612015600080fd5b8151611614848260208601611fcd565b6000612033611bc584611d2b565b8381529050602080820190840283018581111561205257612052600080fd5b835b81811015611dbb5780516001600160401b0381111561207557612075600080fd5b8086016120828982612001565b8552505060209283019201612054565b600082601f8301126120a6576120a6600080fd5b8151611614848260208601612025565b80516115cb81611c7c565b80516115cb816115d1565b60006120da611bc584611d2b565b838152905060208082019084028301858111156120f9576120f9600080fd5b835b81811015611dbb578061210e88826120c1565b845250602092830192016120fb565b600082601f83011261213157612131600080fd5b81516116148482602086016120cc565b6000610160828403121561215757612157600080fd5b612162610160611b6a565b905060006121708484611fc2565b82525060208201516001600160401b0381111561218f5761218f600080fd5b61219b84828501612001565b60208301525060408201516001600160401b038111156121bd576121bd600080fd5b6121c984828501612001565b60408301525060608201516001600160401b038111156121eb576121eb600080fd5b6121f784828501612001565b60608301525060808201516001600160401b0381111561221957612219600080fd5b61222584828501612092565b60808301525060a061223984828501611fc2565b60a08301525060c061224d84828501611fc2565b60c08301525060e0612261848285016120b6565b60e0830152506101008201516001600160401b0381111561228457612284600080fd5b61229084828501612092565b610100830152506101208201516001600160401b038111156122b4576122b4600080fd5b6122c08482850161211d565b610120830152506101408201516001600160401b038111156122e4576122e4600080fd5b6122f084828501612001565b6101408301525092915050565b60006020828403121561231257612312600080fd5b81516001600160401b0381111561232b5761232b600080fd5b61161484828501612141565b6000816115cb565b60006001600160a01b0382166115cb565b60006115cb8261233f565b60006115cb82612350565b61161e8161235b565b6040810161237d8285612366565b610b3a6020830184611632565b634e487b7160e01b600052601160045260246000fd5b6000828210156123b2576123b261238a565b500390565b602080825281016115cb81601f81527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00602082015260400190565b600082198211156124055761240561238a565b500190565b6000612414825190565b61242281856020860161163b565b9290920192915050565b6000610b3a828461240a565b60408101612446828561161c565b610b3a602083018461161c565b8051600090610120840190612468858261161c565b5060208301518482036020860152612480828261166b565b9150506040830151848203604086015261249a828261166b565b915050606083015184820360608601526124b4828261166b565b915050608083015184820360808601526124ce82826118a3565b91505060a08301516124e360a086018261161c565b5060c08301516124f660c086018261161c565b5060e083015161250960e0860182611909565b50610100830151848203610100860152611a7682826118a3565b606081016125318286611632565b61253e6020830185612366565b8181036040830152611a768184612453565b60006020828403121561256557612565600080fd5b600061161484846120c1565b60c0810161257f8289611632565b61258b60208301889052565b61259760408301879052565b6125a360608301869052565b6125af60808301859052565b6125bc60a0830184611632565b97965050505050505056fea264697066735822122047fa4b4768452e3b56bd5c572c8b006064835dbb2e753022bc5f48f28740715764736f6c634300080b0033a264697066735822122092eed391931eb19c176cca8a822ed2688da0780ae312e08f29e3870dd12c01cf64736f6c634300080b0033", "libraries": { - "RefunderLib": "0xC9bDfa0822e14bcc54e68229C1EDb13539c43E46" + "RefunderLib": "0xaba71389D5f81a8C1380D88AF36F7823d5e0cb80" }, "devdoc": { "kind": "dev", diff --git a/deployments/sepolia/CrowdFunder.json b/deployments/sepolia/CrowdFunder.json index bfd5f0f..d3ea363 100644 --- a/deployments/sepolia/CrowdFunder.json +++ b/deployments/sepolia/CrowdFunder.json @@ -1,5 +1,5 @@ { - "address": "0x990AfB3FC9238DD61Ee4fc6E1BAB33B0F57a6831", + "address": "0xb9e150eBeB6095781F13c89f27749D894Ef03071", "abi": [ { "inputs": [ @@ -387,33 +387,33 @@ "type": "function" } ], - "transactionHash": "0x8060f7f4a205670a8aa1bf3119092fdec2b2345213d7d1d549bd6a35fa1d8273", + "transactionHash": "0x1fbfa2c327efd4bf8a06483fca6d65fd0f3d105e3571abcc21e63247297bcf52", "receipt": { "to": null, - "from": "0x3f3c2A0AB4E3c081979FaCB10Bf3c9E1A4DB44A3", - "contractAddress": "0x990AfB3FC9238DD61Ee4fc6E1BAB33B0F57a6831", - "transactionIndex": 46, - "gasUsed": "1185612", + "from": "0x571Dac692B7b76301c7c2BFD2dB0BD8fDf6eD54C", + "contractAddress": "0xb9e150eBeB6095781F13c89f27749D894Ef03071", + "transactionIndex": 65, + "gasUsed": "1142384", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xe6e642977b85310879f529f4b99b1488227ff9c0e0badb20c0bf8ce24fcc58ee", - "transactionHash": "0x8060f7f4a205670a8aa1bf3119092fdec2b2345213d7d1d549bd6a35fa1d8273", + "blockHash": "0x0750ac32a76b203e38e78576ce65b3c8d83fe0d83a3bc5d8673b1c3a2b36af79", + "transactionHash": "0x1fbfa2c327efd4bf8a06483fca6d65fd0f3d105e3571abcc21e63247297bcf52", "logs": [], - "blockNumber": 3634566, - "cumulativeGasUsed": "5814073", + "blockNumber": 4190611, + "cumulativeGasUsed": "8391100", "status": 1, "byzantium": true }, "args": [ - "0x5EDD1F7Bd905D5b2cca5571cc85d00B3679b73B2", + "0x49106a712b3b06Ee1a330F571cF200EFEaFA4869", "0xbE5EC9210ef38A922b929377112436Ec0871f7db" ], - "numDeployments": 15, - "solcInputHash": "d728c752d0773b76f850663011342c47", - "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_cmpFactory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rwdFactory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_title\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_category\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_tags\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_imageURI\",\"type\":\"string\"}],\"name\":\"CampaignAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_funder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_val\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_c_creator\",\"type\":\"address\"}],\"name\":\"CampaignFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"}],\"name\":\"CampaignPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"}],\"name\":\"CampaignRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_withdrawer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_val\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_c_creator\",\"type\":\"address\"}],\"name\":\"CampaignShrunk\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_username\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_email\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_shipAddress\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_pfp\",\"type\":\"string\"}],\"name\":\"UserAdded\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"_title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_category\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_tags\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_goalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_imageURI\",\"type\":\"string\"}],\"internalType\":\"struct CampaignFactory.cmpInput\",\"name\":\"_cmp\",\"type\":\"tuple\"}],\"name\":\"addCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_username\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_email\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_shipAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_pfp\",\"type\":\"string\"}],\"name\":\"addUser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"campaignCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_rewardable\",\"type\":\"bool\"}],\"name\":\"donateToCampaign\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_cmpFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_rewardFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_upkeepCreator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_linkToken\",\"type\":\"address\"}],\"name\":\"publishCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"}],\"name\":\"refundFromCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"}],\"name\":\"removeCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/CrowdFunder.sol\":\"CrowdFunder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/**\\n * @notice OnchainConfig of the registry\\n * @dev only used in params and return values\\n * @member paymentPremiumPPB payment premium rate oracles receive on top of\\n * being reimbursed for gas, measured in parts per billion\\n * @member flatFeeMicroLink flat fee paid to oracles for performing upkeeps,\\n * priced in MicroLink; can be used in conjunction with or independently of\\n * paymentPremiumPPB\\n * @member checkGasLimit gas limit when checking for upkeep\\n * @member stalenessSeconds number of seconds that is allowed for feed data to\\n * be stale before switching to the fallback pricing\\n * @member gasCeilingMultiplier multiplier to apply to the fast gas feed price\\n * when calculating the payment ceiling for keepers\\n * @member minUpkeepSpend minimum LINK that an upkeep must spend before cancelling\\n * @member maxPerformGas max executeGas allowed for an upkeep on this registry\\n * @member fallbackGasPrice gas price used if the gas price feed is stale\\n * @member fallbackLinkPrice LINK price used if the LINK price feed is stale\\n * @member transcoder address of the transcoder contract\\n * @member registrar address of the registrar contract\\n */\\nstruct OnchainConfig {\\n uint32 paymentPremiumPPB;\\n uint32 flatFeeMicroLink; // min 0.000001 LINK, max 4294 LINK\\n uint32 checkGasLimit;\\n uint24 stalenessSeconds;\\n uint16 gasCeilingMultiplier;\\n uint96 minUpkeepSpend;\\n uint32 maxPerformGas;\\n uint32 maxCheckDataSize;\\n uint32 maxPerformDataSize;\\n uint256 fallbackGasPrice;\\n uint256 fallbackLinkPrice;\\n address transcoder;\\n address registrar;\\n}\\n\\n/**\\n * @notice state of the registry\\n * @dev only used in params and return values\\n * @member nonce used for ID generation\\n * @member ownerLinkBalance withdrawable balance of LINK by contract owner\\n * @member expectedLinkBalance the expected balance of LINK of the registry\\n * @member totalPremium the total premium collected on registry so far\\n * @member numUpkeeps total number of upkeeps on the registry\\n * @member configCount ordinal number of current config, out of all configs applied to this contract so far\\n * @member latestConfigBlockNumber last block at which this config was set\\n * @member latestConfigDigest domain-separation tag for current config\\n * @member latestEpoch for which a report was transmitted\\n * @member paused freeze on execution scoped to the entire registry\\n */\\nstruct State {\\n uint32 nonce;\\n uint96 ownerLinkBalance;\\n uint256 expectedLinkBalance;\\n uint96 totalPremium;\\n uint256 numUpkeeps;\\n uint32 configCount;\\n uint32 latestConfigBlockNumber;\\n bytes32 latestConfigDigest;\\n uint32 latestEpoch;\\n bool paused;\\n}\\n\\n/**\\n * @notice all information about an upkeep\\n * @dev only used in return values\\n * @member target the contract which needs to be serviced\\n * @member executeGas the gas limit of upkeep execution\\n * @member checkData the checkData bytes for this upkeep\\n * @member balance the balance of this upkeep\\n * @member admin for this upkeep\\n * @member maxValidBlocknumber until which block this upkeep is valid\\n * @member lastPerformBlockNumber the last block number when this upkeep was performed\\n * @member amountSpent the amount this upkeep has spent\\n * @member paused if this upkeep has been paused\\n * @member skipSigVerification skip signature verification in transmit for a low security low cost model\\n */\\nstruct UpkeepInfo {\\n address target;\\n uint32 executeGas;\\n bytes checkData;\\n uint96 balance;\\n address admin;\\n uint64 maxValidBlocknumber;\\n uint32 lastPerformBlockNumber;\\n uint96 amountSpent;\\n bool paused;\\n bytes offchainConfig;\\n}\\n\\nenum UpkeepFailureReason {\\n NONE,\\n UPKEEP_CANCELLED,\\n UPKEEP_PAUSED,\\n TARGET_CHECK_REVERTED,\\n UPKEEP_NOT_NEEDED,\\n PERFORM_DATA_EXCEEDS_LIMIT,\\n INSUFFICIENT_BALANCE\\n}\\n\\ninterface AutomationRegistryBaseInterface {\\n function registerUpkeep(\\n address target,\\n uint32 gasLimit,\\n address admin,\\n bytes calldata checkData,\\n bytes calldata offchainConfig\\n ) external returns (uint256 id);\\n\\n function cancelUpkeep(uint256 id) external;\\n\\n function pauseUpkeep(uint256 id) external;\\n\\n function unpauseUpkeep(uint256 id) external;\\n\\n function transferUpkeepAdmin(uint256 id, address proposed) external;\\n\\n function acceptUpkeepAdmin(uint256 id) external;\\n\\n function updateCheckData(uint256 id, bytes calldata newCheckData) external;\\n\\n function addFunds(uint256 id, uint96 amount) external;\\n\\n function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external;\\n\\n function setUpkeepOffchainConfig(uint256 id, bytes calldata config) external;\\n\\n function getUpkeep(uint256 id) external view returns (UpkeepInfo memory upkeepInfo);\\n\\n function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[] memory);\\n\\n function getTransmitterInfo(address query)\\n external\\n view\\n returns (\\n bool active,\\n uint8 index,\\n uint96 balance,\\n uint96 lastCollected,\\n address payee\\n );\\n\\n function getState()\\n external\\n view\\n returns (\\n State memory state,\\n OnchainConfig memory config,\\n address[] memory signers,\\n address[] memory transmitters,\\n uint8 f\\n );\\n}\\n\\n/**\\n * @dev The view methods are not actually marked as view in the implementation\\n * but we want them to be easily queried off-chain. Solidity will not compile\\n * if we actually inherit from this interface, so we document it here.\\n */\\ninterface AutomationRegistryInterface is AutomationRegistryBaseInterface {\\n function checkUpkeep(uint256 upkeepId)\\n external\\n view\\n returns (\\n bool upkeepNeeded,\\n bytes memory performData,\\n UpkeepFailureReason upkeepFailureReason,\\n uint256 gasUsed,\\n uint256 fastGasWei,\\n uint256 linkNative\\n );\\n}\\n\\ninterface AutomationRegistryExecutableInterface is AutomationRegistryBaseInterface {\\n function checkUpkeep(uint256 upkeepId)\\n external\\n returns (\\n bool upkeepNeeded,\\n bytes memory performData,\\n UpkeepFailureReason upkeepFailureReason,\\n uint256 gasUsed,\\n uint256 fastGasWei,\\n uint256 linkNative\\n );\\n}\\n\",\"keccak256\":\"0x9faf0551509440bd9c25a4a2f14b23bce2f82e5ab5691058b9664edab808468c\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n/**\\n * @notice This is a deprecated interface. Please use AutomationCompatibleInterface directly.\\n */\\npragma solidity ^0.8.0;\\nimport {AutomationCompatibleInterface as KeeperCompatibleInterface} from \\\"./AutomationCompatibleInterface.sol\\\";\\n\",\"keccak256\":\"0xac76a31c20c6d66196247376d113a0f19229569ab8c123989649d50be3333e0a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface LinkTokenInterface {\\n function allowance(address owner, address spender) external view returns (uint256 remaining);\\n\\n function approve(address spender, uint256 value) external returns (bool success);\\n\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n function decimals() external view returns (uint8 decimalPlaces);\\n\\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\\n\\n function increaseApproval(address spender, uint256 subtractedValue) external;\\n\\n function name() external view returns (string memory tokenName);\\n\\n function symbol() external view returns (string memory tokenSymbol);\\n\\n function totalSupply() external view returns (uint256 totalTokensIssued);\\n\\n function transfer(address to, uint256 value) external returns (bool success);\\n\\n function transferAndCall(\\n address to,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bool success);\\n\\n function transferFrom(\\n address from,\\n address to,\\n uint256 value\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xc7d7cd730d36825485ef4107d93c3ff18b9f3a5a00ea3d5988ba9a0bd70b10c5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x0e9621f60b2faabe65549f7ed0f24e8853a45c1b7990d47e8160e523683f3935\",\"license\":\"MIT\"},\"contracts/Campaign.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\r\\nimport \\\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\\\";\\r\\nimport { Reward } from \\\"./Reward.sol\\\";\\r\\nimport { RewardFactory } from \\\"./factories/RewardFactory.sol\\\";\\r\\nimport { RefunderLib } from \\\"./libraries/campaign/RefunderLib.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Cmp_NIS(); /**not in state */\\r\\n// error Cmp_NotCrtr();\\r\\n// error Cmp_DIC(); /**donator is creator */\\r\\n// error Cmp_NoDns();\\r\\n// error Cmp_RefF();\\r\\n// error Cmp_UpkNN();\\r\\n// error Cmp_NotRef();\\r\\n// error Cmp_Bankrupt();\\r\\n\\r\\ncontract Campaign is KeeperCompatibleInterface, ReentrancyGuard{\\r\\n\\r\\n // enums\\r\\n enum C_State {\\r\\n Fundraising,\\r\\n Expired,\\r\\n Canceled\\r\\n }\\r\\n\\r\\n // c_state variables\\r\\n address immutable public i_crf;\\r\\n address payable immutable public i_creator;\\r\\n address immutable public i_rwdFactory;\\r\\n string public s_title;\\r\\n string public s_description;\\r\\n string public s_category;\\r\\n string public s_imageURI;\\r\\n string public s_campaignURI;\\r\\n string public s_tags;\\r\\n uint256 public goalAmount;\\r\\n uint256 public duration;\\r\\n uint256 public currentBalance;\\r\\n uint256 private immutable i_initTimeStamp;\\r\\n uint256 private constant i_maxDur = 5184000;\\r\\n uint256 public deadline;\\r\\n uint256 private rId;\\r\\n C_State public c_state = C_State.Fundraising; // default c_state\\r\\n\\r\\n struct CampaignObject {\\r\\n address i_creator;\\r\\n string s_title;\\r\\n string s_description;\\r\\n string s_category;\\r\\n string s_tags;\\r\\n uint256 goalAmount;\\r\\n uint256 duration;\\r\\n uint256 currentBalance;\\r\\n C_State currentC_State;\\r\\n string s_imageURI;\\r\\n string s_campaignURI;\\r\\n uint256 deadline;\\r\\n }\\r\\n\\r\\n struct refunder_pckg {\\r\\n uint256 currentBalance;\\r\\n C_State c_state;\\r\\n }\\r\\n\\r\\n // mapping (uint256 => reward) public rewards;\\r\\n mapping (uint256 => address) public rewards;\\r\\n mapping (address => uint256[]) public entDonations;\\r\\n mapping (address => uint256) public aggrDonations;\\r\\n\\r\\n uint256[] public rKeys;\\r\\n\\r\\n // events\\r\\n event FundingRecieved (\\r\\n address indexed contributor,\\r\\n uint256 amount,\\r\\n uint256 currentBalance\\r\\n );\\r\\n event CreatorPaid(address creator, address campaignAddress);\\r\\n event CampaignExpired(address campaignAddress);\\r\\n event CampaignCanceled();\\r\\n\\r\\n // modifiers\\r\\n modifier isCreator() {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n _;\\r\\n }\\r\\n\\r\\n refunder_pckg _refP;\\r\\n\\r\\n constructor (\\r\\n address _crowdfunder,\\r\\n address _creator,\\r\\n address _rwdFactory,\\r\\n string memory _title,\\r\\n string memory _description,\\r\\n string memory _category,\\r\\n string memory _tags,\\r\\n uint256 _goalAmount,\\r\\n uint256 _duration,\\r\\n string memory _imageURI\\r\\n ) {\\r\\n i_rwdFactory = _rwdFactory;\\r\\n i_crf = _crowdfunder;\\r\\n i_creator = payable(_creator);\\r\\n s_title = _title;\\r\\n s_description = _description;\\r\\n s_category = _category;\\r\\n s_tags = _tags;\\r\\n goalAmount = _goalAmount;\\r\\n i_initTimeStamp = block.timestamp;\\r\\n duration = _duration > i_maxDur ? i_maxDur : _duration;\\r\\n deadline = i_initTimeStamp + duration;\\r\\n s_imageURI = _imageURI;\\r\\n currentBalance = 0;\\r\\n }\\r\\n\\r\\n\\r\\n function donate(address _donator, bool _rewardable) public payable nonReentrant{\\r\\n if(msg.sender != i_crf){revert();}\\r\\n if(c_state != C_State.Fundraising){revert();}\\r\\n if(_donator == i_creator){revert();}\\r\\n currentBalance = currentBalance + msg.value;\\r\\n if(_rewardable){\\r\\n if(rewards[msg.value] != address(0)){\\r\\n (bool success, ) = rewards[msg.value].call(abi.encodeWithSignature(\\\"addDonator(address)\\\", _donator));\\r\\n if(!success){revert();}\\r\\n entDonations[_donator].push(msg.value);\\r\\n }else{revert();}\\r\\n }\\r\\n aggrDonations[_donator] = aggrDonations[_donator] + msg.value; \\r\\n emit FundingRecieved(_donator, msg.value, currentBalance);\\r\\n }\\r\\n\\r\\n /**\\r\\n @dev this is the function chainlink keepers calls\\r\\n chekupkeep returns true to trigger the action after the interval has passed\\r\\n */\\r\\n function checkUpkeep(bytes memory /**checkData */) public view override\\r\\n returns (bool upkeepNeeded, bytes memory /**performData */) \\r\\n {\\r\\n bool isOpen = c_state == C_State.Fundraising;\\r\\n bool timePassed = ((block.timestamp - i_initTimeStamp) > duration);\\r\\n upkeepNeeded = (timePassed && isOpen);\\r\\n return (upkeepNeeded, \\\"0x0\\\");\\r\\n }\\r\\n\\r\\n function performUpkeep(bytes calldata /**performData */) external override {\\r\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\r\\n if(!upkeepNeeded){revert();}\\r\\n c_state = C_State.Expired;\\r\\n emit CampaignExpired(address(this));\\r\\n }\\r\\n\\r\\n function payout() external isCreator{\\r\\n if(c_state != C_State.Expired){revert();}\\r\\n uint256 totalRaised = currentBalance;\\r\\n currentBalance = 0;\\r\\n (bool success, ) = i_creator.call{value: totalRaised}(\\\"\\\");\\r\\n if(success){\\r\\n emit CreatorPaid(i_creator, address(this));\\r\\n }\\r\\n else{revert();}\\r\\n }\\r\\n\\r\\n\\r\\n function refund(address _donator) external nonReentrant{\\r\\n _refP = refunder_pckg(currentBalance, c_state);\\r\\n RefunderLib.refund(i_crf, _refP, rewards, aggrDonations, entDonations, _donator);\\r\\n }\\r\\n\\r\\n function makeReward(RewardFactory.rwdInput memory _rwd) external isCreator {\\r\\n if(rewards[_rwd._price] != address(0)){revert();}\\r\\n rKeys.push(_rwd._price);\\r\\n address newReward = RewardFactory(i_rwdFactory).createReward(address(this), i_creator, _rwd);\\r\\n rewards[_rwd._price] = newReward;\\r\\n }\\r\\n\\r\\n function endCampaign() external isCreator {\\r\\n if(c_state == C_State.Expired){revert();}\\r\\n c_state = C_State.Canceled;\\r\\n emit CampaignCanceled();\\r\\n }\\r\\n\\r\\n // update functions\\r\\n function updateCampaignURI(string memory _campaignURI) external isCreator {\\r\\n s_campaignURI = _campaignURI;\\r\\n }\\r\\n\\r\\n function updateDur(uint256 _addedDur) external isCreator {\\r\\n duration = (((duration + _addedDur)) > i_maxDur) ? i_maxDur : (duration + _addedDur);\\r\\n deadline = i_initTimeStamp + duration;\\r\\n }\\r\\n\\r\\n // getter functions\\r\\n function getRewardKeys() external view returns(uint256[] memory){\\r\\n return rKeys;\\r\\n }\\r\\n \\r\\n function getReward(uint256 _priceID) external view returns(Reward.RewardObject memory) {\\r\\n Reward reward = Reward(rewards[_priceID]);\\r\\n return reward.getRewardDetails();\\r\\n }\\r\\n\\r\\n function getCampaignDetails() external view returns(CampaignObject memory) {\\r\\n return CampaignObject(\\r\\n i_creator,\\r\\n s_title, \\r\\n s_description,\\r\\n s_category,\\r\\n s_tags,\\r\\n goalAmount,\\r\\n duration,\\r\\n currentBalance,\\r\\n c_state,\\r\\n s_imageURI,\\r\\n s_campaignURI,\\r\\n deadline\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0xba4854907f5316e4e515f78099f50c65545c9a72971d15b7a6cdc607a93f548f\",\"license\":\"MIT\"},\"contracts/CrowdFunder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { UpkeepIDConsumer } from \\\"./UpkeepIDConsumer.sol\\\";\\r\\nimport { LinkTokenInterface } from \\\"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\\\";\\r\\nimport { CampaignFactory } from \\\"./factories/CampaignFactory.sol\\\";\\r\\nimport { Campaign } from \\\"./Campaign.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Crf_NotCrtr();\\r\\n// error Crf_CSA(); /** cmp still active */\\r\\n// error Crf_DonF();\\r\\n// error Crf_RefF();\\r\\n// error Crf_PubF();\\r\\n\\r\\ncontract CrowdFunder {\\r\\n // using SafeMath for uint256;\\r\\n\\r\\n event UserAdded(\\r\\n address indexed _address,\\r\\n string _username,\\r\\n string _email,\\r\\n string _shipAddress,\\r\\n string _pfp\\r\\n );\\r\\n\\r\\n event CampaignAdded(\\r\\n address indexed _campaignAddress,\\r\\n address indexed _creator,\\r\\n string _title,\\r\\n string _description,\\r\\n string _category,\\r\\n string _tags,\\r\\n string _imageURI\\r\\n );\\r\\n\\r\\n event CampaignFunded(\\r\\n address indexed _funder,\\r\\n address indexed _campaignAddress,\\r\\n uint256 _val,\\r\\n address indexed _c_creator\\r\\n );\\r\\n\\r\\n event CampaignShrunk(\\r\\n address indexed _withdrawer,\\r\\n address indexed _campaignAddress,\\r\\n uint256 _val,\\r\\n address indexed _c_creator\\r\\n );\\r\\n\\r\\n event CampaignRemoved(\\r\\n address indexed _campaignAddress\\r\\n );\\r\\n\\r\\n event CampaignPublished(\\r\\n address _campaignAddress,\\r\\n address _creator\\r\\n );\\r\\n\\r\\n address immutable public i_cmpFactory;\\r\\n address immutable public i_rewardFactory;\\r\\n uint256 public campaignCounter;\\r\\n mapping (address => address) private campaigns;\\r\\n\\r\\n constructor (address _cmpFactory, address _rwdFactory){\\r\\n i_rewardFactory = _rwdFactory;\\r\\n i_cmpFactory = _cmpFactory; \\r\\n }\\r\\n\\r\\n function addUser(\\r\\n address _address, string memory _username, \\r\\n string memory _email, \\r\\n string memory _shipAddress,\\r\\n string memory _pfp\\r\\n ) external {\\r\\n emit UserAdded(_address, _username, _email, _shipAddress, _pfp);\\r\\n }\\r\\n\\r\\n function addCampaign (CampaignFactory.cmpInput memory _cmp) external {\\r\\n address newCampaign = CampaignFactory(i_cmpFactory).createCampaign(address(this), msg.sender, i_rewardFactory, _cmp);\\r\\n campaigns[newCampaign] = newCampaign;\\r\\n emit CampaignAdded(\\r\\n newCampaign, \\r\\n msg.sender, \\r\\n _cmp._title, \\r\\n _cmp._description, \\r\\n _cmp._category, \\r\\n _cmp._tags, \\r\\n _cmp._imageURI\\r\\n );\\r\\n }\\r\\n\\r\\n function donateToCampaign(address _campaignAddress, bool _rewardable) external payable {\\r\\n address c_creator = Campaign(campaigns[_campaignAddress]).i_creator();\\r\\n (bool success, ) = _campaignAddress.call{value:msg.value}(abi.encodeWithSignature(\\\"donate(address,bool)\\\",msg.sender,_rewardable));\\r\\n if(success){\\r\\n emit CampaignFunded(msg.sender, _campaignAddress, msg.value, c_creator);\\r\\n }else{\\r\\n revert();\\r\\n }\\r\\n }\\r\\n\\r\\n function refundFromCampaign(address _campaignAddress) external {\\r\\n address c_creator = Campaign(campaigns[_campaignAddress]).i_creator();\\r\\n uint256 refVal = Campaign(campaigns[_campaignAddress]).aggrDonations(msg.sender);\\r\\n if(!(refVal > 0)){revert(\\\"Yo\\\");}\\r\\n (bool success,) = _campaignAddress.call(abi.encodeWithSignature(\\\"refund(address)\\\", msg.sender));\\r\\n if(success){\\r\\n emit CampaignShrunk(msg.sender, _campaignAddress, refVal, c_creator);\\r\\n }else{\\r\\n revert(\\\"Yh\\\");\\r\\n }\\r\\n }\\r\\n\\r\\n function removeCampaign (address _campaignAddress) external {\\r\\n if(Campaign(campaigns[_campaignAddress]).i_creator() != msg.sender){revert();}\\r\\n if(Campaign(campaigns[_campaignAddress]).currentBalance() > 0){revert();}\\r\\n // either payout or leave for refunds\\r\\n delete(campaigns[_campaignAddress]);\\r\\n emit CampaignRemoved(_campaignAddress);\\r\\n }\\r\\n\\r\\n function publishCampaign(address _campaignAddress, address _upkeepCreator, address _linkToken) external {\\r\\n UpkeepIDConsumer newUpkeepCreator = UpkeepIDConsumer(_upkeepCreator);\\r\\n LinkTokenInterface token = LinkTokenInterface(_linkToken);\\r\\n if(token.balanceOf(_upkeepCreator) == 0){revert(\\\"no funds\\\");}\\r\\n newUpkeepCreator.registerAndPredictID(Campaign(_campaignAddress).s_title(), \\\"0x\\\", _campaignAddress, 500000, Campaign(_campaignAddress).i_creator(), \\\"0x\\\", \\\"0x\\\", 2000000000000000000);\\r\\n campaignCounter = campaignCounter + 1;\\r\\n emit CampaignPublished(_campaignAddress, msg.sender);\\r\\n // (bool success, ) = _campaignAddress.delegatecall(abi.encodeWithSignature(\\\"timeBox(address,address,address)\\\", _upkeepCreator, _linkToken, _campaignAddress));\\r\\n // if(success){\\r\\n // }else{revert();}\\r\\n }\\r\\n}\",\"keccak256\":\"0x14d88ccbb4a9b464961c4703af870ade62ca74ddc6479642b864f940113ebefe\",\"license\":\"MIT\"},\"contracts/Reward.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\ncontract Reward {\\r\\n address public immutable i_campaignAddress;\\r\\n // address public immutable i_crf;\\r\\n address public immutable i_creator;\\r\\n\\r\\n uint256 public immutable i_price;\\r\\n string public title;\\r\\n string public description;\\r\\n string public rpic;\\r\\n string[] public perks;\\r\\n uint256 public delDate;\\r\\n uint256 public quantity;\\r\\n bool public infinite = true;\\r\\n string[] public shipsTo;\\r\\n address[] public donators;\\r\\n string public surveyLink;\\r\\n\\r\\n struct RewardObject {\\r\\n uint256 price;\\r\\n string title;\\r\\n string description;\\r\\n string rpic;\\r\\n string[] perks;\\r\\n uint256 delDate;\\r\\n uint256 quantity;\\r\\n bool infinite;\\r\\n string[] shipsTo;\\r\\n address[] donators;\\r\\n string surveyLink;\\r\\n }\\r\\n\\r\\n mapping (address => uint256) public true_donator; \\r\\n mapping (address => string) public surveyResponses;\\r\\n\\r\\n constructor ( \\r\\n address _campaignAddress, \\r\\n address _creator,\\r\\n uint256 _price, \\r\\n string memory _title, \\r\\n string memory _description, \\r\\n string memory _rpic,\\r\\n string[] memory _perks, \\r\\n uint256 _deadline, \\r\\n uint256 _quantity, \\r\\n bool _infinite, \\r\\n string[] memory _shipsTo\\r\\n ) {\\r\\n i_price = _price;\\r\\n i_campaignAddress = _campaignAddress;\\r\\n i_creator = _creator;\\r\\n\\r\\n title = _title;\\r\\n description = _description;\\r\\n rpic = _rpic;\\r\\n perks = _perks;\\r\\n delDate = _deadline;\\r\\n quantity = _quantity;\\r\\n infinite = _infinite;\\r\\n shipsTo = _shipsTo;\\r\\n }\\r\\n\\r\\n function updateSurveyLink(string memory _surveylink) external {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n surveyLink = _surveylink;\\r\\n }\\r\\n\\r\\n function addDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if((true_donator[_donator] > 0)){revert();} // already has id ...has therefor donated for this reward before\\r\\n\\r\\n if(!infinite){\\r\\n if(quantity > 0){\\r\\n quantity = quantity - 1;\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }else{revert();} // rwd has finished no longer available\\r\\n }else{\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }\\r\\n }\\r\\n\\r\\n function getDonators() external view returns(address[] memory){\\r\\n return donators;\\r\\n }\\r\\n\\r\\n function removeDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if(!(true_donator[_donator] > 0)){revert();} // not a donator\\r\\n uint256 index = true_donator[_donator] - 1;\\r\\n delete donators[index];\\r\\n delete true_donator[_donator];\\r\\n }\\r\\n\\r\\n function respondToSurvey(string memory _response) external {\\r\\n if(!(true_donator[msg.sender] > 0)){revert();} // not a donator\\r\\n surveyResponses[msg.sender] = _response;\\r\\n }\\r\\n\\r\\n function getRewardDetails() external view returns(RewardObject memory){\\r\\n return RewardObject(\\r\\n i_price,\\r\\n title,\\r\\n description,\\r\\n rpic,\\r\\n perks,\\r\\n delDate,\\r\\n quantity,\\r\\n infinite,\\r\\n shipsTo,\\r\\n donators,\\r\\n surveyLink\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0x16520b0d7ec2ca2e9c34cc0738e1db48661eef392ca464f8b0ee003169d06603\",\"license\":\"MIT\"},\"contracts/UpkeepIDConsumer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.6;\\r\\n\\r\\n// UpkeepIDConsumerExample.sol imports functions from both ./AutomationRegistryInterface2_0.sol and\\r\\n// ./interfaces/LinkTokenInterface.sol\\r\\n\\r\\nimport {AutomationRegistryInterface, State, OnchainConfig} from \\\"@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol\\\";\\r\\nimport {LinkTokenInterface} from \\\"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\\\";\\r\\n\\r\\n/**\\r\\n * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY.\\r\\n * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.\\r\\n * DO NOT USE THIS CODE IN PRODUCTION.\\r\\n */\\r\\n\\r\\ninterface KeeperRegistrarInterface {\\r\\n function register(\\r\\n string memory name,\\r\\n bytes calldata encryptedEmail,\\r\\n address upkeepContract,\\r\\n uint32 gasLimit,\\r\\n address adminAddress,\\r\\n bytes calldata checkData,\\r\\n bytes calldata offchainConfig,\\r\\n uint96 amount,\\r\\n address sender\\r\\n ) external;\\r\\n}\\r\\n\\r\\ncontract UpkeepIDConsumer {\\r\\n LinkTokenInterface public immutable i_link;\\r\\n address public immutable registrar;\\r\\n AutomationRegistryInterface public immutable i_registry;\\r\\n bytes4 registerSig = KeeperRegistrarInterface.register.selector;\\r\\n\\r\\n constructor(\\r\\n LinkTokenInterface _link,\\r\\n address _registrar,\\r\\n AutomationRegistryInterface _registry\\r\\n ) {\\r\\n i_link = _link;\\r\\n registrar = _registrar;\\r\\n i_registry = _registry;\\r\\n }\\r\\n\\r\\n function registerAndPredictID(\\r\\n string memory name,\\r\\n bytes calldata encryptedEmail,\\r\\n address upkeepContract,\\r\\n uint32 gasLimit,\\r\\n address adminAddress,\\r\\n bytes calldata checkData,\\r\\n bytes calldata offchainConfig,\\r\\n uint96 amount\\r\\n ) public returns(uint256) {\\r\\n (State memory state, , , , ) = i_registry.getState();\\r\\n uint256 oldNonce = state.nonce;\\r\\n bytes memory payload = abi.encode(\\r\\n name,\\r\\n encryptedEmail,\\r\\n upkeepContract,\\r\\n gasLimit,\\r\\n adminAddress,\\r\\n checkData,\\r\\n offchainConfig,\\r\\n amount,\\r\\n address(this)\\r\\n );\\r\\n\\r\\n i_link.transferAndCall(\\r\\n registrar,\\r\\n amount,\\r\\n bytes.concat(registerSig, payload)\\r\\n );\\r\\n (state, , , , ) = i_registry.getState();\\r\\n uint256 newNonce = state.nonce;\\r\\n if (newNonce == oldNonce + 1) {\\r\\n uint256 upkeepID = uint256(\\r\\n keccak256(\\r\\n abi.encodePacked(\\r\\n blockhash(block.number - 1),\\r\\n address(i_registry),\\r\\n uint32(oldNonce)\\r\\n )\\r\\n )\\r\\n );\\r\\n // DEV - Use the upkeepID however you see fit\\r\\n return upkeepID;\\r\\n } else {\\r\\n revert(\\\"auto-approve disabled\\\");\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x1712d2ac002e57e74e5367f9a88c9466f935fada95bd9ad98111e434110f0b3f\",\"license\":\"MIT\"},\"contracts/factories/CampaignFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../Campaign.sol\\\";\\r\\n\\r\\ncontract CampaignFactory {\\r\\n struct cmpInput {\\r\\n string _title; \\r\\n string _description;\\r\\n string _category;\\r\\n string _tags; \\r\\n uint256 _goalAmount;\\r\\n uint256 _duration;\\r\\n string _imageURI;\\r\\n }\\r\\n\\r\\n function createCampaign(address _crf, address _creator, address _rwdFactory, cmpInput memory _cmp) external returns (address) {\\r\\n Campaign cmp = new Campaign(\\r\\n _crf,\\r\\n payable(_creator),\\r\\n _rwdFactory,\\r\\n _cmp._title,\\r\\n _cmp._description,\\r\\n _cmp._category,\\r\\n _cmp._tags,\\r\\n _cmp._goalAmount,\\r\\n _cmp._duration,\\r\\n _cmp._imageURI\\r\\n );\\r\\n\\r\\n return address(cmp);\\r\\n }\\r\\n}\",\"keccak256\":\"0xae3a189ad6f1504c63d874152a930c38bf2289506a36db75d26107500f0b79a6\",\"license\":\"MIT\"},\"contracts/factories/RewardFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Reward } from \\\"../Reward.sol\\\";\\r\\n\\r\\ncontract RewardFactory {\\r\\n struct rwdInput {\\r\\n uint256 _price;\\r\\n string _title; \\r\\n string _description; \\r\\n string _rpic;\\r\\n string[] _perks; \\r\\n uint256 _deadline; \\r\\n uint256 _quantity; \\r\\n bool _infinite; \\r\\n string[] _shipsTo;\\r\\n }\\r\\n\\r\\n function createReward(address _cmpAddress, address _creator, rwdInput memory _rwd) public returns (address) {\\r\\n Reward rwd = new Reward(\\r\\n _cmpAddress, \\r\\n _creator,\\r\\n _rwd._price,\\r\\n _rwd._title,\\r\\n _rwd._description,\\r\\n _rwd._rpic,\\r\\n _rwd._perks,\\r\\n _rwd._deadline,\\r\\n _rwd._quantity,\\r\\n _rwd._infinite,\\r\\n _rwd._shipsTo \\r\\n );\\r\\n\\r\\n return address(rwd);\\r\\n }\\r\\n}\",\"keccak256\":\"0x025667572f11f51d96b92b058b304512b26a9394374f509ec337a822c2133729\",\"license\":\"MIT\"},\"contracts/libraries/campaign/RefunderLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../../Campaign.sol\\\";\\r\\nimport { Reward } from \\\"../../Reward.sol\\\";\\r\\n\\r\\nlibrary RefunderLib {\\r\\n function refund (\\r\\n address _i_crf,\\r\\n Campaign.refunder_pckg storage _refP, \\r\\n mapping (uint256 => address) storage _rewards, \\r\\n mapping (address => uint256) storage _aggrDons, \\r\\n mapping (address => uint256[]) storage _entDons, \\r\\n address _donator\\r\\n ) external {\\r\\n if(msg.sender != _i_crf){revert();}\\r\\n if(_refP.c_state == Campaign.C_State.Expired){revert();}\\r\\n if(_aggrDons[_donator] == 0 ){revert();}\\r\\n\\r\\n uint256 amountToRefund = _aggrDons[_donator];\\r\\n\\r\\n if(_refP.currentBalance < amountToRefund){revert();}\\r\\n _refP.currentBalance = _refP.currentBalance - amountToRefund;\\r\\n\\r\\n (bool success, ) = payable(_donator).call{value: amountToRefund}(\\\"\\\");\\r\\n if(!success){revert();}\\r\\n\\r\\n delete _aggrDons[_donator];\\r\\n\\r\\n if(_entDons[_donator].length > 0){ \\r\\n for(uint i=0; i<_entDons[_donator].length; i++){\\r\\n if(!(_rewards[_entDons[_donator][i]] != address(0))){\\r\\n Reward(_rewards[_entDons[_donator][i]]).removeDonator(_donator);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n delete _entDons[_donator];\\r\\n }\\r\\n}\",\"keccak256\":\"0xacea134a5959c86c7ca67a50b965a2ad2666dccf020c1e3d97b908a79937da03\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60c06040523480156200001157600080fd5b506040516200156938038062001569833981016040819052620000349162000086565b6001600160a01b0390811660a05216608052620000c9565b60006001600160a01b0382165b92915050565b6200006a816200004c565b81146200007657600080fd5b50565b805162000059816200005f565b600080604083850312156200009e576200009e600080fd5b6000620000ac858562000079565b9250506020620000bf8582860162000079565b9150509250929050565b60805160a05161146e620000fb60003960008181609d01526105d201526000818160e701526105a1015261146e6000f3fe6080604052600436106100865760003560e01c8063ccf5f27f11610059578063ccf5f27f1461013e578063cd274a401461015e578063e4663a5b1461017e578063fab62a1d1461019e578063fca604d7146101be57600080fd5b806357168c791461008b5780636feb02a1146100d55780639083ef5814610109578063ac3d15fb1461011e575b600080fd5b34801561009757600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516100cc9190610abf565b60405180910390f35b3480156100e157600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b61011c610117366004610b02565b6101e1565b005b34801561012a57600080fd5b5061011c610139366004610b3f565b61035b565b34801561014a57600080fd5b5061011c610159366004610da1565b610587565b34801561016a57600080fd5b5061011c610179366004610ddb565b6106c1565b34801561018a57600080fd5b5061011c610199366004610b3f565b61070f565b3480156101aa57600080fd5b5061011c6101b9366004610ebb565b610875565b3480156101ca57600080fd5b506101d460005481565b6040516100cc9190610f11565b6001600160a01b0380831660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa158015610238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025c9190610f2a565b90506000836001600160a01b031634338560405160240161027e929190610f53565b60408051601f198184030181529181526020820180516001600160e01b0316637be4bae160e01b179052516102b39190610fc3565b60006040518083038185875af1925050503d80600081146102f0576040519150601f19603f3d011682016040523d82523d6000602084013e6102f5565b606091505b50509050801561008657816001600160a01b0316846001600160a01b0316336001600160a01b03167f5f0f580a49a433afc0cd61faf31f545ff739f7874dd091ba39ecfd0383c8462c3460405161034c9190610f11565b60405180910390a45b50505050565b6001600160a01b0380821660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa1580156103b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d69190610f2a565b6001600160a01b03808416600090815260016020526040808220549051629917c560e41b815293945090929116906309917c5090610418903390600401610abf565b602060405180830381865afa158015610435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104599190610fda565b9050600081116104845760405162461bcd60e51b815260040161047b90611017565b60405180910390fd5b6000836001600160a01b0316336040516024016104a19190610abf565b60408051601f198184030181529181526020820180516001600160e01b0316637d44a00d60e11b179052516104d69190610fc3565b6000604051808303816000865af19150503d8060008114610513576040519150601f19603f3d011682016040523d82523d6000602084013e610518565b606091505b50509050801561056f57826001600160a01b0316846001600160a01b0316336001600160a01b03167fe627e40c5979c5da4cf94d4b3ce15ce68a4103b1480ec047eec9736d39a0123d8560405161034c9190610f11565b60405162461bcd60e51b815260040161047b90611040565b604051632213cc3b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063884f30ec906105fc90309033907f0000000000000000000000000000000000000000000000000000000000000000908890600401611131565b6020604051808303816000875af115801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190610f2a565b6001600160a01b03811660008181526001602090815260409182902080546001600160a01b0319168417905585519086015186830151606088015160c0890151945196975033967fce55db2394471943657aaa63a10999909b55d5948702c94255bb9ba41ad07e28956106b59594939291611175565b60405180910390a35050565b846001600160a01b03167f10bb073e1ce0977d8bf7b641de8a59b02dd9c9d1c4badc9b30e5a48ac9fc8cb98585858560405161070094939291906111e1565b60405180910390a25050505050565b6001600160a01b038181166000908152600160209081526040918290205482516358a2b01f60e11b815292513394919091169263b145603e9260048083019391928290030181865afa158015610769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078d9190610f2a565b6001600160a01b0316146107a057600080fd5b6001600160a01b03808216600090815260016020908152604080832054815163ce845d1d60e01b815291519394169263ce845d1d926004808401939192918290030181865afa1580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190610fda565b111561082657600080fd5b6001600160a01b03811660008181526001602052604080822080546001600160a01b0319169055517fd41d62ed7a46b1f2f4c0a4c0fa40c95bbe14a7d55034ff9817b743d6cb7935369190a250565b6040516370a0823160e01b8152829082906001600160a01b038216906370a08231906108a5908590600401610abf565b602060405180830381865afa1580156108c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e69190610fda565b6109025760405162461bcd60e51b815260040161047b9061124d565b816001600160a01b0316634c7e9be3866001600160a01b03166399a8502d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561094f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097791908101906112b5565b876207a120896001600160a01b031663b145603e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109de9190610f2a565b671bc16d674ec800006040518663ffffffff1660e01b8152600401610a0795949392919061136e565b6020604051808303816000875af1158015610a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4a9190610fda565b50600054610a59906001611405565b6000556040517f4ee76a1c89ccbef26f098ac48c95b7da87fe34749fea8758a71a3dc4ccc28bcd90610a8e908790339061141d565b60405180910390a15050505050565b60006001600160a01b0382165b92915050565b610ab981610a9d565b82525050565b60208101610aaa8284610ab0565b610ad681610a9d565b8114610ae157600080fd5b50565b8035610aaa81610acd565b801515610ad6565b8035610aaa81610aef565b60008060408385031215610b1857610b18600080fd5b6000610b248585610ae4565b9250506020610b3585828601610af7565b9150509250929050565b600060208284031215610b5457610b54600080fd5b6000610b608484610ae4565b949350505050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715610ba357610ba3610b68565b6040525050565b6000610bb560405190565b9050610bc18282610b7e565b919050565b60006001600160401b03821115610bdf57610bdf610b68565b601f19601f83011660200192915050565b82818337506000910152565b6000610c0f610c0a84610bc6565b610baa565b905082815260208101848484011115610c2a57610c2a600080fd5b610c35848285610bf0565b509392505050565b600082601f830112610c5157610c51600080fd5b8135610b60848260208601610bfc565b80610ad6565b8035610aaa81610c61565b600060e08284031215610c8757610c87600080fd5b610c9160e0610baa565b905081356001600160401b03811115610cac57610cac600080fd5b610cb884828501610c3d565b82525060208201356001600160401b03811115610cd757610cd7600080fd5b610ce384828501610c3d565b60208301525060408201356001600160401b03811115610d0557610d05600080fd5b610d1184828501610c3d565b60408301525060608201356001600160401b03811115610d3357610d33600080fd5b610d3f84828501610c3d565b6060830152506080610d5384828501610c67565b60808301525060a0610d6784828501610c67565b60a08301525060c08201356001600160401b03811115610d8957610d89600080fd5b610d9584828501610c3d565b60c08301525092915050565b600060208284031215610db657610db6600080fd5b81356001600160401b03811115610dcf57610dcf600080fd5b610b6084828501610c72565b600080600080600060a08688031215610df657610df6600080fd5b6000610e028888610ae4565b95505060208601356001600160401b03811115610e2157610e21600080fd5b610e2d88828901610c3d565b94505060408601356001600160401b03811115610e4c57610e4c600080fd5b610e5888828901610c3d565b93505060608601356001600160401b03811115610e7757610e77600080fd5b610e8388828901610c3d565b92505060808601356001600160401b03811115610ea257610ea2600080fd5b610eae88828901610c3d565b9150509295509295909350565b600080600060608486031215610ed357610ed3600080fd5b6000610edf8686610ae4565b9350506020610ef086828701610ae4565b9250506040610f0186828701610ae4565b9150509250925092565b80610ab9565b60208101610aaa8284610f0b565b8051610aaa81610acd565b600060208284031215610f3f57610f3f600080fd5b6000610b608484610f1f565b801515610ab9565b60408101610f618285610ab0565b610f6e6020830184610f4b565b9392505050565b60005b83811015610f90578181015183820152602001610f78565b838111156103555750506000910152565b6000610fab825190565b610fb9818560208601610f75565b9290920192915050565b6000610f6e8284610fa1565b8051610aaa81610c61565b600060208284031215610fef57610fef600080fd5b6000610b608484610fcf565b6002815260006020820161596f60f01b815291505b5060200190565b60208082528101610aaa81610ffb565b60028152600060208201610b2d60f31b81529150611010565b60208082528101610aaa81611027565b600061105a825190565b808452602084019350611071818560208601610f75565b601f01601f19169290920192915050565b805160e08084526000919084019061109a8282611050565b915050602083015184820360208601526110b48282611050565b915050604083015184820360408601526110ce8282611050565b915050606083015184820360608601526110e88282611050565b91505060808301516110fd6080860182610f0b565b5060a083015161111060a0860182610f0b565b5060c083015184820360c08601526111288282611050565b95945050505050565b6080810161113f8287610ab0565b61114c6020830186610ab0565b6111596040830185610ab0565b818103606083015261116b8184611082565b9695505050505050565b60a080825281016111868188611050565b9050818103602083015261119a8187611050565b905081810360408301526111ae8186611050565b905081810360608301526111c28185611050565b905081810360808301526111d68184611050565b979650505050505050565b608080825281016111f28187611050565b905081810360208301526112068186611050565b9050818103604083015261121a8185611050565b9050818103606083015261116b8184611050565b60088152600060208201676e6f2066756e647360c01b81529150611010565b60208082528101610aaa8161122e565b600061126b610c0a84610bc6565b90508281526020810184848401111561128657611286600080fd5b610c35848285610f75565b600082601f8301126112a5576112a5600080fd5b8151610b6084826020860161125d565b6000602082840312156112ca576112ca600080fd5b81516001600160401b038111156112e3576112e3600080fd5b610b6084828501611291565b6002815260006020820161060f60f31b81529150611010565b600063ffffffff8216610aaa565b610ab981611308565b60006001600160a01b038216610aaa565b6000610aaa8261131f565b6000610aaa82611330565b610ab98161133b565b60006bffffffffffffffffffffffff8216610aaa565b610ab98161134f565b61010080825281016113808188611050565b90508181036020830152611393816112ef565b90506113a26040830187610ab0565b6113af6060830186611316565b6113bc6080830185611346565b81810360a08301526113cd816112ef565b905081810360c08301526113e0816112ef565b905061116b60e0830184611365565b634e487b7160e01b600052601160045260246000fd5b60008219821115611418576114186113ef565b500190565b6040810161142b8285610ab0565b610f6e6020830184610ab056fea2646970667358221220c65167695d8baeab1d9dfc671560e38d89810f6f242202dcf842984cac3660f764736f6c634300080b0033", - "deployedBytecode": "0x6080604052600436106100865760003560e01c8063ccf5f27f11610059578063ccf5f27f1461013e578063cd274a401461015e578063e4663a5b1461017e578063fab62a1d1461019e578063fca604d7146101be57600080fd5b806357168c791461008b5780636feb02a1146100d55780639083ef5814610109578063ac3d15fb1461011e575b600080fd5b34801561009757600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516100cc9190610abf565b60405180910390f35b3480156100e157600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b61011c610117366004610b02565b6101e1565b005b34801561012a57600080fd5b5061011c610139366004610b3f565b61035b565b34801561014a57600080fd5b5061011c610159366004610da1565b610587565b34801561016a57600080fd5b5061011c610179366004610ddb565b6106c1565b34801561018a57600080fd5b5061011c610199366004610b3f565b61070f565b3480156101aa57600080fd5b5061011c6101b9366004610ebb565b610875565b3480156101ca57600080fd5b506101d460005481565b6040516100cc9190610f11565b6001600160a01b0380831660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa158015610238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025c9190610f2a565b90506000836001600160a01b031634338560405160240161027e929190610f53565b60408051601f198184030181529181526020820180516001600160e01b0316637be4bae160e01b179052516102b39190610fc3565b60006040518083038185875af1925050503d80600081146102f0576040519150601f19603f3d011682016040523d82523d6000602084013e6102f5565b606091505b50509050801561008657816001600160a01b0316846001600160a01b0316336001600160a01b03167f5f0f580a49a433afc0cd61faf31f545ff739f7874dd091ba39ecfd0383c8462c3460405161034c9190610f11565b60405180910390a45b50505050565b6001600160a01b0380821660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa1580156103b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d69190610f2a565b6001600160a01b03808416600090815260016020526040808220549051629917c560e41b815293945090929116906309917c5090610418903390600401610abf565b602060405180830381865afa158015610435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104599190610fda565b9050600081116104845760405162461bcd60e51b815260040161047b90611017565b60405180910390fd5b6000836001600160a01b0316336040516024016104a19190610abf565b60408051601f198184030181529181526020820180516001600160e01b0316637d44a00d60e11b179052516104d69190610fc3565b6000604051808303816000865af19150503d8060008114610513576040519150601f19603f3d011682016040523d82523d6000602084013e610518565b606091505b50509050801561056f57826001600160a01b0316846001600160a01b0316336001600160a01b03167fe627e40c5979c5da4cf94d4b3ce15ce68a4103b1480ec047eec9736d39a0123d8560405161034c9190610f11565b60405162461bcd60e51b815260040161047b90611040565b604051632213cc3b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063884f30ec906105fc90309033907f0000000000000000000000000000000000000000000000000000000000000000908890600401611131565b6020604051808303816000875af115801561061b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f9190610f2a565b6001600160a01b03811660008181526001602090815260409182902080546001600160a01b0319168417905585519086015186830151606088015160c0890151945196975033967fce55db2394471943657aaa63a10999909b55d5948702c94255bb9ba41ad07e28956106b59594939291611175565b60405180910390a35050565b846001600160a01b03167f10bb073e1ce0977d8bf7b641de8a59b02dd9c9d1c4badc9b30e5a48ac9fc8cb98585858560405161070094939291906111e1565b60405180910390a25050505050565b6001600160a01b038181166000908152600160209081526040918290205482516358a2b01f60e11b815292513394919091169263b145603e9260048083019391928290030181865afa158015610769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078d9190610f2a565b6001600160a01b0316146107a057600080fd5b6001600160a01b03808216600090815260016020908152604080832054815163ce845d1d60e01b815291519394169263ce845d1d926004808401939192918290030181865afa1580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190610fda565b111561082657600080fd5b6001600160a01b03811660008181526001602052604080822080546001600160a01b0319169055517fd41d62ed7a46b1f2f4c0a4c0fa40c95bbe14a7d55034ff9817b743d6cb7935369190a250565b6040516370a0823160e01b8152829082906001600160a01b038216906370a08231906108a5908590600401610abf565b602060405180830381865afa1580156108c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e69190610fda565b6109025760405162461bcd60e51b815260040161047b9061124d565b816001600160a01b0316634c7e9be3866001600160a01b03166399a8502d6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561094f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261097791908101906112b5565b876207a120896001600160a01b031663b145603e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109de9190610f2a565b671bc16d674ec800006040518663ffffffff1660e01b8152600401610a0795949392919061136e565b6020604051808303816000875af1158015610a26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4a9190610fda565b50600054610a59906001611405565b6000556040517f4ee76a1c89ccbef26f098ac48c95b7da87fe34749fea8758a71a3dc4ccc28bcd90610a8e908790339061141d565b60405180910390a15050505050565b60006001600160a01b0382165b92915050565b610ab981610a9d565b82525050565b60208101610aaa8284610ab0565b610ad681610a9d565b8114610ae157600080fd5b50565b8035610aaa81610acd565b801515610ad6565b8035610aaa81610aef565b60008060408385031215610b1857610b18600080fd5b6000610b248585610ae4565b9250506020610b3585828601610af7565b9150509250929050565b600060208284031215610b5457610b54600080fd5b6000610b608484610ae4565b949350505050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715610ba357610ba3610b68565b6040525050565b6000610bb560405190565b9050610bc18282610b7e565b919050565b60006001600160401b03821115610bdf57610bdf610b68565b601f19601f83011660200192915050565b82818337506000910152565b6000610c0f610c0a84610bc6565b610baa565b905082815260208101848484011115610c2a57610c2a600080fd5b610c35848285610bf0565b509392505050565b600082601f830112610c5157610c51600080fd5b8135610b60848260208601610bfc565b80610ad6565b8035610aaa81610c61565b600060e08284031215610c8757610c87600080fd5b610c9160e0610baa565b905081356001600160401b03811115610cac57610cac600080fd5b610cb884828501610c3d565b82525060208201356001600160401b03811115610cd757610cd7600080fd5b610ce384828501610c3d565b60208301525060408201356001600160401b03811115610d0557610d05600080fd5b610d1184828501610c3d565b60408301525060608201356001600160401b03811115610d3357610d33600080fd5b610d3f84828501610c3d565b6060830152506080610d5384828501610c67565b60808301525060a0610d6784828501610c67565b60a08301525060c08201356001600160401b03811115610d8957610d89600080fd5b610d9584828501610c3d565b60c08301525092915050565b600060208284031215610db657610db6600080fd5b81356001600160401b03811115610dcf57610dcf600080fd5b610b6084828501610c72565b600080600080600060a08688031215610df657610df6600080fd5b6000610e028888610ae4565b95505060208601356001600160401b03811115610e2157610e21600080fd5b610e2d88828901610c3d565b94505060408601356001600160401b03811115610e4c57610e4c600080fd5b610e5888828901610c3d565b93505060608601356001600160401b03811115610e7757610e77600080fd5b610e8388828901610c3d565b92505060808601356001600160401b03811115610ea257610ea2600080fd5b610eae88828901610c3d565b9150509295509295909350565b600080600060608486031215610ed357610ed3600080fd5b6000610edf8686610ae4565b9350506020610ef086828701610ae4565b9250506040610f0186828701610ae4565b9150509250925092565b80610ab9565b60208101610aaa8284610f0b565b8051610aaa81610acd565b600060208284031215610f3f57610f3f600080fd5b6000610b608484610f1f565b801515610ab9565b60408101610f618285610ab0565b610f6e6020830184610f4b565b9392505050565b60005b83811015610f90578181015183820152602001610f78565b838111156103555750506000910152565b6000610fab825190565b610fb9818560208601610f75565b9290920192915050565b6000610f6e8284610fa1565b8051610aaa81610c61565b600060208284031215610fef57610fef600080fd5b6000610b608484610fcf565b6002815260006020820161596f60f01b815291505b5060200190565b60208082528101610aaa81610ffb565b60028152600060208201610b2d60f31b81529150611010565b60208082528101610aaa81611027565b600061105a825190565b808452602084019350611071818560208601610f75565b601f01601f19169290920192915050565b805160e08084526000919084019061109a8282611050565b915050602083015184820360208601526110b48282611050565b915050604083015184820360408601526110ce8282611050565b915050606083015184820360608601526110e88282611050565b91505060808301516110fd6080860182610f0b565b5060a083015161111060a0860182610f0b565b5060c083015184820360c08601526111288282611050565b95945050505050565b6080810161113f8287610ab0565b61114c6020830186610ab0565b6111596040830185610ab0565b818103606083015261116b8184611082565b9695505050505050565b60a080825281016111868188611050565b9050818103602083015261119a8187611050565b905081810360408301526111ae8186611050565b905081810360608301526111c28185611050565b905081810360808301526111d68184611050565b979650505050505050565b608080825281016111f28187611050565b905081810360208301526112068186611050565b9050818103604083015261121a8185611050565b9050818103606083015261116b8184611050565b60088152600060208201676e6f2066756e647360c01b81529150611010565b60208082528101610aaa8161122e565b600061126b610c0a84610bc6565b90508281526020810184848401111561128657611286600080fd5b610c35848285610f75565b600082601f8301126112a5576112a5600080fd5b8151610b6084826020860161125d565b6000602082840312156112ca576112ca600080fd5b81516001600160401b038111156112e3576112e3600080fd5b610b6084828501611291565b6002815260006020820161060f60f31b81529150611010565b600063ffffffff8216610aaa565b610ab981611308565b60006001600160a01b038216610aaa565b6000610aaa8261131f565b6000610aaa82611330565b610ab98161133b565b60006bffffffffffffffffffffffff8216610aaa565b610ab98161134f565b61010080825281016113808188611050565b90508181036020830152611393816112ef565b90506113a26040830187610ab0565b6113af6060830186611316565b6113bc6080830185611346565b81810360a08301526113cd816112ef565b905081810360c08301526113e0816112ef565b905061116b60e0830184611365565b634e487b7160e01b600052601160045260246000fd5b60008219821115611418576114186113ef565b500190565b6040810161142b8285610ab0565b610f6e6020830184610ab056fea2646970667358221220c65167695d8baeab1d9dfc671560e38d89810f6f242202dcf842984cac3660f764736f6c634300080b0033", + "numDeployments": 16, + "solcInputHash": "29f2960a323d69a7be5b01d1ca776898", + "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_cmpFactory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rwdFactory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_title\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_category\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_tags\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_imageURI\",\"type\":\"string\"}],\"name\":\"CampaignAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_funder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_val\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_c_creator\",\"type\":\"address\"}],\"name\":\"CampaignFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_creator\",\"type\":\"address\"}],\"name\":\"CampaignPublished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"}],\"name\":\"CampaignRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_withdrawer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_val\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_c_creator\",\"type\":\"address\"}],\"name\":\"CampaignShrunk\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_username\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_email\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_shipAddress\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_pfp\",\"type\":\"string\"}],\"name\":\"UserAdded\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"_title\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_category\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_tags\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_goalAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_duration\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_imageURI\",\"type\":\"string\"}],\"internalType\":\"struct CampaignFactory.cmpInput\",\"name\":\"_cmp\",\"type\":\"tuple\"}],\"name\":\"addCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_username\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_email\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_shipAddress\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_pfp\",\"type\":\"string\"}],\"name\":\"addUser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"campaignCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_rewardable\",\"type\":\"bool\"}],\"name\":\"donateToCampaign\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_cmpFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_rewardFactory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_upkeepCreator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_linkToken\",\"type\":\"address\"}],\"name\":\"publishCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"}],\"name\":\"refundFromCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_campaignAddress\",\"type\":\"address\"}],\"name\":\"removeCampaign\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/CrowdFunder.sol\":\"CrowdFunder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/**\\n * @notice OnchainConfig of the registry\\n * @dev only used in params and return values\\n * @member paymentPremiumPPB payment premium rate oracles receive on top of\\n * being reimbursed for gas, measured in parts per billion\\n * @member flatFeeMicroLink flat fee paid to oracles for performing upkeeps,\\n * priced in MicroLink; can be used in conjunction with or independently of\\n * paymentPremiumPPB\\n * @member checkGasLimit gas limit when checking for upkeep\\n * @member stalenessSeconds number of seconds that is allowed for feed data to\\n * be stale before switching to the fallback pricing\\n * @member gasCeilingMultiplier multiplier to apply to the fast gas feed price\\n * when calculating the payment ceiling for keepers\\n * @member minUpkeepSpend minimum LINK that an upkeep must spend before cancelling\\n * @member maxPerformGas max executeGas allowed for an upkeep on this registry\\n * @member fallbackGasPrice gas price used if the gas price feed is stale\\n * @member fallbackLinkPrice LINK price used if the LINK price feed is stale\\n * @member transcoder address of the transcoder contract\\n * @member registrar address of the registrar contract\\n */\\nstruct OnchainConfig {\\n uint32 paymentPremiumPPB;\\n uint32 flatFeeMicroLink; // min 0.000001 LINK, max 4294 LINK\\n uint32 checkGasLimit;\\n uint24 stalenessSeconds;\\n uint16 gasCeilingMultiplier;\\n uint96 minUpkeepSpend;\\n uint32 maxPerformGas;\\n uint32 maxCheckDataSize;\\n uint32 maxPerformDataSize;\\n uint256 fallbackGasPrice;\\n uint256 fallbackLinkPrice;\\n address transcoder;\\n address registrar;\\n}\\n\\n/**\\n * @notice state of the registry\\n * @dev only used in params and return values\\n * @member nonce used for ID generation\\n * @member ownerLinkBalance withdrawable balance of LINK by contract owner\\n * @member expectedLinkBalance the expected balance of LINK of the registry\\n * @member totalPremium the total premium collected on registry so far\\n * @member numUpkeeps total number of upkeeps on the registry\\n * @member configCount ordinal number of current config, out of all configs applied to this contract so far\\n * @member latestConfigBlockNumber last block at which this config was set\\n * @member latestConfigDigest domain-separation tag for current config\\n * @member latestEpoch for which a report was transmitted\\n * @member paused freeze on execution scoped to the entire registry\\n */\\nstruct State {\\n uint32 nonce;\\n uint96 ownerLinkBalance;\\n uint256 expectedLinkBalance;\\n uint96 totalPremium;\\n uint256 numUpkeeps;\\n uint32 configCount;\\n uint32 latestConfigBlockNumber;\\n bytes32 latestConfigDigest;\\n uint32 latestEpoch;\\n bool paused;\\n}\\n\\n/**\\n * @notice all information about an upkeep\\n * @dev only used in return values\\n * @member target the contract which needs to be serviced\\n * @member executeGas the gas limit of upkeep execution\\n * @member checkData the checkData bytes for this upkeep\\n * @member balance the balance of this upkeep\\n * @member admin for this upkeep\\n * @member maxValidBlocknumber until which block this upkeep is valid\\n * @member lastPerformBlockNumber the last block number when this upkeep was performed\\n * @member amountSpent the amount this upkeep has spent\\n * @member paused if this upkeep has been paused\\n * @member skipSigVerification skip signature verification in transmit for a low security low cost model\\n */\\nstruct UpkeepInfo {\\n address target;\\n uint32 executeGas;\\n bytes checkData;\\n uint96 balance;\\n address admin;\\n uint64 maxValidBlocknumber;\\n uint32 lastPerformBlockNumber;\\n uint96 amountSpent;\\n bool paused;\\n bytes offchainConfig;\\n}\\n\\nenum UpkeepFailureReason {\\n NONE,\\n UPKEEP_CANCELLED,\\n UPKEEP_PAUSED,\\n TARGET_CHECK_REVERTED,\\n UPKEEP_NOT_NEEDED,\\n PERFORM_DATA_EXCEEDS_LIMIT,\\n INSUFFICIENT_BALANCE\\n}\\n\\ninterface AutomationRegistryBaseInterface {\\n function registerUpkeep(\\n address target,\\n uint32 gasLimit,\\n address admin,\\n bytes calldata checkData,\\n bytes calldata offchainConfig\\n ) external returns (uint256 id);\\n\\n function cancelUpkeep(uint256 id) external;\\n\\n function pauseUpkeep(uint256 id) external;\\n\\n function unpauseUpkeep(uint256 id) external;\\n\\n function transferUpkeepAdmin(uint256 id, address proposed) external;\\n\\n function acceptUpkeepAdmin(uint256 id) external;\\n\\n function updateCheckData(uint256 id, bytes calldata newCheckData) external;\\n\\n function addFunds(uint256 id, uint96 amount) external;\\n\\n function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external;\\n\\n function setUpkeepOffchainConfig(uint256 id, bytes calldata config) external;\\n\\n function getUpkeep(uint256 id) external view returns (UpkeepInfo memory upkeepInfo);\\n\\n function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[] memory);\\n\\n function getTransmitterInfo(address query)\\n external\\n view\\n returns (\\n bool active,\\n uint8 index,\\n uint96 balance,\\n uint96 lastCollected,\\n address payee\\n );\\n\\n function getState()\\n external\\n view\\n returns (\\n State memory state,\\n OnchainConfig memory config,\\n address[] memory signers,\\n address[] memory transmitters,\\n uint8 f\\n );\\n}\\n\\n/**\\n * @dev The view methods are not actually marked as view in the implementation\\n * but we want them to be easily queried off-chain. Solidity will not compile\\n * if we actually inherit from this interface, so we document it here.\\n */\\ninterface AutomationRegistryInterface is AutomationRegistryBaseInterface {\\n function checkUpkeep(uint256 upkeepId)\\n external\\n view\\n returns (\\n bool upkeepNeeded,\\n bytes memory performData,\\n UpkeepFailureReason upkeepFailureReason,\\n uint256 gasUsed,\\n uint256 fastGasWei,\\n uint256 linkNative\\n );\\n}\\n\\ninterface AutomationRegistryExecutableInterface is AutomationRegistryBaseInterface {\\n function checkUpkeep(uint256 upkeepId)\\n external\\n returns (\\n bool upkeepNeeded,\\n bytes memory performData,\\n UpkeepFailureReason upkeepFailureReason,\\n uint256 gasUsed,\\n uint256 fastGasWei,\\n uint256 linkNative\\n );\\n}\\n\",\"keccak256\":\"0x9faf0551509440bd9c25a4a2f14b23bce2f82e5ab5691058b9664edab808468c\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n/**\\n * @notice This is a deprecated interface. Please use AutomationCompatibleInterface directly.\\n */\\npragma solidity ^0.8.0;\\nimport {AutomationCompatibleInterface as KeeperCompatibleInterface} from \\\"./AutomationCompatibleInterface.sol\\\";\\n\",\"keccak256\":\"0xac76a31c20c6d66196247376d113a0f19229569ab8c123989649d50be3333e0a\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface LinkTokenInterface {\\n function allowance(address owner, address spender) external view returns (uint256 remaining);\\n\\n function approve(address spender, uint256 value) external returns (bool success);\\n\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n function decimals() external view returns (uint8 decimalPlaces);\\n\\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\\n\\n function increaseApproval(address spender, uint256 subtractedValue) external;\\n\\n function name() external view returns (string memory tokenName);\\n\\n function symbol() external view returns (string memory tokenSymbol);\\n\\n function totalSupply() external view returns (uint256 totalTokensIssued);\\n\\n function transfer(address to, uint256 value) external returns (bool success);\\n\\n function transferAndCall(\\n address to,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bool success);\\n\\n function transferFrom(\\n address from,\\n address to,\\n uint256 value\\n ) external returns (bool success);\\n}\\n\",\"keccak256\":\"0xc7d7cd730d36825485ef4107d93c3ff18b9f3a5a00ea3d5988ba9a0bd70b10c5\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x0e9621f60b2faabe65549f7ed0f24e8853a45c1b7990d47e8160e523683f3935\",\"license\":\"MIT\"},\"contracts/Campaign.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\r\\nimport \\\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\\\";\\r\\nimport {Reward} from \\\"./Reward.sol\\\";\\r\\nimport {RewardFactory} from \\\"./factories/RewardFactory.sol\\\";\\r\\nimport {RefunderLib} from \\\"./libraries/campaign/RefunderLib.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Cmp_NIS(); /**not in state */\\r\\n// error Cmp_NotCrtr();\\r\\n// error Cmp_DIC(); /**donator is creator */\\r\\n// error Cmp_NoDns();\\r\\n// error Cmp_RefF();\\r\\n// error Cmp_UpkNN();\\r\\n// error Cmp_NotRef();\\r\\n// error Cmp_Bankrupt();\\r\\n\\r\\ncontract Campaign is KeeperCompatibleInterface, ReentrancyGuard {\\r\\n // enums\\r\\n enum C_State {\\r\\n Fundraising,\\r\\n Expired,\\r\\n Canceled\\r\\n }\\r\\n\\r\\n // c_state variables\\r\\n address public immutable i_crf;\\r\\n address payable public immutable i_creator;\\r\\n address public immutable i_rwdFactory;\\r\\n string public s_title;\\r\\n string public s_description;\\r\\n string public s_category;\\r\\n string public s_imageURI;\\r\\n string public s_campaignURI;\\r\\n string public s_tags;\\r\\n uint256 public goalAmount;\\r\\n uint256 public duration;\\r\\n uint256 public currentBalance;\\r\\n uint256 private immutable i_initTimeStamp;\\r\\n uint256 private constant i_maxDur = 5184000;\\r\\n uint256 public deadline;\\r\\n uint256 private rId;\\r\\n C_State public c_state = C_State.Fundraising; // default c_state\\r\\n\\r\\n struct CampaignObject {\\r\\n address i_creator;\\r\\n string s_title;\\r\\n string s_description;\\r\\n string s_category;\\r\\n string s_tags;\\r\\n uint256 goalAmount;\\r\\n uint256 duration;\\r\\n uint256 currentBalance;\\r\\n C_State currentC_State;\\r\\n string s_imageURI;\\r\\n string s_campaignURI;\\r\\n uint256 deadline;\\r\\n }\\r\\n\\r\\n struct refunder_pckg {\\r\\n uint256 currentBalance;\\r\\n C_State c_state;\\r\\n }\\r\\n\\r\\n // mapping (uint256 => reward) public rewards;\\r\\n mapping(uint256 => address) public rewards;\\r\\n mapping(address => uint256[]) public entDonations;\\r\\n mapping(address => uint256) public aggrDonations;\\r\\n\\r\\n uint256[] public rKeys;\\r\\n\\r\\n // events\\r\\n event FundingRecieved(\\r\\n address indexed contributor,\\r\\n uint256 amount,\\r\\n uint256 currentBalance\\r\\n );\\r\\n event CreatorPaid(address creator, address campaignAddress);\\r\\n event CampaignExpired(address campaignAddress);\\r\\n event CampaignCanceled();\\r\\n\\r\\n // modifiers\\r\\n modifier isCreator() {\\r\\n if (msg.sender != i_creator) {\\r\\n revert();\\r\\n }\\r\\n _;\\r\\n }\\r\\n\\r\\n refunder_pckg _refP;\\r\\n\\r\\n constructor(\\r\\n address _crowdfunder,\\r\\n address _creator,\\r\\n address _rwdFactory,\\r\\n string memory _title,\\r\\n string memory _description,\\r\\n string memory _category,\\r\\n string memory _tags,\\r\\n uint256 _goalAmount,\\r\\n uint256 _duration,\\r\\n string memory _imageURI\\r\\n ) {\\r\\n i_rwdFactory = _rwdFactory;\\r\\n i_crf = _crowdfunder;\\r\\n i_creator = payable(_creator);\\r\\n s_title = _title;\\r\\n s_description = _description;\\r\\n s_category = _category;\\r\\n s_tags = _tags;\\r\\n goalAmount = _goalAmount;\\r\\n i_initTimeStamp = block.timestamp;\\r\\n duration = _duration > i_maxDur ? i_maxDur : _duration;\\r\\n deadline = i_initTimeStamp + duration;\\r\\n s_imageURI = _imageURI;\\r\\n currentBalance = 0;\\r\\n }\\r\\n\\r\\n function donate(\\r\\n address _donator,\\r\\n bool _rewardable\\r\\n ) public payable nonReentrant {\\r\\n if (msg.sender != i_crf) {\\r\\n revert();\\r\\n }\\r\\n if (c_state != C_State.Fundraising) {\\r\\n revert();\\r\\n }\\r\\n if (_donator == i_creator) {\\r\\n revert();\\r\\n }\\r\\n currentBalance = currentBalance + msg.value;\\r\\n if (_rewardable) {\\r\\n if (rewards[msg.value] != address(0)) {\\r\\n (bool success, ) = rewards[msg.value].call(\\r\\n abi.encodeWithSignature(\\\"addDonator(address)\\\", _donator)\\r\\n );\\r\\n if (!success) {\\r\\n revert();\\r\\n }\\r\\n entDonations[_donator].push(msg.value);\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n aggrDonations[_donator] = aggrDonations[_donator] + msg.value;\\r\\n emit FundingRecieved(_donator, msg.value, currentBalance);\\r\\n }\\r\\n\\r\\n /**\\r\\n @dev this is the function chainlink keepers calls\\r\\n chekupkeep returns true to trigger the action after the interval has passed\\r\\n */\\r\\n function checkUpkeep(\\r\\n bytes memory /**checkData */\\r\\n )\\r\\n public\\r\\n view\\r\\n override\\r\\n returns (bool upkeepNeeded, bytes memory /**performData */)\\r\\n {\\r\\n bool isOpen = c_state == C_State.Fundraising;\\r\\n bool timePassed = ((block.timestamp - i_initTimeStamp) > duration);\\r\\n upkeepNeeded = (timePassed && isOpen);\\r\\n return (upkeepNeeded, \\\"0x0\\\");\\r\\n }\\r\\n\\r\\n function performUpkeep(bytes calldata /**performData */) external override {\\r\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\r\\n if (!upkeepNeeded) {\\r\\n revert();\\r\\n }\\r\\n c_state = C_State.Expired;\\r\\n emit CampaignExpired(address(this));\\r\\n }\\r\\n\\r\\n function payout() external isCreator {\\r\\n if (c_state != C_State.Expired) {\\r\\n revert();\\r\\n }\\r\\n uint256 totalRaised = currentBalance;\\r\\n currentBalance = 0;\\r\\n (bool success, ) = i_creator.call{value: totalRaised}(\\\"\\\");\\r\\n if (success) {\\r\\n emit CreatorPaid(i_creator, address(this));\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n\\r\\n function refund(address _donator) external nonReentrant {\\r\\n _refP = refunder_pckg(currentBalance, c_state);\\r\\n RefunderLib.refund(\\r\\n i_crf,\\r\\n _refP,\\r\\n rewards,\\r\\n aggrDonations,\\r\\n entDonations,\\r\\n _donator\\r\\n );\\r\\n }\\r\\n\\r\\n function makeReward(RewardFactory.rwdInput memory _rwd) external isCreator {\\r\\n if (rewards[_rwd._price] != address(0)) {\\r\\n revert();\\r\\n }\\r\\n rKeys.push(_rwd._price);\\r\\n address newReward = RewardFactory(i_rwdFactory).createReward(\\r\\n address(this),\\r\\n i_creator,\\r\\n _rwd\\r\\n );\\r\\n rewards[_rwd._price] = newReward;\\r\\n }\\r\\n\\r\\n function endCampaign() external isCreator {\\r\\n if (c_state == C_State.Expired) {\\r\\n revert();\\r\\n }\\r\\n c_state = C_State.Canceled;\\r\\n emit CampaignCanceled();\\r\\n }\\r\\n\\r\\n // update functions\\r\\n function updateCampaignURI(string memory _campaignURI) external isCreator {\\r\\n s_campaignURI = _campaignURI;\\r\\n }\\r\\n\\r\\n function updateDur(uint256 _addedDur) external isCreator {\\r\\n duration = (((duration + _addedDur)) > i_maxDur)\\r\\n ? i_maxDur\\r\\n : (duration + _addedDur);\\r\\n deadline = i_initTimeStamp + duration;\\r\\n }\\r\\n\\r\\n // getter functions\\r\\n function getRewardKeys() external view returns (uint256[] memory) {\\r\\n return rKeys;\\r\\n }\\r\\n\\r\\n function getReward(\\r\\n uint256 _priceID\\r\\n ) external view returns (Reward.RewardObject memory) {\\r\\n Reward reward = Reward(rewards[_priceID]);\\r\\n return reward.getRewardDetails();\\r\\n }\\r\\n\\r\\n function getCampaignDetails()\\r\\n external\\r\\n view\\r\\n returns (CampaignObject memory)\\r\\n {\\r\\n return\\r\\n CampaignObject(\\r\\n i_creator,\\r\\n s_title,\\r\\n s_description,\\r\\n s_category,\\r\\n s_tags,\\r\\n goalAmount,\\r\\n duration,\\r\\n currentBalance,\\r\\n c_state,\\r\\n s_imageURI,\\r\\n s_campaignURI,\\r\\n deadline\\r\\n );\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x05c5518a752b38ef051b073ae318d9756c394760487680397e447357299626bc\",\"license\":\"MIT\"},\"contracts/CrowdFunder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport {UpkeepIDConsumer} from \\\"./UpkeepIDConsumer.sol\\\";\\r\\nimport {LinkTokenInterface} from \\\"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\\\";\\r\\nimport {CampaignFactory} from \\\"./factories/CampaignFactory.sol\\\";\\r\\nimport {Campaign} from \\\"./Campaign.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Crf_NotCrtr();\\r\\n// error Crf_CSA(); /** cmp still active */\\r\\n// error Crf_DonF();\\r\\n// error Crf_RefF();\\r\\n// error Crf_PubF();\\r\\n\\r\\ncontract CrowdFunder {\\r\\n // using SafeMath for uint256;\\r\\n\\r\\n event UserAdded(\\r\\n address indexed _address,\\r\\n string _username,\\r\\n string _email,\\r\\n string _shipAddress,\\r\\n string _pfp\\r\\n );\\r\\n\\r\\n event CampaignAdded(\\r\\n address indexed _campaignAddress,\\r\\n address indexed _creator,\\r\\n string _title,\\r\\n string _description,\\r\\n string _category,\\r\\n string _tags,\\r\\n string _imageURI\\r\\n );\\r\\n\\r\\n event CampaignFunded(\\r\\n address indexed _funder,\\r\\n address indexed _campaignAddress,\\r\\n uint256 _val,\\r\\n address indexed _c_creator\\r\\n );\\r\\n\\r\\n event CampaignShrunk(\\r\\n address indexed _withdrawer,\\r\\n address indexed _campaignAddress,\\r\\n uint256 _val,\\r\\n address indexed _c_creator\\r\\n );\\r\\n\\r\\n event CampaignRemoved(address indexed _campaignAddress);\\r\\n\\r\\n event CampaignPublished(address _campaignAddress, address _creator);\\r\\n\\r\\n address public immutable i_cmpFactory;\\r\\n address public immutable i_rewardFactory;\\r\\n uint256 public campaignCounter;\\r\\n mapping(address => address) private campaigns;\\r\\n\\r\\n constructor(address _cmpFactory, address _rwdFactory) {\\r\\n i_rewardFactory = _rwdFactory;\\r\\n i_cmpFactory = _cmpFactory;\\r\\n }\\r\\n\\r\\n function addUser(\\r\\n address _address,\\r\\n string memory _username,\\r\\n string memory _email,\\r\\n string memory _shipAddress,\\r\\n string memory _pfp\\r\\n ) external {\\r\\n emit UserAdded(_address, _username, _email, _shipAddress, _pfp);\\r\\n }\\r\\n\\r\\n function addCampaign(CampaignFactory.cmpInput memory _cmp) external {\\r\\n address newCampaign = CampaignFactory(i_cmpFactory).createCampaign(\\r\\n address(this),\\r\\n msg.sender,\\r\\n i_rewardFactory,\\r\\n _cmp\\r\\n );\\r\\n campaigns[newCampaign] = newCampaign;\\r\\n emit CampaignAdded(\\r\\n newCampaign,\\r\\n msg.sender,\\r\\n _cmp._title,\\r\\n _cmp._description,\\r\\n _cmp._category,\\r\\n _cmp._tags,\\r\\n _cmp._imageURI\\r\\n );\\r\\n }\\r\\n\\r\\n function donateToCampaign(\\r\\n address _campaignAddress,\\r\\n bool _rewardable\\r\\n ) external payable {\\r\\n address c_creator = Campaign(campaigns[_campaignAddress]).i_creator();\\r\\n (bool success, ) = _campaignAddress.call{value: msg.value}(\\r\\n abi.encodeWithSignature(\\r\\n \\\"donate(address,bool)\\\",\\r\\n msg.sender,\\r\\n _rewardable\\r\\n )\\r\\n );\\r\\n if (success) {\\r\\n emit CampaignFunded(\\r\\n msg.sender,\\r\\n _campaignAddress,\\r\\n msg.value,\\r\\n c_creator\\r\\n );\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n\\r\\n function refundFromCampaign(address _campaignAddress) external {\\r\\n address c_creator = Campaign(campaigns[_campaignAddress]).i_creator();\\r\\n uint256 refVal = Campaign(campaigns[_campaignAddress]).aggrDonations(\\r\\n msg.sender\\r\\n );\\r\\n if (!(refVal > 0)) {\\r\\n revert();\\r\\n }\\r\\n (bool success, ) = _campaignAddress.call(\\r\\n abi.encodeWithSignature(\\\"refund(address)\\\", msg.sender)\\r\\n );\\r\\n if (success) {\\r\\n emit CampaignShrunk(\\r\\n msg.sender,\\r\\n _campaignAddress,\\r\\n refVal,\\r\\n c_creator\\r\\n );\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n\\r\\n function removeCampaign(address _campaignAddress) external {\\r\\n if (Campaign(campaigns[_campaignAddress]).i_creator() != msg.sender) {\\r\\n revert();\\r\\n }\\r\\n if (Campaign(campaigns[_campaignAddress]).currentBalance() > 0) {\\r\\n revert();\\r\\n }\\r\\n // either payout or leave for refunds\\r\\n delete (campaigns[_campaignAddress]);\\r\\n emit CampaignRemoved(_campaignAddress);\\r\\n }\\r\\n\\r\\n function publishCampaign(\\r\\n address _campaignAddress,\\r\\n address _upkeepCreator,\\r\\n address _linkToken\\r\\n ) external {\\r\\n UpkeepIDConsumer newUpkeepCreator = UpkeepIDConsumer(_upkeepCreator);\\r\\n LinkTokenInterface token = LinkTokenInterface(_linkToken);\\r\\n if (token.balanceOf(_upkeepCreator) == 0) {\\r\\n revert();\\r\\n }\\r\\n newUpkeepCreator.registerAndPredictID(\\r\\n Campaign(_campaignAddress).s_title(),\\r\\n \\\"0x\\\",\\r\\n _campaignAddress,\\r\\n 500000,\\r\\n Campaign(_campaignAddress).i_creator(),\\r\\n \\\"0x\\\",\\r\\n \\\"0x\\\",\\r\\n 2000000000000000000\\r\\n );\\r\\n campaignCounter = campaignCounter + 1;\\r\\n emit CampaignPublished(_campaignAddress, msg.sender);\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x66c46688a4baa7473049c725709b7d2b43f2649917795993d25142b2d4fd4d22\",\"license\":\"MIT\"},\"contracts/Reward.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\ncontract Reward {\\r\\n address public immutable i_campaignAddress;\\r\\n // address public immutable i_crf;\\r\\n address public immutable i_creator;\\r\\n\\r\\n uint256 public immutable i_price;\\r\\n string public title;\\r\\n string public description;\\r\\n string public rpic;\\r\\n string[] public perks;\\r\\n uint256 public delDate;\\r\\n uint256 public quantity;\\r\\n bool public infinite = true;\\r\\n string[] public shipsTo;\\r\\n address[] public donators;\\r\\n string public surveyLink;\\r\\n\\r\\n struct RewardObject {\\r\\n uint256 price;\\r\\n string title;\\r\\n string description;\\r\\n string rpic;\\r\\n string[] perks;\\r\\n uint256 delDate;\\r\\n uint256 quantity;\\r\\n bool infinite;\\r\\n string[] shipsTo;\\r\\n address[] donators;\\r\\n string surveyLink;\\r\\n }\\r\\n\\r\\n mapping (address => uint256) public true_donator; \\r\\n mapping (address => string) public surveyResponses;\\r\\n\\r\\n constructor ( \\r\\n address _campaignAddress, \\r\\n address _creator,\\r\\n uint256 _price, \\r\\n string memory _title, \\r\\n string memory _description, \\r\\n string memory _rpic,\\r\\n string[] memory _perks, \\r\\n uint256 _deadline, \\r\\n uint256 _quantity, \\r\\n bool _infinite, \\r\\n string[] memory _shipsTo\\r\\n ) {\\r\\n i_price = _price;\\r\\n i_campaignAddress = _campaignAddress;\\r\\n i_creator = _creator;\\r\\n\\r\\n title = _title;\\r\\n description = _description;\\r\\n rpic = _rpic;\\r\\n perks = _perks;\\r\\n delDate = _deadline;\\r\\n quantity = _quantity;\\r\\n infinite = _infinite;\\r\\n shipsTo = _shipsTo;\\r\\n }\\r\\n\\r\\n function updateSurveyLink(string memory _surveylink) external {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n surveyLink = _surveylink;\\r\\n }\\r\\n\\r\\n function addDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if((true_donator[_donator] > 0)){revert();} // already has id ...has therefor donated for this reward before\\r\\n\\r\\n if(!infinite){\\r\\n if(quantity > 0){\\r\\n quantity = quantity - 1;\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }else{revert();} // rwd has finished no longer available\\r\\n }else{\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }\\r\\n }\\r\\n\\r\\n function getDonators() external view returns(address[] memory){\\r\\n return donators;\\r\\n }\\r\\n\\r\\n function removeDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if(!(true_donator[_donator] > 0)){revert();} // not a donator\\r\\n uint256 index = true_donator[_donator] - 1;\\r\\n delete donators[index];\\r\\n delete true_donator[_donator];\\r\\n }\\r\\n\\r\\n function respondToSurvey(string memory _response) external {\\r\\n if(!(true_donator[msg.sender] > 0)){revert();} // not a donator\\r\\n surveyResponses[msg.sender] = _response;\\r\\n }\\r\\n\\r\\n function getRewardDetails() external view returns(RewardObject memory){\\r\\n return RewardObject(\\r\\n i_price,\\r\\n title,\\r\\n description,\\r\\n rpic,\\r\\n perks,\\r\\n delDate,\\r\\n quantity,\\r\\n infinite,\\r\\n shipsTo,\\r\\n donators,\\r\\n surveyLink\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0x16520b0d7ec2ca2e9c34cc0738e1db48661eef392ca464f8b0ee003169d06603\",\"license\":\"MIT\"},\"contracts/UpkeepIDConsumer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.6;\\r\\n\\r\\n// UpkeepIDConsumerExample.sol imports functions from both ./AutomationRegistryInterface2_0.sol and\\r\\n// ./interfaces/LinkTokenInterface.sol\\r\\n\\r\\nimport {AutomationRegistryInterface, State, OnchainConfig} from \\\"@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol\\\";\\r\\nimport {LinkTokenInterface} from \\\"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\\\";\\r\\n\\r\\n/**\\r\\n * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY.\\r\\n * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.\\r\\n * DO NOT USE THIS CODE IN PRODUCTION.\\r\\n */\\r\\n\\r\\ninterface KeeperRegistrarInterface {\\r\\n function register(\\r\\n string memory name,\\r\\n bytes calldata encryptedEmail,\\r\\n address upkeepContract,\\r\\n uint32 gasLimit,\\r\\n address adminAddress,\\r\\n bytes calldata checkData,\\r\\n bytes calldata offchainConfig,\\r\\n uint96 amount,\\r\\n address sender\\r\\n ) external;\\r\\n}\\r\\n\\r\\ncontract UpkeepIDConsumer {\\r\\n LinkTokenInterface public immutable i_link;\\r\\n address public immutable registrar;\\r\\n AutomationRegistryInterface public immutable i_registry;\\r\\n bytes4 registerSig = KeeperRegistrarInterface.register.selector;\\r\\n\\r\\n constructor(\\r\\n LinkTokenInterface _link,\\r\\n address _registrar,\\r\\n AutomationRegistryInterface _registry\\r\\n ) {\\r\\n i_link = _link;\\r\\n registrar = _registrar;\\r\\n i_registry = _registry;\\r\\n }\\r\\n\\r\\n function registerAndPredictID(\\r\\n string memory name,\\r\\n bytes calldata encryptedEmail,\\r\\n address upkeepContract,\\r\\n uint32 gasLimit,\\r\\n address adminAddress,\\r\\n bytes calldata checkData,\\r\\n bytes calldata offchainConfig,\\r\\n uint96 amount\\r\\n ) public returns(uint256) {\\r\\n (State memory state, , , , ) = i_registry.getState();\\r\\n uint256 oldNonce = state.nonce;\\r\\n bytes memory payload = abi.encode(\\r\\n name,\\r\\n encryptedEmail,\\r\\n upkeepContract,\\r\\n gasLimit,\\r\\n adminAddress,\\r\\n checkData,\\r\\n offchainConfig,\\r\\n amount,\\r\\n address(this)\\r\\n );\\r\\n\\r\\n i_link.transferAndCall(\\r\\n registrar,\\r\\n amount,\\r\\n bytes.concat(registerSig, payload)\\r\\n );\\r\\n (state, , , , ) = i_registry.getState();\\r\\n uint256 newNonce = state.nonce;\\r\\n if (newNonce == oldNonce + 1) {\\r\\n uint256 upkeepID = uint256(\\r\\n keccak256(\\r\\n abi.encodePacked(\\r\\n blockhash(block.number - 1),\\r\\n address(i_registry),\\r\\n uint32(oldNonce)\\r\\n )\\r\\n )\\r\\n );\\r\\n // DEV - Use the upkeepID however you see fit\\r\\n return upkeepID;\\r\\n } else {\\r\\n revert(\\\"auto-approve disabled\\\");\\r\\n }\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x1712d2ac002e57e74e5367f9a88c9466f935fada95bd9ad98111e434110f0b3f\",\"license\":\"MIT\"},\"contracts/factories/CampaignFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../Campaign.sol\\\";\\r\\n\\r\\ncontract CampaignFactory {\\r\\n struct cmpInput {\\r\\n string _title; \\r\\n string _description;\\r\\n string _category;\\r\\n string _tags; \\r\\n uint256 _goalAmount;\\r\\n uint256 _duration;\\r\\n string _imageURI;\\r\\n }\\r\\n\\r\\n function createCampaign(address _crf, address _creator, address _rwdFactory, cmpInput memory _cmp) external returns (address) {\\r\\n Campaign cmp = new Campaign(\\r\\n _crf,\\r\\n payable(_creator),\\r\\n _rwdFactory,\\r\\n _cmp._title,\\r\\n _cmp._description,\\r\\n _cmp._category,\\r\\n _cmp._tags,\\r\\n _cmp._goalAmount,\\r\\n _cmp._duration,\\r\\n _cmp._imageURI\\r\\n );\\r\\n\\r\\n return address(cmp);\\r\\n }\\r\\n}\",\"keccak256\":\"0xae3a189ad6f1504c63d874152a930c38bf2289506a36db75d26107500f0b79a6\",\"license\":\"MIT\"},\"contracts/factories/RewardFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Reward } from \\\"../Reward.sol\\\";\\r\\n\\r\\ncontract RewardFactory {\\r\\n struct rwdInput {\\r\\n uint256 _price;\\r\\n string _title; \\r\\n string _description; \\r\\n string _rpic;\\r\\n string[] _perks; \\r\\n uint256 _deadline; \\r\\n uint256 _quantity; \\r\\n bool _infinite; \\r\\n string[] _shipsTo;\\r\\n }\\r\\n\\r\\n function createReward(address _cmpAddress, address _creator, rwdInput memory _rwd) public returns (address) {\\r\\n Reward rwd = new Reward(\\r\\n _cmpAddress, \\r\\n _creator,\\r\\n _rwd._price,\\r\\n _rwd._title,\\r\\n _rwd._description,\\r\\n _rwd._rpic,\\r\\n _rwd._perks,\\r\\n _rwd._deadline,\\r\\n _rwd._quantity,\\r\\n _rwd._infinite,\\r\\n _rwd._shipsTo \\r\\n );\\r\\n\\r\\n return address(rwd);\\r\\n }\\r\\n}\",\"keccak256\":\"0x025667572f11f51d96b92b058b304512b26a9394374f509ec337a822c2133729\",\"license\":\"MIT\"},\"contracts/libraries/campaign/RefunderLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../../Campaign.sol\\\";\\r\\nimport { Reward } from \\\"../../Reward.sol\\\";\\r\\n\\r\\nlibrary RefunderLib {\\r\\n function refund (\\r\\n address _i_crf,\\r\\n Campaign.refunder_pckg storage _refP, \\r\\n mapping (uint256 => address) storage _rewards, \\r\\n mapping (address => uint256) storage _aggrDons, \\r\\n mapping (address => uint256[]) storage _entDons, \\r\\n address _donator\\r\\n ) external {\\r\\n if(msg.sender != _i_crf){revert();}\\r\\n if(_refP.c_state == Campaign.C_State.Expired){revert();}\\r\\n if(_aggrDons[_donator] == 0 ){revert();}\\r\\n\\r\\n uint256 amountToRefund = _aggrDons[_donator];\\r\\n\\r\\n if(_refP.currentBalance < amountToRefund){revert();}\\r\\n _refP.currentBalance = _refP.currentBalance - amountToRefund;\\r\\n\\r\\n (bool success, ) = payable(_donator).call{value: amountToRefund}(\\\"\\\");\\r\\n if(!success){revert();}\\r\\n\\r\\n delete _aggrDons[_donator];\\r\\n\\r\\n if(_entDons[_donator].length > 0){ \\r\\n for(uint i=0; i<_entDons[_donator].length; i++){\\r\\n if(!(_rewards[_entDons[_donator][i]] != address(0))){\\r\\n Reward(_rewards[_entDons[_donator][i]]).removeDonator(_donator);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n delete _entDons[_donator];\\r\\n }\\r\\n}\",\"keccak256\":\"0xacea134a5959c86c7ca67a50b965a2ad2666dccf020c1e3d97b908a79937da03\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60c06040523480156200001157600080fd5b50604051620014a1380380620014a1833981016040819052620000349162000086565b6001600160a01b0390811660a05216608052620000c9565b60006001600160a01b0382165b92915050565b6200006a816200004c565b81146200007657600080fd5b50565b805162000059816200005f565b600080604083850312156200009e576200009e600080fd5b6000620000ac858562000079565b9250506020620000bf8582860162000079565b9150509250929050565b60805160a0516113a6620000fb60003960008181609d015261059e01526000818160e7015261056d01526113a66000f3fe6080604052600436106100865760003560e01c8063ccf5f27f11610059578063ccf5f27f1461013e578063cd274a401461015e578063e4663a5b1461017e578063fab62a1d1461019e578063fca604d7146101be57600080fd5b806357168c791461008b5780636feb02a1146100d55780639083ef5814610109578063ac3d15fb1461011e575b600080fd5b34801561009757600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516100cc9190610a78565b60405180910390f35b3480156100e157600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b61011c610117366004610abb565b6101e1565b005b34801561012a57600080fd5b5061011c610139366004610af8565b61035b565b34801561014a57600080fd5b5061011c610159366004610d5a565b610553565b34801561016a57600080fd5b5061011c610179366004610d94565b61068d565b34801561018a57600080fd5b5061011c610199366004610af8565b6106db565b3480156101aa57600080fd5b5061011c6101b9366004610e74565b610841565b3480156101ca57600080fd5b506101d460005481565b6040516100cc9190610eca565b6001600160a01b0380831660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa158015610238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025c9190610ee3565b90506000836001600160a01b031634338560405160240161027e929190610f0c565b60408051601f198184030181529181526020820180516001600160e01b0316637be4bae160e01b179052516102b39190610f7c565b60006040518083038185875af1925050503d80600081146102f0576040519150601f19603f3d011682016040523d82523d6000602084013e6102f5565b606091505b50509050801561008657816001600160a01b0316846001600160a01b0316336001600160a01b03167f5f0f580a49a433afc0cd61faf31f545ff739f7874dd091ba39ecfd0383c8462c3460405161034c9190610eca565b60405180910390a45b50505050565b6001600160a01b0380821660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa1580156103b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d69190610ee3565b6001600160a01b03808416600090815260016020526040808220549051629917c560e41b815293945090929116906309917c5090610418903390600401610a78565b602060405180830381865afa158015610435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104599190610f93565b90506000811161046857600080fd5b6000836001600160a01b0316336040516024016104859190610a78565b60408051601f198184030181529181526020820180516001600160e01b0316637d44a00d60e11b179052516104ba9190610f7c565b6000604051808303816000865af19150503d80600081146104f7576040519150601f19603f3d011682016040523d82523d6000602084013e6104fc565b606091505b50509050801561008657826001600160a01b0316846001600160a01b0316336001600160a01b03167fe627e40c5979c5da4cf94d4b3ce15ce68a4103b1480ec047eec9736d39a0123d8560405161034c9190610eca565b604051632213cc3b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063884f30ec906105c890309033907f0000000000000000000000000000000000000000000000000000000000000000908890600401611095565b6020604051808303816000875af11580156105e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060b9190610ee3565b6001600160a01b03811660008181526001602090815260409182902080546001600160a01b0319168417905585519086015186830151606088015160c0890151945196975033967fce55db2394471943657aaa63a10999909b55d5948702c94255bb9ba41ad07e289561068195949392916110d9565b60405180910390a35050565b846001600160a01b03167f10bb073e1ce0977d8bf7b641de8a59b02dd9c9d1c4badc9b30e5a48ac9fc8cb9858585856040516106cc9493929190611145565b60405180910390a25050505050565b6001600160a01b038181166000908152600160209081526040918290205482516358a2b01f60e11b815292513394919091169263b145603e9260048083019391928290030181865afa158015610735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107599190610ee3565b6001600160a01b03161461076c57600080fd5b6001600160a01b03808216600090815260016020908152604080832054815163ce845d1d60e01b815291519394169263ce845d1d926004808401939192918290030181865afa1580156107c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e79190610f93565b11156107f257600080fd5b6001600160a01b03811660008181526001602052604080822080546001600160a01b0319169055517fd41d62ed7a46b1f2f4c0a4c0fa40c95bbe14a7d55034ff9817b743d6cb7935369190a250565b6040516370a0823160e01b8152829082906001600160a01b038216906370a0823190610871908590600401610a78565b602060405180830381865afa15801561088e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b29190610f93565b6108bb57600080fd5b816001600160a01b0316634c7e9be3866001600160a01b03166399a8502d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610908573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261093091908101906111ea565b876207a120896001600160a01b031663b145603e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109979190610ee3565b671bc16d674ec800006040518663ffffffff1660e01b81526004016109c095949392919061128a565b6020604051808303816000875af11580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190610f93565b50600054610a1290600161133d565b6000556040517f4ee76a1c89ccbef26f098ac48c95b7da87fe34749fea8758a71a3dc4ccc28bcd90610a479087903390611355565b60405180910390a15050505050565b60006001600160a01b0382165b92915050565b610a7281610a56565b82525050565b60208101610a638284610a69565b610a8f81610a56565b8114610a9a57600080fd5b50565b8035610a6381610a86565b801515610a8f565b8035610a6381610aa8565b60008060408385031215610ad157610ad1600080fd5b6000610add8585610a9d565b9250506020610aee85828601610ab0565b9150509250929050565b600060208284031215610b0d57610b0d600080fd5b6000610b198484610a9d565b949350505050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715610b5c57610b5c610b21565b6040525050565b6000610b6e60405190565b9050610b7a8282610b37565b919050565b60006001600160401b03821115610b9857610b98610b21565b601f19601f83011660200192915050565b82818337506000910152565b6000610bc8610bc384610b7f565b610b63565b905082815260208101848484011115610be357610be3600080fd5b610bee848285610ba9565b509392505050565b600082601f830112610c0a57610c0a600080fd5b8135610b19848260208601610bb5565b80610a8f565b8035610a6381610c1a565b600060e08284031215610c4057610c40600080fd5b610c4a60e0610b63565b905081356001600160401b03811115610c6557610c65600080fd5b610c7184828501610bf6565b82525060208201356001600160401b03811115610c9057610c90600080fd5b610c9c84828501610bf6565b60208301525060408201356001600160401b03811115610cbe57610cbe600080fd5b610cca84828501610bf6565b60408301525060608201356001600160401b03811115610cec57610cec600080fd5b610cf884828501610bf6565b6060830152506080610d0c84828501610c20565b60808301525060a0610d2084828501610c20565b60a08301525060c08201356001600160401b03811115610d4257610d42600080fd5b610d4e84828501610bf6565b60c08301525092915050565b600060208284031215610d6f57610d6f600080fd5b81356001600160401b03811115610d8857610d88600080fd5b610b1984828501610c2b565b600080600080600060a08688031215610daf57610daf600080fd5b6000610dbb8888610a9d565b95505060208601356001600160401b03811115610dda57610dda600080fd5b610de688828901610bf6565b94505060408601356001600160401b03811115610e0557610e05600080fd5b610e1188828901610bf6565b93505060608601356001600160401b03811115610e3057610e30600080fd5b610e3c88828901610bf6565b92505060808601356001600160401b03811115610e5b57610e5b600080fd5b610e6788828901610bf6565b9150509295509295909350565b600080600060608486031215610e8c57610e8c600080fd5b6000610e988686610a9d565b9350506020610ea986828701610a9d565b9250506040610eba86828701610a9d565b9150509250925092565b80610a72565b60208101610a638284610ec4565b8051610a6381610a86565b600060208284031215610ef857610ef8600080fd5b6000610b198484610ed8565b801515610a72565b60408101610f1a8285610a69565b610f276020830184610f04565b9392505050565b60005b83811015610f49578181015183820152602001610f31565b838111156103555750506000910152565b6000610f64825190565b610f72818560208601610f2e565b9290920192915050565b6000610f278284610f5a565b8051610a6381610c1a565b600060208284031215610fa857610fa8600080fd5b6000610b198484610f88565b6000610fbe825190565b808452602084019350610fd5818560208601610f2e565b601f01601f19169290920192915050565b805160e080845260009190840190610ffe8282610fb4565b915050602083015184820360208601526110188282610fb4565b915050604083015184820360408601526110328282610fb4565b9150506060830151848203606086015261104c8282610fb4565b91505060808301516110616080860182610ec4565b5060a083015161107460a0860182610ec4565b5060c083015184820360c086015261108c8282610fb4565b95945050505050565b608081016110a38287610a69565b6110b06020830186610a69565b6110bd6040830185610a69565b81810360608301526110cf8184610fe6565b9695505050505050565b60a080825281016110ea8188610fb4565b905081810360208301526110fe8187610fb4565b905081810360408301526111128186610fb4565b905081810360608301526111268185610fb4565b9050818103608083015261113a8184610fb4565b979650505050505050565b608080825281016111568187610fb4565b9050818103602083015261116a8186610fb4565b9050818103604083015261117e8185610fb4565b905081810360608301526110cf8184610fb4565b60006111a0610bc384610b7f565b9050828152602081018484840111156111bb576111bb600080fd5b610bee848285610f2e565b600082601f8301126111da576111da600080fd5b8151610b19848260208601611192565b6000602082840312156111ff576111ff600080fd5b81516001600160401b0381111561121857611218600080fd5b610b19848285016111c6565b600063ffffffff8216610a63565b610a7281611224565b60006001600160a01b038216610a63565b6000610a638261123b565b6000610a638261124c565b610a7281611257565b60006bffffffffffffffffffffffff8216610a63565b610a728161126b565b610100808252810161129c8188610fb4565b905081810360208301526112bf816002815261060f60f31b602082015260400190565b90506112ce6040830187610a69565b6112db6060830186611232565b6112e86080830185611262565b81810360a08301819052600280835261060f60f31b60208401819052604092830160c08601529183015260608201526080016110cf60e0830184611281565b634e487b7160e01b600052601160045260246000fd5b6000821982111561135057611350611327565b500190565b604081016113638285610a69565b610f276020830184610a6956fea26469706673582212201a6bb3673ede82e05b1e06ff47b18284874c19a62b0193e843322541672f496464736f6c634300080b0033", + "deployedBytecode": "0x6080604052600436106100865760003560e01c8063ccf5f27f11610059578063ccf5f27f1461013e578063cd274a401461015e578063e4663a5b1461017e578063fab62a1d1461019e578063fca604d7146101be57600080fd5b806357168c791461008b5780636feb02a1146100d55780639083ef5814610109578063ac3d15fb1461011e575b600080fd5b34801561009757600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516100cc9190610a78565b60405180910390f35b3480156100e157600080fd5b506100bf7f000000000000000000000000000000000000000000000000000000000000000081565b61011c610117366004610abb565b6101e1565b005b34801561012a57600080fd5b5061011c610139366004610af8565b61035b565b34801561014a57600080fd5b5061011c610159366004610d5a565b610553565b34801561016a57600080fd5b5061011c610179366004610d94565b61068d565b34801561018a57600080fd5b5061011c610199366004610af8565b6106db565b3480156101aa57600080fd5b5061011c6101b9366004610e74565b610841565b3480156101ca57600080fd5b506101d460005481565b6040516100cc9190610eca565b6001600160a01b0380831660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa158015610238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025c9190610ee3565b90506000836001600160a01b031634338560405160240161027e929190610f0c565b60408051601f198184030181529181526020820180516001600160e01b0316637be4bae160e01b179052516102b39190610f7c565b60006040518083038185875af1925050503d80600081146102f0576040519150601f19603f3d011682016040523d82523d6000602084013e6102f5565b606091505b50509050801561008657816001600160a01b0316846001600160a01b0316336001600160a01b03167f5f0f580a49a433afc0cd61faf31f545ff739f7874dd091ba39ecfd0383c8462c3460405161034c9190610eca565b60405180910390a45b50505050565b6001600160a01b0380821660009081526001602090815260408083205481516358a2b01f60e11b815291519394169263b145603e926004808401939192918290030181865afa1580156103b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d69190610ee3565b6001600160a01b03808416600090815260016020526040808220549051629917c560e41b815293945090929116906309917c5090610418903390600401610a78565b602060405180830381865afa158015610435573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104599190610f93565b90506000811161046857600080fd5b6000836001600160a01b0316336040516024016104859190610a78565b60408051601f198184030181529181526020820180516001600160e01b0316637d44a00d60e11b179052516104ba9190610f7c565b6000604051808303816000865af19150503d80600081146104f7576040519150601f19603f3d011682016040523d82523d6000602084013e6104fc565b606091505b50509050801561008657826001600160a01b0316846001600160a01b0316336001600160a01b03167fe627e40c5979c5da4cf94d4b3ce15ce68a4103b1480ec047eec9736d39a0123d8560405161034c9190610eca565b604051632213cc3b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063884f30ec906105c890309033907f0000000000000000000000000000000000000000000000000000000000000000908890600401611095565b6020604051808303816000875af11580156105e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060b9190610ee3565b6001600160a01b03811660008181526001602090815260409182902080546001600160a01b0319168417905585519086015186830151606088015160c0890151945196975033967fce55db2394471943657aaa63a10999909b55d5948702c94255bb9ba41ad07e289561068195949392916110d9565b60405180910390a35050565b846001600160a01b03167f10bb073e1ce0977d8bf7b641de8a59b02dd9c9d1c4badc9b30e5a48ac9fc8cb9858585856040516106cc9493929190611145565b60405180910390a25050505050565b6001600160a01b038181166000908152600160209081526040918290205482516358a2b01f60e11b815292513394919091169263b145603e9260048083019391928290030181865afa158015610735573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107599190610ee3565b6001600160a01b03161461076c57600080fd5b6001600160a01b03808216600090815260016020908152604080832054815163ce845d1d60e01b815291519394169263ce845d1d926004808401939192918290030181865afa1580156107c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e79190610f93565b11156107f257600080fd5b6001600160a01b03811660008181526001602052604080822080546001600160a01b0319169055517fd41d62ed7a46b1f2f4c0a4c0fa40c95bbe14a7d55034ff9817b743d6cb7935369190a250565b6040516370a0823160e01b8152829082906001600160a01b038216906370a0823190610871908590600401610a78565b602060405180830381865afa15801561088e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b29190610f93565b6108bb57600080fd5b816001600160a01b0316634c7e9be3866001600160a01b03166399a8502d6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610908573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261093091908101906111ea565b876207a120896001600160a01b031663b145603e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610973573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109979190610ee3565b671bc16d674ec800006040518663ffffffff1660e01b81526004016109c095949392919061128a565b6020604051808303816000875af11580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190610f93565b50600054610a1290600161133d565b6000556040517f4ee76a1c89ccbef26f098ac48c95b7da87fe34749fea8758a71a3dc4ccc28bcd90610a479087903390611355565b60405180910390a15050505050565b60006001600160a01b0382165b92915050565b610a7281610a56565b82525050565b60208101610a638284610a69565b610a8f81610a56565b8114610a9a57600080fd5b50565b8035610a6381610a86565b801515610a8f565b8035610a6381610aa8565b60008060408385031215610ad157610ad1600080fd5b6000610add8585610a9d565b9250506020610aee85828601610ab0565b9150509250929050565b600060208284031215610b0d57610b0d600080fd5b6000610b198484610a9d565b949350505050565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b0382111715610b5c57610b5c610b21565b6040525050565b6000610b6e60405190565b9050610b7a8282610b37565b919050565b60006001600160401b03821115610b9857610b98610b21565b601f19601f83011660200192915050565b82818337506000910152565b6000610bc8610bc384610b7f565b610b63565b905082815260208101848484011115610be357610be3600080fd5b610bee848285610ba9565b509392505050565b600082601f830112610c0a57610c0a600080fd5b8135610b19848260208601610bb5565b80610a8f565b8035610a6381610c1a565b600060e08284031215610c4057610c40600080fd5b610c4a60e0610b63565b905081356001600160401b03811115610c6557610c65600080fd5b610c7184828501610bf6565b82525060208201356001600160401b03811115610c9057610c90600080fd5b610c9c84828501610bf6565b60208301525060408201356001600160401b03811115610cbe57610cbe600080fd5b610cca84828501610bf6565b60408301525060608201356001600160401b03811115610cec57610cec600080fd5b610cf884828501610bf6565b6060830152506080610d0c84828501610c20565b60808301525060a0610d2084828501610c20565b60a08301525060c08201356001600160401b03811115610d4257610d42600080fd5b610d4e84828501610bf6565b60c08301525092915050565b600060208284031215610d6f57610d6f600080fd5b81356001600160401b03811115610d8857610d88600080fd5b610b1984828501610c2b565b600080600080600060a08688031215610daf57610daf600080fd5b6000610dbb8888610a9d565b95505060208601356001600160401b03811115610dda57610dda600080fd5b610de688828901610bf6565b94505060408601356001600160401b03811115610e0557610e05600080fd5b610e1188828901610bf6565b93505060608601356001600160401b03811115610e3057610e30600080fd5b610e3c88828901610bf6565b92505060808601356001600160401b03811115610e5b57610e5b600080fd5b610e6788828901610bf6565b9150509295509295909350565b600080600060608486031215610e8c57610e8c600080fd5b6000610e988686610a9d565b9350506020610ea986828701610a9d565b9250506040610eba86828701610a9d565b9150509250925092565b80610a72565b60208101610a638284610ec4565b8051610a6381610a86565b600060208284031215610ef857610ef8600080fd5b6000610b198484610ed8565b801515610a72565b60408101610f1a8285610a69565b610f276020830184610f04565b9392505050565b60005b83811015610f49578181015183820152602001610f31565b838111156103555750506000910152565b6000610f64825190565b610f72818560208601610f2e565b9290920192915050565b6000610f278284610f5a565b8051610a6381610c1a565b600060208284031215610fa857610fa8600080fd5b6000610b198484610f88565b6000610fbe825190565b808452602084019350610fd5818560208601610f2e565b601f01601f19169290920192915050565b805160e080845260009190840190610ffe8282610fb4565b915050602083015184820360208601526110188282610fb4565b915050604083015184820360408601526110328282610fb4565b9150506060830151848203606086015261104c8282610fb4565b91505060808301516110616080860182610ec4565b5060a083015161107460a0860182610ec4565b5060c083015184820360c086015261108c8282610fb4565b95945050505050565b608081016110a38287610a69565b6110b06020830186610a69565b6110bd6040830185610a69565b81810360608301526110cf8184610fe6565b9695505050505050565b60a080825281016110ea8188610fb4565b905081810360208301526110fe8187610fb4565b905081810360408301526111128186610fb4565b905081810360608301526111268185610fb4565b9050818103608083015261113a8184610fb4565b979650505050505050565b608080825281016111568187610fb4565b9050818103602083015261116a8186610fb4565b9050818103604083015261117e8185610fb4565b905081810360608301526110cf8184610fb4565b60006111a0610bc384610b7f565b9050828152602081018484840111156111bb576111bb600080fd5b610bee848285610f2e565b600082601f8301126111da576111da600080fd5b8151610b19848260208601611192565b6000602082840312156111ff576111ff600080fd5b81516001600160401b0381111561121857611218600080fd5b610b19848285016111c6565b600063ffffffff8216610a63565b610a7281611224565b60006001600160a01b038216610a63565b6000610a638261123b565b6000610a638261124c565b610a7281611257565b60006bffffffffffffffffffffffff8216610a63565b610a728161126b565b610100808252810161129c8188610fb4565b905081810360208301526112bf816002815261060f60f31b602082015260400190565b90506112ce6040830187610a69565b6112db6060830186611232565b6112e86080830185611262565b81810360a08301819052600280835261060f60f31b60208401819052604092830160c08601529183015260608201526080016110cf60e0830184611281565b634e487b7160e01b600052601160045260246000fd5b6000821982111561135057611350611327565b500190565b604081016113638285610a69565b610f276020830184610a6956fea26469706673582212201a6bb3673ede82e05b1e06ff47b18284874c19a62b0193e843322541672f496464736f6c634300080b0033", "libraries": { - "RefunderLib": "0xC9bDfa0822e14bcc54e68229C1EDb13539c43E46" + "RefunderLib": "0xaba71389D5f81a8C1380D88AF36F7823d5e0cb80" }, "devdoc": { "kind": "dev", diff --git a/deployments/sepolia/RefunderLib.json b/deployments/sepolia/RefunderLib.json index ff92957..10255d7 100644 --- a/deployments/sepolia/RefunderLib.json +++ b/deployments/sepolia/RefunderLib.json @@ -1,28 +1,28 @@ { - "address": "0xC9bDfa0822e14bcc54e68229C1EDb13539c43E46", + "address": "0xaba71389D5f81a8C1380D88AF36F7823d5e0cb80", "abi": [], - "transactionHash": "0xf1d63f7ae11f20dafd2c59c899811a7c53e75f4ed2f1e15483ce7de9de66fdf3", + "transactionHash": "0x3fff59fbd37f66d406c5b6b7655b57e845e3d8215e50fe330246412c985c33d9", "receipt": { "to": null, - "from": "0x3f3c2A0AB4E3c081979FaCB10Bf3c9E1A4DB44A3", - "contractAddress": "0xC9bDfa0822e14bcc54e68229C1EDb13539c43E46", - "transactionIndex": 74, - "gasUsed": "315665", + "from": "0x571Dac692B7b76301c7c2BFD2dB0BD8fDf6eD54C", + "contractAddress": "0xaba71389D5f81a8C1380D88AF36F7823d5e0cb80", + "transactionIndex": 59, + "gasUsed": "315653", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x9308a0604877975aa8301cddc59fb15324f54f339c88eeadb6c5cfbabe09006c", - "transactionHash": "0xf1d63f7ae11f20dafd2c59c899811a7c53e75f4ed2f1e15483ce7de9de66fdf3", + "blockHash": "0x942c58b4a50acd8b37664f83ac9fb6443cf35136b644f2ddcd05559b3c89db19", + "transactionHash": "0x3fff59fbd37f66d406c5b6b7655b57e845e3d8215e50fe330246412c985c33d9", "logs": [], - "blockNumber": 3634550, - "cumulativeGasUsed": "6135992", + "blockNumber": 4190591, + "cumulativeGasUsed": "9842378", "status": 1, "byzantium": true }, "args": [], - "numDeployments": 2, - "solcInputHash": "d728c752d0773b76f850663011342c47", - "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/campaign/RefunderLib.sol\":\"RefunderLib\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n/**\\n * @notice This is a deprecated interface. Please use AutomationCompatibleInterface directly.\\n */\\npragma solidity ^0.8.0;\\nimport {AutomationCompatibleInterface as KeeperCompatibleInterface} from \\\"./AutomationCompatibleInterface.sol\\\";\\n\",\"keccak256\":\"0xac76a31c20c6d66196247376d113a0f19229569ab8c123989649d50be3333e0a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x0e9621f60b2faabe65549f7ed0f24e8853a45c1b7990d47e8160e523683f3935\",\"license\":\"MIT\"},\"contracts/Campaign.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\r\\nimport \\\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\\\";\\r\\nimport { Reward } from \\\"./Reward.sol\\\";\\r\\nimport { RewardFactory } from \\\"./factories/RewardFactory.sol\\\";\\r\\nimport { RefunderLib } from \\\"./libraries/campaign/RefunderLib.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Cmp_NIS(); /**not in state */\\r\\n// error Cmp_NotCrtr();\\r\\n// error Cmp_DIC(); /**donator is creator */\\r\\n// error Cmp_NoDns();\\r\\n// error Cmp_RefF();\\r\\n// error Cmp_UpkNN();\\r\\n// error Cmp_NotRef();\\r\\n// error Cmp_Bankrupt();\\r\\n\\r\\ncontract Campaign is KeeperCompatibleInterface, ReentrancyGuard{\\r\\n\\r\\n // enums\\r\\n enum C_State {\\r\\n Fundraising,\\r\\n Expired,\\r\\n Canceled\\r\\n }\\r\\n\\r\\n // c_state variables\\r\\n address immutable public i_crf;\\r\\n address payable immutable public i_creator;\\r\\n address immutable public i_rwdFactory;\\r\\n string public s_title;\\r\\n string public s_description;\\r\\n string public s_category;\\r\\n string public s_imageURI;\\r\\n string public s_campaignURI;\\r\\n string public s_tags;\\r\\n uint256 public goalAmount;\\r\\n uint256 public duration;\\r\\n uint256 public currentBalance;\\r\\n uint256 private immutable i_initTimeStamp;\\r\\n uint256 private constant i_maxDur = 5184000;\\r\\n uint256 public deadline;\\r\\n uint256 private rId;\\r\\n C_State public c_state = C_State.Fundraising; // default c_state\\r\\n\\r\\n struct CampaignObject {\\r\\n address i_creator;\\r\\n string s_title;\\r\\n string s_description;\\r\\n string s_category;\\r\\n string s_tags;\\r\\n uint256 goalAmount;\\r\\n uint256 duration;\\r\\n uint256 currentBalance;\\r\\n C_State currentC_State;\\r\\n string s_imageURI;\\r\\n string s_campaignURI;\\r\\n uint256 deadline;\\r\\n }\\r\\n\\r\\n struct refunder_pckg {\\r\\n uint256 currentBalance;\\r\\n C_State c_state;\\r\\n }\\r\\n\\r\\n // mapping (uint256 => reward) public rewards;\\r\\n mapping (uint256 => address) public rewards;\\r\\n mapping (address => uint256[]) public entDonations;\\r\\n mapping (address => uint256) public aggrDonations;\\r\\n\\r\\n uint256[] public rKeys;\\r\\n\\r\\n // events\\r\\n event FundingRecieved (\\r\\n address indexed contributor,\\r\\n uint256 amount,\\r\\n uint256 currentBalance\\r\\n );\\r\\n event CreatorPaid(address creator, address campaignAddress);\\r\\n event CampaignExpired(address campaignAddress);\\r\\n event CampaignCanceled();\\r\\n\\r\\n // modifiers\\r\\n modifier isCreator() {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n _;\\r\\n }\\r\\n\\r\\n refunder_pckg _refP;\\r\\n\\r\\n constructor (\\r\\n address _crowdfunder,\\r\\n address _creator,\\r\\n address _rwdFactory,\\r\\n string memory _title,\\r\\n string memory _description,\\r\\n string memory _category,\\r\\n string memory _tags,\\r\\n uint256 _goalAmount,\\r\\n uint256 _duration,\\r\\n string memory _imageURI\\r\\n ) {\\r\\n i_rwdFactory = _rwdFactory;\\r\\n i_crf = _crowdfunder;\\r\\n i_creator = payable(_creator);\\r\\n s_title = _title;\\r\\n s_description = _description;\\r\\n s_category = _category;\\r\\n s_tags = _tags;\\r\\n goalAmount = _goalAmount;\\r\\n i_initTimeStamp = block.timestamp;\\r\\n duration = _duration > i_maxDur ? i_maxDur : _duration;\\r\\n deadline = i_initTimeStamp + duration;\\r\\n s_imageURI = _imageURI;\\r\\n currentBalance = 0;\\r\\n }\\r\\n\\r\\n\\r\\n function donate(address _donator, bool _rewardable) public payable nonReentrant{\\r\\n if(msg.sender != i_crf){revert();}\\r\\n if(c_state != C_State.Fundraising){revert();}\\r\\n if(_donator == i_creator){revert();}\\r\\n currentBalance = currentBalance + msg.value;\\r\\n if(_rewardable){\\r\\n if(rewards[msg.value] != address(0)){\\r\\n (bool success, ) = rewards[msg.value].call(abi.encodeWithSignature(\\\"addDonator(address)\\\", _donator));\\r\\n if(!success){revert();}\\r\\n entDonations[_donator].push(msg.value);\\r\\n }else{revert();}\\r\\n }\\r\\n aggrDonations[_donator] = aggrDonations[_donator] + msg.value; \\r\\n emit FundingRecieved(_donator, msg.value, currentBalance);\\r\\n }\\r\\n\\r\\n /**\\r\\n @dev this is the function chainlink keepers calls\\r\\n chekupkeep returns true to trigger the action after the interval has passed\\r\\n */\\r\\n function checkUpkeep(bytes memory /**checkData */) public view override\\r\\n returns (bool upkeepNeeded, bytes memory /**performData */) \\r\\n {\\r\\n bool isOpen = c_state == C_State.Fundraising;\\r\\n bool timePassed = ((block.timestamp - i_initTimeStamp) > duration);\\r\\n upkeepNeeded = (timePassed && isOpen);\\r\\n return (upkeepNeeded, \\\"0x0\\\");\\r\\n }\\r\\n\\r\\n function performUpkeep(bytes calldata /**performData */) external override {\\r\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\r\\n if(!upkeepNeeded){revert();}\\r\\n c_state = C_State.Expired;\\r\\n emit CampaignExpired(address(this));\\r\\n }\\r\\n\\r\\n function payout() external isCreator{\\r\\n if(c_state != C_State.Expired){revert();}\\r\\n uint256 totalRaised = currentBalance;\\r\\n currentBalance = 0;\\r\\n (bool success, ) = i_creator.call{value: totalRaised}(\\\"\\\");\\r\\n if(success){\\r\\n emit CreatorPaid(i_creator, address(this));\\r\\n }\\r\\n else{revert();}\\r\\n }\\r\\n\\r\\n\\r\\n function refund(address _donator) external nonReentrant{\\r\\n _refP = refunder_pckg(currentBalance, c_state);\\r\\n RefunderLib.refund(i_crf, _refP, rewards, aggrDonations, entDonations, _donator);\\r\\n }\\r\\n\\r\\n function makeReward(RewardFactory.rwdInput memory _rwd) external isCreator {\\r\\n if(rewards[_rwd._price] != address(0)){revert();}\\r\\n rKeys.push(_rwd._price);\\r\\n address newReward = RewardFactory(i_rwdFactory).createReward(address(this), i_creator, _rwd);\\r\\n rewards[_rwd._price] = newReward;\\r\\n }\\r\\n\\r\\n function endCampaign() external isCreator {\\r\\n if(c_state == C_State.Expired){revert();}\\r\\n c_state = C_State.Canceled;\\r\\n emit CampaignCanceled();\\r\\n }\\r\\n\\r\\n // update functions\\r\\n function updateCampaignURI(string memory _campaignURI) external isCreator {\\r\\n s_campaignURI = _campaignURI;\\r\\n }\\r\\n\\r\\n function updateDur(uint256 _addedDur) external isCreator {\\r\\n duration = (((duration + _addedDur)) > i_maxDur) ? i_maxDur : (duration + _addedDur);\\r\\n deadline = i_initTimeStamp + duration;\\r\\n }\\r\\n\\r\\n // getter functions\\r\\n function getRewardKeys() external view returns(uint256[] memory){\\r\\n return rKeys;\\r\\n }\\r\\n \\r\\n function getReward(uint256 _priceID) external view returns(Reward.RewardObject memory) {\\r\\n Reward reward = Reward(rewards[_priceID]);\\r\\n return reward.getRewardDetails();\\r\\n }\\r\\n\\r\\n function getCampaignDetails() external view returns(CampaignObject memory) {\\r\\n return CampaignObject(\\r\\n i_creator,\\r\\n s_title, \\r\\n s_description,\\r\\n s_category,\\r\\n s_tags,\\r\\n goalAmount,\\r\\n duration,\\r\\n currentBalance,\\r\\n c_state,\\r\\n s_imageURI,\\r\\n s_campaignURI,\\r\\n deadline\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0xba4854907f5316e4e515f78099f50c65545c9a72971d15b7a6cdc607a93f548f\",\"license\":\"MIT\"},\"contracts/Reward.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\ncontract Reward {\\r\\n address public immutable i_campaignAddress;\\r\\n // address public immutable i_crf;\\r\\n address public immutable i_creator;\\r\\n\\r\\n uint256 public immutable i_price;\\r\\n string public title;\\r\\n string public description;\\r\\n string public rpic;\\r\\n string[] public perks;\\r\\n uint256 public delDate;\\r\\n uint256 public quantity;\\r\\n bool public infinite = true;\\r\\n string[] public shipsTo;\\r\\n address[] public donators;\\r\\n string public surveyLink;\\r\\n\\r\\n struct RewardObject {\\r\\n uint256 price;\\r\\n string title;\\r\\n string description;\\r\\n string rpic;\\r\\n string[] perks;\\r\\n uint256 delDate;\\r\\n uint256 quantity;\\r\\n bool infinite;\\r\\n string[] shipsTo;\\r\\n address[] donators;\\r\\n string surveyLink;\\r\\n }\\r\\n\\r\\n mapping (address => uint256) public true_donator; \\r\\n mapping (address => string) public surveyResponses;\\r\\n\\r\\n constructor ( \\r\\n address _campaignAddress, \\r\\n address _creator,\\r\\n uint256 _price, \\r\\n string memory _title, \\r\\n string memory _description, \\r\\n string memory _rpic,\\r\\n string[] memory _perks, \\r\\n uint256 _deadline, \\r\\n uint256 _quantity, \\r\\n bool _infinite, \\r\\n string[] memory _shipsTo\\r\\n ) {\\r\\n i_price = _price;\\r\\n i_campaignAddress = _campaignAddress;\\r\\n i_creator = _creator;\\r\\n\\r\\n title = _title;\\r\\n description = _description;\\r\\n rpic = _rpic;\\r\\n perks = _perks;\\r\\n delDate = _deadline;\\r\\n quantity = _quantity;\\r\\n infinite = _infinite;\\r\\n shipsTo = _shipsTo;\\r\\n }\\r\\n\\r\\n function updateSurveyLink(string memory _surveylink) external {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n surveyLink = _surveylink;\\r\\n }\\r\\n\\r\\n function addDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if((true_donator[_donator] > 0)){revert();} // already has id ...has therefor donated for this reward before\\r\\n\\r\\n if(!infinite){\\r\\n if(quantity > 0){\\r\\n quantity = quantity - 1;\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }else{revert();} // rwd has finished no longer available\\r\\n }else{\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }\\r\\n }\\r\\n\\r\\n function getDonators() external view returns(address[] memory){\\r\\n return donators;\\r\\n }\\r\\n\\r\\n function removeDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if(!(true_donator[_donator] > 0)){revert();} // not a donator\\r\\n uint256 index = true_donator[_donator] - 1;\\r\\n delete donators[index];\\r\\n delete true_donator[_donator];\\r\\n }\\r\\n\\r\\n function respondToSurvey(string memory _response) external {\\r\\n if(!(true_donator[msg.sender] > 0)){revert();} // not a donator\\r\\n surveyResponses[msg.sender] = _response;\\r\\n }\\r\\n\\r\\n function getRewardDetails() external view returns(RewardObject memory){\\r\\n return RewardObject(\\r\\n i_price,\\r\\n title,\\r\\n description,\\r\\n rpic,\\r\\n perks,\\r\\n delDate,\\r\\n quantity,\\r\\n infinite,\\r\\n shipsTo,\\r\\n donators,\\r\\n surveyLink\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0x16520b0d7ec2ca2e9c34cc0738e1db48661eef392ca464f8b0ee003169d06603\",\"license\":\"MIT\"},\"contracts/factories/RewardFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Reward } from \\\"../Reward.sol\\\";\\r\\n\\r\\ncontract RewardFactory {\\r\\n struct rwdInput {\\r\\n uint256 _price;\\r\\n string _title; \\r\\n string _description; \\r\\n string _rpic;\\r\\n string[] _perks; \\r\\n uint256 _deadline; \\r\\n uint256 _quantity; \\r\\n bool _infinite; \\r\\n string[] _shipsTo;\\r\\n }\\r\\n\\r\\n function createReward(address _cmpAddress, address _creator, rwdInput memory _rwd) public returns (address) {\\r\\n Reward rwd = new Reward(\\r\\n _cmpAddress, \\r\\n _creator,\\r\\n _rwd._price,\\r\\n _rwd._title,\\r\\n _rwd._description,\\r\\n _rwd._rpic,\\r\\n _rwd._perks,\\r\\n _rwd._deadline,\\r\\n _rwd._quantity,\\r\\n _rwd._infinite,\\r\\n _rwd._shipsTo \\r\\n );\\r\\n\\r\\n return address(rwd);\\r\\n }\\r\\n}\",\"keccak256\":\"0x025667572f11f51d96b92b058b304512b26a9394374f509ec337a822c2133729\",\"license\":\"MIT\"},\"contracts/libraries/campaign/RefunderLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../../Campaign.sol\\\";\\r\\nimport { Reward } from \\\"../../Reward.sol\\\";\\r\\n\\r\\nlibrary RefunderLib {\\r\\n function refund (\\r\\n address _i_crf,\\r\\n Campaign.refunder_pckg storage _refP, \\r\\n mapping (uint256 => address) storage _rewards, \\r\\n mapping (address => uint256) storage _aggrDons, \\r\\n mapping (address => uint256[]) storage _entDons, \\r\\n address _donator\\r\\n ) external {\\r\\n if(msg.sender != _i_crf){revert();}\\r\\n if(_refP.c_state == Campaign.C_State.Expired){revert();}\\r\\n if(_aggrDons[_donator] == 0 ){revert();}\\r\\n\\r\\n uint256 amountToRefund = _aggrDons[_donator];\\r\\n\\r\\n if(_refP.currentBalance < amountToRefund){revert();}\\r\\n _refP.currentBalance = _refP.currentBalance - amountToRefund;\\r\\n\\r\\n (bool success, ) = payable(_donator).call{value: amountToRefund}(\\\"\\\");\\r\\n if(!success){revert();}\\r\\n\\r\\n delete _aggrDons[_donator];\\r\\n\\r\\n if(_entDons[_donator].length > 0){ \\r\\n for(uint i=0; i<_entDons[_donator].length; i++){\\r\\n if(!(_rewards[_entDons[_donator][i]] != address(0))){\\r\\n Reward(_rewards[_entDons[_donator][i]]).removeDonator(_donator);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n delete _entDons[_donator];\\r\\n }\\r\\n}\",\"keccak256\":\"0xacea134a5959c86c7ca67a50b965a2ad2666dccf020c1e3d97b908a79937da03\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x6104bf61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80637314d79c1461003a575b600080fd5b81801561004657600080fd5b5061005a610055366004610366565b61005c565b005b336001600160a01b0387161461007157600080fd5b60018086015460ff16600281111561008b5761008b6103f0565b141561009657600080fd5b6001600160a01b0381166000908152602084905260409020546100b857600080fd5b6001600160a01b03811660009081526020849052604090205485548111156100df57600080fd5b85546100ec90829061041c565b86556040516000906001600160a01b03841690839061010a90610433565b60006040518083038185875af1925050503d8060008114610147576040519150601f19603f3d011682016040523d82523d6000602084013e61014c565b606091505b505090508061015a57600080fd5b6001600160a01b03831660009081526020868152604080832083905590869052902054156102be5760005b6001600160a01b0384166000908152602086905260409020548110156102bc576001600160a01b0384166000908152602086905260408120805489918391859081106101d3576101d361043b565b600091825260208083209091015483528201929092526040019020546001600160a01b031614156102aa576001600160a01b03841660009081526020869052604081208054899291908490811061022c5761022c61043b565b60009182526020808320909101548352820192909252604090810190912054905163c91e986d60e01b81526001600160a01b039091169063c91e986d90610277908790600401610460565b600060405180830381600087803b15801561029157600080fd5b505af11580156102a5573d6000803e3d6000fd5b505050505b806102b48161046e565b915050610185565b505b6001600160a01b03831660009081526020859052604081206102df916102e9565b5050505050505050565b5080546000825590600052602060002090810190610307919061030a565b50565b5b8082111561031f576000815560010161030b565b5090565b60006001600160a01b0382165b92915050565b61033f81610323565b811461030757600080fd5b803561033081610336565b8061033f565b803561033081610355565b60008060008060008060c0878903121561038257610382600080fd5b600061038e898961034a565b965050602061039f89828a0161035b565b95505060406103b089828a0161035b565b94505060606103c189828a0161035b565b93505060806103d289828a0161035b565b92505060a06103e389828a0161034a565b9150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561042e5761042e610406565b500390565b600081610330565b634e487b7160e01b600052603260045260246000fd5b61045a81610323565b82525050565b602081016103308284610451565b600060001982141561048257610482610406565b506001019056fea2646970667358221220f70dda3cc8fff5365fce32d219e4fb54cbc47011e928b40b1ce2baa820163b8264736f6c634300080b0033", - "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80637314d79c1461003a575b600080fd5b81801561004657600080fd5b5061005a610055366004610366565b61005c565b005b336001600160a01b0387161461007157600080fd5b60018086015460ff16600281111561008b5761008b6103f0565b141561009657600080fd5b6001600160a01b0381166000908152602084905260409020546100b857600080fd5b6001600160a01b03811660009081526020849052604090205485548111156100df57600080fd5b85546100ec90829061041c565b86556040516000906001600160a01b03841690839061010a90610433565b60006040518083038185875af1925050503d8060008114610147576040519150601f19603f3d011682016040523d82523d6000602084013e61014c565b606091505b505090508061015a57600080fd5b6001600160a01b03831660009081526020868152604080832083905590869052902054156102be5760005b6001600160a01b0384166000908152602086905260409020548110156102bc576001600160a01b0384166000908152602086905260408120805489918391859081106101d3576101d361043b565b600091825260208083209091015483528201929092526040019020546001600160a01b031614156102aa576001600160a01b03841660009081526020869052604081208054899291908490811061022c5761022c61043b565b60009182526020808320909101548352820192909252604090810190912054905163c91e986d60e01b81526001600160a01b039091169063c91e986d90610277908790600401610460565b600060405180830381600087803b15801561029157600080fd5b505af11580156102a5573d6000803e3d6000fd5b505050505b806102b48161046e565b915050610185565b505b6001600160a01b03831660009081526020859052604081206102df916102e9565b5050505050505050565b5080546000825590600052602060002090810190610307919061030a565b50565b5b8082111561031f576000815560010161030b565b5090565b60006001600160a01b0382165b92915050565b61033f81610323565b811461030757600080fd5b803561033081610336565b8061033f565b803561033081610355565b60008060008060008060c0878903121561038257610382600080fd5b600061038e898961034a565b965050602061039f89828a0161035b565b95505060406103b089828a0161035b565b94505060606103c189828a0161035b565b93505060806103d289828a0161035b565b92505060a06103e389828a0161034a565b9150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561042e5761042e610406565b500390565b600081610330565b634e487b7160e01b600052603260045260246000fd5b61045a81610323565b82525050565b602081016103308284610451565b600060001982141561048257610482610406565b506001019056fea2646970667358221220f70dda3cc8fff5365fce32d219e4fb54cbc47011e928b40b1ce2baa820163b8264736f6c634300080b0033", + "numDeployments": 3, + "solcInputHash": "29f2960a323d69a7be5b01d1ca776898", + "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/campaign/RefunderLib.sol\":\"RefunderLib\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":false},\"runs\":200},\"remappings\":[]},\"sources\":{\"@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface AutomationCompatibleInterface {\\n /**\\n * @notice method that is simulated by the keepers to see if any work actually\\n * needs to be performed. This method does does not actually need to be\\n * executable, and since it is only ever simulated it can consume lots of gas.\\n * @dev To ensure that it is never called, you may want to add the\\n * cannotExecute modifier from KeeperBase to your implementation of this\\n * method.\\n * @param checkData specified in the upkeep registration so it is always the\\n * same for a registered upkeep. This can easily be broken down into specific\\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\\n * same contract and easily differentiated by the contract.\\n * @return upkeepNeeded boolean to indicate whether the keeper should call\\n * performUpkeep or not.\\n * @return performData bytes that the keeper should call performUpkeep with, if\\n * upkeep is needed. If you would like to encode data to decode later, try\\n * `abi.encode`.\\n */\\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\\n\\n /**\\n * @notice method that is actually executed by the keepers, via the registry.\\n * The data returned by the checkUpkeep simulation will be passed into\\n * this method to actually be executed.\\n * @dev The input to this method should not be trusted, and the caller of the\\n * method should not even be restricted to any single registry. Anyone should\\n * be able call it, and the input should be validated, there is no guarantee\\n * that the data passed in is the performData returned from checkUpkeep. This\\n * could happen due to malicious keepers, racing keepers, or simply a state\\n * change while the performUpkeep transaction is waiting for confirmation.\\n * Always validate the data passed in.\\n * @param performData is the data which was passed back from the checkData\\n * simulation. If it is encoded, it can easily be decoded into other types by\\n * calling `abi.decode`. This data should not be trusted, and should be\\n * validated against the contract's current state.\\n */\\n function performUpkeep(bytes calldata performData) external;\\n}\\n\",\"keccak256\":\"0x67076747c6f66d8d43472a56e72879c350056bff82e069addaf9064922863340\",\"license\":\"MIT\"},\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n/**\\n * @notice This is a deprecated interface. Please use AutomationCompatibleInterface directly.\\n */\\npragma solidity ^0.8.0;\\nimport {AutomationCompatibleInterface as KeeperCompatibleInterface} from \\\"./AutomationCompatibleInterface.sol\\\";\\n\",\"keccak256\":\"0xac76a31c20c6d66196247376d113a0f19229569ab8c123989649d50be3333e0a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0x0e9621f60b2faabe65549f7ed0f24e8853a45c1b7990d47e8160e523683f3935\",\"license\":\"MIT\"},\"contracts/Campaign.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\r\\nimport \\\"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\\\";\\r\\nimport {Reward} from \\\"./Reward.sol\\\";\\r\\nimport {RewardFactory} from \\\"./factories/RewardFactory.sol\\\";\\r\\nimport {RefunderLib} from \\\"./libraries/campaign/RefunderLib.sol\\\";\\r\\n\\r\\n// errors\\r\\n// error Cmp_NIS(); /**not in state */\\r\\n// error Cmp_NotCrtr();\\r\\n// error Cmp_DIC(); /**donator is creator */\\r\\n// error Cmp_NoDns();\\r\\n// error Cmp_RefF();\\r\\n// error Cmp_UpkNN();\\r\\n// error Cmp_NotRef();\\r\\n// error Cmp_Bankrupt();\\r\\n\\r\\ncontract Campaign is KeeperCompatibleInterface, ReentrancyGuard {\\r\\n // enums\\r\\n enum C_State {\\r\\n Fundraising,\\r\\n Expired,\\r\\n Canceled\\r\\n }\\r\\n\\r\\n // c_state variables\\r\\n address public immutable i_crf;\\r\\n address payable public immutable i_creator;\\r\\n address public immutable i_rwdFactory;\\r\\n string public s_title;\\r\\n string public s_description;\\r\\n string public s_category;\\r\\n string public s_imageURI;\\r\\n string public s_campaignURI;\\r\\n string public s_tags;\\r\\n uint256 public goalAmount;\\r\\n uint256 public duration;\\r\\n uint256 public currentBalance;\\r\\n uint256 private immutable i_initTimeStamp;\\r\\n uint256 private constant i_maxDur = 5184000;\\r\\n uint256 public deadline;\\r\\n uint256 private rId;\\r\\n C_State public c_state = C_State.Fundraising; // default c_state\\r\\n\\r\\n struct CampaignObject {\\r\\n address i_creator;\\r\\n string s_title;\\r\\n string s_description;\\r\\n string s_category;\\r\\n string s_tags;\\r\\n uint256 goalAmount;\\r\\n uint256 duration;\\r\\n uint256 currentBalance;\\r\\n C_State currentC_State;\\r\\n string s_imageURI;\\r\\n string s_campaignURI;\\r\\n uint256 deadline;\\r\\n }\\r\\n\\r\\n struct refunder_pckg {\\r\\n uint256 currentBalance;\\r\\n C_State c_state;\\r\\n }\\r\\n\\r\\n // mapping (uint256 => reward) public rewards;\\r\\n mapping(uint256 => address) public rewards;\\r\\n mapping(address => uint256[]) public entDonations;\\r\\n mapping(address => uint256) public aggrDonations;\\r\\n\\r\\n uint256[] public rKeys;\\r\\n\\r\\n // events\\r\\n event FundingRecieved(\\r\\n address indexed contributor,\\r\\n uint256 amount,\\r\\n uint256 currentBalance\\r\\n );\\r\\n event CreatorPaid(address creator, address campaignAddress);\\r\\n event CampaignExpired(address campaignAddress);\\r\\n event CampaignCanceled();\\r\\n\\r\\n // modifiers\\r\\n modifier isCreator() {\\r\\n if (msg.sender != i_creator) {\\r\\n revert();\\r\\n }\\r\\n _;\\r\\n }\\r\\n\\r\\n refunder_pckg _refP;\\r\\n\\r\\n constructor(\\r\\n address _crowdfunder,\\r\\n address _creator,\\r\\n address _rwdFactory,\\r\\n string memory _title,\\r\\n string memory _description,\\r\\n string memory _category,\\r\\n string memory _tags,\\r\\n uint256 _goalAmount,\\r\\n uint256 _duration,\\r\\n string memory _imageURI\\r\\n ) {\\r\\n i_rwdFactory = _rwdFactory;\\r\\n i_crf = _crowdfunder;\\r\\n i_creator = payable(_creator);\\r\\n s_title = _title;\\r\\n s_description = _description;\\r\\n s_category = _category;\\r\\n s_tags = _tags;\\r\\n goalAmount = _goalAmount;\\r\\n i_initTimeStamp = block.timestamp;\\r\\n duration = _duration > i_maxDur ? i_maxDur : _duration;\\r\\n deadline = i_initTimeStamp + duration;\\r\\n s_imageURI = _imageURI;\\r\\n currentBalance = 0;\\r\\n }\\r\\n\\r\\n function donate(\\r\\n address _donator,\\r\\n bool _rewardable\\r\\n ) public payable nonReentrant {\\r\\n if (msg.sender != i_crf) {\\r\\n revert();\\r\\n }\\r\\n if (c_state != C_State.Fundraising) {\\r\\n revert();\\r\\n }\\r\\n if (_donator == i_creator) {\\r\\n revert();\\r\\n }\\r\\n currentBalance = currentBalance + msg.value;\\r\\n if (_rewardable) {\\r\\n if (rewards[msg.value] != address(0)) {\\r\\n (bool success, ) = rewards[msg.value].call(\\r\\n abi.encodeWithSignature(\\\"addDonator(address)\\\", _donator)\\r\\n );\\r\\n if (!success) {\\r\\n revert();\\r\\n }\\r\\n entDonations[_donator].push(msg.value);\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n aggrDonations[_donator] = aggrDonations[_donator] + msg.value;\\r\\n emit FundingRecieved(_donator, msg.value, currentBalance);\\r\\n }\\r\\n\\r\\n /**\\r\\n @dev this is the function chainlink keepers calls\\r\\n chekupkeep returns true to trigger the action after the interval has passed\\r\\n */\\r\\n function checkUpkeep(\\r\\n bytes memory /**checkData */\\r\\n )\\r\\n public\\r\\n view\\r\\n override\\r\\n returns (bool upkeepNeeded, bytes memory /**performData */)\\r\\n {\\r\\n bool isOpen = c_state == C_State.Fundraising;\\r\\n bool timePassed = ((block.timestamp - i_initTimeStamp) > duration);\\r\\n upkeepNeeded = (timePassed && isOpen);\\r\\n return (upkeepNeeded, \\\"0x0\\\");\\r\\n }\\r\\n\\r\\n function performUpkeep(bytes calldata /**performData */) external override {\\r\\n (bool upkeepNeeded, ) = checkUpkeep(\\\"\\\");\\r\\n if (!upkeepNeeded) {\\r\\n revert();\\r\\n }\\r\\n c_state = C_State.Expired;\\r\\n emit CampaignExpired(address(this));\\r\\n }\\r\\n\\r\\n function payout() external isCreator {\\r\\n if (c_state != C_State.Expired) {\\r\\n revert();\\r\\n }\\r\\n uint256 totalRaised = currentBalance;\\r\\n currentBalance = 0;\\r\\n (bool success, ) = i_creator.call{value: totalRaised}(\\\"\\\");\\r\\n if (success) {\\r\\n emit CreatorPaid(i_creator, address(this));\\r\\n } else {\\r\\n revert();\\r\\n }\\r\\n }\\r\\n\\r\\n function refund(address _donator) external nonReentrant {\\r\\n _refP = refunder_pckg(currentBalance, c_state);\\r\\n RefunderLib.refund(\\r\\n i_crf,\\r\\n _refP,\\r\\n rewards,\\r\\n aggrDonations,\\r\\n entDonations,\\r\\n _donator\\r\\n );\\r\\n }\\r\\n\\r\\n function makeReward(RewardFactory.rwdInput memory _rwd) external isCreator {\\r\\n if (rewards[_rwd._price] != address(0)) {\\r\\n revert();\\r\\n }\\r\\n rKeys.push(_rwd._price);\\r\\n address newReward = RewardFactory(i_rwdFactory).createReward(\\r\\n address(this),\\r\\n i_creator,\\r\\n _rwd\\r\\n );\\r\\n rewards[_rwd._price] = newReward;\\r\\n }\\r\\n\\r\\n function endCampaign() external isCreator {\\r\\n if (c_state == C_State.Expired) {\\r\\n revert();\\r\\n }\\r\\n c_state = C_State.Canceled;\\r\\n emit CampaignCanceled();\\r\\n }\\r\\n\\r\\n // update functions\\r\\n function updateCampaignURI(string memory _campaignURI) external isCreator {\\r\\n s_campaignURI = _campaignURI;\\r\\n }\\r\\n\\r\\n function updateDur(uint256 _addedDur) external isCreator {\\r\\n duration = (((duration + _addedDur)) > i_maxDur)\\r\\n ? i_maxDur\\r\\n : (duration + _addedDur);\\r\\n deadline = i_initTimeStamp + duration;\\r\\n }\\r\\n\\r\\n // getter functions\\r\\n function getRewardKeys() external view returns (uint256[] memory) {\\r\\n return rKeys;\\r\\n }\\r\\n\\r\\n function getReward(\\r\\n uint256 _priceID\\r\\n ) external view returns (Reward.RewardObject memory) {\\r\\n Reward reward = Reward(rewards[_priceID]);\\r\\n return reward.getRewardDetails();\\r\\n }\\r\\n\\r\\n function getCampaignDetails()\\r\\n external\\r\\n view\\r\\n returns (CampaignObject memory)\\r\\n {\\r\\n return\\r\\n CampaignObject(\\r\\n i_creator,\\r\\n s_title,\\r\\n s_description,\\r\\n s_category,\\r\\n s_tags,\\r\\n goalAmount,\\r\\n duration,\\r\\n currentBalance,\\r\\n c_state,\\r\\n s_imageURI,\\r\\n s_campaignURI,\\r\\n deadline\\r\\n );\\r\\n }\\r\\n}\\r\\n\",\"keccak256\":\"0x05c5518a752b38ef051b073ae318d9756c394760487680397e447357299626bc\",\"license\":\"MIT\"},\"contracts/Reward.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\ncontract Reward {\\r\\n address public immutable i_campaignAddress;\\r\\n // address public immutable i_crf;\\r\\n address public immutable i_creator;\\r\\n\\r\\n uint256 public immutable i_price;\\r\\n string public title;\\r\\n string public description;\\r\\n string public rpic;\\r\\n string[] public perks;\\r\\n uint256 public delDate;\\r\\n uint256 public quantity;\\r\\n bool public infinite = true;\\r\\n string[] public shipsTo;\\r\\n address[] public donators;\\r\\n string public surveyLink;\\r\\n\\r\\n struct RewardObject {\\r\\n uint256 price;\\r\\n string title;\\r\\n string description;\\r\\n string rpic;\\r\\n string[] perks;\\r\\n uint256 delDate;\\r\\n uint256 quantity;\\r\\n bool infinite;\\r\\n string[] shipsTo;\\r\\n address[] donators;\\r\\n string surveyLink;\\r\\n }\\r\\n\\r\\n mapping (address => uint256) public true_donator; \\r\\n mapping (address => string) public surveyResponses;\\r\\n\\r\\n constructor ( \\r\\n address _campaignAddress, \\r\\n address _creator,\\r\\n uint256 _price, \\r\\n string memory _title, \\r\\n string memory _description, \\r\\n string memory _rpic,\\r\\n string[] memory _perks, \\r\\n uint256 _deadline, \\r\\n uint256 _quantity, \\r\\n bool _infinite, \\r\\n string[] memory _shipsTo\\r\\n ) {\\r\\n i_price = _price;\\r\\n i_campaignAddress = _campaignAddress;\\r\\n i_creator = _creator;\\r\\n\\r\\n title = _title;\\r\\n description = _description;\\r\\n rpic = _rpic;\\r\\n perks = _perks;\\r\\n delDate = _deadline;\\r\\n quantity = _quantity;\\r\\n infinite = _infinite;\\r\\n shipsTo = _shipsTo;\\r\\n }\\r\\n\\r\\n function updateSurveyLink(string memory _surveylink) external {\\r\\n if(msg.sender != i_creator){revert();}\\r\\n surveyLink = _surveylink;\\r\\n }\\r\\n\\r\\n function addDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if((true_donator[_donator] > 0)){revert();} // already has id ...has therefor donated for this reward before\\r\\n\\r\\n if(!infinite){\\r\\n if(quantity > 0){\\r\\n quantity = quantity - 1;\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }else{revert();} // rwd has finished no longer available\\r\\n }else{\\r\\n uint256 currNo = donators.length; // get array length\\r\\n true_donator[_donator] = currNo + 1; \\r\\n donators.push(_donator);\\r\\n }\\r\\n }\\r\\n\\r\\n function getDonators() external view returns(address[] memory){\\r\\n return donators;\\r\\n }\\r\\n\\r\\n function removeDonator(address _donator) external {\\r\\n if(msg.sender != i_campaignAddress){revert();}\\r\\n if(!(true_donator[_donator] > 0)){revert();} // not a donator\\r\\n uint256 index = true_donator[_donator] - 1;\\r\\n delete donators[index];\\r\\n delete true_donator[_donator];\\r\\n }\\r\\n\\r\\n function respondToSurvey(string memory _response) external {\\r\\n if(!(true_donator[msg.sender] > 0)){revert();} // not a donator\\r\\n surveyResponses[msg.sender] = _response;\\r\\n }\\r\\n\\r\\n function getRewardDetails() external view returns(RewardObject memory){\\r\\n return RewardObject(\\r\\n i_price,\\r\\n title,\\r\\n description,\\r\\n rpic,\\r\\n perks,\\r\\n delDate,\\r\\n quantity,\\r\\n infinite,\\r\\n shipsTo,\\r\\n donators,\\r\\n surveyLink\\r\\n );\\r\\n }\\r\\n}\",\"keccak256\":\"0x16520b0d7ec2ca2e9c34cc0738e1db48661eef392ca464f8b0ee003169d06603\",\"license\":\"MIT\"},\"contracts/factories/RewardFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Reward } from \\\"../Reward.sol\\\";\\r\\n\\r\\ncontract RewardFactory {\\r\\n struct rwdInput {\\r\\n uint256 _price;\\r\\n string _title; \\r\\n string _description; \\r\\n string _rpic;\\r\\n string[] _perks; \\r\\n uint256 _deadline; \\r\\n uint256 _quantity; \\r\\n bool _infinite; \\r\\n string[] _shipsTo;\\r\\n }\\r\\n\\r\\n function createReward(address _cmpAddress, address _creator, rwdInput memory _rwd) public returns (address) {\\r\\n Reward rwd = new Reward(\\r\\n _cmpAddress, \\r\\n _creator,\\r\\n _rwd._price,\\r\\n _rwd._title,\\r\\n _rwd._description,\\r\\n _rwd._rpic,\\r\\n _rwd._perks,\\r\\n _rwd._deadline,\\r\\n _rwd._quantity,\\r\\n _rwd._infinite,\\r\\n _rwd._shipsTo \\r\\n );\\r\\n\\r\\n return address(rwd);\\r\\n }\\r\\n}\",\"keccak256\":\"0x025667572f11f51d96b92b058b304512b26a9394374f509ec337a822c2133729\",\"license\":\"MIT\"},\"contracts/libraries/campaign/RefunderLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity ^0.8.11;\\r\\n\\r\\nimport { Campaign } from \\\"../../Campaign.sol\\\";\\r\\nimport { Reward } from \\\"../../Reward.sol\\\";\\r\\n\\r\\nlibrary RefunderLib {\\r\\n function refund (\\r\\n address _i_crf,\\r\\n Campaign.refunder_pckg storage _refP, \\r\\n mapping (uint256 => address) storage _rewards, \\r\\n mapping (address => uint256) storage _aggrDons, \\r\\n mapping (address => uint256[]) storage _entDons, \\r\\n address _donator\\r\\n ) external {\\r\\n if(msg.sender != _i_crf){revert();}\\r\\n if(_refP.c_state == Campaign.C_State.Expired){revert();}\\r\\n if(_aggrDons[_donator] == 0 ){revert();}\\r\\n\\r\\n uint256 amountToRefund = _aggrDons[_donator];\\r\\n\\r\\n if(_refP.currentBalance < amountToRefund){revert();}\\r\\n _refP.currentBalance = _refP.currentBalance - amountToRefund;\\r\\n\\r\\n (bool success, ) = payable(_donator).call{value: amountToRefund}(\\\"\\\");\\r\\n if(!success){revert();}\\r\\n\\r\\n delete _aggrDons[_donator];\\r\\n\\r\\n if(_entDons[_donator].length > 0){ \\r\\n for(uint i=0; i<_entDons[_donator].length; i++){\\r\\n if(!(_rewards[_entDons[_donator][i]] != address(0))){\\r\\n Reward(_rewards[_entDons[_donator][i]]).removeDonator(_donator);\\r\\n }\\r\\n }\\r\\n }\\r\\n\\r\\n delete _entDons[_donator];\\r\\n }\\r\\n}\",\"keccak256\":\"0xacea134a5959c86c7ca67a50b965a2ad2666dccf020c1e3d97b908a79937da03\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6104bf61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80637314d79c1461003a575b600080fd5b81801561004657600080fd5b5061005a610055366004610366565b61005c565b005b336001600160a01b0387161461007157600080fd5b60018086015460ff16600281111561008b5761008b6103f0565b141561009657600080fd5b6001600160a01b0381166000908152602084905260409020546100b857600080fd5b6001600160a01b03811660009081526020849052604090205485548111156100df57600080fd5b85546100ec90829061041c565b86556040516000906001600160a01b03841690839061010a90610433565b60006040518083038185875af1925050503d8060008114610147576040519150601f19603f3d011682016040523d82523d6000602084013e61014c565b606091505b505090508061015a57600080fd5b6001600160a01b03831660009081526020868152604080832083905590869052902054156102be5760005b6001600160a01b0384166000908152602086905260409020548110156102bc576001600160a01b0384166000908152602086905260408120805489918391859081106101d3576101d361043b565b600091825260208083209091015483528201929092526040019020546001600160a01b031614156102aa576001600160a01b03841660009081526020869052604081208054899291908490811061022c5761022c61043b565b60009182526020808320909101548352820192909252604090810190912054905163c91e986d60e01b81526001600160a01b039091169063c91e986d90610277908790600401610460565b600060405180830381600087803b15801561029157600080fd5b505af11580156102a5573d6000803e3d6000fd5b505050505b806102b48161046e565b915050610185565b505b6001600160a01b03831660009081526020859052604081206102df916102e9565b5050505050505050565b5080546000825590600052602060002090810190610307919061030a565b50565b5b8082111561031f576000815560010161030b565b5090565b60006001600160a01b0382165b92915050565b61033f81610323565b811461030757600080fd5b803561033081610336565b8061033f565b803561033081610355565b60008060008060008060c0878903121561038257610382600080fd5b600061038e898961034a565b965050602061039f89828a0161035b565b95505060406103b089828a0161035b565b94505060606103c189828a0161035b565b93505060806103d289828a0161035b565b92505060a06103e389828a0161034a565b9150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561042e5761042e610406565b500390565b600081610330565b634e487b7160e01b600052603260045260246000fd5b61045a81610323565b82525050565b602081016103308284610451565b600060001982141561048257610482610406565b506001019056fea2646970667358221220f33172e3825b6df05b7d577074dd48c3930bb8427dc56500b35bb605be12594564736f6c634300080b0033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80637314d79c1461003a575b600080fd5b81801561004657600080fd5b5061005a610055366004610366565b61005c565b005b336001600160a01b0387161461007157600080fd5b60018086015460ff16600281111561008b5761008b6103f0565b141561009657600080fd5b6001600160a01b0381166000908152602084905260409020546100b857600080fd5b6001600160a01b03811660009081526020849052604090205485548111156100df57600080fd5b85546100ec90829061041c565b86556040516000906001600160a01b03841690839061010a90610433565b60006040518083038185875af1925050503d8060008114610147576040519150601f19603f3d011682016040523d82523d6000602084013e61014c565b606091505b505090508061015a57600080fd5b6001600160a01b03831660009081526020868152604080832083905590869052902054156102be5760005b6001600160a01b0384166000908152602086905260409020548110156102bc576001600160a01b0384166000908152602086905260408120805489918391859081106101d3576101d361043b565b600091825260208083209091015483528201929092526040019020546001600160a01b031614156102aa576001600160a01b03841660009081526020869052604081208054899291908490811061022c5761022c61043b565b60009182526020808320909101548352820192909252604090810190912054905163c91e986d60e01b81526001600160a01b039091169063c91e986d90610277908790600401610460565b600060405180830381600087803b15801561029157600080fd5b505af11580156102a5573d6000803e3d6000fd5b505050505b806102b48161046e565b915050610185565b505b6001600160a01b03831660009081526020859052604081206102df916102e9565b5050505050505050565b5080546000825590600052602060002090810190610307919061030a565b50565b5b8082111561031f576000815560010161030b565b5090565b60006001600160a01b0382165b92915050565b61033f81610323565b811461030757600080fd5b803561033081610336565b8061033f565b803561033081610355565b60008060008060008060c0878903121561038257610382600080fd5b600061038e898961034a565b965050602061039f89828a0161035b565b95505060406103b089828a0161035b565b94505060606103c189828a0161035b565b93505060806103d289828a0161035b565b92505060a06103e389828a0161034a565b9150509295509295509295565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561042e5761042e610406565b500390565b600081610330565b634e487b7160e01b600052603260045260246000fd5b61045a81610323565b82525050565b602081016103308284610451565b600060001982141561048257610482610406565b506001019056fea2646970667358221220f33172e3825b6df05b7d577074dd48c3930bb8427dc56500b35bb605be12594564736f6c634300080b0033", "devdoc": { "kind": "dev", "methods": {}, diff --git a/deployments/sepolia/solcInputs/29f2960a323d69a7be5b01d1ca776898.json b/deployments/sepolia/solcInputs/29f2960a323d69a7be5b01d1ca776898.json new file mode 100644 index 0000000..7227bac --- /dev/null +++ b/deployments/sepolia/solcInputs/29f2960a323d69a7be5b01d1ca776898.json @@ -0,0 +1,71 @@ +{ + "language": "Solidity", + "sources": { + "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AutomationCompatibleInterface {\n /**\n * @notice method that is simulated by the keepers to see if any work actually\n * needs to be performed. This method does does not actually need to be\n * executable, and since it is only ever simulated it can consume lots of gas.\n * @dev To ensure that it is never called, you may want to add the\n * cannotExecute modifier from KeeperBase to your implementation of this\n * method.\n * @param checkData specified in the upkeep registration so it is always the\n * same for a registered upkeep. This can easily be broken down into specific\n * arguments using `abi.decode`, so multiple upkeeps can be registered on the\n * same contract and easily differentiated by the contract.\n * @return upkeepNeeded boolean to indicate whether the keeper should call\n * performUpkeep or not.\n * @return performData bytes that the keeper should call performUpkeep with, if\n * upkeep is needed. If you would like to encode data to decode later, try\n * `abi.encode`.\n */\n function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData);\n\n /**\n * @notice method that is actually executed by the keepers, via the registry.\n * The data returned by the checkUpkeep simulation will be passed into\n * this method to actually be executed.\n * @dev The input to this method should not be trusted, and the caller of the\n * method should not even be restricted to any single registry. Anyone should\n * be able call it, and the input should be validated, there is no guarantee\n * that the data passed in is the performData returned from checkUpkeep. This\n * could happen due to malicious keepers, racing keepers, or simply a state\n * change while the performUpkeep transaction is waiting for confirmation.\n * Always validate the data passed in.\n * @param performData is the data which was passed back from the checkData\n * simulation. If it is encoded, it can easily be decoded into other types by\n * calling `abi.decode`. This data should not be trusted, and should be\n * validated against the contract's current state.\n */\n function performUpkeep(bytes calldata performData) external;\n}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/**\n * @notice OnchainConfig of the registry\n * @dev only used in params and return values\n * @member paymentPremiumPPB payment premium rate oracles receive on top of\n * being reimbursed for gas, measured in parts per billion\n * @member flatFeeMicroLink flat fee paid to oracles for performing upkeeps,\n * priced in MicroLink; can be used in conjunction with or independently of\n * paymentPremiumPPB\n * @member checkGasLimit gas limit when checking for upkeep\n * @member stalenessSeconds number of seconds that is allowed for feed data to\n * be stale before switching to the fallback pricing\n * @member gasCeilingMultiplier multiplier to apply to the fast gas feed price\n * when calculating the payment ceiling for keepers\n * @member minUpkeepSpend minimum LINK that an upkeep must spend before cancelling\n * @member maxPerformGas max executeGas allowed for an upkeep on this registry\n * @member fallbackGasPrice gas price used if the gas price feed is stale\n * @member fallbackLinkPrice LINK price used if the LINK price feed is stale\n * @member transcoder address of the transcoder contract\n * @member registrar address of the registrar contract\n */\nstruct OnchainConfig {\n uint32 paymentPremiumPPB;\n uint32 flatFeeMicroLink; // min 0.000001 LINK, max 4294 LINK\n uint32 checkGasLimit;\n uint24 stalenessSeconds;\n uint16 gasCeilingMultiplier;\n uint96 minUpkeepSpend;\n uint32 maxPerformGas;\n uint32 maxCheckDataSize;\n uint32 maxPerformDataSize;\n uint256 fallbackGasPrice;\n uint256 fallbackLinkPrice;\n address transcoder;\n address registrar;\n}\n\n/**\n * @notice state of the registry\n * @dev only used in params and return values\n * @member nonce used for ID generation\n * @member ownerLinkBalance withdrawable balance of LINK by contract owner\n * @member expectedLinkBalance the expected balance of LINK of the registry\n * @member totalPremium the total premium collected on registry so far\n * @member numUpkeeps total number of upkeeps on the registry\n * @member configCount ordinal number of current config, out of all configs applied to this contract so far\n * @member latestConfigBlockNumber last block at which this config was set\n * @member latestConfigDigest domain-separation tag for current config\n * @member latestEpoch for which a report was transmitted\n * @member paused freeze on execution scoped to the entire registry\n */\nstruct State {\n uint32 nonce;\n uint96 ownerLinkBalance;\n uint256 expectedLinkBalance;\n uint96 totalPremium;\n uint256 numUpkeeps;\n uint32 configCount;\n uint32 latestConfigBlockNumber;\n bytes32 latestConfigDigest;\n uint32 latestEpoch;\n bool paused;\n}\n\n/**\n * @notice all information about an upkeep\n * @dev only used in return values\n * @member target the contract which needs to be serviced\n * @member executeGas the gas limit of upkeep execution\n * @member checkData the checkData bytes for this upkeep\n * @member balance the balance of this upkeep\n * @member admin for this upkeep\n * @member maxValidBlocknumber until which block this upkeep is valid\n * @member lastPerformBlockNumber the last block number when this upkeep was performed\n * @member amountSpent the amount this upkeep has spent\n * @member paused if this upkeep has been paused\n * @member skipSigVerification skip signature verification in transmit for a low security low cost model\n */\nstruct UpkeepInfo {\n address target;\n uint32 executeGas;\n bytes checkData;\n uint96 balance;\n address admin;\n uint64 maxValidBlocknumber;\n uint32 lastPerformBlockNumber;\n uint96 amountSpent;\n bool paused;\n bytes offchainConfig;\n}\n\nenum UpkeepFailureReason {\n NONE,\n UPKEEP_CANCELLED,\n UPKEEP_PAUSED,\n TARGET_CHECK_REVERTED,\n UPKEEP_NOT_NEEDED,\n PERFORM_DATA_EXCEEDS_LIMIT,\n INSUFFICIENT_BALANCE\n}\n\ninterface AutomationRegistryBaseInterface {\n function registerUpkeep(\n address target,\n uint32 gasLimit,\n address admin,\n bytes calldata checkData,\n bytes calldata offchainConfig\n ) external returns (uint256 id);\n\n function cancelUpkeep(uint256 id) external;\n\n function pauseUpkeep(uint256 id) external;\n\n function unpauseUpkeep(uint256 id) external;\n\n function transferUpkeepAdmin(uint256 id, address proposed) external;\n\n function acceptUpkeepAdmin(uint256 id) external;\n\n function updateCheckData(uint256 id, bytes calldata newCheckData) external;\n\n function addFunds(uint256 id, uint96 amount) external;\n\n function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external;\n\n function setUpkeepOffchainConfig(uint256 id, bytes calldata config) external;\n\n function getUpkeep(uint256 id) external view returns (UpkeepInfo memory upkeepInfo);\n\n function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[] memory);\n\n function getTransmitterInfo(address query)\n external\n view\n returns (\n bool active,\n uint8 index,\n uint96 balance,\n uint96 lastCollected,\n address payee\n );\n\n function getState()\n external\n view\n returns (\n State memory state,\n OnchainConfig memory config,\n address[] memory signers,\n address[] memory transmitters,\n uint8 f\n );\n}\n\n/**\n * @dev The view methods are not actually marked as view in the implementation\n * but we want them to be easily queried off-chain. Solidity will not compile\n * if we actually inherit from this interface, so we document it here.\n */\ninterface AutomationRegistryInterface is AutomationRegistryBaseInterface {\n function checkUpkeep(uint256 upkeepId)\n external\n view\n returns (\n bool upkeepNeeded,\n bytes memory performData,\n UpkeepFailureReason upkeepFailureReason,\n uint256 gasUsed,\n uint256 fastGasWei,\n uint256 linkNative\n );\n}\n\ninterface AutomationRegistryExecutableInterface is AutomationRegistryBaseInterface {\n function checkUpkeep(uint256 upkeepId)\n external\n returns (\n bool upkeepNeeded,\n bytes memory performData,\n UpkeepFailureReason upkeepFailureReason,\n uint256 gasUsed,\n uint256 fastGasWei,\n uint256 linkNative\n );\n}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\n/**\n * @notice This is a deprecated interface. Please use AutomationCompatibleInterface directly.\n */\npragma solidity ^0.8.0;\nimport {AutomationCompatibleInterface as KeeperCompatibleInterface} from \"./AutomationCompatibleInterface.sol\";\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n\n function approve(address spender, uint256 value) external returns (bool success);\n\n function balanceOf(address owner) external view returns (uint256 balance);\n\n function decimals() external view returns (uint8 decimalPlaces);\n\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n\n function increaseApproval(address spender, uint256 subtractedValue) external;\n\n function name() external view returns (string memory tokenName);\n\n function symbol() external view returns (string memory tokenSymbol);\n\n function totalSupply() external view returns (uint256 totalTokensIssued);\n\n function transfer(address to, uint256 value) external returns (bool success);\n\n function transferAndCall(\n address to,\n uint256 value,\n bytes calldata data\n ) external returns (bool success);\n\n function transferFrom(\n address from,\n address to,\n uint256 value\n ) external returns (bool success);\n}\n" + }, + "@openzeppelin/contracts/security/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n}\n" + }, + "contracts/Campaign.sol": { + "content": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.11;\r\n\r\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\r\nimport \"@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol\";\r\nimport {Reward} from \"./Reward.sol\";\r\nimport {RewardFactory} from \"./factories/RewardFactory.sol\";\r\nimport {RefunderLib} from \"./libraries/campaign/RefunderLib.sol\";\r\n\r\n// errors\r\n// error Cmp_NIS(); /**not in state */\r\n// error Cmp_NotCrtr();\r\n// error Cmp_DIC(); /**donator is creator */\r\n// error Cmp_NoDns();\r\n// error Cmp_RefF();\r\n// error Cmp_UpkNN();\r\n// error Cmp_NotRef();\r\n// error Cmp_Bankrupt();\r\n\r\ncontract Campaign is KeeperCompatibleInterface, ReentrancyGuard {\r\n // enums\r\n enum C_State {\r\n Fundraising,\r\n Expired,\r\n Canceled\r\n }\r\n\r\n // c_state variables\r\n address public immutable i_crf;\r\n address payable public immutable i_creator;\r\n address public immutable i_rwdFactory;\r\n string public s_title;\r\n string public s_description;\r\n string public s_category;\r\n string public s_imageURI;\r\n string public s_campaignURI;\r\n string public s_tags;\r\n uint256 public goalAmount;\r\n uint256 public duration;\r\n uint256 public currentBalance;\r\n uint256 private immutable i_initTimeStamp;\r\n uint256 private constant i_maxDur = 5184000;\r\n uint256 public deadline;\r\n uint256 private rId;\r\n C_State public c_state = C_State.Fundraising; // default c_state\r\n\r\n struct CampaignObject {\r\n address i_creator;\r\n string s_title;\r\n string s_description;\r\n string s_category;\r\n string s_tags;\r\n uint256 goalAmount;\r\n uint256 duration;\r\n uint256 currentBalance;\r\n C_State currentC_State;\r\n string s_imageURI;\r\n string s_campaignURI;\r\n uint256 deadline;\r\n }\r\n\r\n struct refunder_pckg {\r\n uint256 currentBalance;\r\n C_State c_state;\r\n }\r\n\r\n // mapping (uint256 => reward) public rewards;\r\n mapping(uint256 => address) public rewards;\r\n mapping(address => uint256[]) public entDonations;\r\n mapping(address => uint256) public aggrDonations;\r\n\r\n uint256[] public rKeys;\r\n\r\n // events\r\n event FundingRecieved(\r\n address indexed contributor,\r\n uint256 amount,\r\n uint256 currentBalance\r\n );\r\n event CreatorPaid(address creator, address campaignAddress);\r\n event CampaignExpired(address campaignAddress);\r\n event CampaignCanceled();\r\n\r\n // modifiers\r\n modifier isCreator() {\r\n if (msg.sender != i_creator) {\r\n revert();\r\n }\r\n _;\r\n }\r\n\r\n refunder_pckg _refP;\r\n\r\n constructor(\r\n address _crowdfunder,\r\n address _creator,\r\n address _rwdFactory,\r\n string memory _title,\r\n string memory _description,\r\n string memory _category,\r\n string memory _tags,\r\n uint256 _goalAmount,\r\n uint256 _duration,\r\n string memory _imageURI\r\n ) {\r\n i_rwdFactory = _rwdFactory;\r\n i_crf = _crowdfunder;\r\n i_creator = payable(_creator);\r\n s_title = _title;\r\n s_description = _description;\r\n s_category = _category;\r\n s_tags = _tags;\r\n goalAmount = _goalAmount;\r\n i_initTimeStamp = block.timestamp;\r\n duration = _duration > i_maxDur ? i_maxDur : _duration;\r\n deadline = i_initTimeStamp + duration;\r\n s_imageURI = _imageURI;\r\n currentBalance = 0;\r\n }\r\n\r\n function donate(\r\n address _donator,\r\n bool _rewardable\r\n ) public payable nonReentrant {\r\n if (msg.sender != i_crf) {\r\n revert();\r\n }\r\n if (c_state != C_State.Fundraising) {\r\n revert();\r\n }\r\n if (_donator == i_creator) {\r\n revert();\r\n }\r\n currentBalance = currentBalance + msg.value;\r\n if (_rewardable) {\r\n if (rewards[msg.value] != address(0)) {\r\n (bool success, ) = rewards[msg.value].call(\r\n abi.encodeWithSignature(\"addDonator(address)\", _donator)\r\n );\r\n if (!success) {\r\n revert();\r\n }\r\n entDonations[_donator].push(msg.value);\r\n } else {\r\n revert();\r\n }\r\n }\r\n aggrDonations[_donator] = aggrDonations[_donator] + msg.value;\r\n emit FundingRecieved(_donator, msg.value, currentBalance);\r\n }\r\n\r\n /**\r\n @dev this is the function chainlink keepers calls\r\n chekupkeep returns true to trigger the action after the interval has passed\r\n */\r\n function checkUpkeep(\r\n bytes memory /**checkData */\r\n )\r\n public\r\n view\r\n override\r\n returns (bool upkeepNeeded, bytes memory /**performData */)\r\n {\r\n bool isOpen = c_state == C_State.Fundraising;\r\n bool timePassed = ((block.timestamp - i_initTimeStamp) > duration);\r\n upkeepNeeded = (timePassed && isOpen);\r\n return (upkeepNeeded, \"0x0\");\r\n }\r\n\r\n function performUpkeep(bytes calldata /**performData */) external override {\r\n (bool upkeepNeeded, ) = checkUpkeep(\"\");\r\n if (!upkeepNeeded) {\r\n revert();\r\n }\r\n c_state = C_State.Expired;\r\n emit CampaignExpired(address(this));\r\n }\r\n\r\n function payout() external isCreator {\r\n if (c_state != C_State.Expired) {\r\n revert();\r\n }\r\n uint256 totalRaised = currentBalance;\r\n currentBalance = 0;\r\n (bool success, ) = i_creator.call{value: totalRaised}(\"\");\r\n if (success) {\r\n emit CreatorPaid(i_creator, address(this));\r\n } else {\r\n revert();\r\n }\r\n }\r\n\r\n function refund(address _donator) external nonReentrant {\r\n _refP = refunder_pckg(currentBalance, c_state);\r\n RefunderLib.refund(\r\n i_crf,\r\n _refP,\r\n rewards,\r\n aggrDonations,\r\n entDonations,\r\n _donator\r\n );\r\n }\r\n\r\n function makeReward(RewardFactory.rwdInput memory _rwd) external isCreator {\r\n if (rewards[_rwd._price] != address(0)) {\r\n revert();\r\n }\r\n rKeys.push(_rwd._price);\r\n address newReward = RewardFactory(i_rwdFactory).createReward(\r\n address(this),\r\n i_creator,\r\n _rwd\r\n );\r\n rewards[_rwd._price] = newReward;\r\n }\r\n\r\n function endCampaign() external isCreator {\r\n if (c_state == C_State.Expired) {\r\n revert();\r\n }\r\n c_state = C_State.Canceled;\r\n emit CampaignCanceled();\r\n }\r\n\r\n // update functions\r\n function updateCampaignURI(string memory _campaignURI) external isCreator {\r\n s_campaignURI = _campaignURI;\r\n }\r\n\r\n function updateDur(uint256 _addedDur) external isCreator {\r\n duration = (((duration + _addedDur)) > i_maxDur)\r\n ? i_maxDur\r\n : (duration + _addedDur);\r\n deadline = i_initTimeStamp + duration;\r\n }\r\n\r\n // getter functions\r\n function getRewardKeys() external view returns (uint256[] memory) {\r\n return rKeys;\r\n }\r\n\r\n function getReward(\r\n uint256 _priceID\r\n ) external view returns (Reward.RewardObject memory) {\r\n Reward reward = Reward(rewards[_priceID]);\r\n return reward.getRewardDetails();\r\n }\r\n\r\n function getCampaignDetails()\r\n external\r\n view\r\n returns (CampaignObject memory)\r\n {\r\n return\r\n CampaignObject(\r\n i_creator,\r\n s_title,\r\n s_description,\r\n s_category,\r\n s_tags,\r\n goalAmount,\r\n duration,\r\n currentBalance,\r\n c_state,\r\n s_imageURI,\r\n s_campaignURI,\r\n deadline\r\n );\r\n }\r\n}\r\n" + }, + "contracts/CrowdFunder.sol": { + "content": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.11;\r\n\r\nimport {UpkeepIDConsumer} from \"./UpkeepIDConsumer.sol\";\r\nimport {LinkTokenInterface} from \"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\";\r\nimport {CampaignFactory} from \"./factories/CampaignFactory.sol\";\r\nimport {Campaign} from \"./Campaign.sol\";\r\n\r\n// errors\r\n// error Crf_NotCrtr();\r\n// error Crf_CSA(); /** cmp still active */\r\n// error Crf_DonF();\r\n// error Crf_RefF();\r\n// error Crf_PubF();\r\n\r\ncontract CrowdFunder {\r\n // using SafeMath for uint256;\r\n\r\n event UserAdded(\r\n address indexed _address,\r\n string _username,\r\n string _email,\r\n string _shipAddress,\r\n string _pfp\r\n );\r\n\r\n event CampaignAdded(\r\n address indexed _campaignAddress,\r\n address indexed _creator,\r\n string _title,\r\n string _description,\r\n string _category,\r\n string _tags,\r\n string _imageURI\r\n );\r\n\r\n event CampaignFunded(\r\n address indexed _funder,\r\n address indexed _campaignAddress,\r\n uint256 _val,\r\n address indexed _c_creator\r\n );\r\n\r\n event CampaignShrunk(\r\n address indexed _withdrawer,\r\n address indexed _campaignAddress,\r\n uint256 _val,\r\n address indexed _c_creator\r\n );\r\n\r\n event CampaignRemoved(address indexed _campaignAddress);\r\n\r\n event CampaignPublished(address _campaignAddress, address _creator);\r\n\r\n address public immutable i_cmpFactory;\r\n address public immutable i_rewardFactory;\r\n uint256 public campaignCounter;\r\n mapping(address => address) private campaigns;\r\n\r\n constructor(address _cmpFactory, address _rwdFactory) {\r\n i_rewardFactory = _rwdFactory;\r\n i_cmpFactory = _cmpFactory;\r\n }\r\n\r\n function addUser(\r\n address _address,\r\n string memory _username,\r\n string memory _email,\r\n string memory _shipAddress,\r\n string memory _pfp\r\n ) external {\r\n emit UserAdded(_address, _username, _email, _shipAddress, _pfp);\r\n }\r\n\r\n function addCampaign(CampaignFactory.cmpInput memory _cmp) external {\r\n address newCampaign = CampaignFactory(i_cmpFactory).createCampaign(\r\n address(this),\r\n msg.sender,\r\n i_rewardFactory,\r\n _cmp\r\n );\r\n campaigns[newCampaign] = newCampaign;\r\n emit CampaignAdded(\r\n newCampaign,\r\n msg.sender,\r\n _cmp._title,\r\n _cmp._description,\r\n _cmp._category,\r\n _cmp._tags,\r\n _cmp._imageURI\r\n );\r\n }\r\n\r\n function donateToCampaign(\r\n address _campaignAddress,\r\n bool _rewardable\r\n ) external payable {\r\n address c_creator = Campaign(campaigns[_campaignAddress]).i_creator();\r\n (bool success, ) = _campaignAddress.call{value: msg.value}(\r\n abi.encodeWithSignature(\r\n \"donate(address,bool)\",\r\n msg.sender,\r\n _rewardable\r\n )\r\n );\r\n if (success) {\r\n emit CampaignFunded(\r\n msg.sender,\r\n _campaignAddress,\r\n msg.value,\r\n c_creator\r\n );\r\n } else {\r\n revert();\r\n }\r\n }\r\n\r\n function refundFromCampaign(address _campaignAddress) external {\r\n address c_creator = Campaign(campaigns[_campaignAddress]).i_creator();\r\n uint256 refVal = Campaign(campaigns[_campaignAddress]).aggrDonations(\r\n msg.sender\r\n );\r\n if (!(refVal > 0)) {\r\n revert();\r\n }\r\n (bool success, ) = _campaignAddress.call(\r\n abi.encodeWithSignature(\"refund(address)\", msg.sender)\r\n );\r\n if (success) {\r\n emit CampaignShrunk(\r\n msg.sender,\r\n _campaignAddress,\r\n refVal,\r\n c_creator\r\n );\r\n } else {\r\n revert();\r\n }\r\n }\r\n\r\n function removeCampaign(address _campaignAddress) external {\r\n if (Campaign(campaigns[_campaignAddress]).i_creator() != msg.sender) {\r\n revert();\r\n }\r\n if (Campaign(campaigns[_campaignAddress]).currentBalance() > 0) {\r\n revert();\r\n }\r\n // either payout or leave for refunds\r\n delete (campaigns[_campaignAddress]);\r\n emit CampaignRemoved(_campaignAddress);\r\n }\r\n\r\n function publishCampaign(\r\n address _campaignAddress,\r\n address _upkeepCreator,\r\n address _linkToken\r\n ) external {\r\n UpkeepIDConsumer newUpkeepCreator = UpkeepIDConsumer(_upkeepCreator);\r\n LinkTokenInterface token = LinkTokenInterface(_linkToken);\r\n if (token.balanceOf(_upkeepCreator) == 0) {\r\n revert();\r\n }\r\n newUpkeepCreator.registerAndPredictID(\r\n Campaign(_campaignAddress).s_title(),\r\n \"0x\",\r\n _campaignAddress,\r\n 500000,\r\n Campaign(_campaignAddress).i_creator(),\r\n \"0x\",\r\n \"0x\",\r\n 2000000000000000000\r\n );\r\n campaignCounter = campaignCounter + 1;\r\n emit CampaignPublished(_campaignAddress, msg.sender);\r\n }\r\n}\r\n" + }, + "contracts/factories/CampaignFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.11;\r\n\r\nimport { Campaign } from \"../Campaign.sol\";\r\n\r\ncontract CampaignFactory {\r\n struct cmpInput {\r\n string _title; \r\n string _description;\r\n string _category;\r\n string _tags; \r\n uint256 _goalAmount;\r\n uint256 _duration;\r\n string _imageURI;\r\n }\r\n\r\n function createCampaign(address _crf, address _creator, address _rwdFactory, cmpInput memory _cmp) external returns (address) {\r\n Campaign cmp = new Campaign(\r\n _crf,\r\n payable(_creator),\r\n _rwdFactory,\r\n _cmp._title,\r\n _cmp._description,\r\n _cmp._category,\r\n _cmp._tags,\r\n _cmp._goalAmount,\r\n _cmp._duration,\r\n _cmp._imageURI\r\n );\r\n\r\n return address(cmp);\r\n }\r\n}" + }, + "contracts/factories/RewardFactory.sol": { + "content": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.11;\r\n\r\nimport { Reward } from \"../Reward.sol\";\r\n\r\ncontract RewardFactory {\r\n struct rwdInput {\r\n uint256 _price;\r\n string _title; \r\n string _description; \r\n string _rpic;\r\n string[] _perks; \r\n uint256 _deadline; \r\n uint256 _quantity; \r\n bool _infinite; \r\n string[] _shipsTo;\r\n }\r\n\r\n function createReward(address _cmpAddress, address _creator, rwdInput memory _rwd) public returns (address) {\r\n Reward rwd = new Reward(\r\n _cmpAddress, \r\n _creator,\r\n _rwd._price,\r\n _rwd._title,\r\n _rwd._description,\r\n _rwd._rpic,\r\n _rwd._perks,\r\n _rwd._deadline,\r\n _rwd._quantity,\r\n _rwd._infinite,\r\n _rwd._shipsTo \r\n );\r\n\r\n return address(rwd);\r\n }\r\n}" + }, + "contracts/libraries/campaign/RefunderLib.sol": { + "content": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.11;\r\n\r\nimport { Campaign } from \"../../Campaign.sol\";\r\nimport { Reward } from \"../../Reward.sol\";\r\n\r\nlibrary RefunderLib {\r\n function refund (\r\n address _i_crf,\r\n Campaign.refunder_pckg storage _refP, \r\n mapping (uint256 => address) storage _rewards, \r\n mapping (address => uint256) storage _aggrDons, \r\n mapping (address => uint256[]) storage _entDons, \r\n address _donator\r\n ) external {\r\n if(msg.sender != _i_crf){revert();}\r\n if(_refP.c_state == Campaign.C_State.Expired){revert();}\r\n if(_aggrDons[_donator] == 0 ){revert();}\r\n\r\n uint256 amountToRefund = _aggrDons[_donator];\r\n\r\n if(_refP.currentBalance < amountToRefund){revert();}\r\n _refP.currentBalance = _refP.currentBalance - amountToRefund;\r\n\r\n (bool success, ) = payable(_donator).call{value: amountToRefund}(\"\");\r\n if(!success){revert();}\r\n\r\n delete _aggrDons[_donator];\r\n\r\n if(_entDons[_donator].length > 0){ \r\n for(uint i=0; i<_entDons[_donator].length; i++){\r\n if(!(_rewards[_entDons[_donator][i]] != address(0))){\r\n Reward(_rewards[_entDons[_donator][i]]).removeDonator(_donator);\r\n }\r\n }\r\n }\r\n\r\n delete _entDons[_donator];\r\n }\r\n}" + }, + "contracts/Reward.sol": { + "content": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.11;\r\n\r\ncontract Reward {\r\n address public immutable i_campaignAddress;\r\n // address public immutable i_crf;\r\n address public immutable i_creator;\r\n\r\n uint256 public immutable i_price;\r\n string public title;\r\n string public description;\r\n string public rpic;\r\n string[] public perks;\r\n uint256 public delDate;\r\n uint256 public quantity;\r\n bool public infinite = true;\r\n string[] public shipsTo;\r\n address[] public donators;\r\n string public surveyLink;\r\n\r\n struct RewardObject {\r\n uint256 price;\r\n string title;\r\n string description;\r\n string rpic;\r\n string[] perks;\r\n uint256 delDate;\r\n uint256 quantity;\r\n bool infinite;\r\n string[] shipsTo;\r\n address[] donators;\r\n string surveyLink;\r\n }\r\n\r\n mapping (address => uint256) public true_donator; \r\n mapping (address => string) public surveyResponses;\r\n\r\n constructor ( \r\n address _campaignAddress, \r\n address _creator,\r\n uint256 _price, \r\n string memory _title, \r\n string memory _description, \r\n string memory _rpic,\r\n string[] memory _perks, \r\n uint256 _deadline, \r\n uint256 _quantity, \r\n bool _infinite, \r\n string[] memory _shipsTo\r\n ) {\r\n i_price = _price;\r\n i_campaignAddress = _campaignAddress;\r\n i_creator = _creator;\r\n\r\n title = _title;\r\n description = _description;\r\n rpic = _rpic;\r\n perks = _perks;\r\n delDate = _deadline;\r\n quantity = _quantity;\r\n infinite = _infinite;\r\n shipsTo = _shipsTo;\r\n }\r\n\r\n function updateSurveyLink(string memory _surveylink) external {\r\n if(msg.sender != i_creator){revert();}\r\n surveyLink = _surveylink;\r\n }\r\n\r\n function addDonator(address _donator) external {\r\n if(msg.sender != i_campaignAddress){revert();}\r\n if((true_donator[_donator] > 0)){revert();} // already has id ...has therefor donated for this reward before\r\n\r\n if(!infinite){\r\n if(quantity > 0){\r\n quantity = quantity - 1;\r\n uint256 currNo = donators.length; // get array length\r\n true_donator[_donator] = currNo + 1; \r\n donators.push(_donator);\r\n }else{revert();} // rwd has finished no longer available\r\n }else{\r\n uint256 currNo = donators.length; // get array length\r\n true_donator[_donator] = currNo + 1; \r\n donators.push(_donator);\r\n }\r\n }\r\n\r\n function getDonators() external view returns(address[] memory){\r\n return donators;\r\n }\r\n\r\n function removeDonator(address _donator) external {\r\n if(msg.sender != i_campaignAddress){revert();}\r\n if(!(true_donator[_donator] > 0)){revert();} // not a donator\r\n uint256 index = true_donator[_donator] - 1;\r\n delete donators[index];\r\n delete true_donator[_donator];\r\n }\r\n\r\n function respondToSurvey(string memory _response) external {\r\n if(!(true_donator[msg.sender] > 0)){revert();} // not a donator\r\n surveyResponses[msg.sender] = _response;\r\n }\r\n\r\n function getRewardDetails() external view returns(RewardObject memory){\r\n return RewardObject(\r\n i_price,\r\n title,\r\n description,\r\n rpic,\r\n perks,\r\n delDate,\r\n quantity,\r\n infinite,\r\n shipsTo,\r\n donators,\r\n surveyLink\r\n );\r\n }\r\n}" + }, + "contracts/UpkeepIDConsumer.sol": { + "content": "// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.6;\r\n\r\n// UpkeepIDConsumerExample.sol imports functions from both ./AutomationRegistryInterface2_0.sol and\r\n// ./interfaces/LinkTokenInterface.sol\r\n\r\nimport {AutomationRegistryInterface, State, OnchainConfig} from \"@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol\";\r\nimport {LinkTokenInterface} from \"@chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol\";\r\n\r\n/**\r\n * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED VALUES FOR CLARITY.\r\n * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.\r\n * DO NOT USE THIS CODE IN PRODUCTION.\r\n */\r\n\r\ninterface KeeperRegistrarInterface {\r\n function register(\r\n string memory name,\r\n bytes calldata encryptedEmail,\r\n address upkeepContract,\r\n uint32 gasLimit,\r\n address adminAddress,\r\n bytes calldata checkData,\r\n bytes calldata offchainConfig,\r\n uint96 amount,\r\n address sender\r\n ) external;\r\n}\r\n\r\ncontract UpkeepIDConsumer {\r\n LinkTokenInterface public immutable i_link;\r\n address public immutable registrar;\r\n AutomationRegistryInterface public immutable i_registry;\r\n bytes4 registerSig = KeeperRegistrarInterface.register.selector;\r\n\r\n constructor(\r\n LinkTokenInterface _link,\r\n address _registrar,\r\n AutomationRegistryInterface _registry\r\n ) {\r\n i_link = _link;\r\n registrar = _registrar;\r\n i_registry = _registry;\r\n }\r\n\r\n function registerAndPredictID(\r\n string memory name,\r\n bytes calldata encryptedEmail,\r\n address upkeepContract,\r\n uint32 gasLimit,\r\n address adminAddress,\r\n bytes calldata checkData,\r\n bytes calldata offchainConfig,\r\n uint96 amount\r\n ) public returns(uint256) {\r\n (State memory state, , , , ) = i_registry.getState();\r\n uint256 oldNonce = state.nonce;\r\n bytes memory payload = abi.encode(\r\n name,\r\n encryptedEmail,\r\n upkeepContract,\r\n gasLimit,\r\n adminAddress,\r\n checkData,\r\n offchainConfig,\r\n amount,\r\n address(this)\r\n );\r\n\r\n i_link.transferAndCall(\r\n registrar,\r\n amount,\r\n bytes.concat(registerSig, payload)\r\n );\r\n (state, , , , ) = i_registry.getState();\r\n uint256 newNonce = state.nonce;\r\n if (newNonce == oldNonce + 1) {\r\n uint256 upkeepID = uint256(\r\n keccak256(\r\n abi.encodePacked(\r\n blockhash(block.number - 1),\r\n address(i_registry),\r\n uint32(oldNonce)\r\n )\r\n )\r\n );\r\n // DEV - Use the upkeepID however you see fit\r\n return upkeepID;\r\n } else {\r\n revert(\"auto-approve disabled\");\r\n }\r\n }\r\n}\r\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yul": false + } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index 8a32b6b..403e99a 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -10,98 +10,86 @@ import "solidity-coverage" import "hardhat-contract-sizer" import { HardhatUserConfig } from "hardhat/config" - -const config: HardhatUserConfig = -{ - solidity: { - compilers: [ - { - version: "0.8.11", - settings:{ - optimizer: { - enabled: true, - runs: 200, - details: { - yul: false - } - } - } - }, - { version: "0.8.8" }, { version: "0.6.6" }, { version: "0.4.19" }, { version: "0.6.12" }, { version: "0.4.11" } - ], - // settings:{ - // "optimizer": { - // "enabled": true, - // "runs": 200, - // details: { - // yul: true, - // yulDetails: { - // stackAllocation: true, - // optimizerSteps: "dhfoDgvulfnTUtnIf" - // } - // } - // }, - // "viaIR": true, - // }, - }, - contractSizer: { - alphaSort: true, - disambiguatePaths: false, - runOnCompile: false, - strict: true, - // only: [":ERC20$"], - unit: "kB" - }, - defaultNetwork: "hardhat", - networks: { - hardhat: { - chainId: 31337, - allowUnlimitedContractSize: true - }, - localhost: { - chainId: 31337, - allowUnlimitedContractSize: true - }, - goerli:{ - chainId: 5, - url: process.env.GOERLI_RPC_URL, - accounts: [process.env.FORMIC_PRIVATE_KEY!], - timeout: 1000000 - }, - fuji:{ - chainId: 43113, - url: process.env.FUJI_RPC_URL, - accounts: [process.env.FORMIC_PRIVATE_KEY!], - timeout: 1000000 - }, - sepolia:{ - chainId: 11155111, - url: process.env.SEPOLIA_RPC_URL, - accounts: [process.env.FORMIC_PRIVATE_KEY!], - timeout: 1000000 - } - }, - namedAccounts: { - deployer: { - default: 0, - }, - donator: { - default: 1, - } - }, - gasReporter: { - enabled: true, - outputFile: "gas-report.txt", - noColors: true, - currency: "USD", - coinmarketcap: process.env.MARKETCAP_API_KEY, - }, - etherscan: { - apiKey: process.env.ETHERSCAN_API_KEY, - }, - mocha: { - timeout: 100000000, - } +const config: HardhatUserConfig = { + solidity: { + compilers: [ + { + version: "0.8.11", + settings: { + optimizer: { + enabled: true, + runs: 200, + details: { + yul: false, + }, + }, + }, + }, + { version: "0.8.8" }, + { version: "0.6.6" }, + { version: "0.4.19" }, + { version: "0.6.12" }, + { version: "0.4.11" }, + ], + }, + contractSizer: { + alphaSort: true, + disambiguatePaths: false, + runOnCompile: false, + strict: true, + // only: [":ERC20$"], + unit: "kB", + }, + defaultNetwork: "hardhat", + networks: { + hardhat: { + chainId: 31337, + allowUnlimitedContractSize: true, + }, + localhost: { + chainId: 31337, + allowUnlimitedContractSize: true, + }, + goerli: { + chainId: 5, + url: process.env.GOERLI_RPC_URL, + accounts: [process.env.CHARLATAN_PRIVATE_KEY!], + timeout: 1000000, + }, + fuji: { + chainId: 43113, + url: process.env.FUJI_RPC_URL, + accounts: [process.env.CHARLATAN_PRIVATE_KEY!], + timeout: 1000000, + }, + sepolia: { + chainId: 11155111, + url: process.env.SEPOLIA_RPC_URL, + accounts: [process.env.CHARLATAN_PRIVATE_KEY!], + timeout: 1000000, + }, + }, + namedAccounts: { + deployer: { + default: 0, + }, + donator: { + default: 1, + }, + }, + gasReporter: { + enabled: true, + outputFile: "gas-report.txt", + noColors: true, + currency: "USD", + coinmarketcap: process.env.MARKETCAP_API_KEY, + }, + etherscan: { + apiKey: process.env.ETHERSCAN_API_KEY, + }, + mocha: { + timeout: 100000000, + }, } export default config diff --git a/test/unit/test-campaign.ts b/test/unit/test-campaign.ts index 1693406..d423bc0 100644 --- a/test/unit/test-campaign.ts +++ b/test/unit/test-campaign.ts @@ -5,355 +5,373 @@ import { developmentChains } from "../../helper-hardhat-config" import { Campaign } from "../../typechain-types" !developmentChains.includes(network.name) - ? describe.skip - : describe("Campaign Unit Tests", function () { - let campaign: Campaign - let deployer: string - let campaignAddress: any - let timeGiven: number - - beforeEach(async () => { - deployer = (await getNamedAccounts()).deployer - await deployments.fixture(["campaign"]) - campaign = await ethers.getContract("Campaign", deployer) - campaignAddress = campaign.address - const { duration } = await campaign.getCampaignDetails() - timeGiven = duration.toNumber() - }) - - describe("constructor", function () - { - it("campaign is in fundraising state", async () => { - const campaignState = await campaign.c_state() - assert(campaignState.toString() == "0") // 1 means fundraising - }) - }) - - describe("donate", function () - { - it("reverts if creator tries to donate", async () => { - const donationAmount = ethers.utils.parseEther("5") - await expect(campaign.donate(deployer, false, { value: donationAmount })).to.be.reverted - }) - - // it("successfully adds donations and emits event", async ()=>{ - // const accounts = await ethers.getSigners() - // const donator = accounts[1].address - // const donatorCampaign = campaign.connect(accounts[1]) - - // const oldBalance = await campaign.getBalance() - // const donationAmount = ethers.utils.parseEther("5") - - // const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // const donateTxR = await donateTx.wait(1) - // // console.log(donateTxR.events![0].args) - // const donatorBalance = await donatorCampaign.donations(donator) - // assert.equal(donationAmount.toString(), donatorBalance.toString()) - - // const newBalance = await campaign.getBalance() - // assert.equal((newBalance.sub(donationAmount)).toString(), oldBalance.toString()) - - // expect(donateTx).to.emit(campaign, "FundingRecieved") - // }) - }) - - describe("checkUpkeep", function () - { - it("emits campaign successful if goal is reached", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("5") - - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // here donationAmount was 5 eth - const donateTxR = await donateTx.wait(1) - // goalReached == true - const performUpkeepTx = await campaign.performUpkeep([]) - - const campaignState = await campaign.c_state() - - const { upkeepNeeded } = await campaign.callStatic.checkUpkeep("0x") - assert(upkeepNeeded) // because goalReached == true - assert(campaignState.toString() == "0") - expect(performUpkeepTx).to.emit(campaign, "CampaignSuccessful") - }) - - it("returns false if there is no balance", async () => { - await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true - await network.provider.send("evm_mine", []) - const { upkeepNeeded } = await campaign.callStatic.checkUpkeep("0x") - assert(!upkeepNeeded) // because hasBalance == false - }) - - it("returns false if it is not fundraising", async () => { - await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true - await network.provider.send("evm_mine", []) - - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("1") - - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - const donateTxR = await donateTx.wait(1) - // here donationAmount was 1 eth goalAmount is 3 eth - const performUpkeepTx = await campaign.performUpkeep([]) // changes state to Expired - - const campaignState = await campaign.c_state() - const { upkeepNeeded } = await campaign.callStatic.checkUpkeep("0x") - // checking again after state has changed; isOpen is now false - assert.equal(campaignState == 2, upkeepNeeded == false) - }) - }) - - describe("performUpkeep", function () { - it("only runs if checkUpkeep is true", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("5") - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - const donateTxR = await donateTx.wait(1) - // goalReached == true - const performUpkeepTx = await campaign.performUpkeep([]) - assert(performUpkeepTx) - }) - - it("reverts if checkupKeep is false", async () => { - await expect(campaign.performUpkeep("0x")).to.be.reverted - }) - - it("updates the campaign state and emits an event", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("5") - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // here donationAmount was 5 eth - const donateTxR = await donateTx.wait(1) - // goalReached == true - const performUpkeepTx = await campaign.performUpkeep([]) - const campaignState = await campaign.c_state() - assert(campaignState == 0) - expect(performUpkeepTx).to.emit(campaign, "CampaignSuccessful") - }) - }) - - describe("payout", function () { - it("fails if not called by creator", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("5") - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // here donationAmount was 5 eth - const donateTxR = await donateTx.wait(1) - // goalReached == true - await network.provider.send("evm_increaseTime", [timeGiven + 1]) - await network.provider.send("evm_mine", []) - const performUpkeepTx = await donatorCampaign.performUpkeep([]) - await performUpkeepTx.wait(1) - await expect(donatorCampaign.payout()).to.be.reverted - }) - - it("fails if it is still fundraising", async () => { - const campaignState = await campaign.c_state() - assert(campaignState == 0) - await expect(campaign.payout()).to.be.reverted - }) - - it("pays out for a successful campaign", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("5") - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // here donationAmount was 5 eth - const donateTxR = await donateTx.wait(1) - // goalReached == true - - await network.provider.send("evm_increaseTime", [timeGiven + 1]) - await network.provider.send("evm_mine", []) - - const performUpkeepTx = await campaign.performUpkeep([]) - await performUpkeepTx.wait(1) - - const payoutTx = await campaign.payout() - await payoutTx.wait(1) - // const newBalance = await campaign.getBalance() - - // assert(newBalance.toString() == "0") - }) - - it("pays out for an expired campaign", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("1") - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // here donationAmount was 1 eth - const donateTxR = await donateTx.wait(1) - // goalReached == false, hasBalance == true - - await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true - await network.provider.send("evm_mine", []) - - const performUpkeepTx = await campaign.performUpkeep([]) - await performUpkeepTx.wait(1) - - const payoutTx = await campaign.payout() - await payoutTx.wait(1) - // const newBalance = await campaign.getBalance() - - // assert(newBalance.toString() == "0") - }) - - it("disables refunds and emits event", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("5") - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // here donationAmount was 5 eth - const donateTxR = await donateTx.wait(1) - await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true - await network.provider.send("evm_mine", []) - - const performUpkeepTx = await campaign.performUpkeep([]) - await performUpkeepTx.wait(1) - - const payoutTx = await campaign.payout() - await payoutTx.wait(1) - - // const isRefunding = await campaign.nowRefundable() - // assert(!isRefunding) - expect(payoutTx).to.emit(campaign, "CreatorPaid") - }) - }) - - describe("refund", function () { - it("only runs if refunds are enabled", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("1") - const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) - // here donationAmount was 1 eth - const donateTxR = await donateTx.wait(1) - await expect(donatorCampaign.refund(donator)).to.be.reverted - }) - - it("successful if caller has donations", async () => { - const accounts = await ethers.getSigners() - const donator = accounts[1].address - const donatorCampaign = campaign.connect(accounts[1]) - const donationAmount = ethers.utils.parseEther("0.022") - const donateTx = await donatorCampaign.donate(donator, true, { value: donationAmount }) - // here donationAmount was 5 eth - const donateTxR = await donateTx.wait(1) - console.log(donateTxR.events![0].args) - const bal = await campaign.aggrDonations(donator) - // const bals = await campaign.getDonations(donator) - console.log(bal) - // const performUpkeepTx = await campaign.performUpkeep([]) - // await performUpkeepTx.wait(1) - - const refundTx = await donatorCampaign.refund(donator) - const refundTxR = await refundTx.wait(1) - // console.log(refundTxR.events) - - - // await expect(donatorCampaign.refund()).to.satisfy - }) - }) - - describe("make reward", function (){ - it("successfully creates rewards", async ()=>{ - const getDeadline = await campaign.deadline() - const addRwdTx = campaign.makeReward( - { - _price: ethers.utils.parseEther("0.022"), - _title: "Digital Copy with OST", - _description: "A digital copy of the game for STEAM (PC/MAC).", - _rpic: "ipfs://", - _perks: ["mochas and biggs"], - _deadline: getDeadline, - _quantity: 100, - _infinite: true, - _shipsTo: ["_NW"] - } - ) - - const addRwdTxR = (await addRwdTx).wait(1) - const rewardDets = await campaign.getReward(ethers.utils.parseEther("0.022")) - console.log(rewardDets) - - const accounts = await ethers.getSigners() - const donator = accounts[2].address - const donatorCampaign = campaign.connect(accounts[2]) - const donationAmount = ethers.utils.parseEther("0.022") - const donateTx = await donatorCampaign.donate(donator, true, { value: donationAmount }) - // here donationAmount was 5 eth - const donateTxR = await donateTx.wait(1) - console.log(donateTxR.events![0].args) - const bal = await donatorCampaign.aggrDonations(donator) - // const bals = await campaign.getDonations(donator) - console.log(bal) - // const performUpkeepTx = await campaign.performUpkeep([]) - // await performUpkeepTx.wait(1) - - const refundTx = await donatorCampaign.refund(donator) - const refundTxR = await refundTx.wait(1) - }) - - it("fails on rwd edit", async ()=>{ - const getDeadline = await campaign.deadline() - const addRwdTx = campaign.makeReward( - { - _price: ethers.utils.parseEther("0.022"), - _title: "Digital Copy with OST", - _description: "A digital copy of the game for STEAM (PC/MAC).", - _rpic: "ipfs://", - _perks: ["mochas and biggs"], - _deadline: getDeadline, - _quantity: 100, - _infinite: true, - _shipsTo: ["_NW"] - } - ) - const addRwdTxR = (await addRwdTx).wait(1) - - await expect( campaign.makeReward( - { - _price: ethers.utils.parseEther("0.022"), - _title: "Digital Copy with OST", - _description: "A digital copy of the game for STEAM (PC/MAC).", - _rpic: "ipfs://", - _perks: ["mochas and biggs"], - _deadline: getDeadline, - _quantity: 100, - _infinite: true, - _shipsTo: ["_NW"] - } - )).to.be.reverted - }) - }) - - // describe("getCampaignDetails", function () { - // it("returns all campaign details", async ()=>{ - // const campaignDetails = await campaign.getCampaignDetails() - // assert( - // campaignDetails.creator && - // campaignDetails.title && - // campaignDetails.description && - // campaignDetails.tags && - // "goalAmount" in campaignDetails && - // "duration" in campaignDetails && - // "currentBalance" in campaignDetails && - // "currentState" in campaignDetails - // ) - // // console.log(campaignDetails) - // }) - // }) - }) \ No newline at end of file + ? describe.skip + : describe("Campaign Unit Tests", function () { + let campaign: Campaign + let deployer: string + let campaignAddress: any + let timeGiven: number + + beforeEach(async () => { + deployer = (await getNamedAccounts()).deployer + await deployments.fixture(["campaign"]) + campaign = await ethers.getContract("Campaign", deployer) + campaignAddress = campaign.address + const { duration } = await campaign.getCampaignDetails() + timeGiven = duration.toNumber() + }) + + describe("constructor", function () { + it("campaign is in fundraising state", async () => { + const campaignState = await campaign.c_state() + assert(campaignState.toString() == "0") // 1 means fundraising + }) + }) + + describe("donate", function () { + it("reverts if creator tries to donate", async () => { + const donationAmount = ethers.utils.parseEther("5") + await expect( + campaign.donate(deployer, false, { value: donationAmount }) + ).to.be.reverted + }) + + // it("successfully adds donations and emits event", async ()=>{ + // const accounts = await ethers.getSigners() + // const donator = accounts[1].address + // const donatorCampaign = campaign.connect(accounts[1]) + + // const oldBalance = await campaign.getBalance() + // const donationAmount = ethers.utils.parseEther("5") + + // const donateTx = await donatorCampaign.donate(donator, false, { value: donationAmount }) + // const donateTxR = await donateTx.wait(1) + // // console.log(donateTxR.events![0].args) + // const donatorBalance = await donatorCampaign.donations(donator) + // assert.equal(donationAmount.toString(), donatorBalance.toString()) + + // const newBalance = await campaign.getBalance() + // assert.equal((newBalance.sub(donationAmount)).toString(), oldBalance.toString()) + + // expect(donateTx).to.emit(campaign, "FundingRecieved") + // }) + }) + + describe("checkUpkeep", function () { + it("emits campaign successful if goal is reached", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("5") + + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + // here donationAmount was 5 eth + const donateTxR = await donateTx.wait(1) + // goalReached == true + const performUpkeepTx = await campaign.performUpkeep([]) + + const campaignState = await campaign.c_state() + + const { upkeepNeeded } = await campaign.callStatic.checkUpkeep("0x") + assert(upkeepNeeded) // because goalReached == true + assert(campaignState.toString() == "0") + expect(performUpkeepTx).to.emit(campaign, "CampaignSuccessful") + }) + + it("returns false if there is no balance", async () => { + await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true + await network.provider.send("evm_mine", []) + const { upkeepNeeded } = await campaign.callStatic.checkUpkeep("0x") + assert(!upkeepNeeded) // because hasBalance == false + }) + + it("returns false if it is not fundraising", async () => { + await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true + await network.provider.send("evm_mine", []) + + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("1") + + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + const donateTxR = await donateTx.wait(1) + // here donationAmount was 1 eth goalAmount is 3 eth + const performUpkeepTx = await campaign.performUpkeep([]) // changes state to Expired + + const campaignState = await campaign.c_state() + const { upkeepNeeded } = await campaign.callStatic.checkUpkeep("0x") + // checking again after state has changed; isOpen is now false + assert.equal(campaignState == 2, upkeepNeeded == false) + }) + }) + + describe("performUpkeep", function () { + it("only runs if checkUpkeep is true", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("5") + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + const donateTxR = await donateTx.wait(1) + // goalReached == true + const performUpkeepTx = await campaign.performUpkeep([]) + assert(performUpkeepTx) + }) + + it("reverts if checkupKeep is false", async () => { + await expect(campaign.performUpkeep("0x")).to.be.reverted + }) + + it("updates the campaign state and emits an event", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("5") + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + // here donationAmount was 5 eth + const donateTxR = await donateTx.wait(1) + // goalReached == true + const performUpkeepTx = await campaign.performUpkeep([]) + const campaignState = await campaign.c_state() + assert(campaignState == 0) + expect(performUpkeepTx).to.emit(campaign, "CampaignSuccessful") + }) + }) + + describe("payout", function () { + it("fails if not called by creator", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("5") + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + // here donationAmount was 5 eth + const donateTxR = await donateTx.wait(1) + // goalReached == true + await network.provider.send("evm_increaseTime", [timeGiven + 1]) + await network.provider.send("evm_mine", []) + const performUpkeepTx = await donatorCampaign.performUpkeep([]) + await performUpkeepTx.wait(1) + await expect(donatorCampaign.payout()).to.be.reverted + }) + + it("fails if it is still fundraising", async () => { + const campaignState = await campaign.c_state() + assert(campaignState == 0) + await expect(campaign.payout()).to.be.reverted + }) + + it("pays out for a successful campaign", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("5") + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + // here donationAmount was 5 eth + const donateTxR = await donateTx.wait(1) + // goalReached == true + + await network.provider.send("evm_increaseTime", [timeGiven + 1]) + await network.provider.send("evm_mine", []) + + const performUpkeepTx = await campaign.performUpkeep([]) + await performUpkeepTx.wait(1) + + const payoutTx = await campaign.payout() + await payoutTx.wait(1) + // const newBalance = await campaign.getBalance() + + // assert(newBalance.toString() == "0") + }) + + it("pays out for an expired campaign", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("1") + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + // here donationAmount was 1 eth + const donateTxR = await donateTx.wait(1) + // goalReached == false, hasBalance == true + + await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true + await network.provider.send("evm_mine", []) + + const performUpkeepTx = await campaign.performUpkeep([]) + await performUpkeepTx.wait(1) + + const payoutTx = await campaign.payout() + await payoutTx.wait(1) + // const newBalance = await campaign.getBalance() + + // assert(newBalance.toString() == "0") + }) + + it("disables refunds and emits event", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("5") + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + // here donationAmount was 5 eth + const donateTxR = await donateTx.wait(1) + await network.provider.send("evm_increaseTime", [timeGiven + 1]) // bool timepassed is now = true + await network.provider.send("evm_mine", []) + + const performUpkeepTx = await campaign.performUpkeep([]) + await performUpkeepTx.wait(1) + + const payoutTx = await campaign.payout() + await payoutTx.wait(1) + + // const isRefunding = await campaign.nowRefundable() + // assert(!isRefunding) + expect(payoutTx).to.emit(campaign, "CreatorPaid") + }) + }) + + describe("refund", function () { + it("only runs if refunds are enabled", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("1") + const donateTx = await donatorCampaign.donate(donator, false, { + value: donationAmount, + }) + // here donationAmount was 1 eth + const donateTxR = await donateTx.wait(1) + await expect(donatorCampaign.refund(donator)).to.be.reverted + }) + + it("successful if caller has donations", async () => { + const accounts = await ethers.getSigners() + const donator = accounts[1].address + const donatorCampaign = campaign.connect(accounts[1]) + const donationAmount = ethers.utils.parseEther("0.022") + const donateTx = await donatorCampaign.donate(donator, true, { + value: donationAmount, + }) + // here donationAmount was 5 eth + const donateTxR = await donateTx.wait(1) + console.log(donateTxR.events![0].args) + const bal = await campaign.aggrDonations(donator) + // const bals = await campaign.getDonations(donator) + console.log(bal) + // const performUpkeepTx = await campaign.performUpkeep([]) + // await performUpkeepTx.wait(1) + + const refundTx = await donatorCampaign.refund(donator) + const refundTxR = await refundTx.wait(1) + // console.log(refundTxR.events) + + // await expect(donatorCampaign.refund()).to.satisfy + }) + }) + + describe("make reward", function () { + it("successfully creates rewards", async () => { + const getDeadline = await campaign.deadline() + const addRwdTx = campaign.makeReward({ + _price: ethers.utils.parseEther("0.022"), + _title: "Digital Copy with OST", + _description: "A digital copy of the game for STEAM (PC/MAC).", + _rpic: "ipfs://", + _perks: ["mochas and biggs"], + _deadline: getDeadline, + _quantity: 100, + _infinite: true, + _shipsTo: ["_NW"], + }) + + const addRwdTxR = (await addRwdTx).wait(1) + const rewardDets = await campaign.getReward( + ethers.utils.parseEther("0.022") + ) + console.log(rewardDets) + + const accounts = await ethers.getSigners() + const donator = accounts[2].address + const donatorCampaign = campaign.connect(accounts[2]) + const donationAmount = ethers.utils.parseEther("0.022") + const donateTx = await donatorCampaign.donate(donator, true, { + value: donationAmount, + }) + // here donationAmount was 5 eth + const donateTxR = await donateTx.wait(1) + console.log(donateTxR.events![0].args) + const bal = await donatorCampaign.aggrDonations(donator) + // const bals = await campaign.getDonations(donator) + console.log(bal) + // const performUpkeepTx = await campaign.performUpkeep([]) + // await performUpkeepTx.wait(1) + + const refundTx = await donatorCampaign.refund(donator) + const refundTxR = await refundTx.wait(1) + }) + + it("fails on rwd edit", async () => { + const getDeadline = await campaign.deadline() + const addRwdTx = campaign.makeReward({ + _price: ethers.utils.parseEther("0.022"), + _title: "Digital Copy with OST", + _description: "A digital copy of the game for STEAM (PC/MAC).", + _rpic: "ipfs://", + _perks: ["mochas and biggs"], + _deadline: getDeadline, + _quantity: 100, + _infinite: true, + _shipsTo: ["_NW"], + }) + const addRwdTxR = (await addRwdTx).wait(1) + + await expect( + campaign.makeReward({ + _price: ethers.utils.parseEther("0.022"), + _title: "Digital Copy with OST", + _description: "A digital copy of the game for STEAM (PC/MAC).", + _rpic: "ipfs://", + _perks: ["mochas and biggs"], + _deadline: getDeadline, + _quantity: 100, + _infinite: true, + _shipsTo: ["_NW"], + }) + ).to.be.reverted + }) + }) + + // describe("getCampaignDetails", function () { + // it("returns all campaign details", async ()=>{ + // const campaignDetails = await campaign.getCampaignDetails() + // assert( + // campaignDetails.creator && + // campaignDetails.title && + // campaignDetails.description && + // campaignDetails.tags && + // "goalAmount" in campaignDetails && + // "duration" in campaignDetails && + // "currentBalance" in campaignDetails && + // "currentState" in campaignDetails + // ) + // // console.log(campaignDetails) + // }) + // }) + })