123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596(*****************************************************************************)(* *)(* Open Source License *)(* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. <contact@tezos.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. *)(* *)(*****************************************************************************)openMichelinetypeerror+=Unknown_primitive_nameofstringtypeerror+=Invalid_caseofstringtypeerror+=Invalid_primitive_nameofstringMicheline.canonical*Micheline.canonical_locationtypeprim=|K_parameter|K_storage|K_code|D_False|D_Elt|D_Left|D_None|D_Pair|D_Right|D_Some|D_True|D_Unit|I_PACK|I_UNPACK|I_BLAKE2B|I_SHA256|I_SHA512|I_ABS|I_ADD|I_AMOUNT|I_AND|I_BALANCE|I_CAR|I_CDR|I_CHECK_SIGNATURE|I_COMPARE|I_CONCAT|I_CONS|I_CREATE_ACCOUNT|I_CREATE_CONTRACT|I_IMPLICIT_ACCOUNT|I_DIP|I_DROP|I_DUP|I_EDIV|I_EMPTY_MAP|I_EMPTY_SET|I_EQ|I_EXEC|I_FAILWITH|I_GE|I_GET|I_GT|I_HASH_KEY|I_IF|I_IF_CONS|I_IF_LEFT|I_IF_NONE|I_INT|I_LAMBDA|I_LE|I_LEFT|I_LOOP|I_LSL|I_LSR|I_LT|I_MAP|I_MEM|I_MUL|I_NEG|I_NEQ|I_NIL|I_NONE|I_NOT|I_NOW|I_OR|I_PAIR|I_PUSH|I_RIGHT|I_SIZE|I_SOME|I_SOURCE|I_SENDER|I_SELF|I_SLICE|I_STEPS_TO_QUOTA|I_SUB|I_SWAP|I_TRANSFER_TOKENS|I_SET_DELEGATE|I_UNIT|I_UPDATE|I_XOR|I_ITER|I_LOOP_LEFT|I_ADDRESS|I_CONTRACT|I_ISNAT|I_CAST|I_RENAME|T_bool|T_contract|T_int|T_key|T_key_hash|T_lambda|T_list|T_map|T_big_map|T_nat|T_option|T_or|T_pair|T_set|T_signature|T_string|T_bytes|T_mutez|T_timestamp|T_unit|T_operation|T_addressletvalid_casename=letis_lower=function'_'|'a'..'z'->true|_->falseinletis_upper=function'_'|'A'..'Z'->true|_->falseinletrecfor_allabf=Compare.Int.(a>b)||fa&&for_all(a+1)bfinletlen=String.lengthnameinCompare.Int.(len<>0)&&Compare.Char.(String.getname0<>'_')&&((is_upper(String.getname0)&&for_all1(len-1)(funi->is_upper(String.getnamei)))||(is_upper(String.getname0)&&for_all1(len-1)(funi->is_lower(String.getnamei)))||(is_lower(String.getname0)&&for_all1(len-1)(funi->is_lower(String.getnamei))))letstring_of_prim=function|K_parameter->"parameter"|K_storage->"storage"|K_code->"code"|D_False->"False"|D_Elt->"Elt"|D_Left->"Left"|D_None->"None"|D_Pair->"Pair"|D_Right->"Right"|D_Some->"Some"|D_True->"True"|D_Unit->"Unit"|I_PACK->"PACK"|I_UNPACK->"UNPACK"|I_BLAKE2B->"BLAKE2B"|I_SHA256->"SHA256"|I_SHA512->"SHA512"|I_ABS->"ABS"|I_ADD->"ADD"|I_AMOUNT->"AMOUNT"|I_AND->"AND"|I_BALANCE->"BALANCE"|I_CAR->"CAR"|I_CDR->"CDR"|I_CHECK_SIGNATURE->"CHECK_SIGNATURE"|I_COMPARE->"COMPARE"|I_CONCAT->"CONCAT"|I_CONS->"CONS"|I_CREATE_ACCOUNT->"CREATE_ACCOUNT"|I_CREATE_CONTRACT->"CREATE_CONTRACT"|I_IMPLICIT_ACCOUNT->"IMPLICIT_ACCOUNT"|I_DIP->"DIP"|I_DROP->"DROP"|I_DUP->"DUP"|I_EDIV->"EDIV"|I_EMPTY_MAP->"EMPTY_MAP"|I_EMPTY_SET->"EMPTY_SET"|I_EQ->"EQ"|I_EXEC->"EXEC"|I_FAILWITH->"FAILWITH"|I_GE->"GE"|I_GET->"GET"|I_GT->"GT"|I_HASH_KEY->"HASH_KEY"|I_IF->"IF"|I_IF_CONS->"IF_CONS"|I_IF_LEFT->"IF_LEFT"|I_IF_NONE->"IF_NONE"|I_INT->"INT"|I_LAMBDA->"LAMBDA"|I_LE->"LE"|I_LEFT->"LEFT"|I_LOOP->"LOOP"|I_LSL->"LSL"|I_LSR->"LSR"|I_LT->"LT"|I_MAP->"MAP"|I_MEM->"MEM"|I_MUL->"MUL"|I_NEG->"NEG"|I_NEQ->"NEQ"|I_NIL->"NIL"|I_NONE->"NONE"|I_NOT->"NOT"|I_NOW->"NOW"|I_OR->"OR"|I_PAIR->"PAIR"|I_PUSH->"PUSH"|I_RIGHT->"RIGHT"|I_SIZE->"SIZE"|I_SOME->"SOME"|I_SOURCE->"SOURCE"|I_SENDER->"SENDER"|I_SELF->"SELF"|I_SLICE->"SLICE"|I_STEPS_TO_QUOTA->"STEPS_TO_QUOTA"|I_SUB->"SUB"|I_SWAP->"SWAP"|I_TRANSFER_TOKENS->"TRANSFER_TOKENS"|I_SET_DELEGATE->"SET_DELEGATE"|I_UNIT->"UNIT"|I_UPDATE->"UPDATE"|I_XOR->"XOR"|I_ITER->"ITER"|I_LOOP_LEFT->"LOOP_LEFT"|I_ADDRESS->"ADDRESS"|I_CONTRACT->"CONTRACT"|I_ISNAT->"ISNAT"|I_CAST->"CAST"|I_RENAME->"RENAME"|T_bool->"bool"|T_contract->"contract"|T_int->"int"|T_key->"key"|T_key_hash->"key_hash"|T_lambda->"lambda"|T_list->"list"|T_map->"map"|T_big_map->"big_map"|T_nat->"nat"|T_option->"option"|T_or->"or"|T_pair->"pair"|T_set->"set"|T_signature->"signature"|T_string->"string"|T_bytes->"bytes"|T_mutez->"mutez"|T_timestamp->"timestamp"|T_unit->"unit"|T_operation->"operation"|T_address->"address"letprim_of_string=function|"parameter"->okK_parameter|"storage"->okK_storage|"code"->okK_code|"False"->okD_False|"Elt"->okD_Elt|"Left"->okD_Left|"None"->okD_None|"Pair"->okD_Pair|"Right"->okD_Right|"Some"->okD_Some|"True"->okD_True|"Unit"->okD_Unit|"PACK"->okI_PACK|"UNPACK"->okI_UNPACK|"BLAKE2B"->okI_BLAKE2B|"SHA256"->okI_SHA256|"SHA512"->okI_SHA512|"ABS"->okI_ABS|"ADD"->okI_ADD|"AMOUNT"->okI_AMOUNT|"AND"->okI_AND|"BALANCE"->okI_BALANCE|"CAR"->okI_CAR|"CDR"->okI_CDR|"CHECK_SIGNATURE"->okI_CHECK_SIGNATURE|"COMPARE"->okI_COMPARE|"CONCAT"->okI_CONCAT|"CONS"->okI_CONS|"CREATE_ACCOUNT"->okI_CREATE_ACCOUNT|"CREATE_CONTRACT"->okI_CREATE_CONTRACT|"IMPLICIT_ACCOUNT"->okI_IMPLICIT_ACCOUNT|"DIP"->okI_DIP|"DROP"->okI_DROP|"DUP"->okI_DUP|"EDIV"->okI_EDIV|"EMPTY_MAP"->okI_EMPTY_MAP|"EMPTY_SET"->okI_EMPTY_SET|"EQ"->okI_EQ|"EXEC"->okI_EXEC|"FAILWITH"->okI_FAILWITH|"GE"->okI_GE|"GET"->okI_GET|"GT"->okI_GT|"HASH_KEY"->okI_HASH_KEY|"IF"->okI_IF|"IF_CONS"->okI_IF_CONS|"IF_LEFT"->okI_IF_LEFT|"IF_NONE"->okI_IF_NONE|"INT"->okI_INT|"LAMBDA"->okI_LAMBDA|"LE"->okI_LE|"LEFT"->okI_LEFT|"LOOP"->okI_LOOP|"LSL"->okI_LSL|"LSR"->okI_LSR|"LT"->okI_LT|"MAP"->okI_MAP|"MEM"->okI_MEM|"MUL"->okI_MUL|"NEG"->okI_NEG|"NEQ"->okI_NEQ|"NIL"->okI_NIL|"NONE"->okI_NONE|"NOT"->okI_NOT|"NOW"->okI_NOW|"OR"->okI_OR|"PAIR"->okI_PAIR|"PUSH"->okI_PUSH|"RIGHT"->okI_RIGHT|"SIZE"->okI_SIZE|"SOME"->okI_SOME|"SOURCE"->okI_SOURCE|"SENDER"->okI_SENDER|"SELF"->okI_SELF|"SLICE"->okI_SLICE|"STEPS_TO_QUOTA"->okI_STEPS_TO_QUOTA|"SUB"->okI_SUB|"SWAP"->okI_SWAP|"TRANSFER_TOKENS"->okI_TRANSFER_TOKENS|"SET_DELEGATE"->okI_SET_DELEGATE|"UNIT"->okI_UNIT|"UPDATE"->okI_UPDATE|"XOR"->okI_XOR|"ITER"->okI_ITER|"LOOP_LEFT"->okI_LOOP_LEFT|"ADDRESS"->okI_ADDRESS|"CONTRACT"->okI_CONTRACT|"ISNAT"->okI_ISNAT|"CAST"->okI_CAST|"RENAME"->okI_RENAME|"bool"->okT_bool|"contract"->okT_contract|"int"->okT_int|"key"->okT_key|"key_hash"->okT_key_hash|"lambda"->okT_lambda|"list"->okT_list|"map"->okT_map|"big_map"->okT_big_map|"nat"->okT_nat|"option"->okT_option|"or"->okT_or|"pair"->okT_pair|"set"->okT_set|"signature"->okT_signature|"string"->okT_string|"bytes"->okT_bytes|"mutez"->okT_mutez|"timestamp"->okT_timestamp|"unit"->okT_unit|"operation"->okT_operation|"address"->okT_address|n->ifvalid_casenthenerror(Unknown_primitive_namen)elseerror(Invalid_casen)letprims_of_stringsexpr=letrecconvert=function|Int_|String_|Bytes_asexpr->okexpr|Prim(loc,prim,args,annot)->Error_monad.record_trace(Invalid_primitive_name(expr,loc))(prim_of_stringprim)>>?funprim->List.fold_left(funaccarg->acc>>?funargs->convertarg>>?funarg->ok(arg::args))(ok[])args>>?funargs->ok(Prim(0,prim,List.revargs,annot))|Seq(_,args)->List.fold_left(funaccarg->acc>>?funargs->convertarg>>?funarg->ok(arg::args))(ok[])args>>?funargs->ok(Seq(0,List.revargs))inconvert(rootexpr)>>?funexpr->ok(strip_locationsexpr)letstrings_of_primsexpr=letrecconvert=function|Int_|String_|Bytes_asexpr->expr|Prim(_,prim,args,annot)->letprim=string_of_primpriminletargs=List.mapconvertargsinPrim(0,prim,args,annot)|Seq(_,args)->letargs=List.mapconvertargsinSeq(0,args)instrip_locations(convert(rootexpr))letprim_encoding=letopenData_encodingindef"michelson.v1.primitives"@@string_enum[("parameter",K_parameter);("storage",K_storage);("code",K_code);("False",D_False);("Elt",D_Elt);("Left",D_Left);("None",D_None);("Pair",D_Pair);("Right",D_Right);("Some",D_Some);("True",D_True);("Unit",D_Unit);("PACK",I_PACK);("UNPACK",I_UNPACK);("BLAKE2B",I_BLAKE2B);("SHA256",I_SHA256);("SHA512",I_SHA512);("ABS",I_ABS);("ADD",I_ADD);("AMOUNT",I_AMOUNT);("AND",I_AND);("BALANCE",I_BALANCE);("CAR",I_CAR);("CDR",I_CDR);("CHECK_SIGNATURE",I_CHECK_SIGNATURE);("COMPARE",I_COMPARE);("CONCAT",I_CONCAT);("CONS",I_CONS);("CREATE_ACCOUNT",I_CREATE_ACCOUNT);("CREATE_CONTRACT",I_CREATE_CONTRACT);("IMPLICIT_ACCOUNT",I_IMPLICIT_ACCOUNT);("DIP",I_DIP);("DROP",I_DROP);("DUP",I_DUP);("EDIV",I_EDIV);("EMPTY_MAP",I_EMPTY_MAP);("EMPTY_SET",I_EMPTY_SET);("EQ",I_EQ);("EXEC",I_EXEC);("FAILWITH",I_FAILWITH);("GE",I_GE);("GET",I_GET);("GT",I_GT);("HASH_KEY",I_HASH_KEY);("IF",I_IF);("IF_CONS",I_IF_CONS);("IF_LEFT",I_IF_LEFT);("IF_NONE",I_IF_NONE);("INT",I_INT);("LAMBDA",I_LAMBDA);("LE",I_LE);("LEFT",I_LEFT);("LOOP",I_LOOP);("LSL",I_LSL);("LSR",I_LSR);("LT",I_LT);("MAP",I_MAP);("MEM",I_MEM);("MUL",I_MUL);("NEG",I_NEG);("NEQ",I_NEQ);("NIL",I_NIL);("NONE",I_NONE);("NOT",I_NOT);("NOW",I_NOW);("OR",I_OR);("PAIR",I_PAIR);("PUSH",I_PUSH);("RIGHT",I_RIGHT);("SIZE",I_SIZE);("SOME",I_SOME);("SOURCE",I_SOURCE);("SENDER",I_SENDER);("SELF",I_SELF);("STEPS_TO_QUOTA",I_STEPS_TO_QUOTA);("SUB",I_SUB);("SWAP",I_SWAP);("TRANSFER_TOKENS",I_TRANSFER_TOKENS);("SET_DELEGATE",I_SET_DELEGATE);("UNIT",I_UNIT);("UPDATE",I_UPDATE);("XOR",I_XOR);("ITER",I_ITER);("LOOP_LEFT",I_LOOP_LEFT);("ADDRESS",I_ADDRESS);("CONTRACT",I_CONTRACT);("ISNAT",I_ISNAT);("CAST",I_CAST);("RENAME",I_RENAME);("bool",T_bool);("contract",T_contract);("int",T_int);("key",T_key);("key_hash",T_key_hash);("lambda",T_lambda);("list",T_list);("map",T_map);("big_map",T_big_map);("nat",T_nat);("option",T_option);("or",T_or);("pair",T_pair);("set",T_set);("signature",T_signature);("string",T_string);("bytes",T_bytes);("mutez",T_mutez);("timestamp",T_timestamp);("unit",T_unit);("operation",T_operation);("address",T_address);(* Alpha_002 addition *)("SLICE",I_SLICE)]let()=register_error_kind`Permanent~id:"unknownPrimitiveNameTypeError"~title:"Unknown primitive name (typechecking error)"~description:"In a script or data expression, a primitive was unknown."~pp:(funppfn->Format.fprintfppf"Unknown primitive %s."n)Data_encoding.(obj1(req"wrongPrimitiveName"string))(function|Unknown_primitive_namegot->Somegot|_->None)(fungot->Unknown_primitive_namegot);register_error_kind`Permanent~id:"invalidPrimitiveNameCaseTypeError"~title:"Invalid primitive name case (typechecking error)"~description:"In a script or data expression, a primitive name is \
neither uppercase, lowercase or capitalized."~pp:(funppfn->Format.fprintfppf"Primitive %s has invalid case."n)Data_encoding.(obj1(req"wrongPrimitiveName"string))(function|Invalid_casename->Somename|_->None)(funname->Invalid_casename);register_error_kind`Permanent~id:"invalidPrimitiveNameTypeErro"~title:"Invalid primitive name (typechecking error)"~description:"In a script or data expression, a primitive name is \
unknown or has a wrong case."~pp:(funppf_->Format.fprintfppf"Invalid primitive.")Data_encoding.(obj2(req"expression"(Micheline.canonical_encoding~variant:"generic"string))(req"location"Micheline.canonical_location_encoding))(function|Invalid_primitive_name(expr,loc)->Some(expr,loc)|_->None)(fun(expr,loc)->Invalid_primitive_name(expr,loc))