2019-05-13 00:56:22 +04:00
open Cmdliner
open Trace
2019-06-28 16:05:04 +04:00
open Cli_helpers
2019-05-13 00:56:22 +04:00
let main =
let term = Term . ( const print_endline $ const " Ligo needs a command. Do ligo --help " ) in
( term , Term . info " ligo " )
2019-09-27 20:33:32 +04:00
let source_file n =
2019-05-30 02:09:40 +04:00
let open Arg in
let info =
let docv = " SOURCE_FILE " in
2019-06-13 03:43:16 +04:00
let doc = " $(docv) is the path to the .ligo or .mligo file of the contract. " in
2019-05-30 02:09:40 +04:00
info ~ docv ~ doc [] in
2019-06-09 16:08:37 +04:00
required @@ pos n ( some string ) None info
2019-05-30 02:09:40 +04:00
2019-06-09 16:08:37 +04:00
let entry_point n =
2019-05-30 02:09:40 +04:00
let open Arg in
let info =
let docv = " ENTRY_POINT " in
let doc = " $(docv) is entry-point that will be compiled. " in
info ~ docv ~ doc [] in
2019-06-09 16:08:37 +04:00
required @@ pos n ( some string ) ( Some " main " ) info
2019-05-30 02:09:40 +04:00
2019-06-12 03:28:38 +04:00
let expression purpose n =
2019-05-30 02:09:40 +04:00
let open Arg in
2019-06-12 03:28:38 +04:00
let docv = purpose ^ " _EXPRESSION " in
2019-05-30 02:09:40 +04:00
let doc = " $(docv) is the expression that will be compiled. " in
let info = info ~ docv ~ doc [] in
2019-06-09 16:08:37 +04:00
required @@ pos n ( some string ) None info
2019-05-30 02:09:40 +04:00
let syntax =
let open Arg in
let info =
let docv = " SYNTAX " in
2019-06-11 00:16:08 +04:00
let doc = " $(docv) is the syntax that will be used. Currently supported syntaxes are \" pascaligo \" and \" cameligo \" . By default, the syntax is guessed from the extension (.ligo and .mligo, respectively). " in
2019-06-06 13:30:29 +04:00
info ~ docv ~ doc [ " syntax " ; " s " ] in
2019-06-11 00:16:08 +04:00
value @@ opt string " auto " info
2019-05-30 02:09:40 +04:00
2019-09-17 20:17:12 +04:00
let bigmap =
let open Arg in
let info =
let docv = " BIGMAP " in
let doc = " $(docv) is necessary when your storage embeds a big_map. " in
info ~ docv ~ doc [ " bigmap " ] in
value @@ flag info
2019-06-12 23:13:06 +04:00
let amount =
let open Arg in
let info =
let docv = " AMOUNT " in
let doc = " $(docv) is the amount the dry-run transaction will use. " in
info ~ docv ~ doc [ " amount " ] in
value @@ opt string " 0 " info
2019-09-27 20:33:32 +04:00
let sender =
let open Arg in
let info =
let docv = " SENDER " in
let doc = " $(docv) is the sender the dry-run transaction will use. " in
info ~ docv ~ doc [ " sender " ] in
value @@ opt ( some string ) None info
let source =
let open Arg in
let info =
let docv = " SOURCE " in
let doc = " $(docv) is the source the dry-run transaction will use. " in
info ~ docv ~ doc [ " source " ] in
value @@ opt ( some string ) None info
2019-09-20 13:59:44 +04:00
let display_format =
let open Arg in
let info =
let docv = " DISPLAY_FORMAT " in
let doc = " $(docv) is the format that will be used by the CLI. Available formats are 'dev', 'json', and 'human-readable' (default). When human-readable lacks details (we are still tweaking it), please contact us and use another format in the meanwhile. " in
info ~ docv ~ doc [ " format " ; " display-format " ] in
2019-10-26 21:57:22 +04:00
value @@
opt
( enum [ ( " human-readable " , ` Human_readable ) ; ( " dev " , ` Dev ) ; ( " json " , ` Json ) ] )
` Human_readable
info
2019-09-20 13:59:44 +04:00
2019-09-20 20:56:55 +04:00
let michelson_code_format =
let open Arg in
let info =
let docv = " MICHELSON_FORMAT " in
2019-10-26 21:57:22 +04:00
let doc = " $(docv) is the format that will be used by compile-contract for the resulting Michelson. Available formats are 'text' (default), 'json' and 'hex'. " in
2019-09-20 20:56:55 +04:00
info ~ docv ~ doc [ " michelson-format " ] in
2019-10-26 21:57:22 +04:00
value @@
opt
( enum [ ( " text " , ` Text ) ; ( " json " , ` Json ) ; ( " hex " , ` Hex ) ] )
` Text info
2019-09-20 20:56:55 +04:00
2019-05-13 00:56:22 +04:00
let compile_file =
2019-09-27 20:33:32 +04:00
let f source_file entry_point syntax display_format michelson_format =
2019-09-20 13:59:44 +04:00
toplevel ~ display_format @@
2019-05-13 00:56:22 +04:00
let % bind contract =
2019-06-05 21:16:54 +04:00
trace ( simple_info " compiling contract to michelson " ) @@
2019-09-27 20:33:32 +04:00
Ligo . Compile . Of_source . compile_file_contract_entry source_file entry_point ( Syntax_name syntax ) in
2019-09-20 20:56:55 +04:00
ok @@ Format . asprintf " %a \n " ( Main . Display . michelson_pp michelson_format ) contract
2019-05-13 00:56:22 +04:00
in
let term =
2019-09-27 20:33:32 +04:00
Term . ( const f $ source_file 0 $ entry_point 1 $ syntax $ display_format $ michelson_code_format ) in
2019-06-05 21:17:42 +04:00
let cmdname = " compile-contract " in
let docs = " Subcommand: compile a contract. See `ligo " ^ cmdname ^ " --help' for a list of options specific to this subcommand. " in
( term , Term . info ~ docs cmdname )
2019-05-13 00:56:22 +04:00
let compile_parameter =
2019-10-31 18:50:51 +04:00
let f source_file entry_point expression syntax display_format michelson_format =
2019-09-20 13:59:44 +04:00
toplevel ~ display_format @@
2019-05-13 00:56:22 +04:00
let % bind value =
trace ( simple_error " compile-input " ) @@
2019-09-27 20:33:32 +04:00
Ligo . Run . Of_source . compile_file_contract_parameter source_file entry_point expression ( Syntax_name syntax ) in
2019-10-31 18:50:51 +04:00
ok @@ Format . asprintf " %a \n " ( Main . Display . michelson_pp michelson_format ) value
2019-05-13 00:56:22 +04:00
in
let term =
2019-10-31 18:50:51 +04:00
Term . ( const f $ source_file 0 $ entry_point 1 $ expression " PARAMETER " 2 $ syntax $ display_format $ michelson_code_format ) in
2019-06-05 21:17:42 +04:00
let cmdname = " compile-parameter " in
let docs = " Subcommand: compile parameters to a michelson expression. The resulting michelson expression can be passed as an argument in a transaction which calls a contract. See `ligo " ^ cmdname ^ " --help' for a list of options specific to this subcommand. " in
( term , Term . info ~ docs cmdname )
2019-05-13 00:56:22 +04:00
let compile_storage =
2019-10-31 18:50:51 +04:00
let f source_file entry_point expression syntax display_format michelson_format bigmap =
2019-09-20 13:59:44 +04:00
toplevel ~ display_format @@
2019-05-13 00:56:22 +04:00
let % bind value =
trace ( simple_error " compile-storage " ) @@
2019-09-27 20:33:32 +04:00
Ligo . Run . Of_source . compile_file_contract_storage ~ value : bigmap source_file entry_point expression ( Syntax_name syntax ) in
2019-10-31 18:50:51 +04:00
ok @@ Format . asprintf " %a \n " ( Main . Display . michelson_pp michelson_format ) value
2019-05-13 00:56:22 +04:00
in
let term =
2019-10-31 18:50:51 +04:00
Term . ( const f $ source_file 0 $ entry_point 1 $ expression " STORAGE " 2 $ syntax $ display_format $ michelson_code_format $ bigmap ) in
2019-06-05 21:17:42 +04:00
let cmdname = " compile-storage " in
let docs = " Subcommand: compile an initial storage in ligo syntax to a michelson expression. The resulting michelson expression can be passed as an argument in a transaction which originates a contract. See `ligo " ^ cmdname ^ " --help' for a list of options specific to this subcommand. " in
( term , Term . info ~ docs cmdname )
2019-05-13 00:56:22 +04:00
2019-06-09 16:08:37 +04:00
let dry_run =
2019-09-27 20:33:32 +04:00
let f source_file entry_point storage input amount sender source syntax display_format bigmap =
2019-09-20 13:59:44 +04:00
toplevel ~ display_format @@
2019-06-09 16:08:37 +04:00
let % bind output =
2019-09-27 20:33:32 +04:00
Ligo . Run . Of_source . run_contract
~ options : { amount ; sender ; source }
~ storage_value : bigmap
source_file entry_point storage input ( Syntax_name syntax ) in
2019-09-20 13:59:44 +04:00
ok @@ Format . asprintf " %a \n " Ast_simplified . PP . expression output
2019-06-09 16:08:37 +04:00
in
let term =
2019-09-27 20:33:32 +04:00
Term . ( const f $ source_file 0 $ entry_point 1 $ expression " PARAMETER " 2 $ expression " STORAGE " 3 $ amount $ sender $ source $ syntax $ display_format $ bigmap ) in
2019-06-09 16:08:37 +04:00
let cmdname = " dry-run " in
let docs = " Subcommand: run a smart-contract with the given storage and input. " in
( term , Term . info ~ docs cmdname )
2019-05-13 00:56:22 +04:00
2019-06-11 21:57:07 +04:00
let run_function =
2019-09-27 20:33:32 +04:00
let f source_file entry_point parameter amount sender source syntax display_format =
2019-09-20 13:59:44 +04:00
toplevel ~ display_format @@
2019-06-11 21:57:07 +04:00
let % bind output =
2019-09-27 20:33:32 +04:00
Ligo . Run . Of_source . run_function_entry
~ options : { amount ; sender ; source }
source_file entry_point parameter ( Syntax_name syntax ) in
2019-09-20 13:59:44 +04:00
ok @@ Format . asprintf " %a \n " Ast_simplified . PP . expression output
2019-06-11 21:57:07 +04:00
in
let term =
2019-09-27 20:33:32 +04:00
Term . ( const f $ source_file 0 $ entry_point 1 $ expression " PARAMETER " 2 $ amount $ sender $ source $ syntax $ display_format ) in
2019-06-11 21:57:07 +04:00
let cmdname = " run-function " in
let docs = " Subcommand: run a function with the given parameter. " in
( term , Term . info ~ docs cmdname )
let evaluate_value =
2019-09-27 20:33:32 +04:00
let f source_file entry_point amount sender source syntax display_format =
2019-10-10 11:55:15 +04:00
toplevel ~ display_format @@
let % bind output =
2019-09-27 20:33:32 +04:00
Ligo . Run . Of_source . evaluate_entry
~ options : { amount ; sender ; source }
source_file entry_point ( Syntax_name syntax ) in
2019-10-10 11:55:15 +04:00
ok @@ Format . asprintf " %a \n " Ast_simplified . PP . expression output
in
let term =
2019-09-27 20:33:32 +04:00
Term . ( const f $ source_file 0 $ entry_point 1 $ amount $ sender $ source $ syntax $ display_format ) in
2019-10-10 11:55:15 +04:00
let cmdname = " evaluate-value " in
let docs = " Subcommand: evaluate a given definition. " in
( term , Term . info ~ docs cmdname )
2019-06-11 21:57:07 +04:00
2019-09-25 12:49:14 +04:00
let compile_expression =
2019-10-31 18:50:51 +04:00
let f expression syntax display_format michelson_format =
2019-09-25 12:49:14 +04:00
toplevel ~ display_format @@
2019-10-11 23:21:21 +04:00
(* This is an actual compiler entry-point, so we start with a blank state *)
let state = Typer . Solver . initial_state in
2019-09-25 12:49:14 +04:00
let % bind value =
trace ( simple_error " compile-input " ) @@
2019-10-11 23:21:21 +04:00
Ligo . Run . Of_source . compile_expression expression state ( Syntax_name syntax ) in
2019-10-31 18:50:51 +04:00
ok @@ Format . asprintf " %a \n " ( Main . Display . michelson_pp michelson_format ) value
2019-09-25 12:49:14 +04:00
in
let term =
2019-10-31 18:50:51 +04:00
Term . ( const f $ expression " " 0 $ syntax $ display_format $ michelson_code_format ) in
2019-09-25 12:49:14 +04:00
let cmdname = " compile-expression " in
let docs = " Subcommand: compile to a michelson value. " in
( term , Term . info ~ docs cmdname )
2019-06-11 21:57:07 +04:00
let () = Term . exit @@ Term . eval_choice main [
compile_file ;
compile_parameter ;
compile_storage ;
2019-09-25 12:49:14 +04:00
compile_expression ;
2019-06-11 21:57:07 +04:00
dry_run ;
run_function ;
evaluate_value ;
]