lundi 3 septembre 2018

Jetons et DAOs

https://www.ethereum.org/

Jetons et DAOs

Dans cet exemple, nous allons faire un crowdfunding mieux de résoudre deux problèmes importants : comment les récompenses sont gérés et conservés, et comment l’argent est dépensé après que les fonds sont levés.
Récompenses en crowdfundings sont généralement réglées par une base de données immuable centrale qui assure le suivi de tous les donateurs : tous ceux qui ont manqué la date limite pour la campagne ne peut pas obtenir plus et tout donateur qui a changé leur esprit ne peut pas sortir. Au lieu de cela, nous allons faire la façon décentralisée et il suffit de créer un jeton pour garder une trace des récompenses, quiconque contribue obtient un jeton qui ils peuvent échanger, vendre ou garder pour plus tard. Lorsque vient le temps de la récompense physique le producteur n’a besoin d’échanger les jetons pour les vrais produits. Donateurs arriver à garder leurs jetons, même si le projet n’atteint pas ses objectifs, en guise de souvenir.
En outre, généralement ceux qui financent ne peut pas avoir son mot à dire sur la façon dont l’argent est dépensé après que les fonds sont levés et mauvaise gestion souvent cause projets jamais de livrer n’importe quoi du tout. Dans ce projet, nous utiliserons une Organisation démocratique qui devra approuver tout argent qui sortent du système. Ceci est souvent appelé un crowdsale ou l’équité de la foule et est donc fondamental que, dans certains cas, le jeton peut être la récompense elle-même, en particulier dans les projets où un groupe de personnes se rassemblent pour construire un public commun bien.
https://www.ethereum.org/crowdsale

Exemple :


pragma solidity ^
0.4.18;
interface token {
   
function transfer(address receiver, uint amount) external;
}

contract Crowdsale {
    address
public beneficiary;
   
uint public fundingGoal;
   
uint public amountRaised;
   
uint public deadline;
   
uint public price;
    token
public tokenReward;
    mapping(address => uint256)
public balanceOf;
   
bool fundingGoalReached = false;
   
bool crowdsaleClosed = false;

   
event GoalReached(address recipient, uint totalAmountRaised);
   
event FundTransfer(address backer, uint amount, bool isContribution);

   
/**
     * Constructor function
     *
     * Setup the owner
     */

   
function Crowdsale(
        address ifSuccessfulSendTo,
        uint fundingGoalInEthers,
        uint durationInMinutes,
        uint etherCostOfEachToken, address addressOfTokenUsedAsReward
) public
{
        beneficiary = ifSuccessfulSendTo;
        fundingGoal = fundingGoalInEthers *
1 ether;
        deadline = now + durationInMinutes *
1 minutes;
        price = etherCostOfEachToken *
1 ether;
        tokenReward = token(addressOfTokenUsedAsReward);
    }

   
/**
     * Fallback function
     *
     * The function without name is the default function that is called whenever anyone sends funds to a contract
     */

    function () payable
public {
        require(!crowdsaleClosed);
       
uint amount = msg.value;
        balanceOf[msg.sender] += amount;
        amountRaised += amount;
        tokenReward.transfer(msg.sender, amount / price);
      
emit FundTransfer(msg.sender, amount, true);
    }

   
modifier afterDeadline() { if (now >= deadline) _; }

   
/**
     * Check if goal was reached
     *
     * Checks if the goal or time limit has been reached and ends the campaign
     */

   
function checkGoalReached() public afterDeadline {
       
if (amountRaised >= fundingGoal){
            fundingGoalReached =
true;
           
emit GoalReached(beneficiary, amountRaised);
        }
        crowdsaleClosed =
true;
    }


   
/**
     * Withdraw the funds
     *
     * Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached,
     * sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw
     * the amount they contributed.
     */

   
function safeWithdrawal() public afterDeadline {
       
if (!fundingGoalReached) {
           
uint amount = balanceOf[msg.sender];
            balanceOf[msg.sender] =
0;
           
if (amount > 0) {
               
if (msg.sender.send(amount)) {
                  
emit FundTransfer(msg.sender, amount, false);
                }
else {
                    balanceOf[msg.sender] = amount;
                }
            }
        }

       
if (fundingGoalReached && beneficiary == msg.sender) {
           
if (beneficiary.send(amountRaised)) {
              
emit FundTransfer(beneficiary, amountRaised, false);
            }
else {
               
//If we fail to send the funds to beneficiary, unlock funders balance
                fundingGoalReached =
false;
            }
        }
    }
}


--- Pierre Erol GIRAUDY

Aucun commentaire: