Crowd fundraising campagindefi

Source

CROWDFUNDRAISIN

  • how to start a fund raising campagin
  • how to work
  • included make by factory pattern

how to use by factory

  • remove or comment line 106 here

how to deploy & run directly

  • use line 106 & compile & deploy here

Review

  • Create campagin
function create(address benefit, uint amount, uint end, bool timerNeed) public onlyAdmin returns (bytes16) {
    // validating the benefit address not a smartContract
    require(!_isContract(benefit), "NOT VALID: benefitial address is contract address");
    needTimer = timerNeed;
    campaginId += 1;
    uint start = block.timestamp;
    bytes16 DATA = bytes16(
        keccak256(abi.encodePacked(msg.sender, benefit, amount, campaginId, start))
    ); // type(Crowdfunding).creationCode
    isValidData.push(DATA);
    _balanceOfCampagin[campaginId] = 0;
    campagin[campaginId] = CROWD(
        campaginId,
        amount,
        start,
        start + end,
        0,
        0,
        benefit,
        DATA,
        false
    );
    emit Create(campaginId, benefit, start, amount, DATA);
    return DATA;
}
  • Conterbute
function conterbute(uint _campaginId) public payable isNotEnded(_campaginId) returns (bool) {
    require(_areValidToPay(_campaginId));
    if (!needTimer) {
        campagin[_campaginId].conterbuter += 1;
        campagin[_campaginId].shareCount += msg.value;
        _balanceOf[msg.sender][_campaginId] += msg.value;
        _balanceOfCampagin[_campaginId] += msg.value;
        _fundRaiser[msg.sender] = true;
        if(balanceOfCampagin(_campaginId) >= campagin[_campaginId].raiseAmount){
            campagin[_campaginId].finished = true;
        }
        emit Conterbute(_campaginId, msg.sender, block.timestamp, msg.value);
        return true;
    }
    else {
        require(campagin[_campaginId].end < block.timestamp, "time out!");
        campagin[_campaginId].conterbuter += 1;
        campagin[_campaginId].shareCount += msg.value;
        _balanceOf[msg.sender][_campaginId] += msg.value;
        _balanceOfCampagin[_campaginId] += msg.value;
        _fundRaiser[msg.sender] = true;
        if(balanceOfCampagin(_campaginId) >= campagin[_campaginId].raiseAmount){
            campagin[_campaginId].finished = true;
        }            
        emit Conterbute(_campaginId, msg.sender, block.timestamp, msg.value);
        return true;
    }
}
  • Refund
function refund(uint _campaginId) public onlyFundRaiser isNotEnded(_campaginId) noReentrant returns (bool, uint) {
    if(needTimer) {
        require(campagin[_campaginId].end < block.timestamp, "campagin finished");
    }
    require(_balanceOf[msg.sender][_campaginId] > 0, "you are not raise in this campagin");
    uint val = _balanceOf[msg.sender][_campaginId];
    _balanceOf[msg.sender][_campaginId] = 0;
    // payable(msg.sender).transfer(val); // old way & not secure
    (bool success, ) = msg.sender.call{value: val}("");
    if(!success){_balanceOf[msg.sender][_campaginId]=val;} // not secure method at all, but  only way in his pattern
    if(success){
        campagin[_campaginId].conterbuter -= 1;
        campagin[_campaginId].shareCount -= val;
        _balanceOfCampagin[_campaginId] -= val;
        _balanceOf[msg.sender][_campaginId] -= val;
        _fundRaiser[msg.sender] = false;
    }
    require(success);
    emit Refund(_campaginId, msg.sender, block.timestamp, val);
    return(success, val);
}
  • Finalize
function finalize(uint _campaginId) public onlyAdmin returns (bool, uint) {
    require(balance() >= balanceOfCampagin(_campaginId), "somethings wrong, meybe campagin not finished yet");
    require(campagin[_campaginId].finished, "campagin not finished yet");
    if(needTimer) {
        require(campagin[_campaginId].end > block.timestamp, "wait to finish the time!");
    }
    campagin[_campaginId].finished = true;
    uint _amount = _balanceOfCampagin[_campaginId];
    _balanceOfCampagin[_campaginId] = 0;
    (bool success, ) = payable(campagin[_campaginId].benefit).call{value: _amount}("");
    if(!success){_balanceOfCampagin[_campaginId] = _amount;} // not secure method at all, but  only way in his pattern
    require(success, "transaction failed");
    emit Finalize(_campaginId, campagin[_campaginId].benefit, block.timestamp, _amount);
    return (success, _amount);
}