https://gitlab.com/nomadic-labs/mi-cho-coq
Raw File
Tip revision: 1f0c09730df60b78c19f0c965d697052e7484b9f authored by Arvid Jakobsson on 16 April 2021, 14:03:14 UTC
Functional specification and proof for TokenToXTZ
Tip revision: 1f0c097
dexter_definition.v
(* Open Source License *)
(* Copyright (c) 2020 Nomadic Labs. <contact@nomadic-labs.com> *)

(* Permission is hereby granted, free of charge, to any person obtaining a *)
(* copy of this software and associated documentation files (the "Software"), *)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)
(* and/or sell copies of the Software, and to permit persons to whom the *)
(* Software is furnished to do so, subject to the following conditions: *)

(* The above copyright notice and this permission notice shall be included *)
(* in all copies or substantial portions of the Software. *)

(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)
(* DEALINGS IN THE SOFTWARE. *)

Require Import String.

Require Import syntax.
Require error.
Require parser_helpers.

Require Import dexter_definition_helpers.
Require dexter_parse.

(*! Parameter type !*)

(*+ Parameter type definitions +*)

Definition parameter_ty := Eval cbv in contract_file_parameter dexter_parse.dex_contract_file.

Definition parameter_ep_addLiquidity_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%addLiquidity") I.

Definition parameter_ep_removeLiquidity_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%removeLiquidity") I.

Definition parameter_ep_xtzToToken_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%xtzToToken") I.

Definition parameter_ep_tokenToXtz_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%tokenToXtz") I.

Definition parameter_ep_tokenToToken_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%tokenToToken") I.

(*
 * Definition parameter_ep_updateTokenPool_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%updateTokenPool") I.
 *)

(*
 * Definition parameter_ep_updateTokenPoolInternal_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%updateTokenPoolInternal") I.
 *)

(*
 * Definition parameter_ep_setBaker_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%setBaker") I.
 *)

(*
 * Definition parameter_ep_setLqtAddress_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%setLqtAddress") I.
 *)

(*
 * Definition parameter_ep_setManager_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%setManager") I.
 *)

Definition parameter_ep_default_ty := Eval cbv in get_opt (get_ep_ty_by_name1 parameter_ty "%default") I.

(*! Storage type !*)

Definition storage_ty : type :=
  Eval cbv in contract_file_storage dexter_parse.dex_contract_file.

(*! Contract definition !*)

Definition self_type : self_info := Eval cbv in (Some (parameter_ty, None)).

Import error.Notations.

Definition instr_seq_from_typer_result s self_type A B :
  error.M (sigT (fun b => typer.instruction_seq self_type b A B)) :=
  parser_helpers.michelson_type_checked_seq_M
    s 100 self_type A B.

Definition instr_seq_from_sig_to_error self_type A B
           (v : (sigT (fun b => typer.instruction_seq self_type b A B))) :
  error.M (typer.instruction_seq self_type false A B) :=
  match v  with
  | existT _ true code => error.Failed _ (error.Assertion_Failure _ tt)
  | existT _ false code => error.Return code
  end.

Definition m_instr_seq_from_string s self_type A B:
  error.M (typer.instruction_seq self_type false A B) :=
  let! v := instr_seq_from_typer_result s self_type A B in
  let! v' := instr_seq_from_sig_to_error self_type A B v in
  error.Return v'.

Definition ep_from_string s (ep_ty : type) :
  error.M (typer.instruction_seq self_type false
                                 (ep_ty ::: storage_ty ::: nil)
                                 (pair (list operation) storage_ty ::: nil)) :=
  m_instr_seq_from_string s self_type
                          (ep_ty ::: storage_ty ::: nil)
                          (pair (list operation) storage_ty ::: nil).

Definition ep_addLiquidity := (error.extract (ep_from_string dexter_string.ep_addLiquidity parameter_ep_addLiquidity_ty) I).

Definition ep_removeLiquidity := (error.extract (ep_from_string dexter_string.ep_removeLiquidity parameter_ep_removeLiquidity_ty) I).

Definition ep_xtzToToken := (error.extract (ep_from_string dexter_string.ep_xtzToToken parameter_ep_xtzToToken_ty) I).

Definition ep_tokenToXtz := (error.extract (ep_from_string dexter_string.ep_tokenToXtz parameter_ep_tokenToXtz_ty) I).

Definition ep_tokenToToken := (error.extract (ep_from_string dexter_string.ep_tokenToToken parameter_ep_tokenToToken_ty) I).

(*
 * Definition ep_updateTokenPool := (error.extract (ep_from_string dexter_string.ep_updateTokenPool parameter_ep_updateTokenPool_ty) I).
 *)

(*
 * Definition ep_updateTokenPoolInternal := (error.extract (ep_from_string dexter_string.ep_updateTokenPoolInternal parameter_ep_updateTokenPoolInternal_ty) I).
 *)

(*
 * Definition ep_setBaker := (error.extract (ep_from_string dexter_string.ep_setBaker parameter_ep_setBaker_ty) I).
 *)

(*
 * Definition ep_setManager := (error.extract (ep_from_string dexter_string.ep_setManager parameter_ep_setManager_ty) I).
 *)

(*
 * Definition ep_setLqtAddress := (error.extract (ep_from_string dexter_string.ep_setLqtAddress parameter_ep_setLqtAddress_ty) I).
 *)

Definition ep_default := (error.extract (ep_from_string dexter_string.ep_default parameter_ep_default_ty) I).


(*! Main !*)

Definition main :=
  contract_file_code dexter_parse.dex_contract_file.


(*! Alternate main !*)

(* This should be the same as [main], however, the contract above
   renders something that is too slow to work on. *)

Require Import macros.

Definition main2 : instruction_seq
                     self_type _
                     (pair parameter_ty storage_ty ::: nil)
                     (pair (list operation) storage_ty ::: nil)
  :=  { DUP ;
        CDR ;
        SWAP ;
        CAR ;
        IF_LEFT
          { IF_LEFT
              { IF_LEFT
                  ( ep_addLiquidity )
                  ( ep_default ) }
              { IF_LEFT
                  ( ep_removeLiquidity )
                  ( ep_tokenToToken ) } }
          { IF_LEFT
              ( ep_tokenToXtz )
              ( ep_xtzToToken ) } }.

Lemma main_eq_main2 : main = main2.
  reflexivity.
Qed.
back to top