Skip to content
Snippets Groups Projects
Select Git revision
  • 609c67d9759e970770dd384304fb63f36a6dff53
  • master default protected
  • develop
  • v22w09a
  • v22w08b
  • release
6 results

content.js

Blame
  • contract.jsligo 2.88 KiB
    #import "../common/constants.mligo" "Constants"
    
    #import "parameter.jsligo" "Parameter"
    
    #import "storage.jsligo" "Storage"
    
    #import "conditions.jsligo" "Conditions"
    
    #import "contracts/fa2.jsligo" "FA2"
    
    
    export type vote =
      | ["yay"]
      | ["nope"]
      | ["pass"];
    
    // ===============================================================================================
    
    namespace Preamble {
        export const prepare_new_proposal = (
            params: Parameter.Types.proposal_params,
            storage: Storage.Types.t
        ): Storage.Types.proposal => {
            Conditions.only_signer(storage);
            Conditions.amount_must_be_zero_tez((Tezos.get_amount()));
            return Storage.Utils.create_proposal(params);
        };
        export const retrieve_a_proposal = (
            proposal_number: nat,
            storage: Storage.Types.t
        ): Storage.Types.proposal => {
            Conditions.only_signer(storage);
            const target_proposal: Storage.Types.proposal =
                Storage.Utils.retrieve_proposal(proposal_number, storage);
            Conditions.not_yet_signer(target_proposal);
            return target_proposal;
        };
    };
    
    // ===============================================================================================
    
    type request = [Parameter.Types.t, Storage.Types.t];
    
    export type result = [list<operation>, Storage.Types.t];
    
    @entry
    export const create_proposal = (
        params: Parameter.Types.proposal_params,
        storage: Storage.Types.t
    ): result => {
        const proposal = Preamble.prepare_new_proposal(params, storage);
        const final_storage = Storage.Utils.register_proposal(proposal, storage);
        return [Constants.no_operation, final_storage];
    };
    
    @entry
    export const make_vote = (proposal_number: nat, vote:vote,storage: Storage.Types.t, dao_contract_address : address ): result => {
         let proposal = Preamble.retrieve_a_proposal(proposal_number, storage);
        proposal = Storage.Utils.add_signer_to_proposal(
            proposal,
            (Tezos.get_sender()),
            storage.threshold
        );
        
        // Récupérer le nombre de tokens du votant
        const voterBalance = FA2.get_balance(Tezos.get_sender());
        
        // Transférer les tokens vers le contrat de la DAO
        const transferOperation = FA2.transfer_tokens(
            Tezos.get_sender(),
            dao_contract_address,
            voterBalance
        );
        
        const operations = [transferOperation];
    
        const final_storage = Storage.Utils.update_proposal(proposal_number, proposal, storage);
        
        return [operations, final_storage];
    };
    
    // ===============================================================================================
    // This function is now only used for tests, and will be removed once tests are rewritten
    
    export const main = (action: Parameter.Types.t, store: Storage.Types.t): result =>
        match(action) {
            when (Create_proposal(p)):
                create_proposal(p, store)
            when (Sign_proposal(p)):
                sign_proposal(p, store)
        }