diff --git a/src/contract.jsligo b/src/contract.jsligo index c3ffa6ae48fddecd340e7888b5aa96a8a6fa0abe..e5fd758d3b9eec551b4787d28bf155febf9db724 100644 --- a/src/contract.jsligo +++ b/src/contract.jsligo @@ -8,14 +8,9 @@ #import "contracts/fa2.jsligo" "FA2" - -export type vote = - | ["yay"] - | ["nope"] - | ["pass"]; +export type vote = ["yay"] | ["nope"] | ["pass"]; // =============================================================================================== - namespace Preamble { export const prepare_new_proposal = ( params: Parameter.Types.proposal_params, @@ -38,7 +33,6 @@ namespace Preamble { }; // =============================================================================================== - type request = [Parameter.Types.t, Storage.Types.t]; export type result = [list<operation>, Storage.Types.t]; @@ -54,34 +48,59 @@ export const create_proposal = ( }; @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 - ); - +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 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); - + 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 +@entry +export const buy_token = ( + buyer_address: address, + amount: nat, + storage: Storage.Types.t +): result => { + // Transférer les tokens de la "banque" vers l'acheteur + const transferOperation = + FA2.transfer_tokens(storage.bank_address, buyer_address, amount); + // Mettre à jour le stockage pour refléter le nouveau solde de l'acheteur et de la "banque" + const final_storage = + Storage.Utils.update_balances( + storage.bank_address, + buyer_address, + amount, + storage + ); + // Retourner une liste d'opérations et le stockage mis à jour + return [[transferOperation], 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)): diff --git a/src/storage.jsligo b/src/storage.jsligo index 10f87e0f27d60a5e465296d1b8784ac36074bfeb..cb15e1dfd9c8242f26227592a90b0c5aec18cf75 100644 --- a/src/storage.jsligo +++ b/src/storage.jsligo @@ -18,7 +18,8 @@ export namespace Types { proposal_map: big_map<nat, proposal>, signers: set<address>, threshold: nat, - metadata: big_map<string, bytes> + metadata: big_map<string, bytes>, + balances: big_map<address, nat> }; }; @@ -31,7 +32,8 @@ export namespace Utils { proposal_map: Big_map.empty as big_map<nat, Types.proposal>, signers: signers, threshold: threshold, - metadata: (Big_map.empty as big_map<string, bytes>) + metadata: (Big_map.empty as big_map<string, bytes>), + balances: (Big_map.empty as big_map<address, nat>) } ); @inline @@ -105,4 +107,29 @@ export namespace Utils { ); return { ...storage, proposal_map: proposal_map } }; +/* + @inline +export const update_balances = (bank_address: address, buyer_address: address, amount: nat, storage: Types.t): Types.t => { + // Vérifier si les adresses existent dans le stockage, sinon initialiser à 0 + if (Test.equal(Big_map.find_opt(bank_address, storage.balances), None())) { + let storage = { ...storage }; + storage.balances = Big_map.add(bank_address, 0n, storage.balances); + } + if (Test.equal(Big_map.find_opt(buyer_address, storage.balances), None())) { + let updatedStorage = { ...storage }; + updatedStorage.balances = Big_map.add(buyer_address, 0n, updatedStorage.balances); + } + + // Récupérer les soldes actuels + const bank_balance = Big_map.find_opt(bank_address, storage.balances).get(); + const buyer_balance = Big_map.find_opt(buyer_address, storage.balances).get(); + + // Mettre à jour les soldes + storage.balances = Big_map.update(bank_address, Some(bank_balance - amount), storage.balances); + storage.balances = Big_map.update(buyer_address, Some(buyer_balance + amount), storage.balances); + + // Retourner le stockage mis à jour + return storage; +}; +*/ }