From dd93b89f58f81572f1b6abd6127de648bcda7ea0 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Thu, 19 Nov 2020 21:46:17 +0530 Subject: [PATCH 01/33] Add header deserialization and utilities for it --- src/stdlib/Conversions.scillib | 129 +++++++++++++++++++++ src/stdlib/Polynetwork.scillib | 198 +++++++++++++++++++++++++++++++++ 2 files changed, 327 insertions(+) create mode 100644 src/stdlib/Conversions.scillib create mode 100644 src/stdlib/Polynetwork.scillib diff --git a/src/stdlib/Conversions.scillib b/src/stdlib/Conversions.scillib new file mode 100644 index 000000000..f38059dc5 --- /dev/null +++ b/src/stdlib/Conversions.scillib @@ -0,0 +1,129 @@ +(* ******************************************************************************** *) +(* This file is part of scilla. *) +(* *) +(* Copyright (c) 2018 - present Zilliqa Research Pvt. Ltd. *) +(* *) +(* scilla is free software: you can redistribute it and/or modify it under the *) +(* terms of the GNU General Public License as published by the Free Software *) +(* Foundation, either version 3 of the License, or (at your option) any later *) +(* version. *) +(* *) +(* scilla is distributed in the hope that it will be useful, but WITHOUT ANY *) +(* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR *) +(* A PARTICULAR PURPOSE. See the GNU General Public License for more details. *) +(* *) +(* You should have received a copy of the GNU General Public License along with *) +(* scilla. If not, see . *) +(* ******************************************************************************** *) +scilla_version 0 + +import IntUtils + +library Conversions + +(* Is the ByStr long enough for substr, starting at pos and len. *) +let is_long_enough : ByStr -> Uint32 -> Uint32 -> Bool = + fun (bs : ByStr) => + fun (pos : Uint32) => + fun (len : Uint32) => + let bs_len = builtin strlen bs in + let t = builtin add pos len in + uint32_le t bs_len + +(* Extract out a Scilla type from a ByStr starting at pos. Returns next position. *) +(* Use the type specific helpers below rather than this function. *) +let extract_scillaval : forall 'A. forall 'B. (ByStr -> Option 'B) -> ('B -> 'A) -> ByStr -> Uint32 -> Uint32 -> Option (Pair 'A Uint32) = + tfun 'A => + tfun 'B => + fun (to_bystrx : ByStr -> Option 'B) => + fun (to_uint : 'B -> 'A) => + fun (bs : ByStr) => + fun (pos : Uint32) => + fun (len : Uint32) => (* Byte size of the Uint value. *) + let ok = is_long_enough bs pos len in + match ok with + | True => + let subbs = builtin substr bs pos len in + let subbs_x_opt = to_bystrx subbs in + match subbs_x_opt with + | Some subbs_x => + let ui = to_uint subbs_x in + let next_pos = builtin add pos len in + let res = Pair {'A Uint32} ui next_pos in + Some {(Pair 'A Uint32)} res + | None => + None {(Pair 'A Uint32)} + end + | False => + None {(Pair 'A Uint32)} + end + +(* Extracts Uint32 in bs from position pos and returns next position. *) +let extract_uint32 : ByStr -> Uint32 -> Option (Pair Uint32 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr4 a in + let to_uint = fun (a : ByStr4) => builtin to_uint32 a in + let extractor = @extract_scillaval Uint32 ByStr4 in + let uint32_bsize = Uint32 4 in + extractor to_bystrx to_uint bs pos uint32_bsize + +(* Extracts Uint64 in bs from position pos and returns next position. *) +let extract_uint64 : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr8 a in + let to_uint = fun (a : ByStr8) => builtin to_uint64 a in + let extractor = @extract_scillaval Uint64 ByStr8 in + let uint64_bsize = Uint32 8 in + extractor to_bystrx to_uint bs pos uint64_bsize + +(* Extracts Uint128 in bs from position pos and returns next position. *) +let extract_uint128 : ByStr -> Uint32 -> Option (Pair Uint128 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr16 a in + let to_uint = fun (a : ByStr16) => builtin to_uint128 a in + let extractor = @extract_scillaval Uint128 ByStr16 in + let uint128_bsize = Uint32 16 in + extractor to_bystrx to_uint bs pos uint128_bsize + +(* Extracts Uint256 in bs from position pos and returns next position. *) +let extract_uint256 : ByStr -> Uint32 -> Option (Pair Uint256 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr32 a in + let to_uint = fun (a : ByStr32) => builtin to_uint256 a in + let extractor = @extract_scillaval Uint256 ByStr32 in + let uint256_bsize = Uint32 32 in + extractor to_bystrx to_uint bs pos uint256_bsize + +(* Extracts ByStr1 in bs from position pos and returns next position *) +let extract_bystr1 : ByStr -> Uint32 -> Option (Pair ByStr1 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr1 a in + let unit = fun (a : ByStr1) => a in + let extractor = @extract_scillaval ByStr1 ByStr1 in + let bystr1_bsize = Uint32 1 in + extractor to_bystrx unit bs pos bystr1_bsize + +(* Extracts ByStr2 in bs from position pos and returns next position *) +let extract_bystr2 : ByStr -> Uint32 -> Option (Pair ByStr2 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr2 a in + let unit = fun (a : ByStr2) => a in + let extractor = @extract_scillaval ByStr2 ByStr2 in + let bystr2_bsize = Uint32 2 in + extractor to_bystrx unit bs pos bystr2_bsize + +(* Extracts ByStr32 in bs from position pos and returns next position *) +let extract_bystr32 : ByStr -> Uint32 -> Option (Pair ByStr32 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr32 a in + let unit = fun (a : ByStr32) => a in + let extractor = @extract_scillaval ByStr32 ByStr32 in + let bystr32_bsize = Uint32 32 in + extractor to_bystrx unit bs pos bystr32_bsize diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib new file mode 100644 index 000000000..31c712bbb --- /dev/null +++ b/src/stdlib/Polynetwork.scillib @@ -0,0 +1,198 @@ +(* ******************************************************************************** *) +(* This file is part of scilla. *) +(* *) +(* Copyright (c) 2018 - present Zilliqa Research Pvt. Ltd. *) +(* *) +(* scilla is free software: you can redistribute it and/or modify it under the *) +(* terms of the GNU General Public License as published by the Free Software *) +(* Foundation, either version 3 of the License, or (at your option) any later *) +(* version. *) +(* *) +(* scilla is distributed in the hope that it will be useful, but WITHOUT ANY *) +(* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR *) +(* A PARTICULAR PURPOSE. See the GNU General Public License for more details. *) +(* *) +(* You should have received a copy of the GNU General Public License along with *) +(* scilla. If not, see . *) +(* ******************************************************************************** *) +scilla_version 0 + +import Conversions + +library Polynetwork + +type Header = + | Header of + Uint32 (* version *) + Uint64 (* chainID *) + Uint32 (* timestamp *) + Uint32 (* height *) + Uint32 (* consensusData *) + ByStr32 (* prevBlockHash *) + ByStr32 (* transactionRoot *) + ByStr32 (* crossStatesRoot *) + ByStr32 (* blockRoot *) + ByStr (* consensusPayload *) + ByStr32 (* nextBookkeeper *) + +type TxParam = + | TxParam of + ByStr (* txHash *) + ByStr (* crossChainId *) + ByStr (* fromContract *) + Uint64 (* toChainId *) + ByStr (* toContract *) + ByStr (* method *) + ByStr (* args *) + +type ToMerkleValue = + | ToMerkleValue of + ByStr (* txHash *) + Uint64 (* fromChainID *) + TxParam (* makeTxParam *) + +(* Return (as Uint64) the next VarUint at pos in bystr, and the next position. *) +(* ZeroCopySource.sol : NextVarUint *) +let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let first_byte_nextpos = extract_bystr1 bs pos in + match first_byte_nextpos with + | Some (Pair first_byte nextpos) => + let bit16_marker = 0xfd in + let is_16bit = builtin eq first_byte bit16_marker in + match is_16bit with + | True => + (* Extract the next 16bits and convert to an integer. *) + let b16_nextpos = extract_bystr2 bs nextpos in + match b16_nextpos with + | Some (Pair b16 nextpos) => + let b16_u32 = builtin to_uint64 b16 in + let res = Pair {Uint64 Uint32} b16_u32 nextpos in + Some {(Pair Uint64 Uint32)} res + | None => + None {(Pair Uint64 Uint32)} + end + | False => + (* It's either 32bits or 64bits or 8bits. *) + let b32_marker = 0xfe in + let is_32b = builtin eq first_byte b32_marker in + match is_32b with + | True => + (* This is a 32b integer *) + let uint32val_nextpos = extract_uint32 bs nextpos in + match uint32val_nextpos with + | Some (Pair uint32val nextpos) => + (* Upcast to a Uint64 value. *) + let uint64val_opt = builtin to_uint64 uint32val in + match uint64val_opt with + | Some uint64val => + let res = Pair {Uint64 Uint32} uint64val nextpos in + Some {(Pair Uint64 Uint32)} res + | None => None {(Pair Uint64 Uint32)} + end + | None => None {(Pair Uint64 Uint32)} + end + | False => + (* 64b or 8bits. *) + let b64_marker = 0xff in + let is_64b = builtin eq first_byte b64_marker in + match is_64b with + | True => + extract_uint64 bs nextpos + | False => + let u8_val = builtin to_uint64 first_byte in + let res = Pair {Uint64 Uint32} u8_val nextpos in + Some {(Pair Uint64 Uint32)} res + end + end + end + | None => + None {(Pair Uint64 Uint32)} + end + +(* Extract a Bystr value start at pos. See ZeroCopySource.sol:NextVarBytes. *) +let extract_bystr : ByStr -> Uint32 -> Option (Pair ByStr Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let bystr_len_64_opt = next_var_uint bs pos in + match bystr_len_64_opt with + | Some (Pair bystr_len_64 nextpos) => + let bystr_len_32_opt = builtin to_uint32 bystr_len_64 in + match bystr_len_32_opt with + | Some bystr_len_32 => + let some = fun (a : ByStr) => Some {ByStr} a in + let unit = fun (a : ByStr) => a in + let extractor = @extract_scillaval ByStr ByStr in + extractor some unit bs nextpos bystr_len_32 + | None => None {(Pair ByStr Uint32)} + end + | None => None {(Pair ByStr Uint32)} + end + +let deserialize_Header : ByStr -> Option Header = + fun (header : ByStr) => + let nextpos = Uint32 0 in (* starting from position 0 *) + let version_nextpos = extract_uint32 header nextpos in + match version_nextpos with + | Some (Pair version nextpos) => + let chainid_nextpos = extract_uint64 header nextpos in + match chainid_nextpos with + | Some (Pair chainid nextpos) => + let timestamp_nextpos = extract_uint32 header nextpos in + match timestamp_nextpos with + | Some (Pair timestamp nextpos) => + let height_nextpos = extract_uint32 header nextpos in + match height_nextpos with + | Some (Pair height nextpos) => + let consensusData_nextpos = extract_uint32 header nextpos in + match consensusData_nextpos with + | Some (Pair consensusData nextpos) => + let prevBlockHash_nextpos = extract_bystr32 header nextpos in + match prevBlockHash_nextpos with + | Some (Pair prevBlockHash nextpos) => + let txnroot_nextpos = extract_bystr32 header nextpos in + match txnroot_nextpos with + | Some (Pair txnroot nextpos) => + let crossStatesRoot_nextpos = extract_bystr32 header nextpos in + match crossStatesRoot_nextpos with + | Some (Pair crossStatesRoot nextpos) => + let blockRoot_nextpos = extract_bystr32 header nextpos in + match blockRoot_nextpos with + | Some (Pair blockRoot nextpos) => + let consensusPayload_nextpos = extract_bystr header nextpos in + match consensusPayload_nextpos with + | Some (Pair consensusPayload nextpos) => + let nextBookkeeper_nextpos = extract_bystr32 header nextpos in + match nextBookkeeper_nextpos with + | Some (Pair nextBoookkeeper nextpos) => + let header = + Header version chainid timestamp height consensusData + prevBlockHash txnroot crossStatesRoot blockRoot consensusPayload + nextBoookkeeper in + Some {Header} header + | None => None {Header} + end + | None => None {Header} + end + | None => None {Header} + end + | None => None {Header} + end + | None => None {Header} + end + | None => None {Header} + end + | None => + None {Header} + end + | None => + None {Header} + end + | None => + None {Header} + end + | None => None {Header} + end + | None => None {Header} + end From 4627dc56f642e70ffda41e6212e236b5eda40996 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Fri, 20 Nov 2020 16:31:08 +0530 Subject: [PATCH 02/33] Make all integer conversions little-endian --- src/stdlib/Conversions.scillib | 40 +++++++++++++++++----- src/stdlib/Polynetwork.scillib | 9 ++++- tests/contracts/Polynetwork.scilla | 9 +++++ tests/eval/good/polynetwork_header.scilexp | 5 +++ 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 tests/contracts/Polynetwork.scilla create mode 100644 tests/eval/good/polynetwork_header.scilexp diff --git a/src/stdlib/Conversions.scillib b/src/stdlib/Conversions.scillib index f38059dc5..df27deea1 100644 --- a/src/stdlib/Conversions.scillib +++ b/src/stdlib/Conversions.scillib @@ -21,6 +21,10 @@ import IntUtils library Conversions +type IntegerEncoding = + | LittleEndian + | BigEndian + (* Is the ByStr long enough for substr, starting at pos and len. *) let is_long_enough : ByStr -> Uint32 -> Uint32 -> Bool = fun (bs : ByStr) => @@ -59,41 +63,61 @@ let extract_scillaval : forall 'A. forall 'B. (ByStr -> Option 'B) -> ('B -> 'A) end (* Extracts Uint32 in bs from position pos and returns next position. *) -let extract_uint32 : ByStr -> Uint32 -> Option (Pair Uint32 Uint32) = +let extract_uint32 : IntegerEncoding -> ByStr -> Uint32 -> Option (Pair Uint32 Uint32) = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (pos : Uint32) => let to_bystrx = fun (a : ByStr) => builtin to_bystr4 a in - let to_uint = fun (a : ByStr4) => builtin to_uint32 a in + let to_uint = + fun (a : ByStr4) => + let b = match endian with | LittleEndian => builtin strrev a | BigEndian => a end in + builtin to_uint32 b + in let extractor = @extract_scillaval Uint32 ByStr4 in let uint32_bsize = Uint32 4 in extractor to_bystrx to_uint bs pos uint32_bsize (* Extracts Uint64 in bs from position pos and returns next position. *) -let extract_uint64 : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = +let extract_uint64 : IntegerEncoding -> ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (pos : Uint32) => let to_bystrx = fun (a : ByStr) => builtin to_bystr8 a in - let to_uint = fun (a : ByStr8) => builtin to_uint64 a in + let to_uint = + fun (a : ByStr8) => + let b = match endian with | LittleEndian => builtin strrev a | BigEndian => a end in + builtin to_uint64 b + in let extractor = @extract_scillaval Uint64 ByStr8 in let uint64_bsize = Uint32 8 in extractor to_bystrx to_uint bs pos uint64_bsize (* Extracts Uint128 in bs from position pos and returns next position. *) -let extract_uint128 : ByStr -> Uint32 -> Option (Pair Uint128 Uint32) = +let extract_uint128 : IntegerEncoding -> ByStr -> Uint32 -> Option (Pair Uint128 Uint32) = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (pos : Uint32) => let to_bystrx = fun (a : ByStr) => builtin to_bystr16 a in - let to_uint = fun (a : ByStr16) => builtin to_uint128 a in + let to_uint = + fun (a : ByStr16) => + let b = match endian with | LittleEndian => builtin strrev a | BigEndian => a end in + builtin to_uint128 b + in let extractor = @extract_scillaval Uint128 ByStr16 in let uint128_bsize = Uint32 16 in extractor to_bystrx to_uint bs pos uint128_bsize (* Extracts Uint256 in bs from position pos and returns next position. *) -let extract_uint256 : ByStr -> Uint32 -> Option (Pair Uint256 Uint32) = +let extract_uint256 : IntegerEncoding -> ByStr -> Uint32 -> Option (Pair Uint256 Uint32) = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (pos : Uint32) => let to_bystrx = fun (a : ByStr) => builtin to_bystr32 a in - let to_uint = fun (a : ByStr32) => builtin to_uint256 a in + let to_uint = + fun (a : ByStr32) => + let b = match endian with | LittleEndian => builtin strrev a | BigEndian => a end in + builtin to_uint256 b + in let extractor = @extract_scillaval Uint256 ByStr32 in let uint256_bsize = Uint32 32 in extractor to_bystrx to_uint bs pos uint256_bsize diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 31c712bbb..0a7126a03 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -51,6 +51,12 @@ type ToMerkleValue = Uint64 (* fromChainID *) TxParam (* makeTxParam *) +let little_endian = LittleEndian +let extract_uint32 = extract_uint32 little_endian +let extract_uint64 = extract_uint64 little_endian +let extract_uint128 = extract_uint128 little_endian +let extract_uint256 = extract_uint256 little_endian + (* Return (as Uint64) the next VarUint at pos in bystr, and the next position. *) (* ZeroCopySource.sol : NextVarUint *) let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = @@ -67,7 +73,8 @@ let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = let b16_nextpos = extract_bystr2 bs nextpos in match b16_nextpos with | Some (Pair b16 nextpos) => - let b16_u32 = builtin to_uint64 b16 in + let b16_little = builtin strrev b16 in + let b16_u32 = builtin to_uint64 b16_little in let res = Pair {Uint64 Uint32} b16_u32 nextpos in Some {(Pair Uint64 Uint32)} res | None => diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla new file mode 100644 index 000000000..e83482dae --- /dev/null +++ b/tests/contracts/Polynetwork.scilla @@ -0,0 +1,9 @@ +scilla_version 0 + +import Polynetwork + +contract Polynetwork() + +transition initGenesisBlock (header : Header, pubkeys : List ByStr67) + +end diff --git a/tests/eval/good/polynetwork_header.scilexp b/tests/eval/good/polynetwork_header.scilexp new file mode 100644 index 000000000..a480074e4 --- /dev/null +++ b/tests/eval/good/polynetwork_header.scilexp @@ -0,0 +1,5 @@ +let headerx = 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000 in + +let header = builtin to_bystr headerx in + +deserialize_Header header From a52a191b9c7093e8279122abc38d3cf545007529 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Fri, 20 Nov 2020 22:13:52 +0530 Subject: [PATCH 03/33] Provide an option version of substr --- src/stdlib/Conversions.scillib | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/stdlib/Conversions.scillib b/src/stdlib/Conversions.scillib index df27deea1..7bfbd9e6f 100644 --- a/src/stdlib/Conversions.scillib +++ b/src/stdlib/Conversions.scillib @@ -25,14 +25,25 @@ type IntegerEncoding = | LittleEndian | BigEndian -(* Is the ByStr long enough for substr, starting at pos and len. *) -let is_long_enough : ByStr -> Uint32 -> Uint32 -> Bool = +(* does not throw exceptions *) +let osubstr : ByStr -> Uint32 -> Uint32 -> Option ByStr = fun (bs : ByStr) => fun (pos : Uint32) => fun (len : Uint32) => - let bs_len = builtin strlen bs in - let t = builtin add pos len in - uint32_le t bs_len + let length = builtin strlen bs in + let shorter = uint32_le len length in + match shorter with + | True => + let delta = builtin sub length len in + let safe_pos = uint32_le pos delta in + match safe_pos with + | True => + let substr = builtin substr bs pos len in + Some {ByStr} substr + | False => None {ByStr} + end + | False => None {ByStr} + end (* Extract out a Scilla type from a ByStr starting at pos. Returns next position. *) (* Use the type specific helpers below rather than this function. *) @@ -44,10 +55,9 @@ let extract_scillaval : forall 'A. forall 'B. (ByStr -> Option 'B) -> ('B -> 'A) fun (bs : ByStr) => fun (pos : Uint32) => fun (len : Uint32) => (* Byte size of the Uint value. *) - let ok = is_long_enough bs pos len in - match ok with - | True => - let subbs = builtin substr bs pos len in + let subbs_opt = osubstr bs pos len in + match subbs_opt with + | Some subbs => let subbs_x_opt = to_bystrx subbs in match subbs_x_opt with | Some subbs_x => @@ -58,7 +68,7 @@ let extract_scillaval : forall 'A. forall 'B. (ByStr -> Option 'B) -> ('B -> 'A) | None => None {(Pair 'A Uint32)} end - | False => + | None => None {(Pair 'A Uint32)} end From 4bd3e9a8b9c1356e8c48018e1f04d44df21653f9 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Sat, 21 Nov 2020 14:42:48 +0530 Subject: [PATCH 04/33] Fix order of fields in Header and add test to testsuite --- src/stdlib/Conversions.scillib | 10 ++++ src/stdlib/Polynetwork.scillib | 59 ++++++++++--------- tests/eval/good/Good.ml | 1 + .../good/gold/polynetwork_header.scilexp.gold | 4 ++ 4 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 tests/eval/good/gold/polynetwork_header.scilexp.gold diff --git a/src/stdlib/Conversions.scillib b/src/stdlib/Conversions.scillib index 7bfbd9e6f..db4938c0b 100644 --- a/src/stdlib/Conversions.scillib +++ b/src/stdlib/Conversions.scillib @@ -152,6 +152,16 @@ let extract_bystr2 : ByStr -> Uint32 -> Option (Pair ByStr2 Uint32) = let bystr2_bsize = Uint32 2 in extractor to_bystrx unit bs pos bystr2_bsize +(* Extracts ByStr20 in bs from position pos and returns next position *) +let extract_bystr20 : ByStr -> Uint32 -> Option (Pair ByStr20 Uint32) = + fun (bs : ByStr) => + fun (pos : Uint32) => + let to_bystrx = fun (a : ByStr) => builtin to_bystr20 a in + let unit = fun (a : ByStr20) => a in + let extractor = @extract_scillaval ByStr20 ByStr20 in + let bystr20_bsize = Uint32 20 in + extractor to_bystrx unit bs pos bystr20_bsize + (* Extracts ByStr32 in bs from position pos and returns next position *) let extract_bystr32 : ByStr -> Uint32 -> Option (Pair ByStr32 Uint32) = fun (bs : ByStr) => diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 0a7126a03..e465bf948 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -25,15 +25,15 @@ type Header = | Header of Uint32 (* version *) Uint64 (* chainID *) - Uint32 (* timestamp *) - Uint32 (* height *) - Uint32 (* consensusData *) ByStr32 (* prevBlockHash *) ByStr32 (* transactionRoot *) ByStr32 (* crossStatesRoot *) ByStr32 (* blockRoot *) + Uint32 (* timestamp *) + Uint32 (* height *) + Uint64 (* consensusData *) ByStr (* consensusPayload *) - ByStr32 (* nextBookkeeper *) + ByStr20 (* nextBookkeeper *) type TxParam = | TxParam of @@ -146,37 +146,38 @@ let deserialize_Header : ByStr -> Option Header = let chainid_nextpos = extract_uint64 header nextpos in match chainid_nextpos with | Some (Pair chainid nextpos) => - let timestamp_nextpos = extract_uint32 header nextpos in - match timestamp_nextpos with - | Some (Pair timestamp nextpos) => - let height_nextpos = extract_uint32 header nextpos in - match height_nextpos with - | Some (Pair height nextpos) => - let consensusData_nextpos = extract_uint32 header nextpos in - match consensusData_nextpos with - | Some (Pair consensusData nextpos) => - let prevBlockHash_nextpos = extract_bystr32 header nextpos in - match prevBlockHash_nextpos with - | Some (Pair prevBlockHash nextpos) => - let txnroot_nextpos = extract_bystr32 header nextpos in - match txnroot_nextpos with - | Some (Pair txnroot nextpos) => - let crossStatesRoot_nextpos = extract_bystr32 header nextpos in - match crossStatesRoot_nextpos with - | Some (Pair crossStatesRoot nextpos) => - let blockRoot_nextpos = extract_bystr32 header nextpos in - match blockRoot_nextpos with - | Some (Pair blockRoot nextpos) => + let prevBlockHash_nextpos = extract_bystr32 header nextpos in + match prevBlockHash_nextpos with + | Some (Pair prevBlockHash nextpos) => + let txnroot_nextpos = extract_bystr32 header nextpos in + match txnroot_nextpos with + | Some (Pair txnroot nextpos) => + let crossStatesRoot_nextpos = extract_bystr32 header nextpos in + match crossStatesRoot_nextpos with + | Some (Pair crossStatesRoot nextpos) => + let blockRoot_nextpos = extract_bystr32 header nextpos in + match blockRoot_nextpos with + | Some (Pair blockRoot nextpos) => + let timestamp_nextpos = extract_uint32 header nextpos in + match timestamp_nextpos with + | Some (Pair timestamp nextpos) => + let height_nextpos = extract_uint32 header nextpos in + match height_nextpos with + | Some (Pair height nextpos) => + let consensusData_nextpos = extract_uint64 header nextpos in + match consensusData_nextpos with + | Some (Pair consensusData nextpos) => let consensusPayload_nextpos = extract_bystr header nextpos in match consensusPayload_nextpos with | Some (Pair consensusPayload nextpos) => - let nextBookkeeper_nextpos = extract_bystr32 header nextpos in + let nextBookkeeper_nextpos = extract_bystr20 header nextpos in match nextBookkeeper_nextpos with | Some (Pair nextBoookkeeper nextpos) => let header = - Header version chainid timestamp height consensusData - prevBlockHash txnroot crossStatesRoot blockRoot consensusPayload - nextBoookkeeper in + Header version chainid prevBlockHash txnroot crossStatesRoot + blockRoot timestamp height consensusData consensusPayload + nextBoookkeeper + in Some {Header} header | None => None {Header} end diff --git a/tests/eval/good/Good.ml b/tests/eval/good/Good.ml index ce0aeef33..5baf692c0 100644 --- a/tests/eval/good/Good.ml +++ b/tests/eval/good/Good.ml @@ -134,6 +134,7 @@ let explist = "builtin-schnorr_get_address.scilexp"; "str-char-1.scilexp"; "builtin-alt-bn128.scilexp"; + "polynetwork_header.scilexp"; ] module Tests = Scilla_test.Util.DiffBasedTests (struct diff --git a/tests/eval/good/gold/polynetwork_header.scilexp.gold b/tests/eval/good/gold/polynetwork_header.scilexp.gold new file mode 100644 index 000000000..6e734929f --- /dev/null +++ b/tests/eval/good/gold/polynetwork_header.scilexp.gold @@ -0,0 +1,4 @@ +(Some (Header (Uint32 1) (Uint64 4) (ByStr32 0x386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c3) (ByStr32 0x0000000000000000000000000000000000000000000000000000000000000000) (ByStr32 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) (ByStr32 0xae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc577) (Uint32 1572256323) (Uint32 1) (Uint64 2214801009744602529) (ByStr 0x7b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d) (ByStr20 0x0000000000000000000000000000000000000000))), +{ [header -> (ByStr 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000)], + [headerx -> (ByStr447 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000)] } +Gas remaining: 3991735 From 990b3f4790fdd3830566e20cf1db8c473cdb7625 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Sun, 22 Nov 2020 21:51:37 +0530 Subject: [PATCH 05/33] Deserialize TxParam and ToMerkleValue --- src/stdlib/Polynetwork.scillib | 102 +++++++++++++++--- .../good/gold/polynetwork_header.scilexp.gold | 7 +- tests/eval/good/polynetwork_header.scilexp | 3 +- 3 files changed, 91 insertions(+), 21 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index e465bf948..6569625e9 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -137,9 +137,10 @@ let extract_bystr : ByStr -> Uint32 -> Option (Pair ByStr Uint32) = | None => None {(Pair ByStr Uint32)} end -let deserialize_Header : ByStr -> Option Header = +(* Deserialize a byte stream into a Header, starting at nextpos. *) +let deserialize_Header : ByStr -> Uint32 -> Option (Pair Header Uint32) = fun (header : ByStr) => - let nextpos = Uint32 0 in (* starting from position 0 *) + fun (nextpos : Uint32) => let version_nextpos = extract_uint32 header nextpos in match version_nextpos with | Some (Pair version nextpos) => @@ -178,29 +179,96 @@ let deserialize_Header : ByStr -> Option Header = blockRoot timestamp height consensusData consensusPayload nextBoookkeeper in - Some {Header} header - | None => None {Header} + let res = Pair {Header Uint32} header nextpos in + Some {(Pair Header Uint32)} res + | None => None {(Pair Header Uint32)} end - | None => None {Header} + | None => None {(Pair Header Uint32)} end - | None => None {Header} + | None => None {(Pair Header Uint32)} end - | None => None {Header} + | None => None {(Pair Header Uint32)} end - | None => None {Header} + | None => None {(Pair Header Uint32)} end - | None => None {Header} + | None => None {(Pair Header Uint32)} end - | None => - None {Header} + | None => None {(Pair Header Uint32)} end - | None => - None {Header} + | None => None {(Pair Header Uint32)} end - | None => - None {Header} + | None => None {(Pair Header Uint32)} + end + | None => None {(Pair Header Uint32)} + end + | None => None {(Pair Header Uint32)} + end + +(* Deserialize a byte stream into a TxParam, starting at nextpos. *) +let deserialize_TxParam : ByStr -> Uint32 -> Option (Pair TxParam Uint32) = + fun (txparam : ByStr) => + fun (nextpos : Uint32) => + let txhash_nextpos = extract_bystr txparam nextpos in + match txhash_nextpos with + | Some (Pair txhash nextpos) => + let crossChainId_nextpos = extract_bystr txparam nextpos in + match crossChainId_nextpos with + | Some (Pair crossChainId nextpos) => + let fromContract_nextpos = extract_bystr txparam nextpos in + match fromContract_nextpos with + | Some (Pair fromContract nextpos) => + let toChainId_nextpos = extract_uint64 txparam nextpos in + match toChainId_nextpos with + | Some (Pair toChainId nextpos) => + let toContract_nextpos = extract_bystr txparam nextpos in + match toContract_nextpos with + | Some (Pair toContract nextpos) => + let method_nextpos = extract_bystr txparam nextpos in + match method_nextpos with + | Some (Pair method nextpos) => + let args_nextpos = extract_bystr txparam nextpos in + match args_nextpos with + | Some (Pair args nextpos) => + let txparam = + TxParam txhash crossChainId fromContract + toChainId toContract method args + in + let res = Pair {TxParam Uint32} txparam nextpos in + Some {(Pair TxParam Uint32)} res + | None => None {(Pair TxParam Uint32)} + end + | None => None {(Pair TxParam Uint32)} + end + | None => None {(Pair TxParam Uint32)} + end + | None => None {(Pair TxParam Uint32)} + end + | None => None {(Pair TxParam Uint32)} + end + | None => None {(Pair TxParam Uint32)} + end + | None => None {(Pair TxParam Uint32)} + end + +(* Deserialize a byte stream into a ToMerkleValue, starting at nextpos. *) +let deserialize_ToMerkleValue : ByStr -> Uint32 -> Option (Pair ToMerkleValue Uint32) = + fun (tomerklevalue : ByStr) => + fun (nextpos : Uint32) => + let txhash_nextpos = extract_bystr tomerklevalue nextpos in + match txhash_nextpos with + | Some (Pair txhash nextpos) => + let fromChainId_nextpos = extract_uint64 tomerklevalue nextpos in + match fromChainId_nextpos with + | Some (Pair fromChainId nextpos) => + let txparam = deserialize_TxParam tomerklevalue nextpos in + match txparam with + | Some (Pair txparam nextpos) => + let tmkv = ToMerkleValue txhash fromChainId txparam in + let res = Pair {ToMerkleValue Uint32} tmkv nextpos in + Some {(Pair ToMerkleValue Uint32)} res + | None => None {(Pair ToMerkleValue Uint32)} end - | None => None {Header} + | None => None {(Pair ToMerkleValue Uint32)} end - | None => None {Header} + | None => None {(Pair ToMerkleValue Uint32)} end diff --git a/tests/eval/good/gold/polynetwork_header.scilexp.gold b/tests/eval/good/gold/polynetwork_header.scilexp.gold index 6e734929f..c65b06f53 100644 --- a/tests/eval/good/gold/polynetwork_header.scilexp.gold +++ b/tests/eval/good/gold/polynetwork_header.scilexp.gold @@ -1,4 +1,5 @@ -(Some (Header (Uint32 1) (Uint64 4) (ByStr32 0x386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c3) (ByStr32 0x0000000000000000000000000000000000000000000000000000000000000000) (ByStr32 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) (ByStr32 0xae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc577) (Uint32 1572256323) (Uint32 1) (Uint64 2214801009744602529) (ByStr 0x7b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d) (ByStr20 0x0000000000000000000000000000000000000000))), -{ [header -> (ByStr 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000)], +(Some (Pair (Header (Uint32 1) (Uint64 4) (ByStr32 0x386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c3) (ByStr32 0x0000000000000000000000000000000000000000000000000000000000000000) (ByStr32 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) (ByStr32 0xae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc577) (Uint32 1572256323) (Uint32 1) (Uint64 2214801009744602529) (ByStr 0x7b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d) (ByStr20 0x0000000000000000000000000000000000000000)) (Uint32 447))), +{ [pos -> (Uint32 0)], + [header -> (ByStr 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000)], [headerx -> (ByStr447 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000)] } -Gas remaining: 3991735 +Gas remaining: 3991730 \ No newline at end of file diff --git a/tests/eval/good/polynetwork_header.scilexp b/tests/eval/good/polynetwork_header.scilexp index a480074e4..ae37bad6a 100644 --- a/tests/eval/good/polynetwork_header.scilexp +++ b/tests/eval/good/polynetwork_header.scilexp @@ -1,5 +1,6 @@ let headerx = 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000 in let header = builtin to_bystr headerx in +let pos = Uint32 0 in -deserialize_Header header +deserialize_Header header pos From 844b5fddbbb3fe31eaa99ead49613fd36e188540 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Mon, 23 Nov 2020 21:26:06 +0800 Subject: [PATCH 06/33] test: add multiple tests for library function next_var_uint --- tests/eval/good/polynetwork_next_var_uint1.scilexp | 12 ++++++++++++ tests/eval/good/polynetwork_next_var_uint2.scilexp | 7 +++++++ tests/eval/good/polynetwork_next_var_uint3.scilexp | 7 +++++++ tests/eval/good/polynetwork_next_var_uint4.scilexp | 7 +++++++ tests/eval/good/polynetwork_next_var_uint5.scilexp | 7 +++++++ tests/eval/good/polynetwork_next_var_uint6.scilexp | 7 +++++++ tests/eval/good/polynetwork_next_var_uint7.scilexp | 7 +++++++ 7 files changed, 54 insertions(+) create mode 100644 tests/eval/good/polynetwork_next_var_uint1.scilexp create mode 100644 tests/eval/good/polynetwork_next_var_uint2.scilexp create mode 100644 tests/eval/good/polynetwork_next_var_uint3.scilexp create mode 100644 tests/eval/good/polynetwork_next_var_uint4.scilexp create mode 100644 tests/eval/good/polynetwork_next_var_uint5.scilexp create mode 100644 tests/eval/good/polynetwork_next_var_uint6.scilexp create mode 100644 tests/eval/good/polynetwork_next_var_uint7.scilexp diff --git a/tests/eval/good/polynetwork_next_var_uint1.scilexp b/tests/eval/good/polynetwork_next_var_uint1.scilexp new file mode 100644 index 000000000..50ef6f754 --- /dev/null +++ b/tests/eval/good/polynetwork_next_var_uint1.scilexp @@ -0,0 +1,12 @@ +(* next_var_uint value < 0xFD value == 100*) +let uint_value = 0x64 in + +let value = builtin to_bystr uint_value in +let pos = Uint32 0 in + +next_var_uint value pos + + + + + diff --git a/tests/eval/good/polynetwork_next_var_uint2.scilexp b/tests/eval/good/polynetwork_next_var_uint2.scilexp new file mode 100644 index 000000000..491cd1ede --- /dev/null +++ b/tests/eval/good/polynetwork_next_var_uint2.scilexp @@ -0,0 +1,7 @@ +(* next_var_uint value == 0xFD *) +let num_hex = 0x64fdfd00 in + +let value = builtin to_bystr num_hex in +let pos = Uint32 1 in + +next_var_uint value pos \ No newline at end of file diff --git a/tests/eval/good/polynetwork_next_var_uint3.scilexp b/tests/eval/good/polynetwork_next_var_uint3.scilexp new file mode 100644 index 000000000..fd0b41a4e --- /dev/null +++ b/tests/eval/good/polynetwork_next_var_uint3.scilexp @@ -0,0 +1,7 @@ +(* next_var_uint 0xFD < value < 0xFFFF, value == 1000 *) +let num_hex = 0x64fdfd00fde803 in + +let value = builtin to_bystr num_hex in +let pos = Uint32 4 in + +next_var_uint value pos \ No newline at end of file diff --git a/tests/eval/good/polynetwork_next_var_uint4.scilexp b/tests/eval/good/polynetwork_next_var_uint4.scilexp new file mode 100644 index 000000000..802eb1ffd --- /dev/null +++ b/tests/eval/good/polynetwork_next_var_uint4.scilexp @@ -0,0 +1,7 @@ +(* next_var_uint value == 0xFFFF *) +let num_hex = 0x64fdfd00fde803fdffff in + +let value = builtin to_bystr num_hex in +let pos = Uint32 7 in + +next_var_uint value pos \ No newline at end of file diff --git a/tests/eval/good/polynetwork_next_var_uint5.scilexp b/tests/eval/good/polynetwork_next_var_uint5.scilexp new file mode 100644 index 000000000..bc95f8a9e --- /dev/null +++ b/tests/eval/good/polynetwork_next_var_uint5.scilexp @@ -0,0 +1,7 @@ +(* next_var_uint 0xFFFF < value < 0xFFFFFFFF value == 165535 *) +let num_hex = 0x64fdfd00fde803fdfffffe9f860200 in + +let value = builtin to_bystr num_hex in +let pos = Uint32 10 in + +next_var_uint value pos \ No newline at end of file diff --git a/tests/eval/good/polynetwork_next_var_uint6.scilexp b/tests/eval/good/polynetwork_next_var_uint6.scilexp new file mode 100644 index 000000000..fe5d33801 --- /dev/null +++ b/tests/eval/good/polynetwork_next_var_uint6.scilexp @@ -0,0 +1,7 @@ +(* next_var_uint value == 0xFFFFFFFF *) +let num_hex = 0x64fdfd00fde803fdfffffe9f860200feffffffff in + +let value = builtin to_bystr num_hex in +let pos = Uint32 15 in + +next_var_uint value pos \ No newline at end of file diff --git a/tests/eval/good/polynetwork_next_var_uint7.scilexp b/tests/eval/good/polynetwork_next_var_uint7.scilexp new file mode 100644 index 000000000..ebc745d99 --- /dev/null +++ b/tests/eval/good/polynetwork_next_var_uint7.scilexp @@ -0,0 +1,7 @@ +(* next_var_uint NextVarUint value > 0xFFFFFFFF value == 14294967295 *) +let num_hex = 0x64fdfd00fde803fdfffffe9f860200feffffffffffffe30b5403000000 in + +let value = builtin to_bystr num_hex in +let pos = Uint32 20 in + +next_var_uint value pos \ No newline at end of file From 9cba52a608af06ef2d189027187a5dc250ce925f Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Mon, 23 Nov 2020 22:07:58 +0800 Subject: [PATCH 07/33] test: add test cases for library function extract_bystr --- tests/eval/good/polynetwork_extract_bystr1.scilexp | 7 +++++++ tests/eval/good/polynetwork_extract_bystr2.scilexp | 7 +++++++ tests/eval/good/polynetwork_extract_bystr3.scilexp | 7 +++++++ 3 files changed, 21 insertions(+) create mode 100644 tests/eval/good/polynetwork_extract_bystr1.scilexp create mode 100644 tests/eval/good/polynetwork_extract_bystr2.scilexp create mode 100644 tests/eval/good/polynetwork_extract_bystr3.scilexp diff --git a/tests/eval/good/polynetwork_extract_bystr1.scilexp b/tests/eval/good/polynetwork_extract_bystr1.scilexp new file mode 100644 index 000000000..d5d657162 --- /dev/null +++ b/tests/eval/good/polynetwork_extract_bystr1.scilexp @@ -0,0 +1,7 @@ +(* next_var_bytes length < 0xFD correctly *) +let bytes = 0x0b2d230f552225a8cfa47efe in + +let value = builtin to_bystr bytes in +let pos = Uint32 0 in + +extract_bystr value pos \ No newline at end of file diff --git a/tests/eval/good/polynetwork_extract_bystr2.scilexp b/tests/eval/good/polynetwork_extract_bystr2.scilexp new file mode 100644 index 000000000..1fc7297a1 --- /dev/null +++ b/tests/eval/good/polynetwork_extract_bystr2.scilexp @@ -0,0 +1,7 @@ +(* next_var_bytes 0xFD < length < 0xFFFF correctly *) +let bytes = 0xfdfd00136f80cd6ff844e6944bd8a6637b1bb9aa6788f35560128e29e283b7edeef41f3206a14150bd01acaf81849f73c8f38b56690604505bf5b9562fa2b179c63e9808a01e2efc252d6ad56b9f0d2f6a15894a62ea253373c043d39914a274da8fc85d8464460b6eb4feaccebf3fc24963db11d0a3cb550f395d3781421e858e62efe41a5bf25b6ed94350313032bdf9b1985535e04671f887dac3f6c094caa761a110a614145153ca2c91b8b9e03c82846159fa184dd868cc0e06c13a35936c04e0d9dd573469fa8441c11f833a42aa769eba588b19fcf5bb65925531689e1ee0abd646c35e19abe9aa3c4001a960652139bf126f16297f7bef2b8c823f54fd450178d637ba68eb987928008958980e99d956fbf0566880836ca608ff2156a8a2aca3f7d09f4323a1a7a7532e9ba61875dc644abc448462d63cd95a25a7a4688ecd4a388f75ccc82b2e01960a95e00d5d17958c6d629c5dfd908d2b7283f70a819bfcfa2d174c6583a729eba6f8c0db08238c3b7c395f7a1f12bfbe1e594bb1a737d7574f1c962493781454ac34205f9bd4891c8c1700544ca7af2cc8707dbcaf8f29e7d659108564c8d8e14a75c4cde41194b2ca0378c7745ca15527866d663a65fbff71079926f526387513cf211cce00780c66a535a7592d2dbf6eb1824d863087f3a340e46aaebd07910b3598c45d23da1a23033c926a5ac4d8de345a2a407962408e53cec475caf303d3b2e49a8fada6aabaeda8510d85e8801083a7a675ac82549d8070d2eec018edbafb59d39c21b732f177c66b22d3dabc5f2fb3178e5c2e4d887fee in + +let value = builtin to_bystr bytes in +let pos = Uint32 256 in + +extract_bystr value pos \ No newline at end of file diff --git a/tests/eval/good/polynetwork_extract_bystr3.scilexp b/tests/eval/good/polynetwork_extract_bystr3.scilexp new file mode 100644 index 000000000..176563233 --- /dev/null +++ b/tests/eval/good/polynetwork_extract_bystr3.scilexp @@ -0,0 +1,7 @@ +(* next_var_bytes 0xFD < length = 10000 < 0xFFFF correctly *) +let bytes = 0xfdfd002647a3bace0f093205bbc8ecbc6445c4031ab4fe72413f4be81cb914a4cfaa1a721d74236461f5259ce901c905724cf3634199ceae04cb334ad9916a2ee14f141ab8d574c748106593968dd7c892e1eba70ffc99df83ae7aefc6e54f7d1273f0661760ac448d4106e4565aeb004a5fdf4be35a1b6e6885d8ec0c4637124e1ceb365b957d9445fecd8cfdd458a06191348a0eb5a611cd2459eea69c06d615d78c8322dda7371b5e3e88bc3f47b51a911fd3d8e8d621bdc49d38b89d9302a9392d2909f303a0d84d9fafaf33b4dc8ad7623af733f34cc00837a69265e852e0de7eb3877bd01fb6af13327b699b1e985a3aea2d256e89cab5cecf962db53bfd4501a0c5db83063ff6d0ae8dde37959186b7000509b2a03e2b7f42c47c35607626d0912b3e9f427b9bc282c57bfa45272882b3278ee383b758d3a1408fa3a6a93077810c58db78babc2a705e5db50bf8445927d0d7aa26b73ed63b6485e05936074c0a9e392c5ebf93451ebe9a929496b8482d2c49a77ece82cafcc031a026e791bdcbc257804df01d861132c8d3cb3eb2ed7f1a087d98f367b0fb12a2452d8afac24ce1806a1fa9a6b7352e8216c85b2ffc3fdbd96c190907bdf0f0e08b735f8bf4a1f32403b79cb0b9cf0a6b02684b76a89a18101fc89d11214ce9eaa6047fe2e4bb7888253453e072fecc42458022975fbb1e36695e181711e99d76de99c8bdbffc0813821d707e4b92851077a79f59532301c161308ff0f3426e2fa570b3c0b2fbcfcc5136657b3b07da7f5b926d0a13d5e410175fc3c0aca6d78facb9d379b6fa2efc5923fd1027ab9fea32aa32379fb5973737271546abe3eb18f224ca6b0eca2cf365b504ce74674f4e45fe95efe38eb421eb464c2fe624f6f382e143dfcd9d794798b4bca9829a733e22ae2f4e5db6f3c6d66840256ff767008f9a1c8afc3c09b6372c21530ca236fa95bc41bac0426bf4470617cc4b84f6ff2d440696194487271ce53038a9e0e7422084b970855f00670faa243b90a0de96aefbb5e2cc09441d23854b25e184e73f650dcbf3fb4d95124ad6147c8b354712ff8f3ad30bb7e1093e105069f09cb79bed6b8a40c13a9d3e4ca52e6f93a14ef7a537874621213def551cb5e2c34c25b386c9fcea0c2f73a3a294eac3fbaa397fd579360956fe98ab83cd9fbf055dcf2f76b9038b0a8f96c2b0976749dab1338999816ab96826a14e9d3b2d13da99d0eae7aa71b7e4019d9cdc741e2dd43d06b3d6ef15fe96f757953a6925b8db5480b5a50e3b4a05aee8ee2db835c60432b03967e0a8b4ea4d582eea7a9a08e815a542b6ca071270da44c9922e898288566b379b9ad8776180cd2ef2830ec2beb389c6a7d5cf3f2631fe76decc8bf3e4a00d33be2de1f05d13a996134dbb550102646272e162f5edf390c236e62f6317ce86d36c28c961e8ef7a7d28f0db9f891f9eb0d9aea539b643d3e36245dcc4ffbd9f14999fac2e83ef8d36eb2ca61250803de9e55e829eec555b27ae36f89b02b84d22b02e7895fff250d90eae203725a4a406c521f0167471fb15cfd7f2301dbfe8f8f92f2904ecba3810ec98af70139fe692a635b6fc03c298519144f4a8a2b1e99d76bc10bda957c98c962af2ba83a11806eb04cce47a3bb9e7080a4d9dce73b38e7470f1dcf943480d3c3b297742bf2a1a7e158053c1ac31a9cf82f885002c1a70a05a06e6d2d405e11e9b1739bee34e4dbe692da45200ace30f32ec7c582c426a8a0fdb531a54497513ebfd23c46df6655122163c4daec34e6200eff1a3dd8a56b08beebb2916827468f94e25d0aa55c9cb4865d6bf93d9f2aa79b2c506e3ee42725e74857da64d96436559328f09979d1f3a0ac9d9e57b3d9eed2c79565885a0e7bded90f5c49cc250d4bd416c98acdbe6d1242d497288a73809a299a3e7dc385475f3edf88fb8a58685686fd07a3c6ce4bc1506bb3447e786965b52076f264d4b1c20e5891eb01c9cbca29ca7966d9f4afcc9fc882313fe78b2f619d8581f5e734cbbc4b6057aadba8b2783ec8c0cb3765308691312599973d6d706dd15978613198347f947361fd2a62d47d9f2b441e70778eb4fe36dc1b1448400808e95434334909a0fffc50149032e914512eac90ee93bd42ee4cdb0169784c3e6e14c8727cb5f4ac6f09a2e8f3658d932aa7125129bf8c44462d235d5ca3b1499bbde9122b294f1631c874751c05be0dbd85ecd76b3878fa1ab2dfa340d6f6b292e13bc5101ca473c4e7187349f49b77e5fb85c93bc4787f67f6c73cd7ee13cc38adbb6cbf80875faf802977b1e4a33cf5b869cf813795a4b83b52bea5db8023aa37926704d399dbdc07380a27de2090f49874188885c1410a941612e3cbd0daa3f0e9bb03adc04baa39ff5a15c863956ae25d46f4651145018062510525473c8ee56aa441b00284864d6ee35800bedcf0f0229490c41a02fb2dc576dbeff02fef82b548e89551980a4ce81734245ebd19cc46ef85c343c9e8d3ca3b6c78fb1191ac7284f2adcab376c58e89de6e6cf920f7c9caaefdbebc75d43e667217e0ee2c76216a1081ae410f41bf9117610259031fa64ab7f6db709fdecf9841036c5121bb32ad2393c67793ea194df33b0b66dafe7c732039610815591b89f398ea50fe8a857d63519e1459c6f0f6104a43a740040577df77e4986423547cbb89bb1356905a49253297e3b16c864e5faf5b323b4fa21462aa58bb036962f187abecadff6e9fddd0cba0ca6a55cbc20c81d206f71f31a92ac8c6c05d7ac2936e5bbe2b33607415eb26eaa54c8d84d2cc995581bdb16c2861dd0f3e02e02bfcd738372562784c84cdf2f23cdcf4e5af1c8101350eaaf741d113e01b02ea8ff1c7e05c76baeb5fea802ab842d8ae402e3c085301138b41e6859c6ba779a154b3f349f08a75216930c3e9440601f64c8feab21752b86db43ca2cac1a52560612134f4233c43bd8d5899599389925a4d123ee506e2c40ecd529b5fc462caea75e4ff1904447cc1ef5acbee90878ce75f33cf81b0c95c1daf9a92802424892c1c1cdbc348d6c04d690a53b05a91666b27a8342891edda43f1ba02df2f7bc0754169d847ec6cb05a5be68dc602e9761409671b6f37e2fbbc52621caa1b3430b74fa502bde589b44d63bda32ef44adec77756c3f61e8ee63a18e44f27ce017e72bda3fbc009a8abc342479c3bbe5eff6a386758cfaa5b6b7b0e37a9d5ab521377e7eda753cce5f1c4c78fc91dcc9e7696d0ab5f1a246b05767ec25475f50847c745b1cb9ebe00613a2ed4df139c63f9df39cd455a4f9f03e161997e0264bb9243dd8b9f5834ebc3a79504a511d6ca04387dd1629df620bacbd2f9e4ca791bf1e499c4bd63687599a613f8be24aa975c3f8b45778e7b2c041d749e3650c0dbdefb0f11e30e0a10b54aeed76cdbc24ced95c2964d971a0edb10473dec81139127df22a136db0bd238c4d1090dcd876bbe72add03e2e163f62a3e49136aa4b6548733022d5e592dfba77900f9bd769143c81a305a59d1cb8075a8729cac49ff13b4551fd2634df233b4d3d15ca2d6fff083374bdc9a57a9eac94f3e12de3b4e228b16e90298b000d2c38cb886487b46c277a9c29c58f79a6a77422f8390e472d62034a4e454b7ee2947146d28b258fa5daf311d9ccb5325832d2178245528cb4c0750c19dbb9ecdf681ac26de84f77dc93bc30300beb11f883b54a629ab94e26459b5ee8b2e4a76448904d0aab3c27ce841da681378a04b17610473fb61bf9690b9526ab2a643f52f38cfd7ebe0fd6ca6f6aa84cd4dcf07e14856f0f98da8477185c99ce3a7c714cc4ed3d844f27ec1a5866c740161ba59a4bb168a2fc5c3a8aa4c286c18ebc46ebf685ca0bf4255c49a06aa0782b0bcac925c9e45b37a54c993a8bd532e1ce9712dc854e744333f17aa7d2503a7efca0736718a29da781de21f6dea8891df363559261c114126fa9a03d7a0cd942a7728aba5f6e8cbd5882b351d124615a7fc94c186dd4a87c0a7d30ddcbd1c8575ff8bc20932149d70786aef56d4ee02bc17391c25bf43a2492d4aef368434b127f3c387d1ac36202afa8046663f85acb571d4e093c5b058087594a5a6f25d404742cd0675e33f999f850ba3170670ca4498f772dab378c636323a66f500d21d6dfb39b30b84f35ca4df48a73e68f8f7054690eba1c79d858e295c821678072305c0d753226b3975512374f3e10f089cf4f3a1b377dbbd140620e60ac0172d327e112bfd2583952b78cfee367f8b8160a0689a981135ac23e8be26604511802865e94886571ad6103a7ab6a845bd47529373e5648215948ed8f54c509593d21e324e596afffbbe666f6cd0287e39e1fca61f747a58829564f69039f251df4db8d2257a8e995f633d0fb6c767f4b71c3d2daa16acc6f71d6b12b7d24a99ea501fdec75585695f0f7a87e769c434f71a0e352b7ba91403492dbceb33778ca8f36424e38b1444da7205b091365d4598431da60f8d642b8a51165a2cb4163c84607eccda8293da8fff358bd505638a129050e2be9cd1b3d8489183cdd279ef2dac8001d8e3983ee8d485656994d20a8e49a2356d9e1df5c304924c9554250bebb002a6eb553c701d27b0c8ff7c8467739bea88811bb70c368b004ded217ab9333fac7a34d690be8227f7aa1cda61b5f58e93a57610c2e76ff3228b05db2d10e579aa62c1404b822d91845aa417c4302cf1518a800222ccf73bec3f8e4f743c9967ea6d24fbd58c978d57fcb07404ab4809118e63222fc800a7e333f130ef109e75039ae4d6f009ccc7ed3a09845e8e2f9f0e2379b0d34522beb7f5aa9408ab2450e8e36ccc03d3e844e873c7165342ad94ebef06f19e44f21ce355e00499ad74bf8b0314752a360e356b9b7e4415a199ab4f4b3a2201d217ebe2fb052e0b5b72f85fc09051bfc2d60226099f177e915ebb68fa46b6ad3342d3174fa20293c1eefa59b85418313c5cf17ae6faae5b3104d76ba75a70a97c36b0450d1831963f69063335193a3c46cbb7dc04ff77c4b0cc970f8508ccc8475b1d8db78387e2cbaa5142ec8bb0a66fe1511d7e00887922c34b82653dce9a773d4cf843b2df7c28ce3bb61c208aaf55c6cb5ee750623ae3a9bc54cd5e48513012b2e822db6a89e58214cd9c71ac6ce1ec2f6864ff40cbdf51f69b3482653db158a9fc376a82d26b0f9e6ea5dbcf9f32d13b223fe50324311bef14ea5eb4f62637f3bd7f79dacb7ae014c18b2c1a206ee47e7c9b2c8383e9ea5365d42ff8e18b8019f0c3e1f6d13b32d5ef37d2ceb3df7e61d41edc185b1901df27ad3dc03d180e27ff79260b297b525ae3771783f9d9b1f48374e301f8b8dbeaebb14e58ec230d2f187e56b87c622df9889da205c3ee3a56bbc9144f391a2fc5e7d38c65640de762a70c0ba881d3e3963159dcdeaf3169c1f2bff1a94a33ec0888fd741c30647395d910674cbcf932fefe8ce5f8473c6cb9168c6e47128f03fc4f828ef54f22de0d96b4df2e17ee9f92cab674d7a8880d608ff6ad837f2701955d1b81b8e80895a480aa4981eb9f05eb9fc5b78629162093cc587bb2c0d5d95740784173af66249cedc355c14eccc665814320416581062968a28f2df06bd7127ecacd64d4f13deaa0ac5c74c310826209a6b5177c201c7e34789a99921ef883dcbc0ec47147b03a4e0769487b7251ea7ecdbebeaad14453985468d6d536045cf43ace99e2548492320432a6c55075fb284d05524b2f2045f768f5082d8fb5f255fa0c44592f429f6f522472953185fb4b14d5e12bfe7d0175c108339ab9ccf21d992334ed57f68697f999443c0b213bef55f5ba6428032152ea52288ab46c974881a61016c9b3c646518a7b50db66025c76fda0286c0cdddeb2927b1c6cb1d7f9eae2272fb5c5c43c67b7c482100857763376c85414a2d12ea8cd043d3e816675ed6a4956e5909201b23aea5f4ff92aa7a2194543ba0a3b4d90304b665dd781633c9358ea851c1c03940da4b16459593a3b633a52b81c602ce060acca5d339b1fe65e0141742964fea8cf1cc188e9d3f4ec3f6d083e289f19de78bf7f90009d909c6f3ff83c3088f4eb1d5d77065f65e35eafc8db77b850d54da999a3e1982c8c358e7b566d88806c13485a1313b2b836eef50060ab019327303c59259730b87d2728ab2f8897fd78b8190cc83c5620409e7aef73e7fde83327917bf5268b115c5c5f035b1e669bfd7b64fc179989b547b0466aca868ffae9053934411ea988920e5d3e62a407a61e0af37bece5ae42c7e77feff6814fc2ef724a46b41b6b7ba449a230a6f41eb70c2233514539ac5aa3c542bf0ce28c82d66bfe8c53b383a9df54e99a9a3c52d264289f2a84c9c9e94660f786e6c7b7a54f16b30bd65b3d4c5d88af5e8e2da43860331961baca8570905f09d1c915790b85ef4e4b1783dd62b446feff3dec54073daf7beba3a8a291a326495e971ce63df6ca4d767b4c4c7a66093da8babc21be4ccbfdd634edb3797e0e21ddc6f6ee7d673c50b7aa0bb6b422c1e63f5652b7c60f1549e1c4ab655ba99e9020e1b11be699808d40c675c4693e52b9785856d57cca37af89b5332582e5e1b8d628bf620396473c2bacff4922e3c469bfd92dadf215a0406ee211eb248dfdbfe05c83ecf41b660bd58fa7749437a5bd398e06f5ddde0d50239cabe9e1c8e8eb41d980647fa72e99faf1ab3212617cda0c337c22e3a247ba8e3cf5464456b96f5767451aa9a8956c342eabe91d32777e1e5692716c2271f7a2d63d13213d7ef2cc271594bc3f87ae9bb5c3f2d33b7a0b9a2e80737a8455ff2cd1012ce07d446a275aabb819294878b5ca49e04cbd8242cf60f2444587599abc37ed1e068e15d6d0ac6f023bcf13b0438ca03d98f5472e56039844c7a53445d506627834db9a81590271cdc57eb8f8c070a96f01061827731784694b19b611a7713185a292c93a46b8f5eebadb1d836a5170717898656b215774e12ce3e7cb2efbf435f7f6155fe0d60dbe9cccf1aed31b576031480b9362c55f84461c9c3567c94fd7080f977193ddf2089166a3f7152af17e7c38cf765a789df901491c6b2e098a5d073811e8f81dbc3673d2c4e8287e1c0f4d9c359e00e21789a12e4af733f46cdd71e2243b3dd14b915f7303bb5a7dee7d96d890a962e70b85e0431cc13c662a661b5da19976e4c836921fb9f0927e8913316521d56cb57883e2a2a5f7176e24ceb0ac02b16fdf7b61a72e95877982ad2d0a8c571ad1f2b54ef71c681e6e96381930fe5efb934079af88761f195ad82224537006e54622badbb19a39d09882a1c9e72d4f8930caed09a53a402ef1932dee086bfea3501f1c52e95ce88984c7a2124825c4d44bbd6c52800b4694d06efdd18baa1054f28438ab6968da660a22888ada1daac131a937589477b58534a1f813307c185aea551333d82b56fcd17652c5f8c74298da3611ba88a2bdb70cb8f25959c426aa3dbd736c8105f7628716d3e0023219674a7ce2ae84358b3013f678f9af0f59c56f1ca2141fae78ed64e3a9bab60577070f834de4e9bad2bdd8e1ee6db3e07f45d4b965a2d525e327cec85271115078c9040f862f725fdb10340ff97a108ea4e8c00e8fe05df884651c26056afbd3fd2afdfe95c2127f82b376335aaab6f6850583e405264b490bda00b9f43d08292326e14501d90f83b22b6ced6cee5e80cf708ac2546385f846678f7f58caa51bb1a6b7fc56bc7b546d100c62a81c59554caabeb23656fc398a19c5c14acddf9291241f4d66a26c45d644dcacc7110d14c3320f3067aea15a12f4151ad17485d8a23fcbf881976c6624b009d7560682494053888a9f5fc9f0699c7da3f095284a6cb2c3929d33002ce4e6cdcdd1f634981e54baccec74191d77c9efb9ed63902a4634dc45149c6097a0fea9de22890c6252c0d95f21e448530eadca832e6a2990a7bd3c965b928917b2bbebe49b31218a86529a4e7c519e87bba194da78e3f71b0ecca7ca6308f5d50a05a2cb2938d64a1fee087832322a88c6f64802e58badaf6039050774e284a0b5e3e7f81b2ba19b7efb03d9f2188d49f2ff0e8099971271bd0fe3678b68e7a74d07b1eae4b87a7b893f9fb7cbe712a2401507b393ab8176a0ac6793b32d4d90c7ffed5b68b6601dc9c55a6361bb864151a7cb5abc46118612ce5d8e8600b23fb15a4b245158d5a93d60a2c0c6259ec68a29079891378848830cdd80bcdf0d4b38b31961e31b65c236adecc328f50d2b784e3fc12e32bc994691e0684a9b84433aa2cd725d70d6a01f3decb1e026a4e810ced4a00f134b843e03eb27f85e6b98d8e7f12cda178330ce0d2fa6b6e3aa67774265c9cc2fe1d7c0869d05b1178bbdcd9b5cd5565c1752bed94bf36ac743f8cba1c8c32fc915556963f3f0688781b0b32cb0d71b37f089e438ba9acc0bf9db8bc283e88223bb890f47f697707dcc8324801d80adfcfdea602cc573e1f16114198fe71f2c13ac942d5113c2daf230ebf174a85ff365f3e7059ac47d4ac5bf68d3d9c554f3fc64bb75fd439ee745a99fb08850b3b41619eaea4a30de7a607d105837e4776a4adf3a1f2c6728dc1fd4fdf270534f178d6536eabc691d242249b84a17dc6390e9721b2232088ecf4d82b468805ab8a5335cba3cce2b8d4f058dce7539a7e14ae6fbb7bd3485a9268621793f94673e457bf9dae0b3d1aaa52b935b49c24b788ac32b1000dd93ed8bd337bed14d4429f2fdd685ced69dc49998dde24a6af288bd4768aa54d5c971ed3aa74852b0b40399fd1e68f313619d273440801fd233df6fd329c4c5f2d59e27030d57105012b19062bb3c9e2f3d585bf59b804b133e6f46ec2e6d88a0f9a09985dd26c396f247a6d13bfdee507130931fda7c89315e3ec4c2848d0c72672ad6090e50ba0feeaa248ad5d81d3d4ecca2a3c85aad6d7e5ee9ae6f67794ccc514e9c6096fae0243f8bbdcacf773ba6d1df15a02a1631c594e13c5541a9093ed9c1001f0c4f78db0812c88da7b0007ae833b13fe829a5e0cf3d14f479db84cab5111d12e81f86d21a5575f473d2b44d4b947dce9e7ec283990c7785858b2c6d51fb65ffc396c075634dea5b64e23d4f61602a36502b0c20db35ac091a13e3d7a46b6370903abd124d6de1e7531df1a59250a08bf064d176899eb091efa797d464be76696ec2a1878922898f0d58990cb63de9580271faf82aab7d5de664d0bc097e4a24036318ca5bb57a9be7eec4fed1cb94c462dc7e8c015b92814d33c783cf1be00ce8a4e28358bbfd4c4006912b7b68a85ff5dbd043f0c9d91585ff1851d686154387e773c3bf240183b9e424b1bdd657bc9007196ab12621e57c46c279da24632d70d378f30327dc517cb20166123bf376dd043c92ca73d29a60e9bc17a8f42fc2a25f334b1b75e9990c96bd473b870d6e825763a4b36d2e2ef7dec70b663565dd4f40853a82ea8860d0ba2c1defa369ea2186eb7e2a52dcacbf1b2126d246e3abd4d1ad611da370cc39db4a9a656ca98b9c2f73f952edf3598d7579b414ca09ce8ab501245f73a7f93901adc825c3b0e0765530fa3774c67196e89a5d8134c3cb41b85beff740f602827f46227e22564a517278cc13c9d8dbd705d9e2aad693e7ff43674631fdf0e62b24cbc10115cdb712aa5051c228ffd1565af91144c03f711eef9f23c626194e1bb8a5761c462ca36564a75db3def5587f1adf44ca9c2c0bf6d41e5cd79f340e505a0a476addb9215a8b127c4d8a52f00e6bac972c0796d788ef9d9faff5a0f5d53ca7a51198fbbee1f6058e9fcee288f434d2d9478b0ab048d1616f4340529b0dba0ec9dea884cfb97b1339c3671f1e6caadb5a658883332a6fda5cc77010879180e6c5239bbe954f38e1fb8748939a4fcfbbbfcb7133f1544e3647d65a564f1fb993bc47366235371ff2626e125d585e5ebddd0fa9a2d641dbca432b6a2e1774ad01be9d097e906d297fbc281ffb0fb4261c040e47af4ad99d60d7761e9adaf7cb7a3dae550f7278024c44e167729afd09db9a6dbcbac48e43a8ed56034ae87221e69434ffe812359f7e67416296a0d73f86b0cd04d5c5ed6c664ce353f565732a5e5ba9fcaac6d2d6fddb98c9f796dfda0d81922560b6fa044213adc2e5aad055afe8b55b8318d4021f2628f4e564da6d2d6e0a04206458a47f01112313af24cff56cebc5f31db719c4c6010704c74ecd78e75763274e59eda0edb41b7b650989be3d12ce11da06956813c8e72ab5b9902a7711feef4b75a170c15b9ed692da26aa2b8e44eb0af70a0813451ba666b0a5c020da273207da6f1fde6e231ed1a35692ecd4ee3b00c56cda80cd612ef898997babcc4541c6ab6c3469b240be51414b525e7056021f3f359d46f99d0ff09c011fc88629d1a94afb533bfcefe3bbf081c3d7efaed8058003f388aaddb16b13c1e9046a9eeceea33946c58e035df188fdfcece96ce34d5b224f399f0694218f3acccbb5a8760223f53741ddecf8969e2b2b90d93196a5a5e813f66774e51fa20a6dfe4534d37087eb9b37c95eb8ad3f9e4282f12286327041253a0b04ef7be483cbfc61a9d3a08ab03dd71c3974f97c3920038a5a58a3ab1139d1a89f8511f070d11790b39b9507027346b47ec4b8d6387ea89037e27a159bf90101197123ca0880bcb050a9f0f74debea4f722e9d300e3f9560af9ffb1a30730dd4ada4c7a23f7feba9c2b199fd169eda543fd1d07eebd2cc3f34e4e45bc0913019a1e84bb9c8352a5e30f60742e676930ea220877214a1081fba3bcf492d46e82b7422a23ad87a4d6cb48668df7c77dfd7ed31fdc51b4caf51fd17b9c93bcd43355de31579793d3718992f3bc280fa42ecacbbd0cd728a5c87d06099a866dd3bc47dcd075bcad79d203a9dd2099ed98c42da7d16d2871dc83513f63ba615904a3c352554b8b441e2619830fd782da099d8092954ab5bc9fba6947bd5865b2b7624f00aa8ee8f96d744bed892a6270500c7c8018b934b1a6f3b791a91ca3a3d4a892c2e3d61b07eabddbcab39a8b845e7fae4be3f350ff10e37a914e158028e580dcc8c9b101637ad972c09ae2b1b5b9b6380e60a60967007a8ab544d6f1560a76bf3ef542bbad0a5f67ef49508f945aa10e7dd724087fd4cecd82c97598c9f7855d5bb7125e1204d6457a4bb65c0f221ef7bea3484c3b7f96f245ac14ef82d1f19cfaafc07303983887a099d9322d31547ca121f224febf57e624abea2d9edb4b12fa0c97e9dffa8c98ca71fe3928575511cf248c807b58ad3f6e291b3baa2bb7774ec03e294bb12bbc7dbd7c7be155a8d5212a3ffba5bb63c133f7f7842f46cc07f6414901b7be1735be4c8539bcf0036f13d67fd8fbfbb4a61b96aedfb564f8b8868e81c4b3f0f47440e4a24c6ead01640988622b582eae5cf5ea4d73c21e9aaed88472d8276229f46e3bb9ab582c59f18b332aba9cd5870a83b51d59ae7b578afa6fc43cbf87a9225729aad094683e1def81005ed877f69ffd65f014fecd9ec0a6645fe05a2704804a4cb82f1e104572925587810447fba561ceeb13f994a91ca4847e30f9822e5cc8d1b3ee64fc48521adae58445f3446b1c2903afeabcad8599c9d193764d2525d59771129bd425f097c02137336f1a81cd01f147829451066b176afae16888e8f022a3fb2de089212d2ab14ec24bfbb98fe4b02c31b5c42858d3d2411b02b0eb4d3a3960361abdc8f992064a68f895b0a1ce359ab205e397bd2efc91b395c67b00d891a8ef055641997eab5f8a37172fbbf5d94d1b8b3a4d0994590873132b8f0cfcc750ea29e00bd84e048e335aae497f6bc5791b51dd8acbe2e6c239ebb481e575638d8a0fe86c8b519c937823ea1a51cf4fb223dded9f16804515ef57410d719c0938a6df831b9471bbb8c8eb87e2593f2ca7b69d3223b60c83bbcf8c18ca34430fbf917bdb5e34d4d055f4879a6a4534ebedcd16a7360fba8c066aef0c5c7a860966122564f372f4623ec8982cff567eb9b954700779a7eefdeae74e232d07534d3082fbfe4a9992c62cba566952dbec6f9390d34d423b6d49db42dab7eae14cf88a7c5831939bf7b9f9e93ff0c311ac37cc08590b3b464568f2091352796b155af609aef5b739a5bff4ebc96cb33079d8e5c2a18be1f85eba1b11b782639d4336965b7211e6bac0284555c5c64cab3d7f01fd065b5ac5ac7f3834b74f208ba028bd6a74461a2e3249bdad0853f968b8b88bb32852178d7572699a83c13cacc7278cc3f3bfe54d6463e43eaaa8c4d24cb3411257be52b670a3235215d3724a92625c3fd0964173d44808337714f00cbec1fbcca711794aa6db4176a9c0f94f61fd8262ccd9f1b4f870ee9c68ace67148caadac926957315a62a0eefbb761badf18d59d8ff44ad50c127a95ed36493364974a83443c3648b94c8fc5263d3812433b5b32481ac56c68e5467041a9aafc726e8c6b453eb81bd2850a2b0a0ab0dd892758799d33ac7b81f47f0539b0f44ad96953a09fc8df5e667555fdf885dfbe3510e3184c91fe9f0c8b70adae228c21767a1db697d8d135e2450c6446cd91a0d03d3db5a8c0cd9ef696e0bc98f8fa8991f811f55420440c0ec0b2bc7c537ba55a4451019780a10d1cc733bed0cc24b902f50e96c453bf6651574489eeb6be29094a441789eba006043d42a1912cb0467ea3846ca2394a827acccf5b71fd8c3395a660c83782cae71be1fcc6b2594fe5e9d975c119e916e257fc3423a76709e2a76ea1694a53ab14f1e57f06086e84f5d4ad5bdce8c21f6cdc121a19f527851d1d1695142b11a9996470c0517f673d6223d5cf1ce5dcbe8334b7cff4937d637c0b0abac50dbd0eae6da4f321ea9c24502dcfb1c75f666e2ebb2e72d4185218d0c9b3e52fd1cd1ca69ba5c5efad824ef447d30f0e0c1e8976dc4ac44c24ba5c9a5e74b0a93ebf17957a2593ad26da95ac6dd957d5c494d8d69139be897bbcf501091fd264f2aea64b03af555c541867a59bee0577eea33f4fa0e0c305ffdf4614c5734a5fcb5a969de3a0b381aa54b63457a7f773c031ea97e3d611e8a6f3f46d371d41a1faf6ed982d4c1767e3be9fc3ad65afaa368271bdb958425282bc2f9c1bf22bc9468f773de8f2e3271581678ae5720d6b4a86b344ca362030c62c69c0ab3661fd209b594f521fd316b77469a5716913f45bcfda614a30d2b84fe9c4c89288541a3eb03a0e5ab089e42906b264dbd83b2dc7d2e8466cf61b71aeec16f8ba2d4e7459d5495a804eab7883155107194653aa027a546197759347e5d1ded9a86ac2ff1efdb64dcb3668eaf1cf8283dc8534f7f3aef275f295b89276584189207e9d9318b4b0d26981fcbb951ab30318ed935e76e48f47cce09abc38c08b65398571490256c3ba55840a4ebb99ac7571c1ca26e0de4faa6f6c2cb131f69c1a60a91956705da65e95309b088a6675e43ec3a46fbeed88c93adf53b99677ade9214420f9d6fe7af1af51ecf7ab3937289b899e607536ef066783873097ecdeaac01a4dad515b8f0a93d5d5b376a0385cd19ce8af3ad27edf49e29ecd15d009aba6ce36e3297696fea7439c10aa8a6dda26e045bc3b23ba860dd592f9af113248b4bb87536b44c6f3ea84a2beef322f89f452894143a760ccd115fde979ce22df0c972aba55e824732421727dc293dbc952993ef9709cc162712e4ba0f282e4828db5cae2dda17a2567614382f7432a863669d314396274666a4155247f34e1bfcf307d6bbd1d687229cfc254b93399e0ca411da5238168bcfdb817ba76df22db45e2442c9203f6c294de5833e220428f1c5f00919dc95ea9b41908c3d505bab6d9d61b7abeff0a50253d84e6e5f988599bbd8d91fcd40e98d1387f85a9ece6c7bc921adf5d5b79297533dd99d85b8521626911ecba49bbb926d8f6d942023e4ea5d29189b3e84427814cbf32085eec4a9398c4ffe00860a4290cb9620d34805d600f5b39b2f5fcead98a0f00dbe5920f36cda3a320e032856c704973e815dd2a6df55774c1fdd196fed707e0787d5aa96235d047169d4521aa4616f75ffe20aa97d628aba6b02fbc903c33bf5358d22492fb377eaca9434d152ded8d55ece173874000989abead5610f592e6bff13e355e89ca65e9352d2cc0c8e8c8f880e575a0c028f97dddfbc1021573b09b3fa3c0d59f1d5cf80967281216aa875e7ff6be97bacf72d9717c439986947f06d8e896b9b491cdebea3719c2f1f33f4f50e3cf121ff207b1065987ad11cd69ae2ca75a1a93768a0176b07b41759fd7ff6126c77da28d6672e182715d83cd86b29154da958ec41572cc1d92a79cad131a76b4a10f4a999417401339999c09f617d65e10a07ce81ea0dfe92698c09e41198cac0a4ca05024417998a453c2cff3b0f3ba4a1a0c90ece3c4804b3bdf7c26af48e70d6a465286b47f76fb319666d3ad601e112fb288a3da8e14e991d53da31b15661bebae9e9f9d9d6bd3f2b663d06de74d98325bea9874e077d47cc6a4e2b246ea17604fab6a364a193c82d8db985b8893f189c06c22bcd1e69913faac36f781029f079cb8c62287fd48de0e1ea62c255e713f3ef4d5fad5458cd8616f6ccad9264b27897c2cc2cbd1d7bc66695bfa46487be4e94ed4dc94cc0303556c5887e8c64dab57c6ed16ad233176afc8832a45e23825bfaf9d086d101acc56c087e30381e6e5157b3ecdff8ee3bd478e89b0ffb70926ddf84cac9644a8023847ec6edeaa54a23d5a51eb2bd395cb9e840c712e114c7f83ced83dabd7cddb59927b7fda6cc0cef39376c8e97696033a8e9579a3126718c684b36f67e1b95fd12f439487019aeabce58596a2d5046d568f09621cfbf60641a9d29514d25df50d126ceec4a227831fe694c86bc98fab2500dec20598fccba17d423eecd9f009625c4e07217dae405de9b6b806e41c15d73f0072196 in + +let value = builtin to_bystr bytes in +let pos = Uint32 584 in + +extract_bystr value pos \ No newline at end of file From 7d47ef6b11e2d2109b311d641e83eab5e708b947 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Mon, 23 Nov 2020 22:24:00 +0800 Subject: [PATCH 08/33] chore: add testing file into ml file --- tests/eval/good/Good.ml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/eval/good/Good.ml b/tests/eval/good/Good.ml index 5baf692c0..1b885b2e6 100644 --- a/tests/eval/good/Good.ml +++ b/tests/eval/good/Good.ml @@ -135,6 +135,16 @@ let explist = "str-char-1.scilexp"; "builtin-alt-bn128.scilexp"; "polynetwork_header.scilexp"; + "polynetwork_next_var_uint1.scilexp"; + "polynetwork_next_var_uint2.scilexp"; + "polynetwork_next_var_uint3.scilexp"; + "polynetwork_next_var_uint4.scilexp"; + "polynetwork_next_var_uint5.scilexp"; + "polynetwork_next_var_uint6.scilexp"; + "polynetwork_next_var_uint7.scilexp"; + "polynetwork_extract_bystr1.scilexp"; + "polynetwork_extract_bystr2.scilexp"; + "polynetwork_extract_bystr3.scilexp"; ] module Tests = Scilla_test.Util.DiffBasedTests (struct From f0c45f7c8a795f6868e9901c66c61a59c21271ed Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Tue, 24 Nov 2020 18:40:27 +0530 Subject: [PATCH 09/33] VarUint serialization --- src/stdlib/Conversions.scillib | 32 +++++++++++ src/stdlib/Polynetwork.scillib | 57 ++++++++++++++++++- .../good/polynetwork_next_var_uint1.scilexp | 17 ++++-- .../good/polynetwork_next_var_uint2.scilexp | 17 +++++- .../good/polynetwork_next_var_uint3.scilexp | 17 +++++- .../good/polynetwork_next_var_uint4.scilexp | 17 +++++- .../good/polynetwork_next_var_uint5.scilexp | 17 +++++- .../good/polynetwork_next_var_uint6.scilexp | 17 +++++- .../good/polynetwork_next_var_uint7.scilexp | 17 +++++- 9 files changed, 196 insertions(+), 12 deletions(-) diff --git a/src/stdlib/Conversions.scillib b/src/stdlib/Conversions.scillib index db4938c0b..4123babd2 100644 --- a/src/stdlib/Conversions.scillib +++ b/src/stdlib/Conversions.scillib @@ -171,3 +171,35 @@ let extract_bystr32 : ByStr -> Uint32 -> Option (Pair ByStr32 Uint32) = let extractor = @extract_scillaval ByStr32 ByStr32 in let bystr32_bsize = Uint32 32 in extractor to_bystrx unit bs pos bystr32_bsize + +(* Append serialized Uint32 value to given byte string *) +let append_uint32 : ByStr -> Uint32 -> ByStr = + fun (bs : ByStr) => + fun (ui : Uint32) => + let uibx = builtin to_bystr4 ui in + let uib = builtin to_bystr uibx in + builtin concat bs uib + +(* Append serialized Uint64 value to given byte string *) +let append_uint64 : ByStr -> Uint64 -> ByStr = + fun (bs : ByStr) => + fun (ui : Uint64) => + let uibx = builtin to_bystr8 ui in + let uib = builtin to_bystr uibx in + builtin concat bs uib + +(* Append serialized Uint128 value to given byte string *) +let append_uint128 : ByStr -> Uint128 -> ByStr = + fun (bs : ByStr) => + fun (ui : Uint128) => + let uibx = builtin to_bystr16 ui in + let uib = builtin to_bystr uibx in + builtin concat bs uib + +(* Append serialized Uint256 value to given byte string *) +let append_uint256 : ByStr -> Uint256 -> ByStr = + fun (bs : ByStr) => + fun (ui : Uint256) => + let uibx = builtin to_bystr32 ui in + let uib = builtin to_bystr uibx in + builtin concat bs uib diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 6569625e9..1f28a9ee5 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -75,7 +75,7 @@ let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = | Some (Pair b16 nextpos) => let b16_little = builtin strrev b16 in let b16_u32 = builtin to_uint64 b16_little in - let res = Pair {Uint64 Uint32} b16_u32 nextpos in + let res = Pair {Uint64 Uint32} b16_u32 nextpos in Some {(Pair Uint64 Uint32)} res | None => None {(Pair Uint64 Uint32)} @@ -118,6 +118,61 @@ let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = None {(Pair Uint64 Uint32)} end +(* Serialize and append to given byte string, a Uint64 as a VarInt value. *) +let append_var_uint : ByStr -> Uint64 -> ByStr = + fun (bs : ByStr) => + fun (ui : Uint64) => + let uibystrx = builtin to_bystr8 ui in + let uibystr = builtin to_bystr uibystrx in + let uint8_limit = Uint64 253 in (* 0xfd *) + let uint16_limit = Uint64 65536 in (* uint16_max + 1 *) + let uint32_limit = Uint64 4294967296 in (* Uint32_max + 1 *) + let fits_in_byte1 = builtin lt ui uint8_limit in + let res = + match fits_in_byte1 with + | True => + (* ui < 0xfd. Write just a byte and be done. *) + let pos = Uint32 7 in + let len = Uint32 1 in + (* Extract out the last byte; our integers are big-endian. *) + builtin substr uibystr pos len + | False => + (* Does the value fit in Uint16? ui <= 0xffff *) + let fits_in_byte2 = builtin lt ui uint16_limit in + match fits_in_byte2 with + | True => + let markerx = 0xfd in + let marker = builtin to_bystr markerx in + (* Extract out the last two bytes; our integers are big-endian. *) + let pos = Uint32 6 in + let len = Uint32 2 in + let ui16_bigendian = builtin substr uibystr pos len in + let ui16_littleendian = builtin strrev ui16_bigendian in + builtin concat marker ui16_littleendian + | False => + (* Does the value fit in Uint32? ui <= 0xffffffff *) + let fits_in_byte4 = builtin lt ui uint32_limit in + match fits_in_byte4 with + | True => + let markerx = 0xfe in + let marker = builtin to_bystr markerx in + (* Extract out the last four bytes; our integers are big-endian. *) + let pos = Uint32 4 in + let len = Uint32 4 in + let ui32_bigendian = builtin substr uibystr pos len in + let ui32_littleendian = builtin strrev ui32_bigendian in + builtin concat marker ui32_littleendian + | False => + let markerx = 0xff in + let marker = builtin to_bystr markerx in + let ui64_littleendian = builtin strrev uibystr in + builtin concat marker ui64_littleendian + end + end + end + in + builtin concat bs res + (* Extract a Bystr value start at pos. See ZeroCopySource.sol:NextVarBytes. *) let extract_bystr : ByStr -> Uint32 -> Option (Pair ByStr Uint32) = fun (bs : ByStr) => diff --git a/tests/eval/good/polynetwork_next_var_uint1.scilexp b/tests/eval/good/polynetwork_next_var_uint1.scilexp index 50ef6f754..b408a2fd1 100644 --- a/tests/eval/good/polynetwork_next_var_uint1.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint1.scilexp @@ -4,9 +4,16 @@ let uint_value = 0x64 in let value = builtin to_bystr uint_value in let pos = Uint32 0 in -next_var_uint value pos - - - - +let ui_opt = next_var_uint value pos in +match ui_opt with +| Some (Pair ui _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_var_uint empty ui in + builtin eq value value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_next_var_uint2.scilexp b/tests/eval/good/polynetwork_next_var_uint2.scilexp index 491cd1ede..f7e01986f 100644 --- a/tests/eval/good/polynetwork_next_var_uint2.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint2.scilexp @@ -4,4 +4,19 @@ let num_hex = 0x64fdfd00 in let value = builtin to_bystr num_hex in let pos = Uint32 1 in -next_var_uint value pos \ No newline at end of file +let ui_opt = next_var_uint value pos in + +match ui_opt with +| Some (Pair ui _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_var_uint empty ui in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_next_var_uint3.scilexp b/tests/eval/good/polynetwork_next_var_uint3.scilexp index fd0b41a4e..5e7c46f4f 100644 --- a/tests/eval/good/polynetwork_next_var_uint3.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint3.scilexp @@ -4,4 +4,19 @@ let num_hex = 0x64fdfd00fde803 in let value = builtin to_bystr num_hex in let pos = Uint32 4 in -next_var_uint value pos \ No newline at end of file +let ui_opt = next_var_uint value pos in + +match ui_opt with +| Some (Pair ui _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_var_uint empty ui in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_next_var_uint4.scilexp b/tests/eval/good/polynetwork_next_var_uint4.scilexp index 802eb1ffd..9b11d1f4a 100644 --- a/tests/eval/good/polynetwork_next_var_uint4.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint4.scilexp @@ -4,4 +4,19 @@ let num_hex = 0x64fdfd00fde803fdffff in let value = builtin to_bystr num_hex in let pos = Uint32 7 in -next_var_uint value pos \ No newline at end of file +let ui_opt = next_var_uint value pos in + +match ui_opt with +| Some (Pair ui _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_var_uint empty ui in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_next_var_uint5.scilexp b/tests/eval/good/polynetwork_next_var_uint5.scilexp index bc95f8a9e..ba39ee50f 100644 --- a/tests/eval/good/polynetwork_next_var_uint5.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint5.scilexp @@ -4,4 +4,19 @@ let num_hex = 0x64fdfd00fde803fdfffffe9f860200 in let value = builtin to_bystr num_hex in let pos = Uint32 10 in -next_var_uint value pos \ No newline at end of file +let ui_opt = next_var_uint value pos in + +match ui_opt with +| Some (Pair ui _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_var_uint empty ui in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_next_var_uint6.scilexp b/tests/eval/good/polynetwork_next_var_uint6.scilexp index fe5d33801..1b6558644 100644 --- a/tests/eval/good/polynetwork_next_var_uint6.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint6.scilexp @@ -4,4 +4,19 @@ let num_hex = 0x64fdfd00fde803fdfffffe9f860200feffffffff in let value = builtin to_bystr num_hex in let pos = Uint32 15 in -next_var_uint value pos \ No newline at end of file +let ui_opt = next_var_uint value pos in + +match ui_opt with +| Some (Pair ui _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_var_uint empty ui in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_next_var_uint7.scilexp b/tests/eval/good/polynetwork_next_var_uint7.scilexp index ebc745d99..1ea21efe5 100644 --- a/tests/eval/good/polynetwork_next_var_uint7.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint7.scilexp @@ -4,4 +4,19 @@ let num_hex = 0x64fdfd00fde803fdfffffe9f860200feffffffffffffe30b5403000000 in let value = builtin to_bystr num_hex in let pos = Uint32 20 in -next_var_uint value pos \ No newline at end of file +let ui_opt = next_var_uint value pos in + +match ui_opt with +| Some (Pair ui _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_var_uint empty ui in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end From d911fbf6f312c7dd91dfe44a38c61b9792f94fd1 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 25 Nov 2020 11:00:47 +0530 Subject: [PATCH 10/33] Add serialization of variable length byte strings --- src/stdlib/Polynetwork.scillib | 19 +++++++++++++++++++ .../good/polynetwork_extract_bystr1.scilexp | 17 ++++++++++++++++- .../good/polynetwork_extract_bystr2.scilexp | 17 ++++++++++++++++- .../good/polynetwork_extract_bystr3.scilexp | 17 ++++++++++++++++- 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 1f28a9ee5..6d136740b 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -192,6 +192,25 @@ let extract_bystr : ByStr -> Uint32 -> Option (Pair ByStr Uint32) = | None => None {(Pair ByStr Uint32)} end +(* Append to first byte string, serialized form of the second byte string. *) +(* See ZeroCopySink.WriteVarBytes. *) +let append_varbytes : ByStr -> ByStr -> ByStr = + fun (bs : ByStr) => + fun (varby : ByStr) => + let len_32b = builtin strlen varby in + let len_64b_opt = builtin to_uint64 len_32b in + match len_64b_opt with + | Some len => + let varint_bs = append_var_uint bs len in + builtin concat varint_bs varby + | None => + (* Can never happen. *) + let zero = Uint32 0 in + let ignore = builtin div zero zero in + let emptyx = 0x in + builtin to_bystr emptyx + end + (* Deserialize a byte stream into a Header, starting at nextpos. *) let deserialize_Header : ByStr -> Uint32 -> Option (Pair Header Uint32) = fun (header : ByStr) => diff --git a/tests/eval/good/polynetwork_extract_bystr1.scilexp b/tests/eval/good/polynetwork_extract_bystr1.scilexp index d5d657162..26abb249b 100644 --- a/tests/eval/good/polynetwork_extract_bystr1.scilexp +++ b/tests/eval/good/polynetwork_extract_bystr1.scilexp @@ -4,4 +4,19 @@ let bytes = 0x0b2d230f552225a8cfa47efe in let value = builtin to_bystr bytes in let pos = Uint32 0 in -extract_bystr value pos \ No newline at end of file +let bs_opt = extract_bystr value pos in + +match bs_opt with +| Some (Pair bs _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_varbytes empty bs in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_extract_bystr2.scilexp b/tests/eval/good/polynetwork_extract_bystr2.scilexp index 1fc7297a1..4de000d3a 100644 --- a/tests/eval/good/polynetwork_extract_bystr2.scilexp +++ b/tests/eval/good/polynetwork_extract_bystr2.scilexp @@ -4,4 +4,19 @@ let bytes = 0xfdfd00136f80cd6ff844e6944bd8a6637b1bb9aa6788f35560128e29e283b7edee let value = builtin to_bystr bytes in let pos = Uint32 256 in -extract_bystr value pos \ No newline at end of file +let bs_opt = extract_bystr value pos in + +match bs_opt with +| Some (Pair bs _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_varbytes empty bs in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end diff --git a/tests/eval/good/polynetwork_extract_bystr3.scilexp b/tests/eval/good/polynetwork_extract_bystr3.scilexp index 176563233..64c3123ef 100644 --- a/tests/eval/good/polynetwork_extract_bystr3.scilexp +++ b/tests/eval/good/polynetwork_extract_bystr3.scilexp @@ -4,4 +4,19 @@ let bytes = 0xfdfd002647a3bace0f093205bbc8ecbc6445c4031ab4fe72413f4be81cb914a4cf let value = builtin to_bystr bytes in let pos = Uint32 584 in -extract_bystr value pos \ No newline at end of file +let bs_opt = extract_bystr value pos in + +match bs_opt with +| Some (Pair bs _) => + let emptyx = 0x in + let empty = builtin to_bystr emptyx in + let value_reserialized = append_varbytes empty bs in + let full_len = builtin strlen value in + let len = builtin sub full_len pos in + let value_sub = builtin substr value pos len in + builtin eq value_sub value_reserialized +| None => + (* division by zero to create an error *) + let dummy = builtin div pos pos in + False +end From a24969daa30e8a85f1e549510452f05d7668da95 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 25 Nov 2020 11:37:11 +0530 Subject: [PATCH 11/33] Provide serialization to uint16 --- src/stdlib/Conversions.scillib | 28 ++++++++++++++++++++++------ src/stdlib/Polynetwork.scillib | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/stdlib/Conversions.scillib b/src/stdlib/Conversions.scillib index 4123babd2..01302431e 100644 --- a/src/stdlib/Conversions.scillib +++ b/src/stdlib/Conversions.scillib @@ -173,33 +173,49 @@ let extract_bystr32 : ByStr -> Uint32 -> Option (Pair ByStr32 Uint32) = extractor to_bystrx unit bs pos bystr32_bsize (* Append serialized Uint32 value to given byte string *) -let append_uint32 : ByStr -> Uint32 -> ByStr = +let append_uint32 : IntegerEncoding -> ByStr -> Uint32 -> ByStr = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (ui : Uint32) => let uibx = builtin to_bystr4 ui in let uib = builtin to_bystr uibx in - builtin concat bs uib + let uib_endian = + match endian with | LittleEndian => builtin strrev uib | BigEndian => uib end + in + builtin concat bs uib_endian (* Append serialized Uint64 value to given byte string *) -let append_uint64 : ByStr -> Uint64 -> ByStr = +let append_uint64 : IntegerEncoding -> ByStr -> Uint64 -> ByStr = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (ui : Uint64) => let uibx = builtin to_bystr8 ui in let uib = builtin to_bystr uibx in - builtin concat bs uib + let uib_endian = + match endian with | LittleEndian => builtin strrev uib | BigEndian => uib end + in + builtin concat bs uib_endian (* Append serialized Uint128 value to given byte string *) -let append_uint128 : ByStr -> Uint128 -> ByStr = +let append_uint128 : IntegerEncoding -> ByStr -> Uint128 -> ByStr = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (ui : Uint128) => let uibx = builtin to_bystr16 ui in let uib = builtin to_bystr uibx in + let uib_endian = + match endian with | LittleEndian => builtin strrev uib | BigEndian => uib end + in builtin concat bs uib (* Append serialized Uint256 value to given byte string *) -let append_uint256 : ByStr -> Uint256 -> ByStr = +let append_uint256 : IntegerEncoding -> ByStr -> Uint256 -> ByStr = + fun (endian : IntegerEncoding) => fun (bs : ByStr) => fun (ui : Uint256) => let uibx = builtin to_bystr32 ui in let uib = builtin to_bystr uibx in + let uib_endian = + match endian with | LittleEndian => builtin strrev uib | BigEndian => uib end + in builtin concat bs uib diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 6d136740b..2e4d5120a 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -57,6 +57,11 @@ let extract_uint64 = extract_uint64 little_endian let extract_uint128 = extract_uint128 little_endian let extract_uint256 = extract_uint256 little_endian +let append_uint32 = append_uint32 little_endian +let append_uint64 = append_uint64 little_endian +let append_uint128 = append_uint128 little_endian +let append_uint256 = append_uint256 little_endian + (* Return (as Uint64) the next VarUint at pos in bystr, and the next position. *) (* ZeroCopySource.sol : NextVarUint *) let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = @@ -211,6 +216,18 @@ let append_varbytes : ByStr -> ByStr -> ByStr = builtin to_bystr emptyx end +(* Downcast Uint32 to Uint16, serialize it and append to given byte string *) +let append_uint16 : ByStr -> Uint32 -> ByStr = + fun (bs : ByStr) => + fun (ui : Uint32) => + let uibx = builtin to_bystr4 ui in + let uib = builtin to_bystr uibx in + let pos = Uint32 2 in + let len = Uint32 2 in + let uib_sub2 = builtin substr uib pos len in + let uib_sub2_littleendian = builtin strrev uib_sub2 in + builtin concat bs uib_sub2_littleendian + (* Deserialize a byte stream into a Header, starting at nextpos. *) let deserialize_Header : ByStr -> Uint32 -> Option (Pair Header Uint32) = fun (header : ByStr) => @@ -346,3 +363,4 @@ let deserialize_ToMerkleValue : ByStr -> Uint32 -> Option (Pair ToMerkleValue Ui end | None => None {(Pair ToMerkleValue Uint32)} end + From 7ece7d7d48af595d6cf507325fd5c45fd5f4e176 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 25 Nov 2020 15:56:12 +0530 Subject: [PATCH 12/33] Add compress_pubkey function --- src/stdlib/Polynetwork.scillib | 59 ++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 2e4d5120a..0621c302a 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -51,6 +51,12 @@ type ToMerkleValue = Uint64 (* fromChainID *) TxParam (* makeTxParam *) +type Pubkey = | Pubkey of ByStr67 +let pubkey_length = Uint32 67 + +type Unit = | Unit +let unit = Unit + let little_endian = LittleEndian let extract_uint32 = extract_uint32 little_endian let extract_uint64 = extract_uint64 little_endian @@ -364,3 +370,56 @@ let deserialize_ToMerkleValue : ByStr -> Uint32 -> Option (Pair ToMerkleValue Ui | None => None {(Pair ToMerkleValue Uint32)} end +(* See Utils.col:compressMCPubKey *) +let compress_pubkey : Pubkey -> ByStr35 = + fun (pk : Pubkey) => + let zero = Uint32 0 in + let cannot_happen = fun (unit : Unit) => + (* This cannot happen. *) + let ignore = builtin div zero zero in + let ret = 0x0000000000000000000000000000000000000000000000000000000000000000000000 in + ret + in + match pk with + | Pubkey pk => + let pk = builtin to_bystr pk in + let pos = Uint32 66 in + let one = Uint32 1 in + let last_byte = builtin substr pk pos one in + let last_bytex_opt = builtin to_bystr1 last_byte in + match last_bytex_opt with + | Some last_bytex => + let last_byte_uint = builtin to_uint32 last_bytex in + let two = Uint32 2 in + let is_even = let rem = builtin rem last_byte_uint two in builtin eq rem zero in + let flagx = + match is_even with + | True => 0x02 + | False => 0x03 + end + in + let flag = builtin to_bystr flagx in + let pos = Uint32 0 in + let len = Uint32 2 in (* bytes 0 and 1. *) + let first = builtin substr pk pos len in + let pos = Uint32 3 in (* bytes starting from 3 *) + let len = Uint32 32 in (* 35 - 3 bytes *) + let third = builtin substr pk pos len in + let partial_res = builtin concat first flag in + let res = builtin concat partial_res third in + let resx_opt = builtin to_bystr35 res in + match resx_opt with + | Some resx => resx + | None => cannot_happen unit + end + | None => + cannot_happen unit + end + end + +(* @notice calculate next book keeper according to public key list + * @param _m minimum signature number + * @param _pubKeyList consensus node public key list + * @return two element: next book keeper, consensus node signer addresses + *) +(* let getBookKeeper : Uint32 -> List Pubkey = *) From bfc9fc0114628952e2ba48d4bddcf168dd72429a Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Thu, 26 Nov 2020 15:47:58 +0530 Subject: [PATCH 13/33] add verifyPubkey and getBookKeeper functions --- src/stdlib/Polynetwork.scillib | 97 ++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 15 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 0621c302a..6c86b0674 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -17,7 +17,7 @@ (* ******************************************************************************** *) scilla_version 0 -import Conversions +import Conversions ListUtils library Polynetwork @@ -56,6 +56,7 @@ let pubkey_length = Uint32 67 type Unit = | Unit let unit = Unit +let zero_uint32 = Uint32 0 let little_endian = LittleEndian let extract_uint32 = extract_uint32 little_endian @@ -68,6 +69,13 @@ let append_uint64 = append_uint64 little_endian let append_uint128 = append_uint128 little_endian let append_uint256 = append_uint256 little_endian +(* Raise an exception and return a default value. *) +let raise_exception = + tfun 'A => + fun (default_val : 'A) => + let ignore = builtin div zero_uint32 zero_uint32 in + default_val + (* Return (as Uint64) the next VarUint at pos in bystr, and the next position. *) (* ZeroCopySource.sol : NextVarUint *) let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = @@ -208,6 +216,7 @@ let extract_bystr : ByStr -> Uint32 -> Option (Pair ByStr Uint32) = let append_varbytes : ByStr -> ByStr -> ByStr = fun (bs : ByStr) => fun (varby : ByStr) => + let exceptioner = @raise_exception ByStr in let len_32b = builtin strlen varby in let len_64b_opt = builtin to_uint64 len_32b in match len_64b_opt with @@ -216,10 +225,9 @@ let append_varbytes : ByStr -> ByStr -> ByStr = builtin concat varint_bs varby | None => (* Can never happen. *) - let zero = Uint32 0 in - let ignore = builtin div zero zero in let emptyx = 0x in - builtin to_bystr emptyx + let empty = builtin to_bystr emptyx in + exceptioner empty end (* Downcast Uint32 to Uint16, serialize it and append to given byte string *) @@ -373,13 +381,8 @@ let deserialize_ToMerkleValue : ByStr -> Uint32 -> Option (Pair ToMerkleValue Ui (* See Utils.col:compressMCPubKey *) let compress_pubkey : Pubkey -> ByStr35 = fun (pk : Pubkey) => - let zero = Uint32 0 in - let cannot_happen = fun (unit : Unit) => - (* This cannot happen. *) - let ignore = builtin div zero zero in - let ret = 0x0000000000000000000000000000000000000000000000000000000000000000000000 in - ret - in + let exceptioner = @raise_exception ByStr35 in + let default_ret = 0x0000000000000000000000000000000000000000000000000000000000000000000000 in match pk with | Pubkey pk => let pk = builtin to_bystr pk in @@ -391,7 +394,7 @@ let compress_pubkey : Pubkey -> ByStr35 = | Some last_bytex => let last_byte_uint = builtin to_uint32 last_bytex in let two = Uint32 2 in - let is_even = let rem = builtin rem last_byte_uint two in builtin eq rem zero in + let is_even = let rem = builtin rem last_byte_uint two in builtin eq rem zero_uint32 in let flagx = match is_even with | True => 0x02 @@ -410,10 +413,10 @@ let compress_pubkey : Pubkey -> ByStr35 = let resx_opt = builtin to_bystr35 res in match resx_opt with | Some resx => resx - | None => cannot_happen unit + | None => exceptioner default_ret end | None => - cannot_happen unit + exceptioner default_ret end end @@ -421,5 +424,69 @@ let compress_pubkey : Pubkey -> ByStr35 = * @param _m minimum signature number * @param _pubKeyList consensus node public key list * @return two element: next book keeper, consensus node signer addresses + * See EthCrossChainUtils.sol:_getBookKeeper() *) -(* let getBookKeeper : Uint32 -> List Pubkey = *) +let getBookKeeper : Uint32 -> List Pubkey -> Pair ByStr20 (List ByStr20) = + fun (m : Uint32) => + fun (pubKeys : List Pubkey) => + let lengther = @list_length Pubkey in + let mapper = @list_map Pubkey ByStr20 in + let folder = @list_foldl Pubkey ByStr in + + let keyLen = lengther pubKeys in + + let mapf = + fun (pk : Pubkey) => + let exceptioner = @raise_exception ByStr20 in + let default_ret = 0x0000000000000000000000000000000000000000 in + match pk with + | Pubkey pubKeyX => + let pubKey = builtin to_bystr pubKeyX in + let pos = Uint32 3 in + let len = Uint32 64 in + let slice = builtin substr pubKey pos len in + let hashX = builtin keccak256hash slice in + (* Pick the lower 20 bytes *) + let hash = builtin to_bystr hashX in + let pos = Uint32 11 in + let len = Uint32 20 in + let keeperX = builtin substr hash pos len in + let keeper_opt = builtin to_bystr20 keeperX in + match keeper_opt with + | Some keeper => keeper + | None => (* This cannot happen *) + exceptioner default_ret + end + end + in + let keepers = mapper mapf pubKeys in + + let foldf = + fun (acc : ByStr) => + fun (pk : Pubkey) => + let compressed_pkx = compress_pubkey pk in + let compressed_pk = builtin to_bystr compressed_pkx in + append_varbytes acc compressed_pk + in + let empty_bystrx = 0x in + let empty_bystr = builtin to_bystr empty_bystrx in + let initv = append_uint16 empty_bystr keyLen in + let buff = folder foldf initv pubKeys in + let buff = append_uint16 buff m in + let buff_sha256 = builtin sha256hash buff in + let nextBookKeeper = builtin ripemd160hash buff_sha256 in + + Pair {ByStr20 (List ByStr20)} nextBookKeeper keepers + +(* See EthCrossChainUtils.sol:verifyPubKey *) +let verifyPubKey : List Pubkey -> Pair ByStr20 (List ByStr20) = + fun (pubKeys : List Pubkey) => + let lengther = @list_length Pubkey in + let n = lengther pubKeys in + let one = Uint32 1 in + let t1 = builtin sub n one in + let three = Uint32 3 in + let t2 = builtin div t1 three in + let m = builtin sub n t2 in + getBookKeeper m pubKeys + From 2e039494a5dd97a80a5a8cbb0df4d3d6bb031909 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Fri, 27 Nov 2020 14:53:36 +0530 Subject: [PATCH 14/33] Rename few functions to not have confliction names --- src/stdlib/Polynetwork.scillib | 35 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 6c86b0674..bf65729c0 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -59,15 +59,15 @@ let unit = Unit let zero_uint32 = Uint32 0 let little_endian = LittleEndian -let extract_uint32 = extract_uint32 little_endian -let extract_uint64 = extract_uint64 little_endian -let extract_uint128 = extract_uint128 little_endian -let extract_uint256 = extract_uint256 little_endian +let extract_uint32_le = extract_uint32 little_endian +let extract_uint64_le = extract_uint64 little_endian +let extract_uint128_le = extract_uint128 little_endian +let extract_uint256_le = extract_uint256 little_endian -let append_uint32 = append_uint32 little_endian -let append_uint64 = append_uint64 little_endian -let append_uint128 = append_uint128 little_endian -let append_uint256 = append_uint256 little_endian +let append_uint32_le = append_uint32 little_endian +let append_uint64_le = append_uint64 little_endian +let append_uint128_le = append_uint128 little_endian +let append_uint256_le = append_uint256 little_endian (* Raise an exception and return a default value. *) let raise_exception = @@ -106,7 +106,7 @@ let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = match is_32b with | True => (* This is a 32b integer *) - let uint32val_nextpos = extract_uint32 bs nextpos in + let uint32val_nextpos = extract_uint32_le bs nextpos in match uint32val_nextpos with | Some (Pair uint32val nextpos) => (* Upcast to a Uint64 value. *) @@ -125,7 +125,7 @@ let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = let is_64b = builtin eq first_byte b64_marker in match is_64b with | True => - extract_uint64 bs nextpos + extract_uint64_le bs nextpos | False => let u8_val = builtin to_uint64 first_byte in let res = Pair {Uint64 Uint32} u8_val nextpos in @@ -246,10 +246,10 @@ let append_uint16 : ByStr -> Uint32 -> ByStr = let deserialize_Header : ByStr -> Uint32 -> Option (Pair Header Uint32) = fun (header : ByStr) => fun (nextpos : Uint32) => - let version_nextpos = extract_uint32 header nextpos in + let version_nextpos = extract_uint32_le header nextpos in match version_nextpos with | Some (Pair version nextpos) => - let chainid_nextpos = extract_uint64 header nextpos in + let chainid_nextpos = extract_uint64_le header nextpos in match chainid_nextpos with | Some (Pair chainid nextpos) => let prevBlockHash_nextpos = extract_bystr32 header nextpos in @@ -264,13 +264,13 @@ let deserialize_Header : ByStr -> Uint32 -> Option (Pair Header Uint32) = let blockRoot_nextpos = extract_bystr32 header nextpos in match blockRoot_nextpos with | Some (Pair blockRoot nextpos) => - let timestamp_nextpos = extract_uint32 header nextpos in + let timestamp_nextpos = extract_uint32_le header nextpos in match timestamp_nextpos with | Some (Pair timestamp nextpos) => - let height_nextpos = extract_uint32 header nextpos in + let height_nextpos = extract_uint32_le header nextpos in match height_nextpos with | Some (Pair height nextpos) => - let consensusData_nextpos = extract_uint64 header nextpos in + let consensusData_nextpos = extract_uint64_le header nextpos in match consensusData_nextpos with | Some (Pair consensusData nextpos) => let consensusPayload_nextpos = extract_bystr header nextpos in @@ -322,7 +322,7 @@ let deserialize_TxParam : ByStr -> Uint32 -> Option (Pair TxParam Uint32) = let fromContract_nextpos = extract_bystr txparam nextpos in match fromContract_nextpos with | Some (Pair fromContract nextpos) => - let toChainId_nextpos = extract_uint64 txparam nextpos in + let toChainId_nextpos = extract_uint64_le txparam nextpos in match toChainId_nextpos with | Some (Pair toChainId nextpos) => let toContract_nextpos = extract_bystr txparam nextpos in @@ -362,7 +362,7 @@ let deserialize_ToMerkleValue : ByStr -> Uint32 -> Option (Pair ToMerkleValue Ui let txhash_nextpos = extract_bystr tomerklevalue nextpos in match txhash_nextpos with | Some (Pair txhash nextpos) => - let fromChainId_nextpos = extract_uint64 tomerklevalue nextpos in + let fromChainId_nextpos = extract_uint64_le tomerklevalue nextpos in match fromChainId_nextpos with | Some (Pair fromChainId nextpos) => let txparam = deserialize_TxParam tomerklevalue nextpos in @@ -489,4 +489,3 @@ let verifyPubKey : List Pubkey -> Pair ByStr20 (List ByStr20) = let t2 = builtin div t1 three in let m = builtin sub n t2 in getBookKeeper m pubKeys - From 189d3d74158030a20f451becf3301a90aabd2bdb Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Sat, 28 Nov 2020 12:42:39 +0530 Subject: [PATCH 15/33] add initGenesisBlock transition --- src/stdlib/Polynetwork.scillib | 6 ++-- tests/contracts/Polynetwork.scilla | 48 +++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index bf65729c0..a3aa1b0f8 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -278,11 +278,11 @@ let deserialize_Header : ByStr -> Uint32 -> Option (Pair Header Uint32) = | Some (Pair consensusPayload nextpos) => let nextBookkeeper_nextpos = extract_bystr20 header nextpos in match nextBookkeeper_nextpos with - | Some (Pair nextBoookkeeper nextpos) => + | Some (Pair nextBookkeeper nextpos) => let header = Header version chainid prevBlockHash txnroot crossStatesRoot blockRoot timestamp height consensusData consensusPayload - nextBoookkeeper + nextBookkeeper in let res = Pair {Header Uint32} header nextpos in Some {(Pair Header Uint32)} res @@ -479,7 +479,7 @@ let getBookKeeper : Uint32 -> List Pubkey -> Pair ByStr20 (List ByStr20) = Pair {ByStr20 (List ByStr20)} nextBookKeeper keepers (* See EthCrossChainUtils.sol:verifyPubKey *) -let verifyPubKey : List Pubkey -> Pair ByStr20 (List ByStr20) = +let verifyPubkey : List Pubkey -> Pair ByStr20 (List ByStr20) = fun (pubKeys : List Pubkey) => let lengther = @list_length Pubkey in let n = lengther pubKeys in diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index e83482dae..15b644cb4 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -4,6 +4,52 @@ import Polynetwork contract Polynetwork() -transition initGenesisBlock (header : Header, pubkeys : List ByStr67) +(* + * Scilla cross chain tx hash indexed by the automatically increased index. + * This map exists for the reason that Poly chain can verify the existence + * of cross chain request tx coming from Scilla + *) +field f_ethToPolyTxHashMap : Map Uint256 ByStr32 = Emp Uint256 ByStr32 +field f_ethToPolyTxHashIndex : Uint256 = Uint256 0 +field f_curKeepers : List ByStr20 = Nil {ByStr20} +field f_curStartHeight : Uint32 = Uint32 0 + +transition initGenesisBlock (header_bs : ByStr, pubkeys : List Pubkey) + curKeepers <- f_curKeepers; + match curKeepers with + | Nil => + header_o = deserialize_Header header_bs zero_uint32; + match header_o with + | Some + (Pair + (Header h_version h_chainid h_prevBlockHash h_txnroot h_crossStatesRoot + h_blockRoot h_timestamp h_height h_consensusData h_consensusPayload + h_nextBookkeeper) + nextpos) + => + nextbookkeeper_keepers = verifyPubkey pubkeys; + match nextbookkeeper_keepers with + | Pair nextBookKeeper keepers => + (* Esnure that Header's nextBookKeeper is same as the one from verifyPubkey *) + nbk_eq = builtin eq nextBookKeeper h_nextBookkeeper; + match nbk_eq with + | True => + f_curStartHeight := h_height; + f_curKeepers := keepers; + e = { _eventname : "GenesisBlock"; height : h_height; header : header_bs }; + event e + | False => + e = { _exception : "NextBookers Illegal" }; + throw e + end + end + | None => + e = { _exception : "Error deserializing header" }; + throw e + end + | Cons _ _ => + e = { _exception : "Already Initialized" }; + throw e + end end From d4564443e5df9091c0adf9bac7c932639a4c9d00 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Tue, 1 Dec 2020 13:20:33 +0530 Subject: [PATCH 16/33] Add merkle proof function --- src/stdlib/Polynetwork.scillib | 68 ++++++++++++++++++++++++++++++ tests/contracts/Polynetwork.scilla | 13 ++++++ 2 files changed, 81 insertions(+) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index a3aa1b0f8..b797dfa20 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -58,6 +58,9 @@ type Unit = | Unit let unit = Unit let zero_uint32 = Uint32 0 +type Proof = + | Proof of ByStr (List (Pair ByStr1 ByStr32)) + let little_endian = LittleEndian let extract_uint32_le = extract_uint32 little_endian let extract_uint64_le = extract_uint64 little_endian @@ -489,3 +492,68 @@ let verifyPubkey : List Pubkey -> Pair ByStr20 (List ByStr20) = let t2 = builtin div t1 three in let m = builtin sub n t2 in getBookKeeper m pubKeys + +(* Given a proof, trace the path and compare with root hash. Return the merkle value on success. *) +let merkle_prove : Proof -> ByStr32 -> Option ByStr = + fun (proof : Proof) => + fun (root : ByStr32) => + let hash_leaf = + fun (data : ByStr) => + let k = 0x00 in + let k_bs = builtin to_bystr k in + let r = builtin concat k_bs data in + builtin sha256hash r + in + let hash_children = + fun (l : ByStr32) => + fun (r : ByStr32) => + let k = 0x01 in + let t1 = builtin concat k l in + let r = builtin concat t1 r in + builtin sha256hash r + in + match proof with + | Proof value path => + let succ = True in + let fail = False in + let hash = hash_leaf value in + let foldf = + fun (acc : Pair ByStr32 Bool) => + fun (el : Pair ByStr1 ByStr32) => + match acc with + | Pair hash False => Pair {ByStr32 Bool} hash fail + | Pair hash _ => + let zerob = 0x00 in + let oneb = 0x01 in + match el with + | Pair pos nodeHash => + let eqzero = builtin eq zerob pos in + match eqzero with + | True => + let r = hash_children nodeHash hash in + Pair {ByStr32 Bool} r succ + | False => + let eqone = builtin eq oneb pos in + match eqone with + | True => + let r = hash_children hash nodeHash in + Pair {ByStr32 Bool} r succ + | False => Pair {ByStr32 Bool} hash fail + end + end + end + end + in + let folder = @list_foldl (Pair ByStr1 ByStr32) (Pair ByStr32 Bool) in + let init = Pair {ByStr32 Bool} hash succ in + let res = folder foldf init path in + match res with + | Pair _ False => None {ByStr} + | Pair hash _ => + let eq = builtin eq hash root in + match eq with + | True => Some {ByStr} value + | False => None {ByStr} + end + end + end diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index 15b644cb4..188f1cc24 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -53,3 +53,16 @@ transition initGenesisBlock (header_bs : ByStr, pubkeys : List Pubkey) throw e end end + +(* @notice Verify Poly chain header and proof, execute the cross chain tx from Poly chain to Zilliqa + * @param proof Poly chain tx merkle proof + * @param rawHeader The header containing crossStateRoot to verify the above tx merkle proof + * @param headerProof The header merkle proof used to verify rawHeader + * @param curRawHeader Any header in current epoch consensus of Poly chain + * @param headerSig The coverted signature veriable for solidity derived from Poly chain consensus nodes' signature + * used to verify the validity of curRawHeader + * @return true or false + *) +transition verifyHeaderAndExecuteTx(proof : Proof, rawHeader : ByStr, headerProof : ByStr, curRawHeader : ByStr, headerSig : ByStr) + +end From 8ad57bfbc1410797b84c93d33738ba5bd5702817 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 2 Dec 2020 09:52:22 +0530 Subject: [PATCH 17/33] Add verifyHeaderAndExecuteTx transition --- src/stdlib/Polynetwork.scillib | 34 ++++++- tests/contracts/Polynetwork.scilla | 143 ++++++++++++++++++++++++++++- 2 files changed, 169 insertions(+), 8 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index b797dfa20..76da58d43 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -54,6 +54,9 @@ type ToMerkleValue = type Pubkey = | Pubkey of ByStr67 let pubkey_length = Uint32 67 +type Signature = | Signature of ByStr65 +let signature_length = Uint32 65 + type Unit = | Unit let unit = Unit let zero_uint32 = Uint32 0 @@ -481,18 +484,39 @@ let getBookKeeper : Uint32 -> List Pubkey -> Pair ByStr20 (List ByStr20) = Pair {ByStr20 (List ByStr20)} nextBookKeeper keepers -(* See EthCrossChainUtils.sol:verifyPubKey *) -let verifyPubkey : List Pubkey -> Pair ByStr20 (List ByStr20) = - fun (pubKeys : List Pubkey) => - let lengther = @list_length Pubkey in - let n = lengther pubKeys in +let lengther_pubkey = @list_length Pubkey +let lengther_address = @list_length ByStr20 + +let compute_m : Uint32 -> Uint32 = + fun (n : Uint32) => let one = Uint32 1 in let t1 = builtin sub n one in let three = Uint32 3 in let t2 = builtin div t1 three in let m = builtin sub n t2 in + m + +(* See EthCrossChainUtils.sol:verifyPubKey *) +let verifyPubkey : List Pubkey -> Pair ByStr20 (List ByStr20) = + fun (pubKeys : List Pubkey) => + let n = lengther_pubkey pubKeys in + let m = compute_m n in getBookKeeper m pubKeys +(* See EthCrossChainUtils.sol:verifySig *) +let verifySig : ByStr -> List Signature -> List ByStr20 -> Uint32 -> Bool = + fun (rawHeader : ByStr) => + fun (siglist : List Signature) => + fun (keepers : List ByStr20) => + fun ( m : Uint32) => + True + +(* See EthCrossChainUtils.sol:getHeaderHash *) +let get_header_hash : ByStr -> ByStr32 = + fun (header : ByStr) => + let h = builtin sha256hash header in + builtin sha256hash h + (* Given a proof, trace the path and compare with root hash. Return the merkle value on success. *) let merkle_prove : Proof -> ByStr32 -> Option ByStr = fun (proof : Proof) => diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index 188f1cc24..6a005242b 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -2,6 +2,15 @@ scilla_version 0 import Polynetwork +library Polynetwork_local + +let thisChainID = Uint64 2111108 + +let one_msg = + fun (msg : Message) => + let nil_msg = Nil {Message} in + Cons {Message} msg nil_msg + contract Polynetwork() (* @@ -14,6 +23,7 @@ field f_ethToPolyTxHashIndex : Uint256 = Uint256 0 field f_curKeepers : List ByStr20 = Nil {ByStr20} field f_curStartHeight : Uint32 = Uint32 0 +field f_fromChainTxExist : Map Uint64 (Map ByStr32 Unit) = Emp Uint64 (Map ByStr32 Unit) transition initGenesisBlock (header_bs : ByStr, pubkeys : List Pubkey) curKeepers <- f_curKeepers; @@ -31,7 +41,7 @@ transition initGenesisBlock (header_bs : ByStr, pubkeys : List Pubkey) nextbookkeeper_keepers = verifyPubkey pubkeys; match nextbookkeeper_keepers with | Pair nextBookKeeper keepers => - (* Esnure that Header's nextBookKeeper is same as the one from verifyPubkey *) + (* Ensure that Header's nextBookKeeper is same as the one from verifyPubkey *) nbk_eq = builtin eq nextBookKeeper h_nextBookkeeper; match nbk_eq with | True => @@ -54,6 +64,50 @@ transition initGenesisBlock (header_bs : ByStr, pubkeys : List Pubkey) end end +procedure checkAndMarkFromChainTxn(chainID : Uint64, txHash : ByStr) + txHash32_o = builtin to_bystr32 txHash; + match txHash32_o with + | Some txHash32 => + already_exists <- exists f_fromChainTxExist[chainID][txHash32]; + match already_exists with + | True => + e = { _exception : "Txn already executed" }; + throw e + | False => + f_fromChainTxExist[chainID][txHash32] := unit + end + | None => + e = { _exception : "Txn hash invalid" }; + throw e + end +end + +procedure executeCrossChainTxn (txparam : TxParam) + match txparam with + | TxParam txHash crossChainID fromContract toChainID toContract method args => + toChainIDOk = builtin eq toChainID thisChainID; + match toChainIDOk with + | True => + toContractAddr_o = builtin to_bystr20 toContract; + match toContractAddr_o with + | Some toContractAddr => + method_name = builtin to_string method; + m = { _tag : method_name; args : args; _amount : Uint128 0; _recipient : toContractAddr }; + mo = one_msg m; + send mo; + e = { _eventname : "VerifyHeaderAndExecuteTxEvent"; txn : txparam }; + event e + | None => + e = { _exception : "Address format mismatch" }; + throw e + end + | False => + e = { _exception : "This txn is not for Zilliqa network" }; + throw e + end + end +end + (* @notice Verify Poly chain header and proof, execute the cross chain tx from Poly chain to Zilliqa * @param proof Poly chain tx merkle proof * @param rawHeader The header containing crossStateRoot to verify the above tx merkle proof @@ -63,6 +117,89 @@ end * used to verify the validity of curRawHeader * @return true or false *) -transition verifyHeaderAndExecuteTx(proof : Proof, rawHeader : ByStr, headerProof : ByStr, curRawHeader : ByStr, headerSig : ByStr) - +transition verifyHeaderAndExecuteTx(proof : Proof, rawHeader : ByStr, headerProof : Proof, curRawHeader : ByStr, headerSig : List Signature) + header_o = deserialize_Header rawHeader zero_uint32; + curKeepers <- f_curKeepers; + curStartHeight <- f_curStartHeight; + n = lengther_address curKeepers; + m = compute_m n; + match header_o with + | Some + (Pair + (Header h_version h_chainid h_prevBlockHash h_txnroot h_crossStatesRoot + h_blockRoot h_timestamp h_height h_consensusData h_consensusPayload + h_nextBookkeeper) + nextpos) + => + is_lt = builtin lt h_height curStartHeight; + match is_lt with + | True => + signed = verifySig curRawHeader headerSig curKeepers m; + match signed with + | True => + curHeader_o = deserialize_Header curRawHeader zero_uint32; + match curHeader_o with + | Some (Pair + (Header h_version h_chainid h_prevBlockHash h_txnroot h_crossStatesRoot + h_blockRoot h_timestamp h_height h_consensusData h_consensusPayload + h_nextBookkeeper) + nextpos) + => + proof_o = merkle_prove headerProof h_blockRoot; + match proof_o with + | Some proveValue => + proveValue32_o = builtin to_bystr32 proveValue; + match proveValue32_o with + | Some proveValue32 => + headerHash = get_header_hash rawHeader; + proof_ok = builtin eq headerHash proveValue32; + match proof_ok with + | True => (* Do nothing *) + | False => + e = { _exception : "Merkle proof invalid" }; + throw e + end + | None => + e = { _exception : "merkle_prove result incorrect" }; + throw e + end + | None => + end + | None => + e = { _exception : "Error deserializing header" }; + throw e + end + | False => + e = { _exception : "Signature verification failed" }; + throw e + end + | False => + signed = verifySig rawHeader headerSig curKeepers m; + match signed with + | True => (* Do nothing *) + | False => + e = { _exception : "Signature verification failed" }; + throw e + end + end; + toMerkleValueBs_o = merkle_prove proof h_crossStatesRoot; + match toMerkleValueBs_o with + | Some toMerkleValueBs => + toMerkleValue_o = deserialize_ToMerkleValue toMerkleValueBs zero_uint32; + match toMerkleValue_o with + | Some (Pair (ToMerkleValue txhash fromChainId txparam) _) => + checkAndMarkFromChainTxn fromChainId txhash; + executeCrossChainTxn txparam + | None => + e = { _exception : "Merkle value deserialization failed" }; + throw e + end + | None => + e = { _exception : "Merkle proof invalid" }; + throw e + end + | None => + e = { _exception : "Error deserializing header" }; + throw e + end end From 49c451eb32cabf8ca324bab93aca62f083b80f8f Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 2 Dec 2020 11:21:44 +0530 Subject: [PATCH 18/33] Add changeBookKeeper transition --- tests/contracts/Polynetwork.scilla | 86 ++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 17 deletions(-) diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index 6a005242b..e3291af13 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -1,10 +1,11 @@ scilla_version 0 -import Polynetwork +import Polynetwork BoolUtils library Polynetwork_local let thisChainID = Uint64 2111108 +let nullAddress = 0x0000000000000000000000000000000000000000 let one_msg = fun (msg : Message) => @@ -25,19 +26,7 @@ field f_curKeepers : List ByStr20 = Nil {ByStr20} field f_curStartHeight : Uint32 = Uint32 0 field f_fromChainTxExist : Map Uint64 (Map ByStr32 Unit) = Emp Uint64 (Map ByStr32 Unit) -transition initGenesisBlock (header_bs : ByStr, pubkeys : List Pubkey) - curKeepers <- f_curKeepers; - match curKeepers with - | Nil => - header_o = deserialize_Header header_bs zero_uint32; - match header_o with - | Some - (Pair - (Header h_version h_chainid h_prevBlockHash h_txnroot h_crossStatesRoot - h_blockRoot h_timestamp h_height h_consensusData h_consensusPayload - h_nextBookkeeper) - nextpos) - => +procedure verifyPubkeysAndUpdate(pubkeys : List Pubkey, h_nextBookkeeper : ByStr20, h_height : Uint32) nextbookkeeper_keepers = verifyPubkey pubkeys; match nextbookkeeper_keepers with | Pair nextBookKeeper keepers => @@ -46,14 +35,31 @@ transition initGenesisBlock (header_bs : ByStr, pubkeys : List Pubkey) match nbk_eq with | True => f_curStartHeight := h_height; - f_curKeepers := keepers; - e = { _eventname : "GenesisBlock"; height : h_height; header : header_bs }; - event e + f_curKeepers := keepers | False => e = { _exception : "NextBookers Illegal" }; throw e end end + +end + +transition initGenesisBlock (rawHeader : ByStr, pubkeys : List Pubkey) + curKeepers <- f_curKeepers; + match curKeepers with + | Nil => + header_o = deserialize_Header rawHeader zero_uint32; + match header_o with + | Some + (Pair + (Header h_version h_chainid h_prevBlockHash h_txnroot h_crossStatesRoot + h_blockRoot h_timestamp h_height h_consensusData h_consensusPayload + h_nextBookkeeper) + nextpos) + => + verifyPubkeysAndUpdate pubkeys h_nextBookkeeper h_height; + e = { _eventname : "GenesisBlock"; height : h_height; header : rawHeader }; + event e | None => e = { _exception : "Error deserializing header" }; throw e @@ -203,3 +209,49 @@ transition verifyHeaderAndExecuteTx(proof : Proof, rawHeader : ByStr, headerProo throw e end end + +(* @notice change Poly chain consensus book keeper + * @param rawHeader Poly chain change book keeper block raw header + * @param pubKeyList Poly chain consensus nodes public key list + * @param sigList Poly chain consensus nodes signature list + * @return true or false + *) +transition changeBookKeeper(rawHeader : ByStr, pubkeys : List Pubkey, sigList : List Signature) + header_o = deserialize_Header rawHeader zero_uint32; + curStartHeight <- f_curStartHeight; + match header_o with + | Some + (Pair + (Header h_version h_chainid h_prevBlockHash h_txnroot h_crossStatesRoot + h_blockRoot h_timestamp h_height h_consensusData h_consensusPayload + h_nextBookkeeper) + nextpos) + => + heightOk = builtin lt curStartHeight h_height; + nextBookKeeperOk = let b = builtin eq h_nextBookkeeper nullAddress in negb b; + both_ok = andb heightOk nextBookKeeperOk; + match both_ok with + | True => + curKeepers <- f_curKeepers; + n = lengther_address curKeepers; + m = compute_m n; + signed = verifySig rawHeader sigList curKeepers m; + match signed with + | True => + verifyPubkeysAndUpdate pubkeys h_nextBookkeeper h_height; + e = { _eventname : "ChangeBookKeeper"; height : h_height; header : rawHeader }; + event e + | False => + e = { _exception : "Signature verification failed" }; + throw e + end + | False => + e = { _exception : "Header height lower than cur epoch heigh / Next bookkeeper empty" }; + throw e + end + | None => + e = { _exception : "Error deserializing header" }; + throw e + end +end + From 96c2a77caff7872f7044bb561d83094d9636ceed Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 2 Dec 2020 12:19:21 +0530 Subject: [PATCH 19/33] Add transition crossChain --- src/stdlib/Polynetwork.scillib | 18 +++++++++++++ tests/contracts/Polynetwork.scilla | 43 ++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 76da58d43..8fe5d30fb 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -248,6 +248,24 @@ let append_uint16 : ByStr -> Uint32 -> ByStr = let uib_sub2_littleendian = builtin strrev uib_sub2 in builtin concat bs uib_sub2_littleendian +(* Serialize TxParam and append to given byte string. *) +let append_TxParam : ByStr -> TxParam -> ByStr = + fun (bs : ByStr) => + fun (txp : TxParam) => + match txp with + | TxParam txHash crossChainId fromContract toChainId toContract method args => + let t1 = append_varbytes bs txHash in + let t2 = append_varbytes t1 crossChainId in + let t3 = append_varbytes t2 fromContract in + let t4 = builtin to_bystr8 toChainId in + let t5 = builtin to_bystr t4 in + let t6 = builtin concat t3 t5 in + let t7 = append_varbytes t6 toContract in + let t8 = append_varbytes t7 method in + let t9 = append_varbytes t8 args in + t9 + end + (* Deserialize a byte stream into a Header, starting at nextpos. *) let deserialize_Header : ByStr -> Uint32 -> Option (Pair Header Uint32) = fun (header : ByStr) => diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index e3291af13..3e2f80d96 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -19,8 +19,8 @@ contract Polynetwork() * This map exists for the reason that Poly chain can verify the existence * of cross chain request tx coming from Scilla *) -field f_ethToPolyTxHashMap : Map Uint256 ByStr32 = Emp Uint256 ByStr32 -field f_ethToPolyTxHashIndex : Uint256 = Uint256 0 +field f_zilToPolyTxHashMap : Map Uint256 ByStr32 = Emp Uint256 ByStr32 +field f_zilToPolyTxHashIndex : Uint256 = Uint256 0 field f_curKeepers : List ByStr20 = Nil {ByStr20} field f_curStartHeight : Uint32 = Uint32 0 @@ -255,3 +255,42 @@ transition changeBookKeeper(rawHeader : ByStr, pubkeys : List Pubkey, sigList : end end +procedure updateZilTxHash(txHashIndex : Uint256, rawParamHash : ByStr32) + f_zilToPolyTxHashMap[txHashIndex] := rawParamHash; + one_uint256 = Uint256 1; + newTxHashIndex = builtin add txHashIndex one_uint256; + f_zilToPolyTxHashIndex := newTxHashIndex +end + +(* @notice ERC20 token cross chain to other blockchain. + * this function push tx event to blockchain + * @param toChainId Target chain id + * @param toContract Target smart contract address in target block chain + * @param txData Transaction data for target chain, include to_address, amount + * @return true or false + *) +transition crossChain(toChainId : Uint64, toContract : ByStr, method : ByStr, txData : ByStr) + txHashIndex <- f_zilToPolyTxHashIndex; + paramTxHash = let b = builtin to_bystr32 txHashIndex in builtin to_bystr b; + crossChainId = + let this_bs = builtin to_bystr _this_address in + let s = builtin concat this_bs paramTxHash in + let h = builtin sha256hash s in + builtin to_bystr h; + fromContract = builtin to_bystr _sender; + txp = TxParam paramTxHash crossChainId fromContract toChainId toContract method txData; + (* Serialize the TxParam object *) + empty_bystr = let b = 0x in builtin to_bystr b; + rawParam = append_TxParam empty_bystr txp; + rawParamHash = builtin keccak256hash rawParam; + updateZilTxHash txHashIndex rawParamHash; + (* Create an event: TODO: What is equivalent of tx.origin? *) + e = { _eventname : "CrossChainEvent"; + origin : _sender; + paramTxHash : paramTxHash; + sender : _sender; + toChainId : toChainId; + toContract : toContract; + rawParam : rawParam }; + event e +end From 3713163a4360f52ea71184a6d838e7078fd0cb8c Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 2 Dec 2020 13:43:21 +0530 Subject: [PATCH 20/33] Add getBookKeeper test --- tests/eval/good/Good.ml | 1 + .../good/polynetwork_getBookKeeper.scilexp | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/eval/good/polynetwork_getBookKeeper.scilexp diff --git a/tests/eval/good/Good.ml b/tests/eval/good/Good.ml index 1b885b2e6..a0fe6d824 100644 --- a/tests/eval/good/Good.ml +++ b/tests/eval/good/Good.ml @@ -145,6 +145,7 @@ let explist = "polynetwork_extract_bystr1.scilexp"; "polynetwork_extract_bystr2.scilexp"; "polynetwork_extract_bystr3.scilexp"; + "polynetwork_getBookKeepers.scilexp"; ] module Tests = Scilla_test.Util.DiffBasedTests (struct diff --git a/tests/eval/good/polynetwork_getBookKeeper.scilexp b/tests/eval/good/polynetwork_getBookKeeper.scilexp new file mode 100644 index 000000000..75f732edc --- /dev/null +++ b/tests/eval/good/polynetwork_getBookKeeper.scilexp @@ -0,0 +1,29 @@ +let p1 = 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197 in +let p2 = 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250 in +let p3 = 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce in +let p4 = 0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712 in +let p5 = 0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0 in +let p6 = 0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f in +let p7 = 0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c in + +let n = Uint32 7 in +let m = compute_m n in + +let t1 = Pubkey p1 in +let t2 = Pubkey p2 in +let t3 = Pubkey p3 in +let t4 = Pubkey p4 in +let t5 = Pubkey p5 in +let t6 = Pubkey p6 in +let t7 = Pubkey p7 in + +let l0 = Nil {Pubkey} in +let l1 = Cons {Pubkey} t1 l0 in +let l2 = Cons {Pubkey} t2 l1 in +let l3 = Cons {Pubkey} t3 l2 in +let l4 = Cons {Pubkey} t4 l3 in +let l5 = Cons {Pubkey} t5 l4 in +let l6 = Cons {Pubkey} t6 l5 in +let l7 = Cons {Pubkey} t7 l6 in + +getBookKeeper m l7 From 717cdc2bc7812926e86236a7d514acd818ade121 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Thu, 3 Dec 2020 10:47:22 +0530 Subject: [PATCH 21/33] Fix typo / bug in Polynetwork.lib --- src/stdlib/Polynetwork.scillib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 8fe5d30fb..382e7532c 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -472,7 +472,7 @@ let getBookKeeper : Uint32 -> List Pubkey -> Pair ByStr20 (List ByStr20) = let hashX = builtin keccak256hash slice in (* Pick the lower 20 bytes *) let hash = builtin to_bystr hashX in - let pos = Uint32 11 in + let pos = Uint32 12 in let len = Uint32 20 in let keeperX = builtin substr hash pos len in let keeper_opt = builtin to_bystr20 keeperX in From c1c3e582cc0d644d07c656eafc09ba83c8ed255e Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Thu, 3 Dec 2020 18:51:38 +0530 Subject: [PATCH 22/33] Add verifySig function along with eth compatible ecrecover --- src/stdlib/Polynetwork.scillib | 113 +++++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 20 deletions(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 382e7532c..4684fba06 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -17,7 +17,7 @@ (* ******************************************************************************** *) scilla_version 0 -import Conversions ListUtils +import Conversions ListUtils BoolUtils library Polynetwork @@ -82,6 +82,18 @@ let raise_exception = let ignore = builtin div zero_uint32 zero_uint32 in default_val +let some_exn = + tfun 'A => + fun (option_val : Option 'A) => + fun (default_val : 'A) => + match option_val with + | Some val => val + | None => + let exceptioner = @raise_exception 'A in + let ignore = exceptioner default_val in + default_val + end + (* Return (as Uint64) the next VarUint at pos in bystr, and the next position. *) (* ZeroCopySource.sol : NextVarUint *) let next_var_uint : ByStr -> Uint32 -> Option (Pair Uint64 Uint32) = @@ -222,19 +234,13 @@ let extract_bystr : ByStr -> Uint32 -> Option (Pair ByStr Uint32) = let append_varbytes : ByStr -> ByStr -> ByStr = fun (bs : ByStr) => fun (varby : ByStr) => - let exceptioner = @raise_exception ByStr in + let sommer = @some_exn Uint64 in + let exnobj = Uint64 0 in let len_32b = builtin strlen varby in let len_64b_opt = builtin to_uint64 len_32b in - match len_64b_opt with - | Some len => - let varint_bs = append_var_uint bs len in - builtin concat varint_bs varby - | None => - (* Can never happen. *) - let emptyx = 0x in - let empty = builtin to_bystr emptyx in - exceptioner empty - end + let len = sommer len_64b_opt exnobj in + let varint_bs = append_var_uint bs len in + builtin concat varint_bs varby (* Downcast Uint32 to Uint16, serialize it and append to given byte string *) let append_uint16 : ByStr -> Uint32 -> ByStr = @@ -461,8 +467,8 @@ let getBookKeeper : Uint32 -> List Pubkey -> Pair ByStr20 (List ByStr20) = let mapf = fun (pk : Pubkey) => - let exceptioner = @raise_exception ByStr20 in - let default_ret = 0x0000000000000000000000000000000000000000 in + let sommer = @some_exn ByStr20 in + let exnobj = 0x0000000000000000000000000000000000000000 in match pk with | Pubkey pubKeyX => let pubKey = builtin to_bystr pubKeyX in @@ -476,11 +482,7 @@ let getBookKeeper : Uint32 -> List Pubkey -> Pair ByStr20 (List ByStr20) = let len = Uint32 20 in let keeperX = builtin substr hash pos len in let keeper_opt = builtin to_bystr20 keeperX in - match keeper_opt with - | Some keeper => keeper - | None => (* This cannot happen *) - exceptioner default_ret - end + sommer keeper_opt exnobj end in let keepers = mapper mapf pubKeys in @@ -521,13 +523,84 @@ let verifyPubkey : List Pubkey -> Pair ByStr20 (List ByStr20) = let m = compute_m n in getBookKeeper m pubKeys +(* Mimics ethereum's recovery of address from message and a signature. *) +let ecrecover : ByStr -> ByStr64 -> Uint32 -> ByStr20 = + fun (msg : ByStr) => + fun (sig : ByStr64) => + fun (recid : Uint32) => + let pk = builtin ecdsa_recover_pk msg sig recid in + let pos = Uint32 1 in + let len = Uint32 64 in + let pk_bs = builtin to_bystr pk in + let pk_ = builtin substr pk_bs pos len in + let pkHash = builtin keccak256hash pk_ in + let pkHash_bs = builtin to_bystr pkHash in + let pos = Uint32 12 in + let len = Uint32 20 in + let addr_bs = builtin substr pkHash_bs pos len in + let addr_opt = builtin to_bystr20 addr_bs in + let sommer = @some_exn ByStr20 in + let exnobj = 0x0000000000000000000000000000000000000000 in + sommer addr_opt exnobj + (* See EthCrossChainUtils.sol:verifySig *) + let verifySig : ByStr -> List Signature -> List ByStr20 -> Uint32 -> Bool = fun (rawHeader : ByStr) => fun (siglist : List Signature) => fun (keepers : List ByStr20) => fun ( m : Uint32) => - True + let header_hash = + fun (header : ByStr) => + let h1 = builtin sha256hash header in + let h2 = builtin sha256hash h1 in + builtin to_bystr h2 + in + let hashedHeader = header_hash rawHeader in + let mapf = + fun (s : Signature) => + match s with + | Signature rs_v => + let rs_v = builtin to_bystr rs_v in + let pos = Uint32 65 in + let len = Uint32 1 in + let v_bs = builtin substr rs_v pos len in + let v_bsx_opt = builtin to_bystr1 v_bs in + let exnobj_bystr1 = 0x00 in + let sommer_bystr1 = @some_exn ByStr1 in + let v_bsx = sommer_bystr1 v_bsx_opt exnobj_bystr1 in + let v = builtin to_uint32 v_bsx in + let pos = Uint32 0 in + let len = Uint32 64 in + let rs_bs = builtin substr rs_v pos len in + let rs_bs64_opt = builtin to_bystr64 rs_bs in + let exnobj_bystr64 = 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 in + let sommer_bystr64 = @some_exn ByStr64 in + let rs = sommer_bystr64 rs_bs64_opt exnobj_bystr64 in + ecrecover hashedHeader rs v + end + in + let mapper = @list_map Signature ByStr20 in + let signers = mapper mapf siglist in + (* Now check that at least "m" signers are in keepers list. *) + let eqquer = fun (a : ByStr20) => fun (b : ByStr20) => builtin eq a b in + let memmer = @list_mem ByStr20 in + let folder = @list_foldl ByStr20 Uint32 in + let foldf = + fun (n : Uint32) => + fun (s : ByStr20) => + let is_s_in_keepers = memmer eqquer s keepers in + match is_s_in_keepers with + | True => + let one = Uint32 1 in + builtin add n one + | False => + n + end + in + let n = folder foldf zero_uint32 signers in + let is_not_sufficient = builtin lt n m in + negb is_not_sufficient (* See EthCrossChainUtils.sol:getHeaderHash *) let get_header_hash : ByStr -> ByStr32 = From 7cfe593e1acd3542334153c46177fc70696d9c0f Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Fri, 4 Dec 2020 14:32:59 +0530 Subject: [PATCH 23/33] executeCrossChainTxn must pass fromContractAddr and fromChainId also --- tests/contracts/Polynetwork.scilla | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index 3e2f80d96..c58bea1d2 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -88,7 +88,7 @@ procedure checkAndMarkFromChainTxn(chainID : Uint64, txHash : ByStr) end end -procedure executeCrossChainTxn (txparam : TxParam) +procedure executeCrossChainTxn (txparam : TxParam, fromChainId : Uint64) match txparam with | TxParam txHash crossChainID fromContract toChainID toContract method args => toChainIDOk = builtin eq toChainID thisChainID; @@ -98,7 +98,11 @@ procedure executeCrossChainTxn (txparam : TxParam) match toContractAddr_o with | Some toContractAddr => method_name = builtin to_string method; - m = { _tag : method_name; args : args; _amount : Uint128 0; _recipient : toContractAddr }; + m = { _tag : method_name; args : args; + fromContractAddr : fromContract; + fromChainId : fromChainId; + _amount : Uint128 0; + _recipient : toContractAddr }; mo = one_msg m; send mo; e = { _eventname : "VerifyHeaderAndExecuteTxEvent"; txn : txparam }; @@ -195,7 +199,7 @@ transition verifyHeaderAndExecuteTx(proof : Proof, rawHeader : ByStr, headerProo match toMerkleValue_o with | Some (Pair (ToMerkleValue txhash fromChainId txparam) _) => checkAndMarkFromChainTxn fromChainId txhash; - executeCrossChainTxn txparam + executeCrossChainTxn txparam fromChainId | None => e = { _exception : "Merkle value deserialization failed" }; throw e From 9b12d5b4bbcc8617cdf49ed31324e05616ee80ca Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Mon, 7 Dec 2020 20:25:16 +0530 Subject: [PATCH 24/33] Add initGenesisBlock test --- tests/contracts/Polynetwork.scilla | 3 +- tests/runner/Polynetwork/blockchain_1.json | 1 + tests/runner/Polynetwork/init.json | 22 +++++++++ tests/runner/Polynetwork/message_1.json | 53 ++++++++++++++++++++++ tests/runner/Polynetwork/output_1.json | 48 ++++++++++++++++++++ tests/runner/Polynetwork/state_1.json | 7 +++ 6 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 tests/runner/Polynetwork/blockchain_1.json create mode 100644 tests/runner/Polynetwork/init.json create mode 100644 tests/runner/Polynetwork/message_1.json create mode 100644 tests/runner/Polynetwork/output_1.json create mode 100644 tests/runner/Polynetwork/state_1.json diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index c58bea1d2..925f835df 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -4,7 +4,6 @@ import Polynetwork BoolUtils library Polynetwork_local -let thisChainID = Uint64 2111108 let nullAddress = 0x0000000000000000000000000000000000000000 let one_msg = @@ -12,7 +11,7 @@ let one_msg = let nil_msg = Nil {Message} in Cons {Message} msg nil_msg -contract Polynetwork() +contract Polynetwork(thisChainID : Uint64) (* * Scilla cross chain tx hash indexed by the automatically increased index. diff --git a/tests/runner/Polynetwork/blockchain_1.json b/tests/runner/Polynetwork/blockchain_1.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_1.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/init.json b/tests/runner/Polynetwork/init.json new file mode 100644 index 000000000..3d0985bb7 --- /dev/null +++ b/tests/runner/Polynetwork/init.json @@ -0,0 +1,22 @@ +[ + { + "vname" : "_scilla_version", + "type" : "Uint32", + "value" : "0" + }, + { + "vname" : "thisChainID", + "type" : "Uint64", + "value" : "2111108" + }, + { + "vname" : "_this_address", + "type" : "ByStr20", + "value" : "0xabfeccdc9012345678901234567890f777567890" + }, + { + "vname" : "_creation_block", + "type" : "BNum", + "value" : "1" + } +] diff --git a/tests/runner/Polynetwork/message_1.json b/tests/runner/Polynetwork/message_1.json new file mode 100644 index 000000000..6b2982c63 --- /dev/null +++ b/tests/runner/Polynetwork/message_1.json @@ -0,0 +1,53 @@ +{ + "_tag": "initGenesisBlock", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b9156170000000000000000000000000000000000000000000000000000000000000000000000006de0a8f7ee3fb67d8e04ac9547f3615e59adc6e0a2309c90080a272dc1fa1fd90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8365b000000001dac2b7c00000000fd1a057b226c6561646572223a343239343936373239352c227672665f76616c7565223a22484a675171706769355248566745716354626e6443456c384d516837446172364e4e646f6f79553051666f67555634764d50675851524171384d6f38373853426a2b38577262676c2b36714d7258686b667a72375751343d222c227672665f70726f6f66223a22785864422b5451454c4c6a59734965305378596474572f442f39542f746e5854624e436667354e62364650596370382f55706a524c572f536a5558643552576b75646632646f4c5267727052474b76305566385a69413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a343239343936373239352c226e65775f636861696e5f636f6e666967223a7b2276657273696f6e223a312c2276696577223a312c226e223a372c2263223a322c22626c6f636b5f6d73675f64656c6179223a31303030303030303030302c22686173685f6d73675f64656c6179223a31303030303030303030302c22706565725f68616e647368616b655f74696d656f7574223a31303030303030303030302c227065657273223a5b7b22696e646578223a312c226964223a2231323035303238313732393138353430623262353132656165313837326132613265336132386439383963363064393564616238383239616461376437646437303664363538227d2c7b22696e646578223a322c226964223a2231323035303338623861663632313065636664636263616232323535326566386438636634316336663836663963663961623533643836353734316366646238333366303662227d2c7b22696e646578223a332c226964223a2231323035303234383261636236353634623139623930363533663665396338303632393265386161383366373865376139333832613234613665666534316330633036663339227d2c7b22696e646578223a342c226964223a2231323035303236373939333061343261616633633639373938636138613366313265313334633031393430353831386437383364313137343865303339646538353135393838227d2c7b22696e646578223a352c226964223a2231323035303234363864643138393965643264316363326238323938383261313635613065636236613734356166306337326562323938326436366234333131623465663733227d2c7b22696e646578223a362c226964223a2231323035303265623162616162363032633538393932383235363163646161613761616262636464306363666362633365373937393361633234616366393037373866333561227d2c7b22696e646578223a372c226964223a2231323035303331653037373966356335636362323631323335326665346132303066393964336537373538653730626135336636303763353966663232613330663637386666227d5d2c22706f735f7461626c65223a5b362c342c332c352c362c312c322c352c342c372c342c322c332c332c372c362c352c342c362c352c312c342c332c312c322c352c322c322c362c312c342c352c342c372c322c332c342c312c352c372c342c312c322c322c352c362c342c342c322c372c332c362c362c352c312c372c332c312c362c312c332c332c322c342c342c312c352c362c352c312c322c362c372c352c362c332c342c372c372c332c322c372c312c352c362c352c322c332c362c322c362c312c372c372c372c312c372c342c332c332c332c322c312c372c355d2c226d61785f626c6f636b5f6368616e67655f76696577223a36303030307d7d9fe171f3fe643eb1c188400b828ba184816fc9ac0000" + }, + { + "vname" : "pubkeys", + "type" : "List Polynetwork.Pubkey", + "value" : [ + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/output_1.json b/tests/runner/Polynetwork/output_1.json new file mode 100644 index 000000000..4416b697d --- /dev/null +++ b/tests/runner/Polynetwork/output_1.json @@ -0,0 +1,48 @@ +{ + "scilla_major_version": "0", + "gas_remaining": "2992", + "_accepted": "false", + "messages": [], + "states": [ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "0" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [] + } + ], + "events": [ + { + "_eventname": "GenesisBlock", + "params": [ + { "vname": "height", "type": "Uint32", "value": "0" }, + { + "vname": "header", + "type": "ByStr", + "value": + "0x000000009b9156170000000000000000000000000000000000000000000000000000000000000000000000006de0a8f7ee3fb67d8e04ac9547f3615e59adc6e0a2309c90080a272dc1fa1fd90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8365b000000001dac2b7c00000000fd1a057b226c6561646572223a343239343936373239352c227672665f76616c7565223a22484a675171706769355248566745716354626e6443456c384d516837446172364e4e646f6f79553051666f67555634764d50675851524171384d6f38373853426a2b38577262676c2b36714d7258686b667a72375751343d222c227672665f70726f6f66223a22785864422b5451454c4c6a59734965305378596474572f442f39542f746e5854624e436667354e62364650596370382f55706a524c572f536a5558643552576b75646632646f4c5267727052474b76305566385a69413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a343239343936373239352c226e65775f636861696e5f636f6e666967223a7b2276657273696f6e223a312c2276696577223a312c226e223a372c2263223a322c22626c6f636b5f6d73675f64656c6179223a31303030303030303030302c22686173685f6d73675f64656c6179223a31303030303030303030302c22706565725f68616e647368616b655f74696d656f7574223a31303030303030303030302c227065657273223a5b7b22696e646578223a312c226964223a2231323035303238313732393138353430623262353132656165313837326132613265336132386439383963363064393564616238383239616461376437646437303664363538227d2c7b22696e646578223a322c226964223a2231323035303338623861663632313065636664636263616232323535326566386438636634316336663836663963663961623533643836353734316366646238333366303662227d2c7b22696e646578223a332c226964223a2231323035303234383261636236353634623139623930363533663665396338303632393265386161383366373865376139333832613234613665666534316330633036663339227d2c7b22696e646578223a342c226964223a2231323035303236373939333061343261616633633639373938636138613366313265313334633031393430353831386437383364313137343865303339646538353135393838227d2c7b22696e646578223a352c226964223a2231323035303234363864643138393965643264316363326238323938383261313635613065636236613734356166306337326562323938326436366234333131623465663733227d2c7b22696e646578223a362c226964223a2231323035303265623162616162363032633538393932383235363163646161613761616262636464306363666362633365373937393361633234616366393037373866333561227d2c7b22696e646578223a372c226964223a2231323035303331653037373966356335636362323631323335326665346132303066393964336537373538653730626135336636303763353966663232613330663637386666227d5d2c22706f735f7461626c65223a5b362c342c332c352c362c312c322c352c342c372c342c322c332c332c372c362c352c342c362c352c312c342c332c312c322c352c322c322c362c312c342c352c342c372c322c332c342c312c352c372c342c312c322c322c352c362c342c342c322c372c332c362c362c352c312c372c332c312c362c312c332c332c322c342c342c312c352c362c352c312c322c362c372c352c362c332c342c372c372c332c322c372c312c352c362c352c322c332c362c322c362c312c372c372c372c312c372c342c332c332c332c322c312c372c355d2c226d61785f626c6f636b5f6368616e67655f76696577223a36303030307d7d9fe171f3fe643eb1c188400b828ba184816fc9ac0000" + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/runner/Polynetwork/state_1.json b/tests/runner/Polynetwork/state_1.json new file mode 100644 index 000000000..4a66db407 --- /dev/null +++ b/tests/runner/Polynetwork/state_1.json @@ -0,0 +1,7 @@ +[ + { + "vname": "_balance", + "type": "Uint128", + "value": "0" + } +] From 8dd38f05ce63bbbd2a59adb6cded2d384b913ebe Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Tue, 8 Dec 2020 11:55:27 +0530 Subject: [PATCH 25/33] Add a proof deserializer in tests Fix bugs in proof deserializer --- .../polynetwork_deserialize_proof.scilexp | 67 +++++++++++++++++++ tests/runner/Polynetwork/state_2.json | 28 ++++++++ 2 files changed, 95 insertions(+) create mode 100644 tests/eval/good/polynetwork_deserialize_proof.scilexp create mode 100644 tests/runner/Polynetwork/state_2.json diff --git a/tests/eval/good/polynetwork_deserialize_proof.scilexp b/tests/eval/good/polynetwork_deserialize_proof.scilexp new file mode 100644 index 000000000..6a250d152 --- /dev/null +++ b/tests/eval/good/polynetwork_deserialize_proof.scilexp @@ -0,0 +1,67 @@ +let proof = 0xd72000ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd60300000000000000204caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc081b0000000000000014b7041bc96b15da728fdfc1c47cbfc687b845adeb0200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd353000000000000000000000000000000000000000000000000000000000000000177d99c0f0857535155071d49ded129993a5b98575761985e90e2d26c7a569a0d in + +(* Starting at pos, deserialize the byte string into a Proof. *) +let deserialize_proof : ByStr -> Uint32 -> Option Proof = + fun (proof : ByStr) => + fun (pos : Uint32) => + let value_pos = extract_bystr proof pos in + match value_pos with + | Some (Pair value pos) => + (* Compute the number of list elements *) + let full_len = builtin strlen proof in + let llen = builtin sub full_len pos in + let comp_size = Uint32 33 in (* ByStr1 + ByStr32 *) + let nelm = builtin div llen comp_size in + let nelm_nat = builtin to_nat nelm in + let foldf = + fun(i_acc : Pair Uint32 (Option (List (Pair ByStr1 ByStr32)))) => + fun (n_ : Nat) => + match i_acc with + | Pair pos (Some acc) => + let len = Uint32 1 in + let a = builtin substr proof pos len in + let pos_1 = builtin add pos len in + let len = Uint32 32 in + let b = builtin substr proof pos_1 len in + let ax_opt = builtin to_bystr1 a in + match ax_opt with + | Some ax => + let bx_opt = builtin to_bystr32 b in + match bx_opt with + | Some bx => + let axbx = Pair {ByStr1 ByStr32} ax bx in + let acc_new = Cons {(Pair ByStr1 ByStr32)} axbx acc in + let acc_new_opt = Some {(List (Pair ByStr1 ByStr32))} acc_new in + let pos_new = builtin add pos comp_size in + Pair {Uint32 (Option (List (Pair ByStr1 ByStr32)))} pos_new acc_new_opt + | None => + let none = None {(List (Pair ByStr1 ByStr32))} in + Pair {Uint32 (Option (List (Pair ByStr1 ByStr32)))} pos none + end + | None => + let none = None {(List (Pair ByStr1 ByStr32))} in + Pair {Uint32 (Option (List (Pair ByStr1 ByStr32)))} pos none + end + | Pair _ None => + let none = None {(List (Pair ByStr1 ByStr32))} in + Pair {Uint32 (Option (List (Pair ByStr1 ByStr32)))} pos none + end + in + let folder = @nat_fold (Pair Uint32 (Option (List (Pair ByStr1 ByStr32)))) in + let nil = Nil {(Pair ByStr1 ByStr32)} in + let some = Some {(List (Pair ByStr1 ByStr32))} nil in + let init = Pair {Uint32 (Option (List (Pair ByStr1 ByStr32)))} pos some in + let res = folder foldf init nelm_nat in + match res with + | Pair _ (Some ls) => + let p = Proof value ls in + Some {Proof} p + | _ => None {Proof} + end + | None => None {Proof} + end +in + +let proof_bs = builtin to_bystr proof in +let pos = Uint32 0 in +deserialize_proof proof_bs pos diff --git a/tests/runner/Polynetwork/state_2.json b/tests/runner/Polynetwork/state_2.json new file mode 100644 index 000000000..39a06cb4a --- /dev/null +++ b/tests/runner/Polynetwork/state_2.json @@ -0,0 +1,28 @@ +[ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "0" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [] + } +] From 4081f483788dc4ad935668961682556641135d41 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Tue, 8 Dec 2020 19:16:49 +0530 Subject: [PATCH 26/33] Test for VerifyHeaderAndExecuteTxEvent --- src/stdlib/Polynetwork.scillib | 2 +- .../polynetwork_deserialize_proof.scilexp | 5 +- tests/runner/Polynetwork/blockchain_2.json | 1 + tests/runner/Polynetwork/init.json | 2 +- tests/runner/Polynetwork/message_2.json | 83 +++++++++++++++++ tests/runner/Polynetwork/output_2.json | 91 +++++++++++++++++++ 6 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 tests/runner/Polynetwork/blockchain_2.json create mode 100644 tests/runner/Polynetwork/message_2.json create mode 100644 tests/runner/Polynetwork/output_2.json diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index 4684fba06..afd8efb0d 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -562,7 +562,7 @@ let verifySig : ByStr -> List Signature -> List ByStr20 -> Uint32 -> Bool = match s with | Signature rs_v => let rs_v = builtin to_bystr rs_v in - let pos = Uint32 65 in + let pos = Uint32 64 in let len = Uint32 1 in let v_bs = builtin substr rs_v pos len in let v_bsx_opt = builtin to_bystr1 v_bs in diff --git a/tests/eval/good/polynetwork_deserialize_proof.scilexp b/tests/eval/good/polynetwork_deserialize_proof.scilexp index 6a250d152..c7f8ce1fe 100644 --- a/tests/eval/good/polynetwork_deserialize_proof.scilexp +++ b/tests/eval/good/polynetwork_deserialize_proof.scilexp @@ -54,7 +54,10 @@ let deserialize_proof : ByStr -> Uint32 -> Option Proof = let res = folder foldf init nelm_nat in match res with | Pair _ (Some ls) => - let p = Proof value ls in + (* Our fold builds the list in reverse, so we reverse it back now. *) + let revver = @list_reverse (Pair ByStr1 ByStr32) in + let ls_rev = revver ls in + let p = Proof value ls_rev in Some {Proof} p | _ => None {Proof} end diff --git a/tests/runner/Polynetwork/blockchain_2.json b/tests/runner/Polynetwork/blockchain_2.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_2.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/init.json b/tests/runner/Polynetwork/init.json index 3d0985bb7..619648bdc 100644 --- a/tests/runner/Polynetwork/init.json +++ b/tests/runner/Polynetwork/init.json @@ -7,7 +7,7 @@ { "vname" : "thisChainID", "type" : "Uint64", - "value" : "2111108" + "value" : "2" }, { "vname" : "_this_address", diff --git a/tests/runner/Polynetwork/message_2.json b/tests/runner/Polynetwork/message_2.json new file mode 100644 index 000000000..c56e95f6c --- /dev/null +++ b/tests/runner/Polynetwork/message_2.json @@ -0,0 +1,83 @@ +{ + "_tag": "verifyHeaderAndExecuteTx", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "proof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : [ + "0x2000ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd60300000000000000204caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc081b0000000000000014b7041bc96b15da728fdfc1c47cbfc687b845adeb0200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd35300000000000000000000000000000000000000000000000000000000000000", + [ + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x77d99c0f0857535155071d49ded129993a5b98575761985e90e2d26c7a569a0d" + ] + } + ] + ] + } + }, + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000622b986e745766256e1b3bb6b478d3da265614dc3a481a1ece3c02a499cbec5c00000000000000000000000000000000000000000000000000000000000000008d8021b0dffcf4361f82ac31b6f990da35f304c1d11342b59b80bd836a8af94d9b970da4cb85cb93e406ce857353c33223b7558aad3f5c903bbd838fce0650314417185f9e43000082ad40a6f1e63ecffd0c017b226c6561646572223a322c227672665f76616c7565223a22424a4f784a3942326b4e446c48736a533359424150386b34414d4e446a716e7a4b32624c5839485576576272497a6d502f48425874783541654e626242436b48306c5734746f4a697455783947304d2b6d3350394677413d222c227672665f70726f6f66223a2258514a30514145775474586c5675594d68454f2f766e566f75776b394442416f4b686962506d3042706e6d3854436e7034334d73767455323868436f6c6c6c5075685573764b34647a7935416e34577730576d4639673d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000" + }, + { + "vname" : "headerProof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : ["0x", []] + } + }, + { + "vname" : "curRawHeader", + "type" : "ByStr", + "value" : "0x" + }, + { + "vname" : "headerSig", + "type" : "List Polynetwork.Signature", + "value" : [ + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x63fd63a8448a034a594c7e34034c0455628c3e879e6981e879b6f20ad1994f3e349d5021592a10908074d5ffc3d72384ee7dbfa7ad4b41388944c22dd3276bc701"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xb046097a68620061598e5c59367f1faab18548ece6c8d6aca1572f95eee3915623eeba8a9c06a1886a16bd019f0d294fc1b204f273a32f4fcfcec994368827f001"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x87206061136d01eb706c1950926d2986d20c3cc879977ccecbae6f8771dfc8873e9c269122575c7493a424f8cce1144e33115ed2402af40f141caf53fef4869500"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xdc9caa49811f4d63c22752906cbfc03bf0bc646699cd82d143c349ab871bf6580102c40a38f4b9284865534dfb2059c100ae383e7f50c35f35eb7a768d41608901"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x46487eb3f2ade194b48fb85df5c22e9a554d551375f23568e2f19f7d0b7021cf241b72890e4b12889480316e4a96404b36b9ef25d6337d947f8a9968577af55401"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x1c58c13bc05bff169897898d9c044e93006c8181e6231c1d7ab92b5bc45dd0242a65018cc843404e1e20f6748df88c48ba9a383a51c6493b0358153f0e2d78ca01"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/output_2.json b/tests/runner/Polynetwork/output_2.json new file mode 100644 index 000000000..afc1a626f --- /dev/null +++ b/tests/runner/Polynetwork/output_2.json @@ -0,0 +1,91 @@ +{ + "scilla_major_version": "0", + "gas_remaining": "4627", + "_accepted": "false", + "messages": [ + { + "_tag": "0x756e6c6f636b", + "_amount": "0", + "_recipient": "0x4ddcf539d13e92d4151b7f5e607d4a09f725c47d", + "params": [ + { + "vname": "args", + "type": "ByStr", + "value": + "0x14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd35300000000000000000000000000000000000000000000000000000000000000" + }, + { + "vname": "fromContractAddr", + "type": "ByStr", + "value": "0xb7041bc96b15da728fdfc1c47cbfc687b845adeb" + }, + { "vname": "fromChainId", "type": "Uint64", "value": "3" } + ] + } + ], + "states": [ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "0" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } + ], + "events": [ + { + "_eventname": "VerifyHeaderAndExecuteTxEvent", + "params": [ + { + "vname": "txn", + "type": "Polynetwork.TxParam", + "value": { + "constructor": "Polynetwork.TxParam", + "argtypes": [], + "arguments": [ + "0x4caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc", + "0x1b00000000000000", + "0xb7041bc96b15da728fdfc1c47cbfc687b845adeb", "2", + "0x4ddcf539d13e92d4151b7f5e607d4a09f725c47d", "0x756e6c6f636b", + "0x14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd35300000000000000000000000000000000000000000000000000000000000000" + ] + } + } + ] + } + ] +} \ No newline at end of file From 5f5904a79b60ae3ac8ce9cfb87a170d52ee46cc7 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Tue, 8 Dec 2020 19:58:19 +0530 Subject: [PATCH 27/33] Improve VerifyHeaderAndExecuteTxEvent --- tests/contracts/Polynetwork.scilla | 11 ++++++--- tests/runner/Polynetwork/output_2.json | 31 ++++++++++++++------------ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index 925f835df..06ac5f45e 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -87,7 +87,7 @@ procedure checkAndMarkFromChainTxn(chainID : Uint64, txHash : ByStr) end end -procedure executeCrossChainTxn (txparam : TxParam, fromChainId : Uint64) +procedure executeCrossChainTxn (txparam : TxParam, fromChainId : Uint64, crossChainTxHash : ByStr) match txparam with | TxParam txHash crossChainID fromContract toChainID toContract method args => toChainIDOk = builtin eq toChainID thisChainID; @@ -104,7 +104,12 @@ procedure executeCrossChainTxn (txparam : TxParam, fromChainId : Uint64) _recipient : toContractAddr }; mo = one_msg m; send mo; - e = { _eventname : "VerifyHeaderAndExecuteTxEvent"; txn : txparam }; + e = { _eventname : "VerifyHeaderAndExecuteTxEvent"; + fromChainId : fromChainId; + toContractAddr : toContractAddr; + crossChainTxHash : crossChainTxHash; + fromChainTxHash : txHash + }; event e | None => e = { _exception : "Address format mismatch" }; @@ -198,7 +203,7 @@ transition verifyHeaderAndExecuteTx(proof : Proof, rawHeader : ByStr, headerProo match toMerkleValue_o with | Some (Pair (ToMerkleValue txhash fromChainId txparam) _) => checkAndMarkFromChainTxn fromChainId txhash; - executeCrossChainTxn txparam fromChainId + executeCrossChainTxn txparam fromChainId txhash | None => e = { _exception : "Merkle value deserialization failed" }; throw e diff --git a/tests/runner/Polynetwork/output_2.json b/tests/runner/Polynetwork/output_2.json index afc1a626f..5c0b097ab 100644 --- a/tests/runner/Polynetwork/output_2.json +++ b/tests/runner/Polynetwork/output_2.json @@ -1,6 +1,6 @@ { "scilla_major_version": "0", - "gas_remaining": "4627", + "gas_remaining": "4629", "_accepted": "false", "messages": [ { @@ -70,20 +70,23 @@ { "_eventname": "VerifyHeaderAndExecuteTxEvent", "params": [ + { "vname": "fromChainId", "type": "Uint64", "value": "3" }, { - "vname": "txn", - "type": "Polynetwork.TxParam", - "value": { - "constructor": "Polynetwork.TxParam", - "argtypes": [], - "arguments": [ - "0x4caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc", - "0x1b00000000000000", - "0xb7041bc96b15da728fdfc1c47cbfc687b845adeb", "2", - "0x4ddcf539d13e92d4151b7f5e607d4a09f725c47d", "0x756e6c6f636b", - "0x14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd35300000000000000000000000000000000000000000000000000000000000000" - ] - } + "vname": "toContractAddr", + "type": "ByStr20", + "value": "0x4ddcf539d13e92d4151b7f5e607d4a09f725c47d" + }, + { + "vname": "crossChainTxHash", + "type": "ByStr", + "value": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6" + }, + { + "vname": "fromChainTxHash", + "type": "ByStr", + "value": + "0x4caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc" } ] } From d2c639dfd9a2b9b01360acef2b5adef94d751af4 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Tue, 8 Dec 2020 22:33:26 +0530 Subject: [PATCH 28/33] use to_ascii instead of to_string for method_name --- tests/contracts/Polynetwork.scilla | 2 +- tests/runner/Polynetwork/output_2.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index 06ac5f45e..3b023fa42 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -96,7 +96,7 @@ procedure executeCrossChainTxn (txparam : TxParam, fromChainId : Uint64, crossCh toContractAddr_o = builtin to_bystr20 toContract; match toContractAddr_o with | Some toContractAddr => - method_name = builtin to_string method; + method_name = builtin to_ascii method; m = { _tag : method_name; args : args; fromContractAddr : fromContract; fromChainId : fromChainId; diff --git a/tests/runner/Polynetwork/output_2.json b/tests/runner/Polynetwork/output_2.json index 5c0b097ab..149c7aab0 100644 --- a/tests/runner/Polynetwork/output_2.json +++ b/tests/runner/Polynetwork/output_2.json @@ -4,7 +4,7 @@ "_accepted": "false", "messages": [ { - "_tag": "0x756e6c6f636b", + "_tag": "unlock", "_amount": "0", "_recipient": "0x4ddcf539d13e92d4151b7f5e607d4a09f725c47d", "params": [ From 10c6d4a2341fa55d550e0f7d2a9c606c8eca92f9 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Wed, 9 Dec 2020 14:09:40 +0530 Subject: [PATCH 29/33] Add more tests, including expected fail tests for Polynetwork --- tests/eval/good/Good.ml | 1 + .../polynetwork_deserialize_proof.scilexp | 17 +- tests/runner/Polynetwork/blockchain_25.json | 1 + tests/runner/Polynetwork/blockchain_26.json | 1 + tests/runner/Polynetwork/blockchain_27.json | 1 + tests/runner/Polynetwork/blockchain_28.json | 1 + tests/runner/Polynetwork/blockchain_3.json | 1 + tests/runner/Polynetwork/blockchain_4.json | 1 + tests/runner/Polynetwork/message_25.json | 53 +++++ tests/runner/Polynetwork/message_26.json | 83 +++++++ tests/runner/Polynetwork/message_27.json | 90 ++++++++ tests/runner/Polynetwork/message_28.json | 211 ++++++++++++++++++ tests/runner/Polynetwork/message_3.json | 90 ++++++++ tests/runner/Polynetwork/message_4.json | 211 ++++++++++++++++++ tests/runner/Polynetwork/output_3.json | 64 ++++++ tests/runner/Polynetwork/output_4.json | 109 +++++++++ tests/runner/Polynetwork/state_25.json | 28 +++ tests/runner/Polynetwork/state_26.json | 43 ++++ tests/runner/Polynetwork/state_27.json | 44 ++++ tests/runner/Polynetwork/state_28.json | 58 +++++ tests/runner/Polynetwork/state_3.json | 43 ++++ tests/runner/Polynetwork/state_4.json | 44 ++++ tests/runner/Testcontracts.ml | 4 + 23 files changed, 1197 insertions(+), 2 deletions(-) create mode 100644 tests/runner/Polynetwork/blockchain_25.json create mode 100644 tests/runner/Polynetwork/blockchain_26.json create mode 100644 tests/runner/Polynetwork/blockchain_27.json create mode 100644 tests/runner/Polynetwork/blockchain_28.json create mode 100644 tests/runner/Polynetwork/blockchain_3.json create mode 100644 tests/runner/Polynetwork/blockchain_4.json create mode 100644 tests/runner/Polynetwork/message_25.json create mode 100644 tests/runner/Polynetwork/message_26.json create mode 100644 tests/runner/Polynetwork/message_27.json create mode 100644 tests/runner/Polynetwork/message_28.json create mode 100644 tests/runner/Polynetwork/message_3.json create mode 100644 tests/runner/Polynetwork/message_4.json create mode 100644 tests/runner/Polynetwork/output_3.json create mode 100644 tests/runner/Polynetwork/output_4.json create mode 100644 tests/runner/Polynetwork/state_25.json create mode 100644 tests/runner/Polynetwork/state_26.json create mode 100644 tests/runner/Polynetwork/state_27.json create mode 100644 tests/runner/Polynetwork/state_28.json create mode 100644 tests/runner/Polynetwork/state_3.json create mode 100644 tests/runner/Polynetwork/state_4.json diff --git a/tests/eval/good/Good.ml b/tests/eval/good/Good.ml index d08e7ab5a..cdb0c45c8 100644 --- a/tests/eval/good/Good.ml +++ b/tests/eval/good/Good.ml @@ -136,6 +136,7 @@ let explist = "builtin-alt-bn128.scilexp"; "builtin-ecdsa_recover.scilexp"; "polynetwork_header.scilexp"; + "polynetwork_deserialize_proof.scilexp"; "polynetwork_next_var_uint1.scilexp"; "polynetwork_next_var_uint2.scilexp"; "polynetwork_next_var_uint3.scilexp"; diff --git a/tests/eval/good/polynetwork_deserialize_proof.scilexp b/tests/eval/good/polynetwork_deserialize_proof.scilexp index c7f8ce1fe..019ec5912 100644 --- a/tests/eval/good/polynetwork_deserialize_proof.scilexp +++ b/tests/eval/good/polynetwork_deserialize_proof.scilexp @@ -1,5 +1,9 @@ let proof = 0xd72000ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd60300000000000000204caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc081b0000000000000014b7041bc96b15da728fdfc1c47cbfc687b845adeb0200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd353000000000000000000000000000000000000000000000000000000000000000177d99c0f0857535155071d49ded129993a5b98575761985e90e2d26c7a569a0d in +let proof2 = 0xd020e91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c080000000000000020b697330bd7a5850235f97d1bcd1c37739f4bc79a4f8e635dcb46ba45bc600ef4012f14f71b55ef55cedc91fd007f7a9ba386ec978f3aa80200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14000000000000000000000000000000000000000014344cfc3b8635f72f14200aaf2168d9f75df86fd36226100000000000000000000000000000000000000000000000000000000000 in + +let proof3 = 0x20c73c8b3c730086cfae83d735d2c405d6f5a00c3f1ff21ce91d223038d3c1ab4d000213149490394c2a8701af2dba1a303df05148a14092f6e59febca31eee4da660079807fe94ecb6f6d1b0b65be5f45159925a905bab8040af476c372ea0583dbba00b41a753c36f64bbe6d6fcd6c2ba40dc09c4c25b6b877bd363696fe1f62cbf6f700059195b0df4add4239eaef270bc187217dc872d11723d4fce02a3c2510461e5900f3c3d66c4611791ff1ebe8a2ef43f1cbf40876b637522c60a81f511445f8dc17011f86c65842afb760457d5ce8ad38821d2110331a7bbae87fe131a5e610f3a146004add0a7a5c74a56ce64a3555b4a73f367c414c80ecc15672dd86f7bff8bf65bc011daedaae87fc34d28ec3116dc04386c7c650f5db9e3a9a853c6e518821069bda001c6cf42ace3bf6b1a7e60ae29dc10aad67cdf672cdb083c601ee3996576cc2e401a1a8ab20062ebdcfa7a6e8f0c6c8b3de823920abd351eedc33d043de1c1449880171c734d6d77806f9475b69c8426bc5c09ce54c0b4ccb13df4315c62899e9926201f459d25426b21e5f2f6bdabf5e6a79f36002114b1ecc5cfa30a18cf3e4baf98d01ad42157822143a7be209b907901a31863d1b35ad9118c4c45d476e405872fb66017badaf21d00ca7e2a73c64dd7738ddcb6a881dcfb88ef0c171e33bfec529fe0a00e0a6008bab76556dbf47269adc41d6820c6a55982e9362257bfdf02a79ff5b8d01061cd147d032d11b1b7b6b5edc389f56d33f939e51be3c7949b357aac4e120df in + (* Starting at pos, deserialize the byte string into a Proof. *) let deserialize_proof : ByStr -> Uint32 -> Option Proof = fun (proof : ByStr) => @@ -65,6 +69,15 @@ let deserialize_proof : ByStr -> Uint32 -> Option Proof = end in -let proof_bs = builtin to_bystr proof in let pos = Uint32 0 in -deserialize_proof proof_bs pos + +let proof_bs = builtin to_bystr proof in +let res1 = deserialize_proof proof_bs pos in + +let proof2_bs = builtin to_bystr proof2 in +let res2 = deserialize_proof proof2_bs pos in + +let proof3_bs = builtin to_bystr proof3 in +let res3 = deserialize_proof proof3_bs pos in + +Uint32 0 diff --git a/tests/runner/Polynetwork/blockchain_25.json b/tests/runner/Polynetwork/blockchain_25.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_25.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/blockchain_26.json b/tests/runner/Polynetwork/blockchain_26.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_26.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/blockchain_27.json b/tests/runner/Polynetwork/blockchain_27.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_27.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/blockchain_28.json b/tests/runner/Polynetwork/blockchain_28.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_28.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/blockchain_3.json b/tests/runner/Polynetwork/blockchain_3.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_3.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/blockchain_4.json b/tests/runner/Polynetwork/blockchain_4.json new file mode 100644 index 000000000..9c3af9b93 --- /dev/null +++ b/tests/runner/Polynetwork/blockchain_4.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] \ No newline at end of file diff --git a/tests/runner/Polynetwork/message_25.json b/tests/runner/Polynetwork/message_25.json new file mode 100644 index 000000000..6b2982c63 --- /dev/null +++ b/tests/runner/Polynetwork/message_25.json @@ -0,0 +1,53 @@ +{ + "_tag": "initGenesisBlock", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b9156170000000000000000000000000000000000000000000000000000000000000000000000006de0a8f7ee3fb67d8e04ac9547f3615e59adc6e0a2309c90080a272dc1fa1fd90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8365b000000001dac2b7c00000000fd1a057b226c6561646572223a343239343936373239352c227672665f76616c7565223a22484a675171706769355248566745716354626e6443456c384d516837446172364e4e646f6f79553051666f67555634764d50675851524171384d6f38373853426a2b38577262676c2b36714d7258686b667a72375751343d222c227672665f70726f6f66223a22785864422b5451454c4c6a59734965305378596474572f442f39542f746e5854624e436667354e62364650596370382f55706a524c572f536a5558643552576b75646632646f4c5267727052474b76305566385a69413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a343239343936373239352c226e65775f636861696e5f636f6e666967223a7b2276657273696f6e223a312c2276696577223a312c226e223a372c2263223a322c22626c6f636b5f6d73675f64656c6179223a31303030303030303030302c22686173685f6d73675f64656c6179223a31303030303030303030302c22706565725f68616e647368616b655f74696d656f7574223a31303030303030303030302c227065657273223a5b7b22696e646578223a312c226964223a2231323035303238313732393138353430623262353132656165313837326132613265336132386439383963363064393564616238383239616461376437646437303664363538227d2c7b22696e646578223a322c226964223a2231323035303338623861663632313065636664636263616232323535326566386438636634316336663836663963663961623533643836353734316366646238333366303662227d2c7b22696e646578223a332c226964223a2231323035303234383261636236353634623139623930363533663665396338303632393265386161383366373865376139333832613234613665666534316330633036663339227d2c7b22696e646578223a342c226964223a2231323035303236373939333061343261616633633639373938636138613366313265313334633031393430353831386437383364313137343865303339646538353135393838227d2c7b22696e646578223a352c226964223a2231323035303234363864643138393965643264316363326238323938383261313635613065636236613734356166306337326562323938326436366234333131623465663733227d2c7b22696e646578223a362c226964223a2231323035303265623162616162363032633538393932383235363163646161613761616262636464306363666362633365373937393361633234616366393037373866333561227d2c7b22696e646578223a372c226964223a2231323035303331653037373966356335636362323631323335326665346132303066393964336537373538653730626135336636303763353966663232613330663637386666227d5d2c22706f735f7461626c65223a5b362c342c332c352c362c312c322c352c342c372c342c322c332c332c372c362c352c342c362c352c312c342c332c312c322c352c322c322c362c312c342c352c342c372c322c332c342c312c352c372c342c312c322c322c352c362c342c342c322c372c332c362c362c352c312c372c332c312c362c312c332c332c322c342c342c312c352c362c352c312c322c362c372c352c362c332c342c372c372c332c322c372c312c352c362c352c322c332c362c322c362c312c372c372c372c312c372c342c332c332c332c322c312c372c355d2c226d61785f626c6f636b5f6368616e67655f76696577223a36303030307d7d9fe171f3fe643eb1c188400b828ba184816fc9ac0000" + }, + { + "vname" : "pubkeys", + "type" : "List Polynetwork.Pubkey", + "value" : [ + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/message_26.json b/tests/runner/Polynetwork/message_26.json new file mode 100644 index 000000000..c56e95f6c --- /dev/null +++ b/tests/runner/Polynetwork/message_26.json @@ -0,0 +1,83 @@ +{ + "_tag": "verifyHeaderAndExecuteTx", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "proof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : [ + "0x2000ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd60300000000000000204caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc081b0000000000000014b7041bc96b15da728fdfc1c47cbfc687b845adeb0200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd35300000000000000000000000000000000000000000000000000000000000000", + [ + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x77d99c0f0857535155071d49ded129993a5b98575761985e90e2d26c7a569a0d" + ] + } + ] + ] + } + }, + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000622b986e745766256e1b3bb6b478d3da265614dc3a481a1ece3c02a499cbec5c00000000000000000000000000000000000000000000000000000000000000008d8021b0dffcf4361f82ac31b6f990da35f304c1d11342b59b80bd836a8af94d9b970da4cb85cb93e406ce857353c33223b7558aad3f5c903bbd838fce0650314417185f9e43000082ad40a6f1e63ecffd0c017b226c6561646572223a322c227672665f76616c7565223a22424a4f784a3942326b4e446c48736a533359424150386b34414d4e446a716e7a4b32624c5839485576576272497a6d502f48425874783541654e626242436b48306c5734746f4a697455783947304d2b6d3350394677413d222c227672665f70726f6f66223a2258514a30514145775474586c5675594d68454f2f766e566f75776b394442416f4b686962506d3042706e6d3854436e7034334d73767455323868436f6c6c6c5075685573764b34647a7935416e34577730576d4639673d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000" + }, + { + "vname" : "headerProof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : ["0x", []] + } + }, + { + "vname" : "curRawHeader", + "type" : "ByStr", + "value" : "0x" + }, + { + "vname" : "headerSig", + "type" : "List Polynetwork.Signature", + "value" : [ + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x63fd63a8448a034a594c7e34034c0455628c3e879e6981e879b6f20ad1994f3e349d5021592a10908074d5ffc3d72384ee7dbfa7ad4b41388944c22dd3276bc701"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xb046097a68620061598e5c59367f1faab18548ece6c8d6aca1572f95eee3915623eeba8a9c06a1886a16bd019f0d294fc1b204f273a32f4fcfcec994368827f001"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x87206061136d01eb706c1950926d2986d20c3cc879977ccecbae6f8771dfc8873e9c269122575c7493a424f8cce1144e33115ed2402af40f141caf53fef4869500"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xdc9caa49811f4d63c22752906cbfc03bf0bc646699cd82d143c349ab871bf6580102c40a38f4b9284865534dfb2059c100ae383e7f50c35f35eb7a768d41608901"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x46487eb3f2ade194b48fb85df5c22e9a554d551375f23568e2f19f7d0b7021cf241b72890e4b12889480316e4a96404b36b9ef25d6337d947f8a9968577af55401"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x1c58c13bc05bff169897898d9c044e93006c8181e6231c1d7ab92b5bc45dd0242a65018cc843404e1e20f6748df88c48ba9a383a51c6493b0358153f0e2d78ca01"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/message_27.json b/tests/runner/Polynetwork/message_27.json new file mode 100644 index 000000000..61f80e359 --- /dev/null +++ b/tests/runner/Polynetwork/message_27.json @@ -0,0 +1,90 @@ +{ + "_tag": "changeBookKeeper", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "pubkeys", + "type" : "List Polynetwork.Pubkey", + "value" : [ + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x12050493421445b9421bd4cc90d7bc88c9301558047a76b20c59e7c511ee7d229982b142bbf593006e8099ad4a2e3a2a9067ce46b7d54bab4b8996e7abc3fcd8bf0a5f"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c"] + } + + ] + }, + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000f48a4057bef268cc3fdb034e69dc2e942907e08ac4a420d1b196b8c28ebf5bf2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a8be0a1605a63a31704aec4eb4f1023f1ecc2934bd86f119ab77526f9477af9a57e1a5f508e0000410782720ab189fffd84057b226c6561646572223a332c227672665f76616c7565223a22424f4f336f58796b32524970655651593338547133714a423832737a4a68366e4f6f724a55702f4a4d582b474c707a347a497347394c4a6c34784a6f34657448674f56357169364d484b6674714f69724f755a495a69593d222c227672665f70726f6f66223a22635953525746506f69394748414247526255646836612b35506f4f317776354a557a53417457786845637071757430536a595873344c7453353574534a74334174493059616d4c67524a797a524f68564756626d34673d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a33363433322c226e65775f636861696e5f636f6e666967223a7b2276657273696f6e223a312c2276696577223a342c226e223a382c2263223a322c22626c6f636b5f6d73675f64656c6179223a31303030303030303030302c22686173685f6d73675f64656c6179223a31303030303030303030302c22706565725f68616e647368616b655f74696d656f7574223a31303030303030303030302c227065657273223a5b7b22696e646578223a312c226964223a2231323035303238313732393138353430623262353132656165313837326132613265336132386439383963363064393564616238383239616461376437646437303664363538227d2c7b22696e646578223a342c226964223a2231323035303236373939333061343261616633633639373938636138613366313265313334633031393430353831386437383364313137343865303339646538353135393838227d2c7b22696e646578223a332c226964223a2231323035303234383261636236353634623139623930363533663665396338303632393265386161383366373865376139333832613234613665666534316330633036663339227d2c7b22696e646578223a352c226964223a2231323035303234363864643138393965643264316363326238323938383261313635613065636236613734356166306337326562323938326436366234333131623465663733227d2c7b22696e646578223a382c226964223a2231323035303339333432313434356239343231626434636339306437626338386339333031353538303437613736623230633539653763353131656537643232393938326231227d2c7b22696e646578223a322c226964223a2231323035303338623861663632313065636664636263616232323535326566386438636634316336663836663963663961623533643836353734316366646238333366303662227d2c7b22696e646578223a372c226964223a2231323035303331653037373966356335636362323631323335326665346132303066393964336537373538653730626135336636303763353966663232613330663637386666227d2c7b22696e646578223a362c226964223a2231323035303265623162616162363032633538393932383235363163646161613761616262636464306363666362633365373937393361633234616366393037373866333561227d5d2c22706f735f7461626c65223a5b322c382c352c352c382c372c312c342c352c362c352c342c372c372c332c332c342c362c312c322c342c382c352c342c372c342c362c362c322c322c312c312c382c382c362c362c362c372c382c372c342c382c352c312c332c332c382c352c332c362c332c362c372c352c362c322c332c312c322c362c352c322c312c342c322c312c382c342c382c332c382c372c372c352c312c372c342c342c312c352c322c352c362c312c322c382c332c332c312c332c312c342c312c372c382c362c382c322c352c312c342c352c332c322c322c322c382c332c332c332c362c372c342c372c342c322c372c352c362c375d2c226d61785f626c6f636b5f6368616e67655f76696577223a36303030307d7df8fc7a1f6a856313c591a3a747f4eca7218a820b" + }, + { + "vname" : "sigList", + "type" : "List Polynetwork.Signature", + "value" : [ + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x7d588d79ac9f0931c69150de6bfe5289f0147893781bffbcc32b5e07bd687d1048dda039ffc1e87de2e98610dc876e97411d604948473904b12b64bed8880bcc00"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xea8be33bb197c82690987e22e970221de11dfa019f470d784ef211edb6c9a3fd75bf74904adea08ed37a635c4dc58ccc21369afc1abcab4696a42be1097468a400"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x289be668444122fd1d48c62781ded43e6fbda9bdd587dc7ee1bd326390d70e3f0e174fbd4854ed96c697dcee93feabbf7cdf290ebee93d4f5156d75d62b80ba301"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xe79df9e679af49c403bbf05a24af2307adc96b641f4501fdb96e6704d27b2a87278e15bfee5909d4fa62dd45907cba23f833b3e96378d140d56722d1f59821e400"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x6d8349493021e2cd6af96524357867b6be9d24ef33aaf66c430d5f91c33253304380ee17c6839fed964e7ba4910dd26533125b548cff6450140b10caec1b08fe01"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/message_28.json b/tests/runner/Polynetwork/message_28.json new file mode 100644 index 000000000..5da864e8d --- /dev/null +++ b/tests/runner/Polynetwork/message_28.json @@ -0,0 +1,211 @@ +{ + "_tag": "verifyHeaderAndExecuteTx", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "proof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : [ + "0x20e91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c080000000000000020b697330bd7a5850235f97d1bcd1c37739f4bc79a4f8e635dcb46ba45bc600ef4012f14f71b55ef55cedc91fd007f7a9ba386ec978f3aa80200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14000000000000000000000000000000000000000014344cfc3b8635f72f14200aaf2168d9f75df86fd36226100000000000000000000000000000000000000000000000000000000000", + [] + ] + } + }, + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000285c4b50cb092422c306eee00b18730bd1e05f0c144bc04d0adf1f44e0aef6c70000000000000000000000000000000000000000000000000000000000000000829ba7727b3bb7d42eff74342bafb37362b4898169750e8b2b8af2267c863ebf6fb8849a086fbed1ccd873b63642cce60ac54875cc3c1f054c1866e0bca5136dc90a185f5e4100007de0abdc2a5b63d5fd0c017b226c6561646572223a312c227672665f76616c7565223a224249703243555764736c424c6b34754979584174417949682f74685a6b5072445539566279697358754c574d6e634a775a49515161434f4b74724474793437454d3541554e4a7542523133546b6857616e56422b4b7a493d222c227672665f70726f6f66223a224a3830534c2b6c62433537306f64426374486f477a45504631516d506f7a4f4332323132553563796b4949346a6b77374d2f74746f317537386e4634347256433443676d344f786f71667943656b3568487132576a413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000" + }, + { + "vname" : "headerProof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : [ + "0xc73c8b3c730086cfae83d735d2c405d6f5a00c3f1ff21ce91d223038d3c1ab4d", + [ + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x0213149490394c2a8701af2dba1a303df05148a14092f6e59febca31eee4da66" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x79807fe94ecb6f6d1b0b65be5f45159925a905bab8040af476c372ea0583dbba" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0xb41a753c36f64bbe6d6fcd6c2ba40dc09c4c25b6b877bd363696fe1f62cbf6f7" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x059195b0df4add4239eaef270bc187217dc872d11723d4fce02a3c2510461e59" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0xf3c3d66c4611791ff1ebe8a2ef43f1cbf40876b637522c60a81f511445f8dc17" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x1f86c65842afb760457d5ce8ad38821d2110331a7bbae87fe131a5e610f3a146" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x4add0a7a5c74a56ce64a3555b4a73f367c414c80ecc15672dd86f7bff8bf65bc" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x1daedaae87fc34d28ec3116dc04386c7c650f5db9e3a9a853c6e518821069bda" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x1c6cf42ace3bf6b1a7e60ae29dc10aad67cdf672cdb083c601ee3996576cc2e4" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0xa1a8ab20062ebdcfa7a6e8f0c6c8b3de823920abd351eedc33d043de1c144988" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x71c734d6d77806f9475b69c8426bc5c09ce54c0b4ccb13df4315c62899e99262" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0xf459d25426b21e5f2f6bdabf5e6a79f36002114b1ecc5cfa30a18cf3e4baf98d" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0xad42157822143a7be209b907901a31863d1b35ad9118c4c45d476e405872fb66" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x7badaf21d00ca7e2a73c64dd7738ddcb6a881dcfb88ef0c171e33bfec529fe0a" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0xe0a6008bab76556dbf47269adc41d6820c6a55982e9362257bfdf02a79ff5b8d" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x061cd147d032d11b1b7b6b5edc389f56d33f939e51be3c7949b357aac4e120df" + ] + } + ] + ] + } + }, + { + "vname" : "curRawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000f2e3823838bcdfafe08c6e9ff2cd1f86ae65dfc1052d15c9441aa6c07097015f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051d45928d93800ffebc80373df7dbe735a2e9c5998b883e69494921fedbbe858057f1a5f5a8e0000216854be71737efbfd10017b226c6561646572223a362c227672665f76616c7565223a224244592f6c4875783448587341376f394962357877634a4d39727466656a454c786d6637766a48583574507a64724d356a47304a305265756d4338632f6e64725131306b4751622f50537a3255667a6267723430666a413d222c227672665f70726f6f66223a2242437877375a6d49446243476a3839576e715744564f6b714f7239645574344f4f2f777176366d4c3165656377474d542b3078664476544642614f3951534451437879725551344c316835392b3130486671386176673d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a33363433322c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000" + }, + { + "vname" : "headerSig", + "type" : "List Polynetwork.Signature", + "value" : [ + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x6d905d095fc1b47eb30b8f176c94b01b64502790f3c20db2a5b7e555791bdbf8458a24c73c8f690ad8481e3754c3297991f9f4148d03316e2e5a6c6af9e7bbc900"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xa81911a6eb529979ee021124c242a828657865fc7a899ab55fb7d2a1623341a67ae83c90a40bec8bf54fa3c5caad445062568d3c4c4099e84ad6c774e70d7d7d00"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x0b5d0a2ebc3685a6deeb96cfabf71e4a9d05606a5918e4765be6cc4cad38c3954e248d97b2fa378b954f323335c93298913c61048cf0b396467df1c6b6bbba4d01"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xcd68657ad3c6d5a979093ff1345eefb269e86498b519418fa0e5e756ce01a9b939d46b405d2a167883bda0a40023cce39659890c97a59e3f772b6fc3c2e0322100"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x4d425ad3bfef2de8b1d523cbfd754d4ea2c8e8fa5f6904b0389f4e5d62039083454e2a24da6e1c90334fd760eaa1921bdac10158758f682cb401e1df16ee0ec801"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xb8e8eb23200a1571c6ad516528ce3f1280506eed9f1e380b9a5e770f1e89d8414182c7b83dc8f230d288c4745d0a8102cfc015d422af77d139bc606054363ecf01"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x38fc63be97c354539b517bd8abd97d86fa3484894663aa7dcf578cfad7368df577206e28daf800cba179314f34f1a6dec569ff12e15c22b598028cce64bfa54601"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/message_3.json b/tests/runner/Polynetwork/message_3.json new file mode 100644 index 000000000..61f80e359 --- /dev/null +++ b/tests/runner/Polynetwork/message_3.json @@ -0,0 +1,90 @@ +{ + "_tag": "changeBookKeeper", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "pubkeys", + "type" : "List Polynetwork.Pubkey", + "value" : [ + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x12050493421445b9421bd4cc90d7bc88c9301558047a76b20c59e7c511ee7d229982b142bbf593006e8099ad4a2e3a2a9067ce46b7d54bab4b8996e7abc3fcd8bf0a5f"] + }, + { + "constructor" : "Polynetwork.Pubkey", + "argtypes" : [], + "arguments" : ["0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c"] + } + + ] + }, + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000f48a4057bef268cc3fdb034e69dc2e942907e08ac4a420d1b196b8c28ebf5bf2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a8be0a1605a63a31704aec4eb4f1023f1ecc2934bd86f119ab77526f9477af9a57e1a5f508e0000410782720ab189fffd84057b226c6561646572223a332c227672665f76616c7565223a22424f4f336f58796b32524970655651593338547133714a423832737a4a68366e4f6f724a55702f4a4d582b474c707a347a497347394c4a6c34784a6f34657448674f56357169364d484b6674714f69724f755a495a69593d222c227672665f70726f6f66223a22635953525746506f69394748414247526255646836612b35506f4f317776354a557a53417457786845637071757430536a595873344c7453353574534a74334174493059616d4c67524a797a524f68564756626d34673d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a33363433322c226e65775f636861696e5f636f6e666967223a7b2276657273696f6e223a312c2276696577223a342c226e223a382c2263223a322c22626c6f636b5f6d73675f64656c6179223a31303030303030303030302c22686173685f6d73675f64656c6179223a31303030303030303030302c22706565725f68616e647368616b655f74696d656f7574223a31303030303030303030302c227065657273223a5b7b22696e646578223a312c226964223a2231323035303238313732393138353430623262353132656165313837326132613265336132386439383963363064393564616238383239616461376437646437303664363538227d2c7b22696e646578223a342c226964223a2231323035303236373939333061343261616633633639373938636138613366313265313334633031393430353831386437383364313137343865303339646538353135393838227d2c7b22696e646578223a332c226964223a2231323035303234383261636236353634623139623930363533663665396338303632393265386161383366373865376139333832613234613665666534316330633036663339227d2c7b22696e646578223a352c226964223a2231323035303234363864643138393965643264316363326238323938383261313635613065636236613734356166306337326562323938326436366234333131623465663733227d2c7b22696e646578223a382c226964223a2231323035303339333432313434356239343231626434636339306437626338386339333031353538303437613736623230633539653763353131656537643232393938326231227d2c7b22696e646578223a322c226964223a2231323035303338623861663632313065636664636263616232323535326566386438636634316336663836663963663961623533643836353734316366646238333366303662227d2c7b22696e646578223a372c226964223a2231323035303331653037373966356335636362323631323335326665346132303066393964336537373538653730626135336636303763353966663232613330663637386666227d2c7b22696e646578223a362c226964223a2231323035303265623162616162363032633538393932383235363163646161613761616262636464306363666362633365373937393361633234616366393037373866333561227d5d2c22706f735f7461626c65223a5b322c382c352c352c382c372c312c342c352c362c352c342c372c372c332c332c342c362c312c322c342c382c352c342c372c342c362c362c322c322c312c312c382c382c362c362c362c372c382c372c342c382c352c312c332c332c382c352c332c362c332c362c372c352c362c322c332c312c322c362c352c322c312c342c322c312c382c342c382c332c382c372c372c352c312c372c342c342c312c352c322c352c362c312c322c382c332c332c312c332c312c342c312c372c382c362c382c322c352c312c342c352c332c322c322c322c382c332c332c332c362c372c342c372c342c322c372c352c362c375d2c226d61785f626c6f636b5f6368616e67655f76696577223a36303030307d7df8fc7a1f6a856313c591a3a747f4eca7218a820b" + }, + { + "vname" : "sigList", + "type" : "List Polynetwork.Signature", + "value" : [ + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x7d588d79ac9f0931c69150de6bfe5289f0147893781bffbcc32b5e07bd687d1048dda039ffc1e87de2e98610dc876e97411d604948473904b12b64bed8880bcc00"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xea8be33bb197c82690987e22e970221de11dfa019f470d784ef211edb6c9a3fd75bf74904adea08ed37a635c4dc58ccc21369afc1abcab4696a42be1097468a400"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x289be668444122fd1d48c62781ded43e6fbda9bdd587dc7ee1bd326390d70e3f0e174fbd4854ed96c697dcee93feabbf7cdf290ebee93d4f5156d75d62b80ba301"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xe79df9e679af49c403bbf05a24af2307adc96b641f4501fdb96e6704d27b2a87278e15bfee5909d4fa62dd45907cba23f833b3e96378d140d56722d1f59821e400"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x6d8349493021e2cd6af96524357867b6be9d24ef33aaf66c430d5f91c33253304380ee17c6839fed964e7ba4910dd26533125b548cff6450140b10caec1b08fe01"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/message_4.json b/tests/runner/Polynetwork/message_4.json new file mode 100644 index 000000000..5da864e8d --- /dev/null +++ b/tests/runner/Polynetwork/message_4.json @@ -0,0 +1,211 @@ +{ + "_tag": "verifyHeaderAndExecuteTx", + "_amount": "0", + "_sender" : "0x12345678901234567890123456789012345678ab", + "params": [ + { + "vname" : "proof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : [ + "0x20e91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c080000000000000020b697330bd7a5850235f97d1bcd1c37739f4bc79a4f8e635dcb46ba45bc600ef4012f14f71b55ef55cedc91fd007f7a9ba386ec978f3aa80200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14000000000000000000000000000000000000000014344cfc3b8635f72f14200aaf2168d9f75df86fd36226100000000000000000000000000000000000000000000000000000000000", + [] + ] + } + }, + { + "vname" : "rawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000285c4b50cb092422c306eee00b18730bd1e05f0c144bc04d0adf1f44e0aef6c70000000000000000000000000000000000000000000000000000000000000000829ba7727b3bb7d42eff74342bafb37362b4898169750e8b2b8af2267c863ebf6fb8849a086fbed1ccd873b63642cce60ac54875cc3c1f054c1866e0bca5136dc90a185f5e4100007de0abdc2a5b63d5fd0c017b226c6561646572223a312c227672665f76616c7565223a224249703243555764736c424c6b34754979584174417949682f74685a6b5072445539566279697358754c574d6e634a775a49515161434f4b74724474793437454d3541554e4a7542523133546b6857616e56422b4b7a493d222c227672665f70726f6f66223a224a3830534c2b6c62433537306f64426374486f477a45504631516d506f7a4f4332323132553563796b4949346a6b77374d2f74746f317537386e4634347256433443676d344f786f71667943656b3568487132576a413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000" + }, + { + "vname" : "headerProof", + "type" : "Polynetwork.Proof", + "value" : { + "constructor" : "Polynetwork.Proof", + "argtypes" : [], + "arguments" : [ + "0xc73c8b3c730086cfae83d735d2c405d6f5a00c3f1ff21ce91d223038d3c1ab4d", + [ + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x0213149490394c2a8701af2dba1a303df05148a14092f6e59febca31eee4da66" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x79807fe94ecb6f6d1b0b65be5f45159925a905bab8040af476c372ea0583dbba" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0xb41a753c36f64bbe6d6fcd6c2ba40dc09c4c25b6b877bd363696fe1f62cbf6f7" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x059195b0df4add4239eaef270bc187217dc872d11723d4fce02a3c2510461e59" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0xf3c3d66c4611791ff1ebe8a2ef43f1cbf40876b637522c60a81f511445f8dc17" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x1f86c65842afb760457d5ce8ad38821d2110331a7bbae87fe131a5e610f3a146" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x4add0a7a5c74a56ce64a3555b4a73f367c414c80ecc15672dd86f7bff8bf65bc" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x1daedaae87fc34d28ec3116dc04386c7c650f5db9e3a9a853c6e518821069bda" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0x1c6cf42ace3bf6b1a7e60ae29dc10aad67cdf672cdb083c601ee3996576cc2e4" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0xa1a8ab20062ebdcfa7a6e8f0c6c8b3de823920abd351eedc33d043de1c144988" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x71c734d6d77806f9475b69c8426bc5c09ce54c0b4ccb13df4315c62899e99262" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0xf459d25426b21e5f2f6bdabf5e6a79f36002114b1ecc5cfa30a18cf3e4baf98d" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0xad42157822143a7be209b907901a31863d1b35ad9118c4c45d476e405872fb66" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x7badaf21d00ca7e2a73c64dd7738ddcb6a881dcfb88ef0c171e33bfec529fe0a" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x00", + "0xe0a6008bab76556dbf47269adc41d6820c6a55982e9362257bfdf02a79ff5b8d" + ] + }, + { + "constructor" : "Pair", + "argtypes" : ["ByStr1", "ByStr32"], + "arguments" : [ + "0x01", + "0x061cd147d032d11b1b7b6b5edc389f56d33f939e51be3c7949b357aac4e120df" + ] + } + ] + ] + } + }, + { + "vname" : "curRawHeader", + "type" : "ByStr", + "value" : "0x000000009b91561700000000f2e3823838bcdfafe08c6e9ff2cd1f86ae65dfc1052d15c9441aa6c07097015f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051d45928d93800ffebc80373df7dbe735a2e9c5998b883e69494921fedbbe858057f1a5f5a8e0000216854be71737efbfd10017b226c6561646572223a362c227672665f76616c7565223a224244592f6c4875783448587341376f394962357877634a4d39727466656a454c786d6637766a48583574507a64724d356a47304a305265756d4338632f6e64725131306b4751622f50537a3255667a6267723430666a413d222c227672665f70726f6f66223a2242437877375a6d49446243476a3839576e715744564f6b714f7239645574344f4f2f777176366d4c3165656377474d542b3078664476544642614f3951534451437879725551344c316835392b3130486671386176673d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a33363433322c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000" + }, + { + "vname" : "headerSig", + "type" : "List Polynetwork.Signature", + "value" : [ + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x6d905d095fc1b47eb30b8f176c94b01b64502790f3c20db2a5b7e555791bdbf8458a24c73c8f690ad8481e3754c3297991f9f4148d03316e2e5a6c6af9e7bbc900"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xa81911a6eb529979ee021124c242a828657865fc7a899ab55fb7d2a1623341a67ae83c90a40bec8bf54fa3c5caad445062568d3c4c4099e84ad6c774e70d7d7d00"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x0b5d0a2ebc3685a6deeb96cfabf71e4a9d05606a5918e4765be6cc4cad38c3954e248d97b2fa378b954f323335c93298913c61048cf0b396467df1c6b6bbba4d01"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xcd68657ad3c6d5a979093ff1345eefb269e86498b519418fa0e5e756ce01a9b939d46b405d2a167883bda0a40023cce39659890c97a59e3f772b6fc3c2e0322100"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x4d425ad3bfef2de8b1d523cbfd754d4ea2c8e8fa5f6904b0389f4e5d62039083454e2a24da6e1c90334fd760eaa1921bdac10158758f682cb401e1df16ee0ec801"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0xb8e8eb23200a1571c6ad516528ce3f1280506eed9f1e380b9a5e770f1e89d8414182c7b83dc8f230d288c4745d0a8102cfc015d422af77d139bc606054363ecf01"] + }, + { + "constructor" : "Polynetwork.Signature", + "argtypes" : [], + "arguments" : ["0x38fc63be97c354539b517bd8abd97d86fa3484894663aa7dcf578cfad7368df577206e28daf800cba179314f34f1a6dec569ff12e15c22b598028cce64bfa54601"] + } + ] + } + ] +} diff --git a/tests/runner/Polynetwork/output_3.json b/tests/runner/Polynetwork/output_3.json new file mode 100644 index 000000000..53ef4e779 --- /dev/null +++ b/tests/runner/Polynetwork/output_3.json @@ -0,0 +1,64 @@ +{ + "scilla_major_version": "0", + "gas_remaining": "1851", + "_accepted": "false", + "messages": [], + "states": [ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0xb27c53c3fac2d374d86187a51c5e4404fc51bc04", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "36432" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } + ], + "events": [ + { + "_eventname": "ChangeBookKeeper", + "params": [ + { "vname": "height", "type": "Uint32", "value": "36432" }, + { + "vname": "header", + "type": "ByStr", + "value": + "0x000000009b91561700000000f48a4057bef268cc3fdb034e69dc2e942907e08ac4a420d1b196b8c28ebf5bf2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a8be0a1605a63a31704aec4eb4f1023f1ecc2934bd86f119ab77526f9477af9a57e1a5f508e0000410782720ab189fffd84057b226c6561646572223a332c227672665f76616c7565223a22424f4f336f58796b32524970655651593338547133714a423832737a4a68366e4f6f724a55702f4a4d582b474c707a347a497347394c4a6c34784a6f34657448674f56357169364d484b6674714f69724f755a495a69593d222c227672665f70726f6f66223a22635953525746506f69394748414247526255646836612b35506f4f317776354a557a53417457786845637071757430536a595873344c7453353574534a74334174493059616d4c67524a797a524f68564756626d34673d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a33363433322c226e65775f636861696e5f636f6e666967223a7b2276657273696f6e223a312c2276696577223a342c226e223a382c2263223a322c22626c6f636b5f6d73675f64656c6179223a31303030303030303030302c22686173685f6d73675f64656c6179223a31303030303030303030302c22706565725f68616e647368616b655f74696d656f7574223a31303030303030303030302c227065657273223a5b7b22696e646578223a312c226964223a2231323035303238313732393138353430623262353132656165313837326132613265336132386439383963363064393564616238383239616461376437646437303664363538227d2c7b22696e646578223a342c226964223a2231323035303236373939333061343261616633633639373938636138613366313265313334633031393430353831386437383364313137343865303339646538353135393838227d2c7b22696e646578223a332c226964223a2231323035303234383261636236353634623139623930363533663665396338303632393265386161383366373865376139333832613234613665666534316330633036663339227d2c7b22696e646578223a352c226964223a2231323035303234363864643138393965643264316363326238323938383261313635613065636236613734356166306337326562323938326436366234333131623465663733227d2c7b22696e646578223a382c226964223a2231323035303339333432313434356239343231626434636339306437626338386339333031353538303437613736623230633539653763353131656537643232393938326231227d2c7b22696e646578223a322c226964223a2231323035303338623861663632313065636664636263616232323535326566386438636634316336663836663963663961623533643836353734316366646238333366303662227d2c7b22696e646578223a372c226964223a2231323035303331653037373966356335636362323631323335326665346132303066393964336537373538653730626135336636303763353966663232613330663637386666227d2c7b22696e646578223a362c226964223a2231323035303265623162616162363032633538393932383235363163646161613761616262636464306363666362633365373937393361633234616366393037373866333561227d5d2c22706f735f7461626c65223a5b322c382c352c352c382c372c312c342c352c362c352c342c372c372c332c332c342c362c312c322c342c382c352c342c372c342c362c362c322c322c312c312c382c382c362c362c362c372c382c372c342c382c352c312c332c332c382c352c332c362c332c362c372c352c362c322c332c312c322c362c352c322c312c342c322c312c382c342c382c332c382c372c372c352c312c372c342c342c312c352c322c352c362c312c322c382c332c332c312c332c312c342c312c372c382c362c382c322c352c312c342c352c332c322c322c322c382c332c332c332c362c372c342c372c342c322c372c352c362c375d2c226d61785f626c6f636b5f6368616e67655f76696577223a36303030307d7df8fc7a1f6a856313c591a3a747f4eca7218a820b" + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/runner/Polynetwork/output_4.json b/tests/runner/Polynetwork/output_4.json new file mode 100644 index 000000000..f42d7e25a --- /dev/null +++ b/tests/runner/Polynetwork/output_4.json @@ -0,0 +1,109 @@ +{ + "scilla_major_version": "0", + "gas_remaining": "2262", + "_accepted": "false", + "messages": [ + { + "_tag": "unlock", + "_amount": "0", + "_recipient": "0x4ddcf539d13e92d4151b7f5e607d4a09f725c47d", + "params": [ + { + "vname": "args", + "type": "ByStr", + "value": + "0x14000000000000000000000000000000000000000014344cfc3b8635f72f14200aaf2168d9f75df86fd36226100000000000000000000000000000000000000000000000000000000000" + }, + { + "vname": "fromContractAddr", + "type": "ByStr", + "value": "0xf71b55ef55cedc91fd007f7a9ba386ec978f3aa8" + }, + { "vname": "fromChainId", "type": "Uint64", "value": "8" } + ] + } + ], + "states": [ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0xb27c53c3fac2d374d86187a51c5e4404fc51bc04", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "36432" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "8", + "val": [ + { + "key": + "0xe91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + }, + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } + ], + "events": [ + { + "_eventname": "VerifyHeaderAndExecuteTxEvent", + "params": [ + { "vname": "fromChainId", "type": "Uint64", "value": "8" }, + { + "vname": "toContractAddr", + "type": "ByStr20", + "value": "0x4ddcf539d13e92d4151b7f5e607d4a09f725c47d" + }, + { + "vname": "crossChainTxHash", + "type": "ByStr", + "value": + "0xe91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c" + }, + { + "vname": "fromChainTxHash", + "type": "ByStr", + "value": + "0xb697330bd7a5850235f97d1bcd1c37739f4bc79a4f8e635dcb46ba45bc600ef4" + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/runner/Polynetwork/state_25.json b/tests/runner/Polynetwork/state_25.json new file mode 100644 index 000000000..39a06cb4a --- /dev/null +++ b/tests/runner/Polynetwork/state_25.json @@ -0,0 +1,28 @@ +[ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "0" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [] + } +] diff --git a/tests/runner/Polynetwork/state_26.json b/tests/runner/Polynetwork/state_26.json new file mode 100644 index 000000000..64c343717 --- /dev/null +++ b/tests/runner/Polynetwork/state_26.json @@ -0,0 +1,43 @@ +[ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "0" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } +] diff --git a/tests/runner/Polynetwork/state_27.json b/tests/runner/Polynetwork/state_27.json new file mode 100644 index 000000000..1ff6ec3bf --- /dev/null +++ b/tests/runner/Polynetwork/state_27.json @@ -0,0 +1,44 @@ +[ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0xb27c53c3fac2d374d86187a51c5e4404fc51bc04", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "36432" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } +] diff --git a/tests/runner/Polynetwork/state_28.json b/tests/runner/Polynetwork/state_28.json new file mode 100644 index 000000000..2dba28b1a --- /dev/null +++ b/tests/runner/Polynetwork/state_28.json @@ -0,0 +1,58 @@ +[ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0xb27c53c3fac2d374d86187a51c5e4404fc51bc04", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "36432" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "8", + "val": [ + { + "key": + "0xe91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + }, + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } +] diff --git a/tests/runner/Polynetwork/state_3.json b/tests/runner/Polynetwork/state_3.json new file mode 100644 index 000000000..64c343717 --- /dev/null +++ b/tests/runner/Polynetwork/state_3.json @@ -0,0 +1,43 @@ +[ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "0" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } +] diff --git a/tests/runner/Polynetwork/state_4.json b/tests/runner/Polynetwork/state_4.json new file mode 100644 index 000000000..1ff6ec3bf --- /dev/null +++ b/tests/runner/Polynetwork/state_4.json @@ -0,0 +1,44 @@ +[ + { "vname": "_balance", "type": "Uint128", "value": "0" }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [ + "0x09732fac787afb2c5d3abb45f3927da18504f10f", + "0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8", + "0xa42a4e85034d5bebc225743da400cc4c0e43727a", + "0x5d60f39ab5bec41fa712562a5c098d8a128cd406", + "0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f", + "0xb98d72dc7743ede561f225e1bf258f49aea8f786", + "0xb27c53c3fac2d374d86187a51c5e4404fc51bc04", + "0x02cbc020209ef8835388882e2c4c4e6acef96f28" + ] + }, + { "vname": "f_curStartHeight", "type": "Uint32", "value": "36432" }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { "vname": "f_zilToPolyTxHashIndex", "type": "Uint256", "value": "0" }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [ + { + "key": "3", + "val": [ + { + "key": + "0x00ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd6", + "val": { + "constructor": "Polynetwork.Unit", + "argtypes": [], + "arguments": [] + } + } + ] + } + ] + } +] diff --git a/tests/runner/Testcontracts.ml b/tests/runner/Testcontracts.ml index 6a5434ff6..05ee812da 100644 --- a/tests/runner/Testcontracts.ml +++ b/tests/runner/Testcontracts.ml @@ -334,6 +334,8 @@ let contract_tests env = >::: build_contract_tests env "multiple-msgs" succ_code 1 1 []; "listiter" >::: build_contract_tests env "listiter" succ_code 1 1 []; + "polynetwork" + >::: build_contract_tests env "Polynetwork" succ_code 1 4 []; ]; "these_tests_must_FAIL" >::: [ @@ -343,6 +345,8 @@ let contract_tests env = >::: build_contract_tests env "mappair" fail_code 8 8 []; "mappair" >::: build_contract_tests env "mappair" fail_code 12 14 []; + "polynetwork" + >::: build_contract_tests env "Polynetwork" fail_code 25 28 []; "exception-example" >::: build_contract_tests env "exception-example" fail_code 1 2 []; From 88aa15ae044d1d99f93bf96f7554976b302230c5 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Sun, 20 Dec 2020 10:36:35 +0530 Subject: [PATCH 30/33] Incorporate _origin and fix all tests --- tests/contracts/Polynetwork.scilla | 3 +-- tests/eval/bad/gold/app_error1.scilexp.gold | 2 +- tests/eval/bad/gold/app_error2.scilexp.gold | 2 +- tests/eval/bad/gold/blowup.scilexp.gold | 2 +- .../gold/builtin-alt-bn128-add.scilexp.gold | 2 +- .../gold/builtin-alt-bn128-mul.scilexp.gold | 2 +- .../bad/gold/builtin-bech32-1.scilexp.gold | 2 +- .../bad/gold/builtin-bech32-2.scilexp.gold | 2 +- .../bad/gold/builtin-bech32-3.scilexp.gold | 2 +- .../bad/gold/builtin-divzero.scilexp.gold | 2 +- .../bad/gold/builtin-divzero2.scilexp.gold | 2 +- .../bad/gold/builtin-divzero3.scilexp.gold | 2 +- .../bad/gold/builtin-divzero4.scilexp.gold | 2 +- .../bad/gold/builtin-overflow1.scilexp.gold | 2 +- .../bad/gold/builtin-overflow10.scilexp.gold | 2 +- .../bad/gold/builtin-overflow11.scilexp.gold | 2 +- .../bad/gold/builtin-overflow12.scilexp.gold | 2 +- .../bad/gold/builtin-overflow13.scilexp.gold | 2 +- .../bad/gold/builtin-overflow14.scilexp.gold | 2 +- .../bad/gold/builtin-overflow2.scilexp.gold | 2 +- .../bad/gold/builtin-overflow3.scilexp.gold | 2 +- .../bad/gold/builtin-overflow5.scilexp.gold | 2 +- .../bad/gold/builtin-overflow6.scilexp.gold | 2 +- .../bad/gold/builtin-overflow7.scilexp.gold | 2 +- .../bad/gold/builtin-overflow8.scilexp.gold | 2 +- .../bad/gold/builtin-overflow9.scilexp.gold | 2 +- tests/eval/bad/gold/builtin-pow.scilexp.gold | 2 +- tests/eval/bad/gold/builtin-pow2.scilexp.gold | 2 +- .../bad/gold/builtin-remzero.scilexp.gold | 2 +- tests/eval/bad/gold/builtin4.scilexp.gold | 2 +- tests/eval/bad/gold/let-error.scilexp.gold | 2 +- tests/eval/bad/gold/msg_error.scilexp.gold | 2 +- tests/eval/bad/gold/msg_error2.scilexp.gold | 2 +- tests/eval/bad/gold/msg_error3.scilexp.gold | 2 +- .../eval/bad/gold/string_error2.scilexp.gold | 2 +- tests/eval/bad/gold/substr_err1.scilexp.gold | 2 +- tests/eval/good/Good.ml | 2 +- tests/eval/good/gold/ackermann.scilexp.gold | 2 +- tests/eval/good/gold/addr.scilexp.gold | 2 +- tests/eval/good/gold/app.scilexp.gold | 2 +- tests/eval/good/gold/app2.scilexp.gold | 2 +- tests/eval/good/gold/app3.scilexp.gold | 2 +- tests/eval/good/gold/app4.scilexp.gold | 2 +- tests/eval/good/gold/app5.scilexp.gold | 2 +- .../good/gold/builtin-alt-bn128.scilexp.gold | 2 +- .../eval/good/gold/builtin-badd.scilexp.gold | 2 +- .../good/gold/builtin-bech32-1.scilexp.gold | 2 +- .../good/gold/builtin-bech32-2.scilexp.gold | 2 +- .../eval/good/gold/builtin-bsub.scilexp.gold | 2 +- tests/eval/good/gold/builtin-div.scilexp.gold | 2 +- .../eval/good/gold/builtin-div2.scilexp.gold | 2 +- .../eval/good/gold/builtin-div3.scilexp.gold | 2 +- .../eval/good/gold/builtin-div4.scilexp.gold | 2 +- .../gold/builtin-ecdsa_recover.scilexp.gold | 2 +- .../good/gold/builtin-eq-bystr.scilexp.gold | 2 +- .../eval/good/gold/builtin-isqrt.scilexp.gold | 2 +- tests/eval/good/gold/builtin-pow.scilexp.gold | 2 +- tests/eval/good/gold/builtin-rem.scilexp.gold | 2 +- .../eval/good/gold/builtin-rem2.scilexp.gold | 2 +- .../eval/good/gold/builtin-rem3.scilexp.gold | 2 +- .../builtin-schnorr_get_address.scilexp.gold | 2 +- .../good/gold/builtin-strings.scilexp.gold | 2 +- tests/eval/good/gold/builtin1.scilexp.gold | 2 +- tests/eval/good/gold/builtin2.scilexp.gold | 2 +- tests/eval/good/gold/builtin3.scilexp.gold | 2 +- tests/eval/good/gold/builtin5.scilexp.gold | 2 +- tests/eval/good/gold/builtin6.scilexp.gold | 2 +- tests/eval/good/gold/cons.scilexp.gold | 2 +- tests/eval/good/gold/fib.scilexp.gold | 2 +- tests/eval/good/gold/func_pair.scilexp.gold | 2 +- tests/eval/good/gold/hash1.scilexp.gold | 2 +- tests/eval/good/gold/hash2.scilexp.gold | 2 +- tests/eval/good/gold/hash3.scilexp.gold | 2 +- tests/eval/good/gold/hash4.scilexp.gold | 2 +- tests/eval/good/gold/hash5.scilexp.gold | 2 +- .../good/gold/hash_map_stable1.scilexp.gold | 2 +- .../good/gold/hash_map_stable2.scilexp.gold | 2 +- .../good/gold/hash_map_stable3.scilexp.gold | 2 +- tests/eval/good/gold/hof.scilexp.gold | 2 +- tests/eval/good/gold/hof2.scilexp.gold | 2 +- tests/eval/good/gold/hof3.scilexp.gold | 2 +- tests/eval/good/gold/id.scilexp.gold | 2 +- .../good/gold/int_conversions.scilexp.gold | 2 +- tests/eval/good/gold/int_to_nat.scilexp.gold | 2 +- tests/eval/good/gold/keccak256_1.scilexp.gold | 2 +- tests/eval/good/gold/keccak256_2.scilexp.gold | 2 +- tests/eval/good/gold/keccak256_3.scilexp.gold | 2 +- tests/eval/good/gold/keccak256_4.scilexp.gold | 2 +- tests/eval/good/gold/keccak256_5.scilexp.gold | 2 +- tests/eval/good/gold/let-builtin.scilexp.gold | 2 +- tests/eval/good/gold/let.scilexp.gold | 2 +- .../eval/good/gold/let_in_let_in.scilexp.gold | 2 +- tests/eval/good/gold/list_append.scilexp.gold | 2 +- tests/eval/good/gold/list_eq.scilexp.gold | 2 +- tests/eval/good/gold/list_exists.scilexp.gold | 2 +- tests/eval/good/gold/list_filter.scilexp.gold | 2 +- tests/eval/good/gold/list_find.scilexp.gold | 2 +- .../eval/good/gold/list_flatten.scilexp.gold | 2 +- tests/eval/good/gold/list_foldl.scilexp.gold | 2 +- .../good/gold/list_foldl_while.scilexp.gold | 2 +- tests/eval/good/gold/list_foldr.scilexp.gold | 2 +- tests/eval/good/gold/list_forall.scilexp.gold | 2 +- tests/eval/good/gold/list_head.scilexp.gold | 2 +- tests/eval/good/gold/list_length.scilexp.gold | 2 +- tests/eval/good/gold/list_map.scilexp.gold | 2 +- tests/eval/good/gold/list_mem.scilexp.gold | 2 +- tests/eval/good/gold/list_nth.scilexp.gold | 2 +- .../eval/good/gold/list_product.scilexp.gold | 2 +- .../eval/good/gold/list_reverse.scilexp.gold | 2 +- tests/eval/good/gold/list_sort.scilexp.gold | 2 +- .../eval/good/gold/list_sort_eq.scilexp.gold | 2 +- tests/eval/good/gold/list_tail.scilexp.gold | 2 +- tests/eval/good/gold/list_tail1.scilexp.gold | 2 +- tests/eval/good/gold/list_tail2.scilexp.gold | 2 +- tests/eval/good/gold/list_unzip.scilexp.gold | 2 +- tests/eval/good/gold/list_zip.scilexp.gold | 2 +- .../eval/good/gold/list_zip_with.scilexp.gold | 2 +- tests/eval/good/gold/map1.scilexp.gold | 2 +- tests/eval/good/gold/map2.scilexp.gold | 2 +- tests/eval/good/gold/map3.scilexp.gold | 2 +- tests/eval/good/gold/map4.scilexp.gold | 2 +- tests/eval/good/gold/map5.scilexp.gold | 2 +- tests/eval/good/gold/map6.scilexp.gold | 2 +- .../map_no_keeping_old_bindings.scilexp.gold | 2 +- .../gold/map_remove_no_exception.scilexp.gold | 2 +- tests/eval/good/gold/map_to_list.scilexp.gold | 2 +- tests/eval/good/gold/msg.scilexp.gold | 2 +- .../eval/good/gold/nat_eq_false.scilexp.gold | 2 +- .../eval/good/gold/nat_eq_foldl.scilexp.gold | 2 +- .../good/gold/nat_fold_stress.scilexp.gold | 2 +- tests/eval/good/gold/nat_to_int.scilexp.gold | 2 +- tests/eval/good/gold/option.scilexp.gold | 2 +- tests/eval/good/gold/pair1.scilexp.gold | 2 +- tests/eval/good/gold/pair2.scilexp.gold | 2 +- tests/eval/good/gold/pair3.scilexp.gold | 2 +- tests/eval/good/gold/pm1.scilexp.gold | 2 +- tests/eval/good/gold/pm2.scilexp.gold | 2 +- tests/eval/good/gold/pm3.scilexp.gold | 2 +- tests/eval/good/gold/pm_app.scilexp.gold | 2 +- tests/eval/good/gold/pm_nesting.scilexp.gold | 2 +- ...polynetwork_deserialize_proof.scilexp.gold | 13 ++++++++++ .../polynetwork_extract_bystr1.scilexp.gold | 13 ++++++++++ .../polynetwork_extract_bystr2.scilexp.gold | 13 ++++++++++ .../polynetwork_extract_bystr3.scilexp.gold | 13 ++++++++++ .../polynetwork_getBookKeeper.scilexp.gold | 26 +++++++++++++++++++ .../good/gold/polynetwork_header.scilexp.gold | 4 +-- .../polynetwork_next_var_uint1.scilexp.gold | 10 +++++++ .../polynetwork_next_var_uint2.scilexp.gold | 13 ++++++++++ .../polynetwork_next_var_uint3.scilexp.gold | 13 ++++++++++ .../polynetwork_next_var_uint4.scilexp.gold | 13 ++++++++++ .../polynetwork_next_var_uint5.scilexp.gold | 13 ++++++++++ .../polynetwork_next_var_uint6.scilexp.gold | 13 ++++++++++ .../polynetwork_next_var_uint7.scilexp.gold | 13 ++++++++++ tests/eval/good/gold/ripemd160_1.scilexp.gold | 2 +- tests/eval/good/gold/ripemd160_2.scilexp.gold | 2 +- tests/eval/good/gold/ripemd160_5.scilexp.gold | 2 +- tests/eval/good/gold/str-char-1.scilexp.gold | 2 +- tests/eval/good/gold/string1.scilexp.gold | 2 +- tests/eval/good/gold/string2.scilexp.gold | 2 +- tests/eval/good/gold/times_two.scilexp.gold | 2 +- tests/eval/good/gold/to_bystr.scilexp.gold | 2 +- tests/eval/good/gold/type_subst1.scilexp.gold | 2 +- tests/eval/good/gold/type_subst2.scilexp.gold | 2 +- .../good/gold/uint_conversions.scilexp.gold | 2 +- tests/runner/Polynetwork/message_1.json | 1 + tests/runner/Polynetwork/message_2.json | 1 + tests/runner/Polynetwork/message_25.json | 1 + tests/runner/Polynetwork/message_26.json | 1 + tests/runner/Polynetwork/message_27.json | 1 + tests/runner/Polynetwork/message_28.json | 1 + tests/runner/Polynetwork/message_3.json | 1 + tests/runner/Polynetwork/message_4.json | 1 + tests/runner/Polynetwork/output_1.json | 2 +- tests/runner/Polynetwork/output_2.json | 2 +- tests/runner/Polynetwork/output_25.json | 25 ++++++++++++++++++ tests/runner/Polynetwork/output_26.json | 25 ++++++++++++++++++ tests/runner/Polynetwork/output_27.json | 25 ++++++++++++++++++ tests/runner/Polynetwork/output_28.json | 25 ++++++++++++++++++ tests/runner/Polynetwork/output_3.json | 2 +- tests/runner/Polynetwork/output_4.json | 2 +- tests/runner/Polynetwork/state_1.json | 25 ++++++++++++++++++ 181 files changed, 456 insertions(+), 158 deletions(-) create mode 100644 tests/eval/good/gold/polynetwork_deserialize_proof.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_extract_bystr1.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_extract_bystr2.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_extract_bystr3.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_getBookKeeper.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_next_var_uint1.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_next_var_uint2.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_next_var_uint3.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_next_var_uint4.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_next_var_uint5.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_next_var_uint6.scilexp.gold create mode 100644 tests/eval/good/gold/polynetwork_next_var_uint7.scilexp.gold create mode 100644 tests/runner/Polynetwork/output_25.json create mode 100644 tests/runner/Polynetwork/output_26.json create mode 100644 tests/runner/Polynetwork/output_27.json create mode 100644 tests/runner/Polynetwork/output_28.json diff --git a/tests/contracts/Polynetwork.scilla b/tests/contracts/Polynetwork.scilla index 3b023fa42..92640e7b7 100644 --- a/tests/contracts/Polynetwork.scilla +++ b/tests/contracts/Polynetwork.scilla @@ -292,9 +292,8 @@ transition crossChain(toChainId : Uint64, toContract : ByStr, method : ByStr, tx rawParam = append_TxParam empty_bystr txp; rawParamHash = builtin keccak256hash rawParam; updateZilTxHash txHashIndex rawParamHash; - (* Create an event: TODO: What is equivalent of tx.origin? *) e = { _eventname : "CrossChainEvent"; - origin : _sender; + origin : _origin; paramTxHash : paramTxHash; sender : _sender; toChainId : toChainId; diff --git a/tests/eval/bad/gold/app_error1.scilexp.gold b/tests/eval/bad/gold/app_error1.scilexp.gold index 811c24518..6a19249a7 100644 --- a/tests/eval/bad/gold/app_error1.scilexp.gold +++ b/tests/eval/bad/gold/app_error1.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001742", + "gas_remaining": "4001224", "errors": [ { "error_message": "Not a functional value: (Int32 2).", diff --git a/tests/eval/bad/gold/app_error2.scilexp.gold b/tests/eval/bad/gold/app_error2.scilexp.gold index 84e142513..acdbc3ba0 100644 --- a/tests/eval/bad/gold/app_error2.scilexp.gold +++ b/tests/eval/bad/gold/app_error2.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001746", + "gas_remaining": "4001228", "errors": [ { "error_message": "Not a functional value: (Int64 1).", diff --git a/tests/eval/bad/gold/blowup.scilexp.gold b/tests/eval/bad/gold/blowup.scilexp.gold index 9c1355d3a..b14cfe212 100644 --- a/tests/eval/bad/gold/blowup.scilexp.gold +++ b/tests/eval/bad/gold/blowup.scilexp.gold @@ -3,7 +3,7 @@ "errors": [ { "error_message": "Ran out of gas.\n", - "start_location": { "file": "Prelude", "line": 1, "column": 37 }, + "start_location": { "file": "Prelude", "line": 1, "column": 74 }, "end_location": { "file": "", "line": 0, "column": 0 } } ], diff --git a/tests/eval/bad/gold/builtin-alt-bn128-add.scilexp.gold b/tests/eval/bad/gold/builtin-alt-bn128-add.scilexp.gold index 38968dd04..3d67d742a 100644 --- a/tests/eval/bad/gold/builtin-alt-bn128-add.scilexp.gold +++ b/tests/eval/bad/gold/builtin-alt-bn128-add.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001740", + "gas_remaining": "4001222", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-alt-bn128-mul.scilexp.gold b/tests/eval/bad/gold/builtin-alt-bn128-mul.scilexp.gold index 18c71fbe8..3c09f5a0b 100644 --- a/tests/eval/bad/gold/builtin-alt-bn128-mul.scilexp.gold +++ b/tests/eval/bad/gold/builtin-alt-bn128-mul.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001744", + "gas_remaining": "4001226", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-bech32-1.scilexp.gold b/tests/eval/bad/gold/builtin-bech32-1.scilexp.gold index 104b15a48..a8492771d 100644 --- a/tests/eval/bad/gold/builtin-bech32-1.scilexp.gold +++ b/tests/eval/bad/gold/builtin-bech32-1.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001505", + "gas_remaining": "4000987", "errors": [ { "error_message": "Only zil and tzil bech32 addresses are supported", diff --git a/tests/eval/bad/gold/builtin-bech32-2.scilexp.gold b/tests/eval/bad/gold/builtin-bech32-2.scilexp.gold index 41865696f..8f3b8ff10 100644 --- a/tests/eval/bad/gold/builtin-bech32-2.scilexp.gold +++ b/tests/eval/bad/gold/builtin-bech32-2.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001593", + "gas_remaining": "4001075", "errors": [ { "error_message": "Only zil and tzil bech32 addresses are supported", diff --git a/tests/eval/bad/gold/builtin-bech32-3.scilexp.gold b/tests/eval/bad/gold/builtin-bech32-3.scilexp.gold index 00713dcab..3f476d92a 100644 --- a/tests/eval/bad/gold/builtin-bech32-3.scilexp.gold +++ b/tests/eval/bad/gold/builtin-bech32-3.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001505", + "gas_remaining": "4000987", "errors": [ { "error_message": "bech32 decoding failed", diff --git a/tests/eval/bad/gold/builtin-divzero.scilexp.gold b/tests/eval/bad/gold/builtin-divzero.scilexp.gold index b455f4044..533cd5a29 100644 --- a/tests/eval/bad/gold/builtin-divzero.scilexp.gold +++ b/tests/eval/bad/gold/builtin-divzero.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001729", + "gas_remaining": "4001211", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-divzero2.scilexp.gold b/tests/eval/bad/gold/builtin-divzero2.scilexp.gold index 9c758b8f9..b768d8b8d 100644 --- a/tests/eval/bad/gold/builtin-divzero2.scilexp.gold +++ b/tests/eval/bad/gold/builtin-divzero2.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001729", + "gas_remaining": "4001211", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-divzero3.scilexp.gold b/tests/eval/bad/gold/builtin-divzero3.scilexp.gold index e8f38a53d..9733c8c3c 100644 --- a/tests/eval/bad/gold/builtin-divzero3.scilexp.gold +++ b/tests/eval/bad/gold/builtin-divzero3.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001669", + "gas_remaining": "4001151", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-divzero4.scilexp.gold b/tests/eval/bad/gold/builtin-divzero4.scilexp.gold index 33045d125..6ba51aa19 100644 --- a/tests/eval/bad/gold/builtin-divzero4.scilexp.gold +++ b/tests/eval/bad/gold/builtin-divzero4.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001669", + "gas_remaining": "4001151", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow1.scilexp.gold b/tests/eval/bad/gold/builtin-overflow1.scilexp.gold index 6bc6fcdae..b31a74e2e 100644 --- a/tests/eval/bad/gold/builtin-overflow1.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow1.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001738", + "gas_remaining": "4001220", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow10.scilexp.gold b/tests/eval/bad/gold/builtin-overflow10.scilexp.gold index edc129615..67c4a13a6 100644 --- a/tests/eval/bad/gold/builtin-overflow10.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow10.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001733", + "gas_remaining": "4001215", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow11.scilexp.gold b/tests/eval/bad/gold/builtin-overflow11.scilexp.gold index 3a1c16232..610b672d2 100644 --- a/tests/eval/bad/gold/builtin-overflow11.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow11.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001733", + "gas_remaining": "4001215", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow12.scilexp.gold b/tests/eval/bad/gold/builtin-overflow12.scilexp.gold index 00aa570d7..1a97a8561 100644 --- a/tests/eval/bad/gold/builtin-overflow12.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow12.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001733", + "gas_remaining": "4001215", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow13.scilexp.gold b/tests/eval/bad/gold/builtin-overflow13.scilexp.gold index bd4dbe917..ed732105a 100644 --- a/tests/eval/bad/gold/builtin-overflow13.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow13.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001739", + "gas_remaining": "4001221", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow14.scilexp.gold b/tests/eval/bad/gold/builtin-overflow14.scilexp.gold index 2e5470f4e..6d6610417 100644 --- a/tests/eval/bad/gold/builtin-overflow14.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow14.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001737", + "gas_remaining": "4001219", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow2.scilexp.gold b/tests/eval/bad/gold/builtin-overflow2.scilexp.gold index 65c9532ec..f4f8e4343 100644 --- a/tests/eval/bad/gold/builtin-overflow2.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow2.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001725", + "gas_remaining": "4001207", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow3.scilexp.gold b/tests/eval/bad/gold/builtin-overflow3.scilexp.gold index 73f63ce1c..bcb3d0440 100644 --- a/tests/eval/bad/gold/builtin-overflow3.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow3.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001725", + "gas_remaining": "4001207", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow5.scilexp.gold b/tests/eval/bad/gold/builtin-overflow5.scilexp.gold index bc0533de4..689b4c9b4 100644 --- a/tests/eval/bad/gold/builtin-overflow5.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow5.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001729", + "gas_remaining": "4001211", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow6.scilexp.gold b/tests/eval/bad/gold/builtin-overflow6.scilexp.gold index f5a03f67d..090d3aff5 100644 --- a/tests/eval/bad/gold/builtin-overflow6.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow6.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001729", + "gas_remaining": "4001211", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow7.scilexp.gold b/tests/eval/bad/gold/builtin-overflow7.scilexp.gold index 9c72995ab..3d2c2bcf1 100644 --- a/tests/eval/bad/gold/builtin-overflow7.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow7.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001745", + "gas_remaining": "4001227", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow8.scilexp.gold b/tests/eval/bad/gold/builtin-overflow8.scilexp.gold index 7559fd423..50886f767 100644 --- a/tests/eval/bad/gold/builtin-overflow8.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow8.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001745", + "gas_remaining": "4001227", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-overflow9.scilexp.gold b/tests/eval/bad/gold/builtin-overflow9.scilexp.gold index 622de957a..db759800e 100644 --- a/tests/eval/bad/gold/builtin-overflow9.scilexp.gold +++ b/tests/eval/bad/gold/builtin-overflow9.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001745", + "gas_remaining": "4001227", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-pow.scilexp.gold b/tests/eval/bad/gold/builtin-pow.scilexp.gold index 2bdab6a24..788876e03 100644 --- a/tests/eval/bad/gold/builtin-pow.scilexp.gold +++ b/tests/eval/bad/gold/builtin-pow.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001753", + "gas_remaining": "4001235", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-pow2.scilexp.gold b/tests/eval/bad/gold/builtin-pow2.scilexp.gold index 25be6f4a4..890294ec1 100644 --- a/tests/eval/bad/gold/builtin-pow2.scilexp.gold +++ b/tests/eval/bad/gold/builtin-pow2.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4000953", + "gas_remaining": "4000435", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin-remzero.scilexp.gold b/tests/eval/bad/gold/builtin-remzero.scilexp.gold index 71a1af214..735e966b9 100644 --- a/tests/eval/bad/gold/builtin-remzero.scilexp.gold +++ b/tests/eval/bad/gold/builtin-remzero.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001729", + "gas_remaining": "4001211", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/builtin4.scilexp.gold b/tests/eval/bad/gold/builtin4.scilexp.gold index 2d07f704e..8d33a2500 100644 --- a/tests/eval/bad/gold/builtin4.scilexp.gold +++ b/tests/eval/bad/gold/builtin4.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001742", + "gas_remaining": "4001224", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/let-error.scilexp.gold b/tests/eval/bad/gold/let-error.scilexp.gold index a51b7610c..6d4782bb8 100644 --- a/tests/eval/bad/gold/let-error.scilexp.gold +++ b/tests/eval/bad/gold/let-error.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001749", + "gas_remaining": "4001231", "errors": [ { "error_message": "Identifier \"oops\" is not bound in environment:\n", diff --git a/tests/eval/bad/gold/msg_error.scilexp.gold b/tests/eval/bad/gold/msg_error.scilexp.gold index a8595bff1..6b0b830ee 100644 --- a/tests/eval/bad/gold/msg_error.scilexp.gold +++ b/tests/eval/bad/gold/msg_error.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001747", + "gas_remaining": "4001229", "errors": [ { "error_message": "Cannot type runtime closure.", diff --git a/tests/eval/bad/gold/msg_error2.scilexp.gold b/tests/eval/bad/gold/msg_error2.scilexp.gold index e92c5a72b..73c2a6928 100644 --- a/tests/eval/bad/gold/msg_error2.scilexp.gold +++ b/tests/eval/bad/gold/msg_error2.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001745", + "gas_remaining": "4001227", "errors": [ { "error_message": diff --git a/tests/eval/bad/gold/msg_error3.scilexp.gold b/tests/eval/bad/gold/msg_error3.scilexp.gold index 7840d6d24..0a00661ed 100644 --- a/tests/eval/bad/gold/msg_error3.scilexp.gold +++ b/tests/eval/bad/gold/msg_error3.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001745", + "gas_remaining": "4001227", "errors": [ { "error_message": "Identifier \"o\" is not bound in environment:\n", diff --git a/tests/eval/bad/gold/string_error2.scilexp.gold b/tests/eval/bad/gold/string_error2.scilexp.gold index 1f30b0ba5..c886dc96d 100644 --- a/tests/eval/bad/gold/string_error2.scilexp.gold +++ b/tests/eval/bad/gold/string_error2.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001754", + "gas_remaining": "4001236", "errors": [ { "error_message": "String.to_ascii: Not printable", diff --git a/tests/eval/bad/gold/substr_err1.scilexp.gold b/tests/eval/bad/gold/substr_err1.scilexp.gold index f59014cf7..59a448ee3 100644 --- a/tests/eval/bad/gold/substr_err1.scilexp.gold +++ b/tests/eval/bad/gold/substr_err1.scilexp.gold @@ -1,5 +1,5 @@ { - "gas_remaining": "4001745", + "gas_remaining": "4001227", "errors": [ { "error_message": diff --git a/tests/eval/good/Good.ml b/tests/eval/good/Good.ml index cdb0c45c8..27b641cb3 100644 --- a/tests/eval/good/Good.ml +++ b/tests/eval/good/Good.ml @@ -147,7 +147,7 @@ let explist = "polynetwork_extract_bystr1.scilexp"; "polynetwork_extract_bystr2.scilexp"; "polynetwork_extract_bystr3.scilexp"; - "polynetwork_getBookKeepers.scilexp"; + "polynetwork_getBookKeeper.scilexp"; ] module Tests = Scilla_test.Util.DiffBasedTests (struct diff --git a/tests/eval/good/gold/ackermann.scilexp.gold b/tests/eval/good/gold/ackermann.scilexp.gold index 98d7bdbf4..69a6888e6 100644 --- a/tests/eval/good/gold/ackermann.scilexp.gold +++ b/tests/eval/good/gold/ackermann.scilexp.gold @@ -51,4 +51,4 @@ [ackermann -> ], [nat_iter -> ], [nat_succ -> ] } -Gas remaining: 3930184 +Gas remaining: 3929666 diff --git a/tests/eval/good/gold/addr.scilexp.gold b/tests/eval/good/gold/addr.scilexp.gold index a548651a5..ab91237aa 100644 --- a/tests/eval/good/gold/addr.scilexp.gold +++ b/tests/eval/good/gold/addr.scilexp.gold @@ -1,4 +1,4 @@ (False), { [b -> (ByStr20 0xafcdeabcde123456789012345678901234567890)], [a -> (ByStr20 0xffcdeabcde123456789012345678901234567890)] } -Gas remaining: 4001733 +Gas remaining: 4001215 diff --git a/tests/eval/good/gold/app.scilexp.gold b/tests/eval/good/gold/app.scilexp.gold index 45c709c6f..4308ff325 100644 --- a/tests/eval/good/gold/app.scilexp.gold +++ b/tests/eval/good/gold/app.scilexp.gold @@ -3,4 +3,4 @@ [a -> (Int64 1)], [f -> ], [x -> (Int64 42)] } -Gas remaining: 4001744 +Gas remaining: 4001226 diff --git a/tests/eval/good/gold/app2.scilexp.gold b/tests/eval/good/gold/app2.scilexp.gold index 4c81628b0..5ae741582 100644 --- a/tests/eval/good/gold/app2.scilexp.gold +++ b/tests/eval/good/gold/app2.scilexp.gold @@ -3,4 +3,4 @@ [a -> (Int32 1)], [f -> ], [x -> (Int32 42)] } -Gas remaining: 4001744 +Gas remaining: 4001226 diff --git a/tests/eval/good/gold/app3.scilexp.gold b/tests/eval/good/gold/app3.scilexp.gold index c6870f693..a33d66cb7 100644 --- a/tests/eval/good/gold/app3.scilexp.gold +++ b/tests/eval/good/gold/app3.scilexp.gold @@ -3,4 +3,4 @@ [a -> (Int32 1)], [f -> ], [x -> (Int32 42)] } -Gas remaining: 4001745 +Gas remaining: 4001227 diff --git a/tests/eval/good/gold/app4.scilexp.gold b/tests/eval/good/gold/app4.scilexp.gold index 6c30a81bf..adf5c185f 100644 --- a/tests/eval/good/gold/app4.scilexp.gold +++ b/tests/eval/good/gold/app4.scilexp.gold @@ -4,4 +4,4 @@ [a -> (Int32 1)], [f -> ], [x -> (Int32 42)] } -Gas remaining: 4001742 +Gas remaining: 4001224 diff --git a/tests/eval/good/gold/app5.scilexp.gold b/tests/eval/good/gold/app5.scilexp.gold index b0cc513ba..e4084f9e3 100644 --- a/tests/eval/good/gold/app5.scilexp.gold +++ b/tests/eval/good/gold/app5.scilexp.gold @@ -7,4 +7,4 @@ [a -> (ByStr20 0x1234567890123456789012345678901234abcdef)], [bs -> (Map ByStr20 Int32 [])], [check_update -> ] } -Gas remaining: 4001731 +Gas remaining: 4001213 diff --git a/tests/eval/good/gold/builtin-alt-bn128.scilexp.gold b/tests/eval/good/gold/builtin-alt-bn128.scilexp.gold index 63c1c03bc..f2de996b8 100644 --- a/tests/eval/good/gold/builtin-alt-bn128.scilexp.gold +++ b/tests/eval/good/gold/builtin-alt-bn128.scilexp.gold @@ -42,4 +42,4 @@ [sum_x -> (ByStr32 0x2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703)], [p1y -> (ByStr32 0x063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266)], [p1x -> (ByStr32 0x18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9)] } -Gas remaining: 3997822 +Gas remaining: 3997304 diff --git a/tests/eval/good/gold/builtin-badd.scilexp.gold b/tests/eval/good/gold/builtin-badd.scilexp.gold index 775881b5f..6a258202f 100644 --- a/tests/eval/good/gold/builtin-badd.scilexp.gold +++ b/tests/eval/good/gold/builtin-badd.scilexp.gold @@ -1,4 +1,4 @@ (BNum 23224456), { [b -> (Uint32 1)], [a -> (BNum 23224455)] } -Gas remaining: 4001721 +Gas remaining: 4001203 diff --git a/tests/eval/good/gold/builtin-bech32-1.scilexp.gold b/tests/eval/good/gold/builtin-bech32-1.scilexp.gold index 97bb57667..bcc29270e 100644 --- a/tests/eval/good/gold/builtin-bech32-1.scilexp.gold +++ b/tests/eval/good/gold/builtin-bech32-1.scilexp.gold @@ -1,4 +1,4 @@ (Some (ByStr20 0x7aa7ea9f4534d8d70224b9c2fb165242f321f12b)), { [prefix -> (String "zil")], [bech32str -> (String "zil102n74869xnvdwq3yh8p0k9jjgtejruft268tg8")] } -Gas remaining: 4001505 +Gas remaining: 4000987 diff --git a/tests/eval/good/gold/builtin-bech32-2.scilexp.gold b/tests/eval/good/gold/builtin-bech32-2.scilexp.gold index c2c817247..6ec44881c 100644 --- a/tests/eval/good/gold/builtin-bech32-2.scilexp.gold +++ b/tests/eval/good/gold/builtin-bech32-2.scilexp.gold @@ -1,4 +1,4 @@ (Some (String "zil102n74869xnvdwq3yh8p0k9jjgtejruft268tg8")), { [prefix -> (String "zil")], [bystr20_addr -> (ByStr20 0x7aa7ea9f4534d8d70224b9c2fb165242f321f12b)] } -Gas remaining: 4001593 +Gas remaining: 4001075 diff --git a/tests/eval/good/gold/builtin-bsub.scilexp.gold b/tests/eval/good/gold/builtin-bsub.scilexp.gold index a5f28a5b8..4b99e178e 100644 --- a/tests/eval/good/gold/builtin-bsub.scilexp.gold +++ b/tests/eval/good/gold/builtin-bsub.scilexp.gold @@ -1,4 +1,4 @@ (Int256 1002233), { [b -> (BNum 22222222)], [a -> (BNum 23224455)] } -Gas remaining: 4001721 +Gas remaining: 4001203 diff --git a/tests/eval/good/gold/builtin-div.scilexp.gold b/tests/eval/good/gold/builtin-div.scilexp.gold index 89d172ea6..4f8df5686 100644 --- a/tests/eval/good/gold/builtin-div.scilexp.gold +++ b/tests/eval/good/gold/builtin-div.scilexp.gold @@ -8,4 +8,4 @@ [b -> (Int32 2)], [a -> (Int32 100)], [f -> ] } -Gas remaining: 4001672 +Gas remaining: 4001154 diff --git a/tests/eval/good/gold/builtin-div2.scilexp.gold b/tests/eval/good/gold/builtin-div2.scilexp.gold index 32fde9f9b..37a3ec3d6 100644 --- a/tests/eval/good/gold/builtin-div2.scilexp.gold +++ b/tests/eval/good/gold/builtin-div2.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Int256 2)], [a -> (Int256 9999999999990)], [f -> ] } -Gas remaining: 4001650 +Gas remaining: 4001132 diff --git a/tests/eval/good/gold/builtin-div3.scilexp.gold b/tests/eval/good/gold/builtin-div3.scilexp.gold index e26cccd86..397ebd15a 100644 --- a/tests/eval/good/gold/builtin-div3.scilexp.gold +++ b/tests/eval/good/gold/builtin-div3.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Int32 101)], [a -> (Int32 100)], [f -> ] } -Gas remaining: 4001722 +Gas remaining: 4001204 diff --git a/tests/eval/good/gold/builtin-div4.scilexp.gold b/tests/eval/good/gold/builtin-div4.scilexp.gold index 7073afec5..6814d0e36 100644 --- a/tests/eval/good/gold/builtin-div4.scilexp.gold +++ b/tests/eval/good/gold/builtin-div4.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Uint256 2)], [a -> (Uint256 9999999999990)], [f -> ] } -Gas remaining: 4001650 +Gas remaining: 4001132 diff --git a/tests/eval/good/gold/builtin-ecdsa_recover.scilexp.gold b/tests/eval/good/gold/builtin-ecdsa_recover.scilexp.gold index 2535a2f06..a7f9d6b34 100644 --- a/tests/eval/good/gold/builtin-ecdsa_recover.scilexp.gold +++ b/tests/eval/good/gold/builtin-ecdsa_recover.scilexp.gold @@ -8,4 +8,4 @@ [sig -> (ByStr64 0x7d588d79ac9f0931c69150de6bfe5289f0147893781bffbcc32b5e07bd687d1048dda039ffc1e87de2e98610dc876e97411d604948473904b12b64bed8880bcc)], [header_hash -> ], [ecrecover -> ] } -Gas remaining: 3999856 +Gas remaining: 3999338 diff --git a/tests/eval/good/gold/builtin-eq-bystr.scilexp.gold b/tests/eval/good/gold/builtin-eq-bystr.scilexp.gold index e07579d3b..dc0284144 100644 --- a/tests/eval/good/gold/builtin-eq-bystr.scilexp.gold +++ b/tests/eval/good/gold/builtin-eq-bystr.scilexp.gold @@ -31,4 +31,4 @@ [aa -> (ByStr 0x0f0f)], [c -> (ByStr2 0x0f0f)], [b -> (ByStr2 0xbfbf)] } -Gas remaining: 4001648 +Gas remaining: 4001130 diff --git a/tests/eval/good/gold/builtin-isqrt.scilexp.gold b/tests/eval/good/gold/builtin-isqrt.scilexp.gold index 9b46b45da..80b22aabc 100644 --- a/tests/eval/good/gold/builtin-isqrt.scilexp.gold +++ b/tests/eval/good/gold/builtin-isqrt.scilexp.gold @@ -19,4 +19,4 @@ [two -> (Uint64 2)], [one -> (Uint32 1)], [zero -> (Uint32 0)] } -Gas remaining: 3998130 +Gas remaining: 3997612 diff --git a/tests/eval/good/gold/builtin-pow.scilexp.gold b/tests/eval/good/gold/builtin-pow.scilexp.gold index 98a61810f..4a1e6549e 100644 --- a/tests/eval/good/gold/builtin-pow.scilexp.gold +++ b/tests/eval/good/gold/builtin-pow.scilexp.gold @@ -3,4 +3,4 @@ [x -> (Int32 10000)], [b -> (Uint32 2)], [a -> (Int32 100)] } -Gas remaining: 4001670 +Gas remaining: 4001152 diff --git a/tests/eval/good/gold/builtin-rem.scilexp.gold b/tests/eval/good/gold/builtin-rem.scilexp.gold index b589b6db4..83df23218 100644 --- a/tests/eval/good/gold/builtin-rem.scilexp.gold +++ b/tests/eval/good/gold/builtin-rem.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Int32 2)], [a -> (Int32 100)], [f -> ] } -Gas remaining: 4001722 +Gas remaining: 4001204 diff --git a/tests/eval/good/gold/builtin-rem2.scilexp.gold b/tests/eval/good/gold/builtin-rem2.scilexp.gold index 9ac9ac110..0e5893c6e 100644 --- a/tests/eval/good/gold/builtin-rem2.scilexp.gold +++ b/tests/eval/good/gold/builtin-rem2.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Int32 23)], [a -> (Int32 100)], [f -> ] } -Gas remaining: 4001722 +Gas remaining: 4001204 diff --git a/tests/eval/good/gold/builtin-rem3.scilexp.gold b/tests/eval/good/gold/builtin-rem3.scilexp.gold index 80045f8b0..7339c33b5 100644 --- a/tests/eval/good/gold/builtin-rem3.scilexp.gold +++ b/tests/eval/good/gold/builtin-rem3.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Uint32 23)], [a -> (Uint32 100)], [f -> ] } -Gas remaining: 4001722 +Gas remaining: 4001204 diff --git a/tests/eval/good/gold/builtin-schnorr_get_address.scilexp.gold b/tests/eval/good/gold/builtin-schnorr_get_address.scilexp.gold index 15078047a..c17e53cae 100644 --- a/tests/eval/good/gold/builtin-schnorr_get_address.scilexp.gold +++ b/tests/eval/good/gold/builtin-schnorr_get_address.scilexp.gold @@ -35,4 +35,4 @@ [a1_gen -> (ByStr20 0x4baf5fada8e5db92c3d3242618c5b47133ae003c)], [a1 -> (ByStr20 0x4baf5fada8e5db92c3d3242618c5b47133ae003c)], [p1 -> (ByStr33 0x0314738163b9bb67ad11aa464fe69a1147df263e8970d7dcfd8f993ddd39e81bd9)] } -Gas remaining: 4001513 +Gas remaining: 4000995 diff --git a/tests/eval/good/gold/builtin-strings.scilexp.gold b/tests/eval/good/gold/builtin-strings.scilexp.gold index aa31eab72..d7e7d6008 100644 --- a/tests/eval/good/gold/builtin-strings.scilexp.gold +++ b/tests/eval/good/gold/builtin-strings.scilexp.gold @@ -33,4 +33,4 @@ [fsubstr -> ], [fconcat -> ], [feq -> ] } -Gas remaining: 4001448 +Gas remaining: 4000930 diff --git a/tests/eval/good/gold/builtin1.scilexp.gold b/tests/eval/good/gold/builtin1.scilexp.gold index 1d8196157..c28709b7e 100644 --- a/tests/eval/good/gold/builtin1.scilexp.gold +++ b/tests/eval/good/gold/builtin1.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Int32 2)], [a -> (Int32 100)], [f -> ] } -Gas remaining: 4001738 +Gas remaining: 4001220 diff --git a/tests/eval/good/gold/builtin2.scilexp.gold b/tests/eval/good/gold/builtin2.scilexp.gold index d975bf17f..28202443d 100644 --- a/tests/eval/good/gold/builtin2.scilexp.gold +++ b/tests/eval/good/gold/builtin2.scilexp.gold @@ -4,4 +4,4 @@ [two -> (Int64 2)], [b -> (Int64 44)], [a -> (Int64 42)] } -Gas remaining: 4001738 +Gas remaining: 4001220 diff --git a/tests/eval/good/gold/builtin3.scilexp.gold b/tests/eval/good/gold/builtin3.scilexp.gold index d5e174137..5c3b2d9ed 100644 --- a/tests/eval/good/gold/builtin3.scilexp.gold +++ b/tests/eval/good/gold/builtin3.scilexp.gold @@ -4,4 +4,4 @@ [two -> (Int128 2)], [b -> (Int128 44)], [a -> (Int128 42)] } -Gas remaining: 4001723 +Gas remaining: 4001205 diff --git a/tests/eval/good/gold/builtin5.scilexp.gold b/tests/eval/good/gold/builtin5.scilexp.gold index 22e631631..318c18603 100644 --- a/tests/eval/good/gold/builtin5.scilexp.gold +++ b/tests/eval/good/gold/builtin5.scilexp.gold @@ -2,4 +2,4 @@ { [b -> (Int256 2)], [a -> (Int256 100)], [f -> ] } -Gas remaining: 4001714 +Gas remaining: 4001196 diff --git a/tests/eval/good/gold/builtin6.scilexp.gold b/tests/eval/good/gold/builtin6.scilexp.gold index b2fe28a64..d86130432 100644 --- a/tests/eval/good/gold/builtin6.scilexp.gold +++ b/tests/eval/good/gold/builtin6.scilexp.gold @@ -71,4 +71,4 @@ [c -> (Int32 40)], [b -> (Int32 2)], [a -> (Int32 100)] } -Gas remaining: 4000820 +Gas remaining: 4000302 diff --git a/tests/eval/good/gold/cons.scilexp.gold b/tests/eval/good/gold/cons.scilexp.gold index e0465792a..429e466ec 100644 --- a/tests/eval/good/gold/cons.scilexp.gold +++ b/tests/eval/good/gold/cons.scilexp.gold @@ -4,4 +4,4 @@ [msg -> (Message [(tag : (String "Main")) ; (value : (Int32 5))])], [one_msg -> ], [nil_msg -> (Nil)] } -Gas remaining: 4001745 +Gas remaining: 4001227 diff --git a/tests/eval/good/gold/fib.scilexp.gold b/tests/eval/good/gold/fib.scilexp.gold index 15b21d90b..4741e29c1 100644 --- a/tests/eval/good/gold/fib.scilexp.gold +++ b/tests/eval/good/gold/fib.scilexp.gold @@ -8,4 +8,4 @@ [two -> (Nat 2)], [one -> (Nat 1)], [zero -> (Nat 0)] } -Gas remaining: 4001610 +Gas remaining: 4001092 diff --git a/tests/eval/good/gold/func_pair.scilexp.gold b/tests/eval/good/gold/func_pair.scilexp.gold index 013d9cdb5..ac1e362d4 100644 --- a/tests/eval/good/gold/func_pair.scilexp.gold +++ b/tests/eval/good/gold/func_pair.scilexp.gold @@ -3,4 +3,4 @@ [s -> (String "abc")], [p -> (Pair )], [f -> ] } -Gas remaining: 4001705 +Gas remaining: 4001187 diff --git a/tests/eval/good/gold/hash1.scilexp.gold b/tests/eval/good/gold/hash1.scilexp.gold index 66003a0b3..f6d24101a 100644 --- a/tests/eval/good/gold/hash1.scilexp.gold +++ b/tests/eval/good/gold/hash1.scilexp.gold @@ -8,4 +8,4 @@ [v1 -> (Int32 42)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001674 +Gas remaining: 4001156 diff --git a/tests/eval/good/gold/hash2.scilexp.gold b/tests/eval/good/gold/hash2.scilexp.gold index f3cd1eacf..e5dcdd1c0 100644 --- a/tests/eval/good/gold/hash2.scilexp.gold +++ b/tests/eval/good/gold/hash2.scilexp.gold @@ -8,4 +8,4 @@ [v1 -> (Int64 42)], [k2 -> (Int64 2)], [k1 -> (Int64 1)] } -Gas remaining: 4001737 +Gas remaining: 4001219 diff --git a/tests/eval/good/gold/hash3.scilexp.gold b/tests/eval/good/gold/hash3.scilexp.gold index a2d22829e..f013d2e30 100644 --- a/tests/eval/good/gold/hash3.scilexp.gold +++ b/tests/eval/good/gold/hash3.scilexp.gold @@ -14,4 +14,4 @@ [k2 -> (Int128 2)], [k1 -> (Int128 1)], [hash_dist -> ] } -Gas remaining: 4001405 +Gas remaining: 4000887 diff --git a/tests/eval/good/gold/hash4.scilexp.gold b/tests/eval/good/gold/hash4.scilexp.gold index 73d16472b..58d2289c0 100644 --- a/tests/eval/good/gold/hash4.scilexp.gold +++ b/tests/eval/good/gold/hash4.scilexp.gold @@ -14,4 +14,4 @@ [k2 -> (Int32 2)], [k1 -> (Int32 1)], [hash_dist -> ] } -Gas remaining: 4001405 +Gas remaining: 4000887 diff --git a/tests/eval/good/gold/hash5.scilexp.gold b/tests/eval/good/gold/hash5.scilexp.gold index 5cd05ee2e..2ccf4f57e 100644 --- a/tests/eval/good/gold/hash5.scilexp.gold +++ b/tests/eval/good/gold/hash5.scilexp.gold @@ -19,4 +19,4 @@ [v3 -> (Int128 43)], [v2 -> (Int64 2)], [v1 -> (Int32 1)] } -Gas remaining: 4001716 +Gas remaining: 4001198 diff --git a/tests/eval/good/gold/hash_map_stable1.scilexp.gold b/tests/eval/good/gold/hash_map_stable1.scilexp.gold index a3c73de28..0793138f3 100644 --- a/tests/eval/good/gold/hash_map_stable1.scilexp.gold +++ b/tests/eval/good/gold/hash_map_stable1.scilexp.gold @@ -10,4 +10,4 @@ [k2 -> (Int64 2)], [v1 -> (Int64 48)], [k1 -> (Int64 1)] } -Gas remaining: 4001701 +Gas remaining: 4001183 diff --git a/tests/eval/good/gold/hash_map_stable2.scilexp.gold b/tests/eval/good/gold/hash_map_stable2.scilexp.gold index 4d6776190..6740b55cc 100644 --- a/tests/eval/good/gold/hash_map_stable2.scilexp.gold +++ b/tests/eval/good/gold/hash_map_stable2.scilexp.gold @@ -10,4 +10,4 @@ [k2 -> (Int64 2)], [v1 -> (Int64 48)], [k1 -> (Int64 1)] } -Gas remaining: 4001697 +Gas remaining: 4001179 diff --git a/tests/eval/good/gold/hash_map_stable3.scilexp.gold b/tests/eval/good/gold/hash_map_stable3.scilexp.gold index c967d87ff..0a8d8c032 100644 --- a/tests/eval/good/gold/hash_map_stable3.scilexp.gold +++ b/tests/eval/good/gold/hash_map_stable3.scilexp.gold @@ -9,4 +9,4 @@ [k2 -> (Int64 2)], [v1 -> (Int64 48)], [k1 -> (Int64 1)] } -Gas remaining: 4001702 +Gas remaining: 4001184 diff --git a/tests/eval/good/gold/hof.scilexp.gold b/tests/eval/good/gold/hof.scilexp.gold index 19888e0b7..42a634975 100644 --- a/tests/eval/good/gold/hof.scilexp.gold +++ b/tests/eval/good/gold/hof.scilexp.gold @@ -1,3 +1,3 @@ , { [g -> ] } -Gas remaining: 4001754 +Gas remaining: 4001236 diff --git a/tests/eval/good/gold/hof2.scilexp.gold b/tests/eval/good/gold/hof2.scilexp.gold index be995d7a3..5d6512951 100644 --- a/tests/eval/good/gold/hof2.scilexp.gold +++ b/tests/eval/good/gold/hof2.scilexp.gold @@ -1,3 +1,3 @@ , { [g -> ] } -Gas remaining: 4001754 +Gas remaining: 4001236 diff --git a/tests/eval/good/gold/hof3.scilexp.gold b/tests/eval/good/gold/hof3.scilexp.gold index be995d7a3..5d6512951 100644 --- a/tests/eval/good/gold/hof3.scilexp.gold +++ b/tests/eval/good/gold/hof3.scilexp.gold @@ -1,3 +1,3 @@ , { [g -> ] } -Gas remaining: 4001754 +Gas remaining: 4001236 diff --git a/tests/eval/good/gold/id.scilexp.gold b/tests/eval/good/gold/id.scilexp.gold index 32f55c858..d2ee60180 100644 --- a/tests/eval/good/gold/id.scilexp.gold +++ b/tests/eval/good/gold/id.scilexp.gold @@ -2,4 +2,4 @@ { [n -> (Int32 42)], [id_int -> ], [id -> ] } -Gas remaining: 4001748 +Gas remaining: 4001230 diff --git a/tests/eval/good/gold/int_conversions.scilexp.gold b/tests/eval/good/gold/int_conversions.scilexp.gold index 4c6c281ba..8456befb0 100644 --- a/tests/eval/good/gold/int_conversions.scilexp.gold +++ b/tests/eval/good/gold/int_conversions.scilexp.gold @@ -35,4 +35,4 @@ [minus_one -> (Int32 -1)], [one -> (Uint32 1)], [zero -> (Uint32 0)] } -Gas remaining: 4001472 +Gas remaining: 4000954 diff --git a/tests/eval/good/gold/int_to_nat.scilexp.gold b/tests/eval/good/gold/int_to_nat.scilexp.gold index 6c8c0423e..876842787 100644 --- a/tests/eval/good/gold/int_to_nat.scilexp.gold +++ b/tests/eval/good/gold/int_to_nat.scilexp.gold @@ -17,4 +17,4 @@ [zero_nat2 -> (Nat 0)], [zero_nat1 -> (Nat 0)], [zero_uint -> (Uint32 0)] } -Gas remaining: 3001595 +Gas remaining: 3001077 diff --git a/tests/eval/good/gold/keccak256_1.scilexp.gold b/tests/eval/good/gold/keccak256_1.scilexp.gold index 0792bb83e..c6a3647cf 100644 --- a/tests/eval/good/gold/keccak256_1.scilexp.gold +++ b/tests/eval/good/gold/keccak256_1.scilexp.gold @@ -6,4 +6,4 @@ [v1 -> (Int32 42)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001741 +Gas remaining: 4001223 diff --git a/tests/eval/good/gold/keccak256_2.scilexp.gold b/tests/eval/good/gold/keccak256_2.scilexp.gold index c83bdcef0..3855c9008 100644 --- a/tests/eval/good/gold/keccak256_2.scilexp.gold +++ b/tests/eval/good/gold/keccak256_2.scilexp.gold @@ -8,4 +8,4 @@ [v1 -> (Int64 42)], [k2 -> (Int64 2)], [k1 -> (Int64 1)] } -Gas remaining: 4001737 +Gas remaining: 4001219 diff --git a/tests/eval/good/gold/keccak256_3.scilexp.gold b/tests/eval/good/gold/keccak256_3.scilexp.gold index 00d060430..33c445077 100644 --- a/tests/eval/good/gold/keccak256_3.scilexp.gold +++ b/tests/eval/good/gold/keccak256_3.scilexp.gold @@ -14,4 +14,4 @@ [k2 -> (Int128 2)], [k1 -> (Int128 1)], [hash_dist -> ] } -Gas remaining: 4001405 +Gas remaining: 4000887 diff --git a/tests/eval/good/gold/keccak256_4.scilexp.gold b/tests/eval/good/gold/keccak256_4.scilexp.gold index 00f484ba9..ceed10164 100644 --- a/tests/eval/good/gold/keccak256_4.scilexp.gold +++ b/tests/eval/good/gold/keccak256_4.scilexp.gold @@ -14,4 +14,4 @@ [k2 -> (Int32 2)], [k1 -> (Int32 1)], [hash_dist -> ] } -Gas remaining: 4001405 +Gas remaining: 4000887 diff --git a/tests/eval/good/gold/keccak256_5.scilexp.gold b/tests/eval/good/gold/keccak256_5.scilexp.gold index daaeb6b89..26a91655b 100644 --- a/tests/eval/good/gold/keccak256_5.scilexp.gold +++ b/tests/eval/good/gold/keccak256_5.scilexp.gold @@ -19,4 +19,4 @@ [v3 -> (Int128 43)], [v2 -> (Int64 2)], [v1 -> (Int32 1)] } -Gas remaining: 4001716 +Gas remaining: 4001198 diff --git a/tests/eval/good/gold/let-builtin.scilexp.gold b/tests/eval/good/gold/let-builtin.scilexp.gold index 572543b16..4ebcfd297 100644 --- a/tests/eval/good/gold/let-builtin.scilexp.gold +++ b/tests/eval/good/gold/let-builtin.scilexp.gold @@ -3,4 +3,4 @@ [y -> (Int32 84)], [f -> ], [x -> (Int32 42)] } -Gas remaining: 4001744 +Gas remaining: 4001226 diff --git a/tests/eval/good/gold/let.scilexp.gold b/tests/eval/good/gold/let.scilexp.gold index 5168fead8..fcac7367a 100644 --- a/tests/eval/good/gold/let.scilexp.gold +++ b/tests/eval/good/gold/let.scilexp.gold @@ -3,4 +3,4 @@ [y -> (Int32 42)], [f -> ], [x -> (Int32 42)] } -Gas remaining: 4001748 +Gas remaining: 4001230 diff --git a/tests/eval/good/gold/let_in_let_in.scilexp.gold b/tests/eval/good/gold/let_in_let_in.scilexp.gold index 2a3b9a09f..acea4a342 100644 --- a/tests/eval/good/gold/let_in_let_in.scilexp.gold +++ b/tests/eval/good/gold/let_in_let_in.scilexp.gold @@ -1,3 +1,3 @@ (Uint32 1), { [f -> (Uint32 1)] } -Gas remaining: 4001752 +Gas remaining: 4001234 diff --git a/tests/eval/good/gold/list_append.scilexp.gold b/tests/eval/good/gold/list_append.scilexp.gold index 2546ab46e..14161efef 100644 --- a/tests/eval/good/gold/list_append.scilexp.gold +++ b/tests/eval/good/gold/list_append.scilexp.gold @@ -9,4 +9,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [int_append -> ] } -Gas remaining: 4001685 +Gas remaining: 4001167 diff --git a/tests/eval/good/gold/list_eq.scilexp.gold b/tests/eval/good/gold/list_eq.scilexp.gold index 995fb3210..3faf68af2 100644 --- a/tests/eval/good/gold/list_eq.scilexp.gold +++ b/tests/eval/good/gold/list_eq.scilexp.gold @@ -21,4 +21,4 @@ [two -> (Int64 2)], [one -> (Int64 1)], [int_list_eq -> ] } -Gas remaining: 4001295 +Gas remaining: 4000777 diff --git a/tests/eval/good/gold/list_exists.scilexp.gold b/tests/eval/good/gold/list_exists.scilexp.gold index 5cdd3449a..32de8e976 100644 --- a/tests/eval/good/gold/list_exists.scilexp.gold +++ b/tests/eval/good/gold/list_exists.scilexp.gold @@ -13,4 +13,4 @@ [g -> ], [f -> ], [int_exists -> ] } -Gas remaining: 4001560 +Gas remaining: 4001042 diff --git a/tests/eval/good/gold/list_filter.scilexp.gold b/tests/eval/good/gold/list_filter.scilexp.gold index 9322ce837..f28025f05 100644 --- a/tests/eval/good/gold/list_filter.scilexp.gold +++ b/tests/eval/good/gold/list_filter.scilexp.gold @@ -10,4 +10,4 @@ [one -> (Int32 1)], [f -> ], [int_filter -> ] } -Gas remaining: 4001642 +Gas remaining: 4001124 diff --git a/tests/eval/good/gold/list_find.scilexp.gold b/tests/eval/good/gold/list_find.scilexp.gold index 9fba2dbcd..4e6b274bc 100644 --- a/tests/eval/good/gold/list_find.scilexp.gold +++ b/tests/eval/good/gold/list_find.scilexp.gold @@ -13,4 +13,4 @@ [one -> (Int64 1)], [f -> ], [int_find -> ] } -Gas remaining: 4001598 +Gas remaining: 4001080 diff --git a/tests/eval/good/gold/list_flatten.scilexp.gold b/tests/eval/good/gold/list_flatten.scilexp.gold index 0401e8ef0..11897eaf7 100644 --- a/tests/eval/good/gold/list_flatten.scilexp.gold +++ b/tests/eval/good/gold/list_flatten.scilexp.gold @@ -16,4 +16,4 @@ [two -> (Int128 2)], [one -> (Int128 1)], [int_flatten -> ] } -Gas remaining: 4001604 +Gas remaining: 4001086 diff --git a/tests/eval/good/gold/list_foldl.scilexp.gold b/tests/eval/good/gold/list_foldl.scilexp.gold index dff5d32d6..8cbbb2662 100644 --- a/tests/eval/good/gold/list_foldl.scilexp.gold +++ b/tests/eval/good/gold/list_foldl.scilexp.gold @@ -8,4 +8,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [zero -> (Int32 0)] } -Gas remaining: 4001660 +Gas remaining: 4001142 diff --git a/tests/eval/good/gold/list_foldl_while.scilexp.gold b/tests/eval/good/gold/list_foldl_while.scilexp.gold index 72a0e6055..1f030e1a2 100644 --- a/tests/eval/good/gold/list_foldl_while.scilexp.gold +++ b/tests/eval/good/gold/list_foldl_while.scilexp.gold @@ -11,4 +11,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [zero -> (Int32 0)] } -Gas remaining: 4001637 +Gas remaining: 4001119 diff --git a/tests/eval/good/gold/list_foldr.scilexp.gold b/tests/eval/good/gold/list_foldr.scilexp.gold index cb827f846..55513afe2 100644 --- a/tests/eval/good/gold/list_foldr.scilexp.gold +++ b/tests/eval/good/gold/list_foldr.scilexp.gold @@ -8,4 +8,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [zero -> (Int32 0)] } -Gas remaining: 4001660 +Gas remaining: 4001142 diff --git a/tests/eval/good/gold/list_forall.scilexp.gold b/tests/eval/good/gold/list_forall.scilexp.gold index 136d74a20..4644d170c 100644 --- a/tests/eval/good/gold/list_forall.scilexp.gold +++ b/tests/eval/good/gold/list_forall.scilexp.gold @@ -14,4 +14,4 @@ [three -> (Int32 3)], [two -> (Int32 2)], [one -> (Int32 1)] } -Gas remaining: 4001553 +Gas remaining: 4001035 diff --git a/tests/eval/good/gold/list_head.scilexp.gold b/tests/eval/good/gold/list_head.scilexp.gold index 9c5fe9b81..3be4b3438 100644 --- a/tests/eval/good/gold/list_head.scilexp.gold +++ b/tests/eval/good/gold/list_head.scilexp.gold @@ -7,4 +7,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [int_head -> ] } -Gas remaining: 4001736 +Gas remaining: 4001218 diff --git a/tests/eval/good/gold/list_length.scilexp.gold b/tests/eval/good/gold/list_length.scilexp.gold index 34a5501f7..775bb0766 100644 --- a/tests/eval/good/gold/list_length.scilexp.gold +++ b/tests/eval/good/gold/list_length.scilexp.gold @@ -11,4 +11,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [int_length -> ] } -Gas remaining: 4001649 +Gas remaining: 4001131 diff --git a/tests/eval/good/gold/list_map.scilexp.gold b/tests/eval/good/gold/list_map.scilexp.gold index 66d6c7377..41ace3123 100644 --- a/tests/eval/good/gold/list_map.scilexp.gold +++ b/tests/eval/good/gold/list_map.scilexp.gold @@ -9,4 +9,4 @@ [one -> (Uint32 1)], [f -> ], [int_map -> ] } -Gas remaining: 4001587 +Gas remaining: 4001069 diff --git a/tests/eval/good/gold/list_mem.scilexp.gold b/tests/eval/good/gold/list_mem.scilexp.gold index b4c68ef96..d6e81377b 100644 --- a/tests/eval/good/gold/list_mem.scilexp.gold +++ b/tests/eval/good/gold/list_mem.scilexp.gold @@ -15,4 +15,4 @@ [zero -> (Int32 0)], [f -> ], [int_mem -> ] } -Gas remaining: 4001379 +Gas remaining: 4000861 diff --git a/tests/eval/good/gold/list_nth.scilexp.gold b/tests/eval/good/gold/list_nth.scilexp.gold index d30429f4d..48608adee 100644 --- a/tests/eval/good/gold/list_nth.scilexp.gold +++ b/tests/eval/good/gold/list_nth.scilexp.gold @@ -15,4 +15,4 @@ [one -> (Uint32 1)], [zero -> (Uint32 0)], [int_nth -> ] } -Gas remaining: 4001278 +Gas remaining: 4000760 diff --git a/tests/eval/good/gold/list_product.scilexp.gold b/tests/eval/good/gold/list_product.scilexp.gold index b26be2206..626da5866 100644 --- a/tests/eval/good/gold/list_product.scilexp.gold +++ b/tests/eval/good/gold/list_product.scilexp.gold @@ -7,4 +7,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [list_product -> ] } -Gas remaining: 4001615 +Gas remaining: 4001097 diff --git a/tests/eval/good/gold/list_reverse.scilexp.gold b/tests/eval/good/gold/list_reverse.scilexp.gold index 8e4f3dafe..f1ca5ee06 100644 --- a/tests/eval/good/gold/list_reverse.scilexp.gold +++ b/tests/eval/good/gold/list_reverse.scilexp.gold @@ -9,4 +9,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [int_reverse -> ] } -Gas remaining: 4001685 +Gas remaining: 4001167 diff --git a/tests/eval/good/gold/list_sort.scilexp.gold b/tests/eval/good/gold/list_sort.scilexp.gold index b4b89282a..c29cc7005 100644 --- a/tests/eval/good/gold/list_sort.scilexp.gold +++ b/tests/eval/good/gold/list_sort.scilexp.gold @@ -22,4 +22,4 @@ [zero -> (Uint64 0)], [flt -> ], [int_sort -> ] } -Gas remaining: 4000768 +Gas remaining: 4000250 diff --git a/tests/eval/good/gold/list_sort_eq.scilexp.gold b/tests/eval/good/gold/list_sort_eq.scilexp.gold index 8ed8a6c43..415091e0a 100644 --- a/tests/eval/good/gold/list_sort_eq.scilexp.gold +++ b/tests/eval/good/gold/list_sort_eq.scilexp.gold @@ -18,4 +18,4 @@ [int_sort_t -> ], [list_int_eq -> ], [list_int_eq_t -> ] } -Gas remaining: 4001384 +Gas remaining: 4000866 diff --git a/tests/eval/good/gold/list_tail.scilexp.gold b/tests/eval/good/gold/list_tail.scilexp.gold index 6ca95a165..2c2dd2357 100644 --- a/tests/eval/good/gold/list_tail.scilexp.gold +++ b/tests/eval/good/gold/list_tail.scilexp.gold @@ -7,4 +7,4 @@ [two -> (Int32 2)], [one -> (Int32 1)], [int_rest -> ] } -Gas remaining: 4001736 +Gas remaining: 4001218 diff --git a/tests/eval/good/gold/list_tail1.scilexp.gold b/tests/eval/good/gold/list_tail1.scilexp.gold index 4aa96533c..e4a2ec737 100644 --- a/tests/eval/good/gold/list_tail1.scilexp.gold +++ b/tests/eval/good/gold/list_tail1.scilexp.gold @@ -6,4 +6,4 @@ [two -> (Int64 2)], [one -> (Int64 1)], [int_rest -> ] } -Gas remaining: 4001738 +Gas remaining: 4001220 diff --git a/tests/eval/good/gold/list_tail2.scilexp.gold b/tests/eval/good/gold/list_tail2.scilexp.gold index e0d0a222a..f43022f68 100644 --- a/tests/eval/good/gold/list_tail2.scilexp.gold +++ b/tests/eval/good/gold/list_tail2.scilexp.gold @@ -5,4 +5,4 @@ [two -> (Int64 2)], [one -> (Int64 1)], [int_rest -> ] } -Gas remaining: 4001740 +Gas remaining: 4001222 diff --git a/tests/eval/good/gold/list_unzip.scilexp.gold b/tests/eval/good/gold/list_unzip.scilexp.gold index 90191cf4c..17a93dd4b 100644 --- a/tests/eval/good/gold/list_unzip.scilexp.gold +++ b/tests/eval/good/gold/list_unzip.scilexp.gold @@ -13,4 +13,4 @@ [two -> (Int128 2)], [one -> (Int128 1)], [int_unzip -> ] } -Gas remaining: 4001648 +Gas remaining: 4001130 diff --git a/tests/eval/good/gold/list_zip.scilexp.gold b/tests/eval/good/gold/list_zip.scilexp.gold index c35a7e2fe..ea626c92a 100644 --- a/tests/eval/good/gold/list_zip.scilexp.gold +++ b/tests/eval/good/gold/list_zip.scilexp.gold @@ -11,4 +11,4 @@ [two -> (Uint32 2)], [one -> (Uint32 1)], [int_zip -> ] } -Gas remaining: 4001203 +Gas remaining: 4000685 diff --git a/tests/eval/good/gold/list_zip_with.scilexp.gold b/tests/eval/good/gold/list_zip_with.scilexp.gold index 077e44af7..f261f3c70 100644 --- a/tests/eval/good/gold/list_zip_with.scilexp.gold +++ b/tests/eval/good/gold/list_zip_with.scilexp.gold @@ -15,4 +15,4 @@ [list_reverse -> ], [list_tail -> ], [list_head -> ] } -Gas remaining: 4001129 +Gas remaining: 4000611 diff --git a/tests/eval/good/gold/map1.scilexp.gold b/tests/eval/good/gold/map1.scilexp.gold index aa6b0aa47..900a5a4c4 100644 --- a/tests/eval/good/gold/map1.scilexp.gold +++ b/tests/eval/good/gold/map1.scilexp.gold @@ -6,4 +6,4 @@ [v1 -> (Uint64 42)], [k2 -> (Uint64 2)], [k1 -> (Uint64 1)] } -Gas remaining: 4001741 +Gas remaining: 4001223 diff --git a/tests/eval/good/gold/map2.scilexp.gold b/tests/eval/good/gold/map2.scilexp.gold index 4e0078703..4217bcf3d 100644 --- a/tests/eval/good/gold/map2.scilexp.gold +++ b/tests/eval/good/gold/map2.scilexp.gold @@ -8,4 +8,4 @@ [v1 -> (Int32 42)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001735 +Gas remaining: 4001217 diff --git a/tests/eval/good/gold/map3.scilexp.gold b/tests/eval/good/gold/map3.scilexp.gold index 1d7a91417..32ed5e07d 100644 --- a/tests/eval/good/gold/map3.scilexp.gold +++ b/tests/eval/good/gold/map3.scilexp.gold @@ -9,4 +9,4 @@ [k3 -> (Int32 3)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001733 +Gas remaining: 4001215 diff --git a/tests/eval/good/gold/map4.scilexp.gold b/tests/eval/good/gold/map4.scilexp.gold index 8217c4987..40d59d290 100644 --- a/tests/eval/good/gold/map4.scilexp.gold +++ b/tests/eval/good/gold/map4.scilexp.gold @@ -9,4 +9,4 @@ [k3 -> (Int32 3)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001731 +Gas remaining: 4001213 diff --git a/tests/eval/good/gold/map5.scilexp.gold b/tests/eval/good/gold/map5.scilexp.gold index d1541c7b8..ce7fd8596 100644 --- a/tests/eval/good/gold/map5.scilexp.gold +++ b/tests/eval/good/gold/map5.scilexp.gold @@ -9,4 +9,4 @@ [k3 -> (Int32 3)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001733 +Gas remaining: 4001215 diff --git a/tests/eval/good/gold/map6.scilexp.gold b/tests/eval/good/gold/map6.scilexp.gold index 097235f9b..148d13f87 100644 --- a/tests/eval/good/gold/map6.scilexp.gold +++ b/tests/eval/good/gold/map6.scilexp.gold @@ -9,4 +9,4 @@ [k3 -> (Int32 3)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001733 +Gas remaining: 4001215 diff --git a/tests/eval/good/gold/map_no_keeping_old_bindings.scilexp.gold b/tests/eval/good/gold/map_no_keeping_old_bindings.scilexp.gold index 11a26db28..6f384075b 100644 --- a/tests/eval/good/gold/map_no_keeping_old_bindings.scilexp.gold +++ b/tests/eval/good/gold/map_no_keeping_old_bindings.scilexp.gold @@ -7,4 +7,4 @@ [v2 -> (Int32 239)], [v1 -> (Int32 57)], [k -> (Int32 1)] } -Gas remaining: 4001736 +Gas remaining: 4001218 diff --git a/tests/eval/good/gold/map_remove_no_exception.scilexp.gold b/tests/eval/good/gold/map_remove_no_exception.scilexp.gold index b627f14a6..6fea9689d 100644 --- a/tests/eval/good/gold/map_remove_no_exception.scilexp.gold +++ b/tests/eval/good/gold/map_remove_no_exception.scilexp.gold @@ -1,4 +1,4 @@ (Map Int32 Int32 []), { [m -> (Map Int32 Int32 [])], [k -> (Int32 1)] } -Gas remaining: 4001752 +Gas remaining: 4001234 diff --git a/tests/eval/good/gold/map_to_list.scilexp.gold b/tests/eval/good/gold/map_to_list.scilexp.gold index 096fdfde3..e43294cda 100644 --- a/tests/eval/good/gold/map_to_list.scilexp.gold +++ b/tests/eval/good/gold/map_to_list.scilexp.gold @@ -9,4 +9,4 @@ [k3 -> (Int32 3)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001730 +Gas remaining: 4001212 diff --git a/tests/eval/good/gold/msg.scilexp.gold b/tests/eval/good/gold/msg.scilexp.gold index 375e16e03..71a838fa3 100644 --- a/tests/eval/good/gold/msg.scilexp.gold +++ b/tests/eval/good/gold/msg.scilexp.gold @@ -4,4 +4,4 @@ [y -> (Int32 42)], [f -> ], [x -> (Int32 42)] } -Gas remaining: 4001746 +Gas remaining: 4001228 diff --git a/tests/eval/good/gold/nat_eq_false.scilexp.gold b/tests/eval/good/gold/nat_eq_false.scilexp.gold index e3360e7e6..a35883732 100644 --- a/tests/eval/good/gold/nat_eq_false.scilexp.gold +++ b/tests/eval/good/gold/nat_eq_false.scilexp.gold @@ -7,4 +7,4 @@ [two -> (Nat 2)], [one -> (Nat 1)], [zero -> (Nat 0)] } -Gas remaining: 4001580 +Gas remaining: 4001062 diff --git a/tests/eval/good/gold/nat_eq_foldl.scilexp.gold b/tests/eval/good/gold/nat_eq_foldl.scilexp.gold index e1588a23a..8ac9d6181 100644 --- a/tests/eval/good/gold/nat_eq_foldl.scilexp.gold +++ b/tests/eval/good/gold/nat_eq_foldl.scilexp.gold @@ -4,4 +4,4 @@ [two -> (Nat 2)], [one -> (Nat 1)], [zero -> (Nat 0)] } -Gas remaining: 4001677 +Gas remaining: 4001159 diff --git a/tests/eval/good/gold/nat_fold_stress.scilexp.gold b/tests/eval/good/gold/nat_fold_stress.scilexp.gold index d9e713f31..4777dfeb7 100644 --- a/tests/eval/good/gold/nat_fold_stress.scilexp.gold +++ b/tests/eval/good/gold/nat_fold_stress.scilexp.gold @@ -1,4 +1,4 @@ (Uint32 0), { [large_n -> (Uint32 80000)], [silly_zero -> ] } -Gas remaining: 3201737 +Gas remaining: 3201219 diff --git a/tests/eval/good/gold/nat_to_int.scilexp.gold b/tests/eval/good/gold/nat_to_int.scilexp.gold index dc8c62b2e..64093511a 100644 --- a/tests/eval/good/gold/nat_to_int.scilexp.gold +++ b/tests/eval/good/gold/nat_to_int.scilexp.gold @@ -4,4 +4,4 @@ [two -> (Nat 2)], [one -> (Nat 1)], [zero -> (Nat 0)] } -Gas remaining: 4001678 +Gas remaining: 4001160 diff --git a/tests/eval/good/gold/option.scilexp.gold b/tests/eval/good/gold/option.scilexp.gold index 8821ef73e..e7b9ae6bf 100644 --- a/tests/eval/good/gold/option.scilexp.gold +++ b/tests/eval/good/gold/option.scilexp.gold @@ -3,4 +3,4 @@ [t -> (True)], [x -> (Int32 12)], [a -> (Int32 12)] } -Gas remaining: 4001748 +Gas remaining: 4001230 diff --git a/tests/eval/good/gold/pair1.scilexp.gold b/tests/eval/good/gold/pair1.scilexp.gold index 184361ef7..479e71d83 100644 --- a/tests/eval/good/gold/pair1.scilexp.gold +++ b/tests/eval/good/gold/pair1.scilexp.gold @@ -9,4 +9,4 @@ [n -> (None)], [b -> (Int32 2)], [a -> (Int32 1)] } -Gas remaining: 4001735 +Gas remaining: 4001217 diff --git a/tests/eval/good/gold/pair2.scilexp.gold b/tests/eval/good/gold/pair2.scilexp.gold index b39c299e5..60077f4fd 100644 --- a/tests/eval/good/gold/pair2.scilexp.gold +++ b/tests/eval/good/gold/pair2.scilexp.gold @@ -8,4 +8,4 @@ [n -> (None)], [b -> (Int32 2)], [a -> (Int32 1)] } -Gas remaining: 4001737 +Gas remaining: 4001219 diff --git a/tests/eval/good/gold/pair3.scilexp.gold b/tests/eval/good/gold/pair3.scilexp.gold index 75ea33e22..43d2b89e4 100644 --- a/tests/eval/good/gold/pair3.scilexp.gold +++ b/tests/eval/good/gold/pair3.scilexp.gold @@ -7,4 +7,4 @@ [n -> (None)], [b -> (Int32 2)], [a -> (Int32 1)] } -Gas remaining: 4001736 +Gas remaining: 4001218 diff --git a/tests/eval/good/gold/pm1.scilexp.gold b/tests/eval/good/gold/pm1.scilexp.gold index 6145f92ef..70a150871 100644 --- a/tests/eval/good/gold/pm1.scilexp.gold +++ b/tests/eval/good/gold/pm1.scilexp.gold @@ -1,4 +1,4 @@ (Int32 2), { [c -> (False)], [b -> (True)] } -Gas remaining: 4001748 +Gas remaining: 4001230 diff --git a/tests/eval/good/gold/pm2.scilexp.gold b/tests/eval/good/gold/pm2.scilexp.gold index 7e3e0ba90..10a4a3289 100644 --- a/tests/eval/good/gold/pm2.scilexp.gold +++ b/tests/eval/good/gold/pm2.scilexp.gold @@ -2,4 +2,4 @@ { [c -> (True)], [b -> (True)], [z -> (Int32 3)] } -Gas remaining: 4001746 +Gas remaining: 4001228 diff --git a/tests/eval/good/gold/pm3.scilexp.gold b/tests/eval/good/gold/pm3.scilexp.gold index 1e9d5a517..4ef46e5e6 100644 --- a/tests/eval/good/gold/pm3.scilexp.gold +++ b/tests/eval/good/gold/pm3.scilexp.gold @@ -5,4 +5,4 @@ [z -> (Int32 3)], [y -> (Some (Int32 42))], [v -> (Int32 42)] } -Gas remaining: 4001742 +Gas remaining: 4001224 diff --git a/tests/eval/good/gold/pm_app.scilexp.gold b/tests/eval/good/gold/pm_app.scilexp.gold index 69c00650b..74ee3938c 100644 --- a/tests/eval/good/gold/pm_app.scilexp.gold +++ b/tests/eval/good/gold/pm_app.scilexp.gold @@ -2,4 +2,4 @@ { [y -> (False)], [x -> (True)], [andb -> ] } -Gas remaining: 4001744 +Gas remaining: 4001226 diff --git a/tests/eval/good/gold/pm_nesting.scilexp.gold b/tests/eval/good/gold/pm_nesting.scilexp.gold index 5fdd1e812..da9579fcb 100644 --- a/tests/eval/good/gold/pm_nesting.scilexp.gold +++ b/tests/eval/good/gold/pm_nesting.scilexp.gold @@ -4,4 +4,4 @@ [y -> (Some (Int32 42))], [x -> (True)], [v -> (Int32 42)] } -Gas remaining: 4001747 +Gas remaining: 4001229 diff --git a/tests/eval/good/gold/polynetwork_deserialize_proof.scilexp.gold b/tests/eval/good/gold/polynetwork_deserialize_proof.scilexp.gold new file mode 100644 index 000000000..61200c617 --- /dev/null +++ b/tests/eval/good/gold/polynetwork_deserialize_proof.scilexp.gold @@ -0,0 +1,13 @@ +(Uint32 0), +{ [res3 -> (Some (Polynetwork.Proof (ByStr 0xc73c8b3c730086cfae83d735d2c405d6f5a00c3f1ff21ce91d223038d3c1ab4d) (List (Pair (ByStr1 0x00) (ByStr32 0x0213149490394c2a8701af2dba1a303df05148a14092f6e59febca31eee4da66)), (Pair (ByStr1 0x00) (ByStr32 0x79807fe94ecb6f6d1b0b65be5f45159925a905bab8040af476c372ea0583dbba)), (Pair (ByStr1 0x00) (ByStr32 0xb41a753c36f64bbe6d6fcd6c2ba40dc09c4c25b6b877bd363696fe1f62cbf6f7)), (Pair (ByStr1 0x00) (ByStr32 0x059195b0df4add4239eaef270bc187217dc872d11723d4fce02a3c2510461e59)), (Pair (ByStr1 0x00) (ByStr32 0xf3c3d66c4611791ff1ebe8a2ef43f1cbf40876b637522c60a81f511445f8dc17)), (Pair (ByStr1 0x01) (ByStr32 0x1f86c65842afb760457d5ce8ad38821d2110331a7bbae87fe131a5e610f3a146)), (Pair (ByStr1 0x00) (ByStr32 0x4add0a7a5c74a56ce64a3555b4a73f367c414c80ecc15672dd86f7bff8bf65bc)), (Pair (ByStr1 0x01) (ByStr32 0x1daedaae87fc34d28ec3116dc04386c7c650f5db9e3a9a853c6e518821069bda)), (Pair (ByStr1 0x00) (ByStr32 0x1c6cf42ace3bf6b1a7e60ae29dc10aad67cdf672cdb083c601ee3996576cc2e4)), (Pair (ByStr1 0x01) (ByStr32 0xa1a8ab20062ebdcfa7a6e8f0c6c8b3de823920abd351eedc33d043de1c144988)), (Pair (ByStr1 0x01) (ByStr32 0x71c734d6d77806f9475b69c8426bc5c09ce54c0b4ccb13df4315c62899e99262)), (Pair (ByStr1 0x01) (ByStr32 0xf459d25426b21e5f2f6bdabf5e6a79f36002114b1ecc5cfa30a18cf3e4baf98d)), (Pair (ByStr1 0x01) (ByStr32 0xad42157822143a7be209b907901a31863d1b35ad9118c4c45d476e405872fb66)), (Pair (ByStr1 0x01) (ByStr32 0x7badaf21d00ca7e2a73c64dd7738ddcb6a881dcfb88ef0c171e33bfec529fe0a)), (Pair (ByStr1 0x00) (ByStr32 0xe0a6008bab76556dbf47269adc41d6820c6a55982e9362257bfdf02a79ff5b8d)), (Pair (ByStr1 0x01) (ByStr32 0x061cd147d032d11b1b7b6b5edc389f56d33f939e51be3c7949b357aac4e120df)), (Nil))))], + [proof3_bs -> (ByStr 0x20c73c8b3c730086cfae83d735d2c405d6f5a00c3f1ff21ce91d223038d3c1ab4d000213149490394c2a8701af2dba1a303df05148a14092f6e59febca31eee4da660079807fe94ecb6f6d1b0b65be5f45159925a905bab8040af476c372ea0583dbba00b41a753c36f64bbe6d6fcd6c2ba40dc09c4c25b6b877bd363696fe1f62cbf6f700059195b0df4add4239eaef270bc187217dc872d11723d4fce02a3c2510461e5900f3c3d66c4611791ff1ebe8a2ef43f1cbf40876b637522c60a81f511445f8dc17011f86c65842afb760457d5ce8ad38821d2110331a7bbae87fe131a5e610f3a146004add0a7a5c74a56ce64a3555b4a73f367c414c80ecc15672dd86f7bff8bf65bc011daedaae87fc34d28ec3116dc04386c7c650f5db9e3a9a853c6e518821069bda001c6cf42ace3bf6b1a7e60ae29dc10aad67cdf672cdb083c601ee3996576cc2e401a1a8ab20062ebdcfa7a6e8f0c6c8b3de823920abd351eedc33d043de1c1449880171c734d6d77806f9475b69c8426bc5c09ce54c0b4ccb13df4315c62899e9926201f459d25426b21e5f2f6bdabf5e6a79f36002114b1ecc5cfa30a18cf3e4baf98d01ad42157822143a7be209b907901a31863d1b35ad9118c4c45d476e405872fb66017badaf21d00ca7e2a73c64dd7738ddcb6a881dcfb88ef0c171e33bfec529fe0a00e0a6008bab76556dbf47269adc41d6820c6a55982e9362257bfdf02a79ff5b8d01061cd147d032d11b1b7b6b5edc389f56d33f939e51be3c7949b357aac4e120df)], + [res2 -> (Some (Polynetwork.Proof (ByStr 0x20e91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c080000000000000020b697330bd7a5850235f97d1bcd1c37739f4bc79a4f8e635dcb46ba45bc600ef4012f14f71b55ef55cedc91fd007f7a9ba386ec978f3aa80200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14000000000000000000000000000000000000000014344cfc3b8635f72f14200aaf2168d9f75df86fd36226100000000000000000000000000000000000000000000000000000000000) (Nil)))], + [proof2_bs -> (ByStr 0xd020e91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c080000000000000020b697330bd7a5850235f97d1bcd1c37739f4bc79a4f8e635dcb46ba45bc600ef4012f14f71b55ef55cedc91fd007f7a9ba386ec978f3aa80200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14000000000000000000000000000000000000000014344cfc3b8635f72f14200aaf2168d9f75df86fd36226100000000000000000000000000000000000000000000000000000000000)], + [res1 -> (Some (Polynetwork.Proof (ByStr 0x2000ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd60300000000000000204caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc081b0000000000000014b7041bc96b15da728fdfc1c47cbfc687b845adeb0200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd35300000000000000000000000000000000000000000000000000000000000000) (List (Pair (ByStr1 0x01) (ByStr32 0x77d99c0f0857535155071d49ded129993a5b98575761985e90e2d26c7a569a0d)), (Nil))))], + [proof_bs -> (ByStr 0xd72000ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd60300000000000000204caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc081b0000000000000014b7041bc96b15da728fdfc1c47cbfc687b845adeb0200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd353000000000000000000000000000000000000000000000000000000000000000177d99c0f0857535155071d49ded129993a5b98575761985e90e2d26c7a569a0d)], + [pos -> (Uint32 0)], + [deserialize_proof -> ], + [proof3 -> (ByStr561 0x20c73c8b3c730086cfae83d735d2c405d6f5a00c3f1ff21ce91d223038d3c1ab4d000213149490394c2a8701af2dba1a303df05148a14092f6e59febca31eee4da660079807fe94ecb6f6d1b0b65be5f45159925a905bab8040af476c372ea0583dbba00b41a753c36f64bbe6d6fcd6c2ba40dc09c4c25b6b877bd363696fe1f62cbf6f700059195b0df4add4239eaef270bc187217dc872d11723d4fce02a3c2510461e5900f3c3d66c4611791ff1ebe8a2ef43f1cbf40876b637522c60a81f511445f8dc17011f86c65842afb760457d5ce8ad38821d2110331a7bbae87fe131a5e610f3a146004add0a7a5c74a56ce64a3555b4a73f367c414c80ecc15672dd86f7bff8bf65bc011daedaae87fc34d28ec3116dc04386c7c650f5db9e3a9a853c6e518821069bda001c6cf42ace3bf6b1a7e60ae29dc10aad67cdf672cdb083c601ee3996576cc2e401a1a8ab20062ebdcfa7a6e8f0c6c8b3de823920abd351eedc33d043de1c1449880171c734d6d77806f9475b69c8426bc5c09ce54c0b4ccb13df4315c62899e9926201f459d25426b21e5f2f6bdabf5e6a79f36002114b1ecc5cfa30a18cf3e4baf98d01ad42157822143a7be209b907901a31863d1b35ad9118c4c45d476e405872fb66017badaf21d00ca7e2a73c64dd7738ddcb6a881dcfb88ef0c171e33bfec529fe0a00e0a6008bab76556dbf47269adc41d6820c6a55982e9362257bfdf02a79ff5b8d01061cd147d032d11b1b7b6b5edc389f56d33f939e51be3c7949b357aac4e120df)], + [proof2 -> (ByStr209 0xd020e91d858cba58b3dff91bf4b3adcacabf899e106ed6ad86a16a4a29e7817e307c080000000000000020b697330bd7a5850235f97d1bcd1c37739f4bc79a4f8e635dcb46ba45bc600ef4012f14f71b55ef55cedc91fd007f7a9ba386ec978f3aa80200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14000000000000000000000000000000000000000014344cfc3b8635f72f14200aaf2168d9f75df86fd36226100000000000000000000000000000000000000000000000000000000000)], + [proof -> (ByStr249 0xd72000ca93f8738111a063d8ab7221f47c70a4cade0ca4a2829df494cd4b5e231bd60300000000000000204caa77a3d2ddfaa318c550f1f38dd09d610dcff827d1f2ccd4ddcafaa6c553cc081b0000000000000014b7041bc96b15da728fdfc1c47cbfc687b845adeb0200000000000000144ddcf539d13e92d4151b7f5e607d4a09f725c47d06756e6c6f636b4a14406d31a9291bdaed4f4bc31b97dc468f88256ded14344cfc3b8635f72f14200aaf2168d9f75df86fd353000000000000000000000000000000000000000000000000000000000000000177d99c0f0857535155071d49ded129993a5b98575761985e90e2d26c7a569a0d)] } +Gas remaining: 3984475 diff --git a/tests/eval/good/gold/polynetwork_extract_bystr1.scilexp.gold b/tests/eval/good/gold/polynetwork_extract_bystr1.scilexp.gold new file mode 100644 index 000000000..d4e4c274b --- /dev/null +++ b/tests/eval/good/gold/polynetwork_extract_bystr1.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0x0b2d230f552225a8cfa47efe)], + [len -> (Uint32 12)], + [full_len -> (Uint32 12)], + [value_reserialized -> (ByStr 0x0b2d230f552225a8cfa47efe)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [bs -> (ByStr 0x2d230f552225a8cfa47efe)], + [bs_opt -> (Some (Pair (ByStr 0x2d230f552225a8cfa47efe) (Uint32 12)))], + [pos -> (Uint32 0)], + [value -> (ByStr 0x0b2d230f552225a8cfa47efe)], + [bytes -> (ByStr12 0x0b2d230f552225a8cfa47efe)] } +Gas remaining: 4000843 diff --git a/tests/eval/good/gold/polynetwork_extract_bystr2.scilexp.gold b/tests/eval/good/gold/polynetwork_extract_bystr2.scilexp.gold new file mode 100644 index 000000000..ee0fc42d4 --- /dev/null +++ b/tests/eval/good/gold/polynetwork_extract_bystr2.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xfd450178d637ba68eb987928008958980e99d956fbf0566880836ca608ff2156a8a2aca3f7d09f4323a1a7a7532e9ba61875dc644abc448462d63cd95a25a7a4688ecd4a388f75ccc82b2e01960a95e00d5d17958c6d629c5dfd908d2b7283f70a819bfcfa2d174c6583a729eba6f8c0db08238c3b7c395f7a1f12bfbe1e594bb1a737d7574f1c962493781454ac34205f9bd4891c8c1700544ca7af2cc8707dbcaf8f29e7d659108564c8d8e14a75c4cde41194b2ca0378c7745ca15527866d663a65fbff71079926f526387513cf211cce00780c66a535a7592d2dbf6eb1824d863087f3a340e46aaebd07910b3598c45d23da1a23033c926a5ac4d8de345a2a407962408e53cec475caf303d3b2e49a8fada6aabaeda8510d85e8801083a7a675ac82549d8070d2eec018edbafb59d39c21b732f177c66b22d3dabc5f2fb3178e5c2e4d887fee)], + [len -> (Uint32 328)], + [full_len -> (Uint32 584)], + [value_reserialized -> (ByStr 0xfd450178d637ba68eb987928008958980e99d956fbf0566880836ca608ff2156a8a2aca3f7d09f4323a1a7a7532e9ba61875dc644abc448462d63cd95a25a7a4688ecd4a388f75ccc82b2e01960a95e00d5d17958c6d629c5dfd908d2b7283f70a819bfcfa2d174c6583a729eba6f8c0db08238c3b7c395f7a1f12bfbe1e594bb1a737d7574f1c962493781454ac34205f9bd4891c8c1700544ca7af2cc8707dbcaf8f29e7d659108564c8d8e14a75c4cde41194b2ca0378c7745ca15527866d663a65fbff71079926f526387513cf211cce00780c66a535a7592d2dbf6eb1824d863087f3a340e46aaebd07910b3598c45d23da1a23033c926a5ac4d8de345a2a407962408e53cec475caf303d3b2e49a8fada6aabaeda8510d85e8801083a7a675ac82549d8070d2eec018edbafb59d39c21b732f177c66b22d3dabc5f2fb3178e5c2e4d887fee)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [bs -> (ByStr 0x78d637ba68eb987928008958980e99d956fbf0566880836ca608ff2156a8a2aca3f7d09f4323a1a7a7532e9ba61875dc644abc448462d63cd95a25a7a4688ecd4a388f75ccc82b2e01960a95e00d5d17958c6d629c5dfd908d2b7283f70a819bfcfa2d174c6583a729eba6f8c0db08238c3b7c395f7a1f12bfbe1e594bb1a737d7574f1c962493781454ac34205f9bd4891c8c1700544ca7af2cc8707dbcaf8f29e7d659108564c8d8e14a75c4cde41194b2ca0378c7745ca15527866d663a65fbff71079926f526387513cf211cce00780c66a535a7592d2dbf6eb1824d863087f3a340e46aaebd07910b3598c45d23da1a23033c926a5ac4d8de345a2a407962408e53cec475caf303d3b2e49a8fada6aabaeda8510d85e8801083a7a675ac82549d8070d2eec018edbafb59d39c21b732f177c66b22d3dabc5f2fb3178e5c2e4d887fee)], + [bs_opt -> (Some (Pair (ByStr 0x78d637ba68eb987928008958980e99d956fbf0566880836ca608ff2156a8a2aca3f7d09f4323a1a7a7532e9ba61875dc644abc448462d63cd95a25a7a4688ecd4a388f75ccc82b2e01960a95e00d5d17958c6d629c5dfd908d2b7283f70a819bfcfa2d174c6583a729eba6f8c0db08238c3b7c395f7a1f12bfbe1e594bb1a737d7574f1c962493781454ac34205f9bd4891c8c1700544ca7af2cc8707dbcaf8f29e7d659108564c8d8e14a75c4cde41194b2ca0378c7745ca15527866d663a65fbff71079926f526387513cf211cce00780c66a535a7592d2dbf6eb1824d863087f3a340e46aaebd07910b3598c45d23da1a23033c926a5ac4d8de345a2a407962408e53cec475caf303d3b2e49a8fada6aabaeda8510d85e8801083a7a675ac82549d8070d2eec018edbafb59d39c21b732f177c66b22d3dabc5f2fb3178e5c2e4d887fee) (Uint32 584)))], + [pos -> (Uint32 256)], + [value -> (ByStr 0xfdfd00136f80cd6ff844e6944bd8a6637b1bb9aa6788f35560128e29e283b7edeef41f3206a14150bd01acaf81849f73c8f38b56690604505bf5b9562fa2b179c63e9808a01e2efc252d6ad56b9f0d2f6a15894a62ea253373c043d39914a274da8fc85d8464460b6eb4feaccebf3fc24963db11d0a3cb550f395d3781421e858e62efe41a5bf25b6ed94350313032bdf9b1985535e04671f887dac3f6c094caa761a110a614145153ca2c91b8b9e03c82846159fa184dd868cc0e06c13a35936c04e0d9dd573469fa8441c11f833a42aa769eba588b19fcf5bb65925531689e1ee0abd646c35e19abe9aa3c4001a960652139bf126f16297f7bef2b8c823f54fd450178d637ba68eb987928008958980e99d956fbf0566880836ca608ff2156a8a2aca3f7d09f4323a1a7a7532e9ba61875dc644abc448462d63cd95a25a7a4688ecd4a388f75ccc82b2e01960a95e00d5d17958c6d629c5dfd908d2b7283f70a819bfcfa2d174c6583a729eba6f8c0db08238c3b7c395f7a1f12bfbe1e594bb1a737d7574f1c962493781454ac34205f9bd4891c8c1700544ca7af2cc8707dbcaf8f29e7d659108564c8d8e14a75c4cde41194b2ca0378c7745ca15527866d663a65fbff71079926f526387513cf211cce00780c66a535a7592d2dbf6eb1824d863087f3a340e46aaebd07910b3598c45d23da1a23033c926a5ac4d8de345a2a407962408e53cec475caf303d3b2e49a8fada6aabaeda8510d85e8801083a7a675ac82549d8070d2eec018edbafb59d39c21b732f177c66b22d3dabc5f2fb3178e5c2e4d887fee)], + [bytes -> (ByStr584 0xfdfd00136f80cd6ff844e6944bd8a6637b1bb9aa6788f35560128e29e283b7edeef41f3206a14150bd01acaf81849f73c8f38b56690604505bf5b9562fa2b179c63e9808a01e2efc252d6ad56b9f0d2f6a15894a62ea253373c043d39914a274da8fc85d8464460b6eb4feaccebf3fc24963db11d0a3cb550f395d3781421e858e62efe41a5bf25b6ed94350313032bdf9b1985535e04671f887dac3f6c094caa761a110a614145153ca2c91b8b9e03c82846159fa184dd868cc0e06c13a35936c04e0d9dd573469fa8441c11f833a42aa769eba588b19fcf5bb65925531689e1ee0abd646c35e19abe9aa3c4001a960652139bf126f16297f7bef2b8c823f54fd450178d637ba68eb987928008958980e99d956fbf0566880836ca608ff2156a8a2aca3f7d09f4323a1a7a7532e9ba61875dc644abc448462d63cd95a25a7a4688ecd4a388f75ccc82b2e01960a95e00d5d17958c6d629c5dfd908d2b7283f70a819bfcfa2d174c6583a729eba6f8c0db08238c3b7c395f7a1f12bfbe1e594bb1a737d7574f1c962493781454ac34205f9bd4891c8c1700544ca7af2cc8707dbcaf8f29e7d659108564c8d8e14a75c4cde41194b2ca0378c7745ca15527866d663a65fbff71079926f526387513cf211cce00780c66a535a7592d2dbf6eb1824d863087f3a340e46aaebd07910b3598c45d23da1a23033c926a5ac4d8de345a2a407962408e53cec475caf303d3b2e49a8fada6aabaeda8510d85e8801083a7a675ac82549d8070d2eec018edbafb59d39c21b732f177c66b22d3dabc5f2fb3178e5c2e4d887fee)] } +Gas remaining: 3995274 diff --git a/tests/eval/good/gold/polynetwork_extract_bystr3.scilexp.gold b/tests/eval/good/gold/polynetwork_extract_bystr3.scilexp.gold new file mode 100644 index 000000000..ff57a0828 --- /dev/null +++ b/tests/eval/good/gold/polynetwork_extract_bystr3.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xfd1027ab9fea32aa32379fb5973737271546abe3eb18f224ca6b0eca2cf365b504ce74674f4e45fe95efe38eb421eb464c2fe624f6f382e143dfcd9d794798b4bca9829a733e22ae2f4e5db6f3c6d66840256ff767008f9a1c8afc3c09b6372c21530ca236fa95bc41bac0426bf4470617cc4b84f6ff2d440696194487271ce53038a9e0e7422084b970855f00670faa243b90a0de96aefbb5e2cc09441d23854b25e184e73f650dcbf3fb4d95124ad6147c8b354712ff8f3ad30bb7e1093e105069f09cb79bed6b8a40c13a9d3e4ca52e6f93a14ef7a537874621213def551cb5e2c34c25b386c9fcea0c2f73a3a294eac3fbaa397fd579360956fe98ab83cd9fbf055dcf2f76b9038b0a8f96c2b0976749dab1338999816ab96826a14e9d3b2d13da99d0eae7aa71b7e4019d9cdc741e2dd43d06b3d6ef15fe96f757953a6925b8db5480b5a50e3b4a05aee8ee2db835c60432b03967e0a8b4ea4d582eea7a9a08e815a542b6ca071270da44c9922e898288566b379b9ad8776180cd2ef2830ec2beb389c6a7d5cf3f2631fe76decc8bf3e4a00d33be2de1f05d13a996134dbb550102646272e162f5edf390c236e62f6317ce86d36c28c961e8ef7a7d28f0db9f891f9eb0d9aea539b643d3e36245dcc4ffbd9f14999fac2e83ef8d36eb2ca61250803de9e55e829eec555b27ae36f89b02b84d22b02e7895fff250d90eae203725a4a406c521f0167471fb15cfd7f2301dbfe8f8f92f2904ecba3810ec98af70139fe692a635b6fc03c298519144f4a8a2b1e99d76bc10bda957c98c962af2ba83a11806eb04cce47a3bb9e7080a4d9dce73b38e7470f1dcf943480d3c3b297742bf2a1a7e158053c1ac31a9cf82f885002c1a70a05a06e6d2d405e11e9b1739bee34e4dbe692da45200ace30f32ec7c582c426a8a0fdb531a54497513ebfd23c46df6655122163c4daec34e6200eff1a3dd8a56b08beebb2916827468f94e25d0aa55c9cb4865d6bf93d9f2aa79b2c506e3ee42725e74857da64d96436559328f09979d1f3a0ac9d9e57b3d9eed2c79565885a0e7bded90f5c49cc250d4bd416c98acdbe6d1242d497288a73809a299a3e7dc385475f3edf88fb8a58685686fd07a3c6ce4bc1506bb3447e786965b52076f264d4b1c20e5891eb01c9cbca29ca7966d9f4afcc9fc882313fe78b2f619d8581f5e734cbbc4b6057aadba8b2783ec8c0cb3765308691312599973d6d706dd15978613198347f947361fd2a62d47d9f2b441e70778eb4fe36dc1b1448400808e95434334909a0fffc50149032e914512eac90ee93bd42ee4cdb0169784c3e6e14c8727cb5f4ac6f09a2e8f3658d932aa7125129bf8c44462d235d5ca3b1499bbde9122b294f1631c874751c05be0dbd85ecd76b3878fa1ab2dfa340d6f6b292e13bc5101ca473c4e7187349f49b77e5fb85c93bc4787f67f6c73cd7ee13cc38adbb6cbf80875faf802977b1e4a33cf5b869cf813795a4b83b52bea5db8023aa37926704d399dbdc07380a27de2090f49874188885c1410a941612e3cbd0daa3f0e9bb03adc04baa39ff5a15c863956ae25d46f4651145018062510525473c8ee56aa441b00284864d6ee35800bedcf0f0229490c41a02fb2dc576dbeff02fef82b548e89551980a4ce81734245ebd19cc46ef85c343c9e8d3ca3b6c78fb1191ac7284f2adcab376c58e89de6e6cf920f7c9caaefdbebc75d43e667217e0ee2c76216a1081ae410f41bf9117610259031fa64ab7f6db709fdecf9841036c5121bb32ad2393c67793ea194df33b0b66dafe7c732039610815591b89f398ea50fe8a857d63519e1459c6f0f6104a43a740040577df77e4986423547cbb89bb1356905a49253297e3b16c864e5faf5b323b4fa21462aa58bb036962f187abecadff6e9fddd0cba0ca6a55cbc20c81d206f71f31a92ac8c6c05d7ac2936e5bbe2b33607415eb26eaa54c8d84d2cc995581bdb16c2861dd0f3e02e02bfcd738372562784c84cdf2f23cdcf4e5af1c8101350eaaf741d113e01b02ea8ff1c7e05c76baeb5fea802ab842d8ae402e3c085301138b41e6859c6ba779a154b3f349f08a75216930c3e9440601f64c8feab21752b86db43ca2cac1a52560612134f4233c43bd8d5899599389925a4d123ee506e2c40ecd529b5fc462caea75e4ff1904447cc1ef5acbee90878ce75f33cf81b0c95c1daf9a92802424892c1c1cdbc348d6c04d690a53b05a91666b27a8342891edda43f1ba02df2f7bc0754169d847ec6cb05a5be68dc602e9761409671b6f37e2fbbc52621caa1b3430b74fa502bde589b44d63bda32ef44adec77756c3f61e8ee63a18e44f27ce017e72bda3fbc009a8abc342479c3bbe5eff6a386758cfaa5b6b7b0e37a9d5ab521377e7eda753cce5f1c4c78fc91dcc9e7696d0ab5f1a246b05767ec25475f50847c745b1cb9ebe00613a2ed4df139c63f9df39cd455a4f9f03e161997e0264bb9243dd8b9f5834ebc3a79504a511d6ca04387dd1629df620bacbd2f9e4ca791bf1e499c4bd63687599a613f8be24aa975c3f8b45778e7b2c041d749e3650c0dbdefb0f11e30e0a10b54aeed76cdbc24ced95c2964d971a0edb10473dec81139127df22a136db0bd238c4d1090dcd876bbe72add03e2e163f62a3e49136aa4b6548733022d5e592dfba77900f9bd769143c81a305a59d1cb8075a8729cac49ff13b4551fd2634df233b4d3d15ca2d6fff083374bdc9a57a9eac94f3e12de3b4e228b16e90298b000d2c38cb886487b46c277a9c29c58f79a6a77422f8390e472d62034a4e454b7ee2947146d28b258fa5daf311d9ccb5325832d2178245528cb4c0750c19dbb9ecdf681ac26de84f77dc93bc30300beb11f883b54a629ab94e26459b5ee8b2e4a76448904d0aab3c27ce841da681378a04b17610473fb61bf9690b9526ab2a643f52f38cfd7ebe0fd6ca6f6aa84cd4dcf07e14856f0f98da8477185c99ce3a7c714cc4ed3d844f27ec1a5866c740161ba59a4bb168a2fc5c3a8aa4c286c18ebc46ebf685ca0bf4255c49a06aa0782b0bcac925c9e45b37a54c993a8bd532e1ce9712dc854e744333f17aa7d2503a7efca0736718a29da781de21f6dea8891df363559261c114126fa9a03d7a0cd942a7728aba5f6e8cbd5882b351d124615a7fc94c186dd4a87c0a7d30ddcbd1c8575ff8bc20932149d70786aef56d4ee02bc17391c25bf43a2492d4aef368434b127f3c387d1ac36202afa8046663f85acb571d4e093c5b058087594a5a6f25d404742cd0675e33f999f850ba3170670ca4498f772dab378c636323a66f500d21d6dfb39b30b84f35ca4df48a73e68f8f7054690eba1c79d858e295c821678072305c0d753226b3975512374f3e10f089cf4f3a1b377dbbd140620e60ac0172d327e112bfd2583952b78cfee367f8b8160a0689a981135ac23e8be26604511802865e94886571ad6103a7ab6a845bd47529373e5648215948ed8f54c509593d21e324e596afffbbe666f6cd0287e39e1fca61f747a58829564f69039f251df4db8d2257a8e995f633d0fb6c767f4b71c3d2daa16acc6f71d6b12b7d24a99ea501fdec75585695f0f7a87e769c434f71a0e352b7ba91403492dbceb33778ca8f36424e38b1444da7205b091365d4598431da60f8d642b8a51165a2cb4163c84607eccda8293da8fff358bd505638a129050e2be9cd1b3d8489183cdd279ef2dac8001d8e3983ee8d485656994d20a8e49a2356d9e1df5c304924c9554250bebb002a6eb553c701d27b0c8ff7c8467739bea88811bb70c368b004ded217ab9333fac7a34d690be8227f7aa1cda61b5f58e93a57610c2e76ff3228b05db2d10e579aa62c1404b822d91845aa417c4302cf1518a800222ccf73bec3f8e4f743c9967ea6d24fbd58c978d57fcb07404ab4809118e63222fc800a7e333f130ef109e75039ae4d6f009ccc7ed3a09845e8e2f9f0e2379b0d34522beb7f5aa9408ab2450e8e36ccc03d3e844e873c7165342ad94ebef06f19e44f21ce355e00499ad74bf8b0314752a360e356b9b7e4415a199ab4f4b3a2201d217ebe2fb052e0b5b72f85fc09051bfc2d60226099f177e915ebb68fa46b6ad3342d3174fa20293c1eefa59b85418313c5cf17ae6faae5b3104d76ba75a70a97c36b0450d1831963f69063335193a3c46cbb7dc04ff77c4b0cc970f8508ccc8475b1d8db78387e2cbaa5142ec8bb0a66fe1511d7e00887922c34b82653dce9a773d4cf843b2df7c28ce3bb61c208aaf55c6cb5ee750623ae3a9bc54cd5e48513012b2e822db6a89e58214cd9c71ac6ce1ec2f6864ff40cbdf51f69b3482653db158a9fc376a82d26b0f9e6ea5dbcf9f32d13b223fe50324311bef14ea5eb4f62637f3bd7f79dacb7ae014c18b2c1a206ee47e7c9b2c8383e9ea5365d42ff8e18b8019f0c3e1f6d13b32d5ef37d2ceb3df7e61d41edc185b1901df27ad3dc03d180e27ff79260b297b525ae3771783f9d9b1f48374e301f8b8dbeaebb14e58ec230d2f187e56b87c622df9889da205c3ee3a56bbc9144f391a2fc5e7d38c65640de762a70c0ba881d3e3963159dcdeaf3169c1f2bff1a94a33ec0888fd741c30647395d910674cbcf932fefe8ce5f8473c6cb9168c6e47128f03fc4f828ef54f22de0d96b4df2e17ee9f92cab674d7a8880d608ff6ad837f2701955d1b81b8e80895a480aa4981eb9f05eb9fc5b78629162093cc587bb2c0d5d95740784173af66249cedc355c14eccc665814320416581062968a28f2df06bd7127ecacd64d4f13deaa0ac5c74c310826209a6b5177c201c7e34789a99921ef883dcbc0ec47147b03a4e0769487b7251ea7ecdbebeaad14453985468d6d536045cf43ace99e2548492320432a6c55075fb284d05524b2f2045f768f5082d8fb5f255fa0c44592f429f6f522472953185fb4b14d5e12bfe7d0175c108339ab9ccf21d992334ed57f68697f999443c0b213bef55f5ba6428032152ea52288ab46c974881a61016c9b3c646518a7b50db66025c76fda0286c0cdddeb2927b1c6cb1d7f9eae2272fb5c5c43c67b7c482100857763376c85414a2d12ea8cd043d3e816675ed6a4956e5909201b23aea5f4ff92aa7a2194543ba0a3b4d90304b665dd781633c9358ea851c1c03940da4b16459593a3b633a52b81c602ce060acca5d339b1fe65e0141742964fea8cf1cc188e9d3f4ec3f6d083e289f19de78bf7f90009d909c6f3ff83c3088f4eb1d5d77065f65e35eafc8db77b850d54da999a3e1982c8c358e7b566d88806c13485a1313b2b836eef50060ab019327303c59259730b87d2728ab2f8897fd78b8190cc83c5620409e7aef73e7fde83327917bf5268b115c5c5f035b1e669bfd7b64fc179989b547b0466aca868ffae9053934411ea988920e5d3e62a407a61e0af37bece5ae42c7e77feff6814fc2ef724a46b41b6b7ba449a230a6f41eb70c2233514539ac5aa3c542bf0ce28c82d66bfe8c53b383a9df54e99a9a3c52d264289f2a84c9c9e94660f786e6c7b7a54f16b30bd65b3d4c5d88af5e8e2da43860331961baca8570905f09d1c915790b85ef4e4b1783dd62b446feff3dec54073daf7beba3a8a291a326495e971ce63df6ca4d767b4c4c7a66093da8babc21be4ccbfdd634edb3797e0e21ddc6f6ee7d673c50b7aa0bb6b422c1e63f5652b7c60f1549e1c4ab655ba99e9020e1b11be699808d40c675c4693e52b9785856d57cca37af89b5332582e5e1b8d628bf620396473c2bacff4922e3c469bfd92dadf215a0406ee211eb248dfdbfe05c83ecf41b660bd58fa7749437a5bd398e06f5ddde0d50239cabe9e1c8e8eb41d980647fa72e99faf1ab3212617cda0c337c22e3a247ba8e3cf5464456b96f5767451aa9a8956c342eabe91d32777e1e5692716c2271f7a2d63d13213d7ef2cc271594bc3f87ae9bb5c3f2d33b7a0b9a2e80737a8455ff2cd1012ce07d446a275aabb819294878b5ca49e04cbd8242cf60f2444587599abc37ed1e068e15d6d0ac6f023bcf13b0438ca03d98f5472e56039844c7a53445d506627834db9a81590271cdc57eb8f8c070a96f01061827731784694b19b611a7713185a292c93a46b8f5eebadb1d836a5170717898656b215774e12ce3e7cb2efbf435f7f6155fe0d60dbe9cccf1aed31b576031480b9362c55f84461c9c3567c94fd7080f977193ddf2089166a3f7152af17e7c38cf765a789df901491c6b2e098a5d073811e8f81dbc3673d2c4e8287e1c0f4d9c359e00e21789a12e4af733f46cdd71e2243b3dd14b915f7303bb5a7dee7d96d890a962e70b85e0431cc13c662a661b5da19976e4c836921fb9f0927e8913316521d56cb57883e2a2a5f7176e24ceb0ac02b16fdf7b61a72e95877982ad2d0a8c571ad1f2b54ef71c681e6e96381930fe5efb934079af88761f195ad82224537006e54622badbb19a39d09882a1c9e72d4f8930caed09a53a402ef1932dee086bfea3501f1c52e95ce88984c7a2124825c4d44bbd6c52800b4694d06efdd18baa1054f28438ab6968da660a22888ada1daac131a937589477b58534a1f813307c185aea551333d82b56fcd17652c5f8c74298da3611ba88a2bdb70cb8f25959c426aa3dbd736c8105f7628716d3e0023219674a7ce2ae84358b3013f678f9af0f59c56f1ca2141fae78ed64e3a9bab60577070f834de4e9bad2bdd8e1ee6db3e07f45d4b965a2d525e327cec85271115078c9040f862f725fdb10340ff97a108ea4e8c00e8fe05df884651c26056afbd3fd2afdfe95c2127f82b376335aaab6f6850583e405264b490bda00b9f43d08292326e14501d90f83b22b6ced6cee5e80cf708ac2546385f846678f7f58caa51bb1a6b7fc56bc7b546d100c62a81c59554caabeb23656fc398a19c5c14acddf9291241f4d66a26c45d644dcacc7110d14c3320f3067aea15a12f4151ad17485d8a23fcbf881976c6624b009d7560682494053888a9f5fc9f0699c7da3f095284a6cb2c3929d33002ce4e6cdcdd1f634981e54baccec74191d77c9efb9ed63902a4634dc45149c6097a0fea9de22890c6252c0d95f21e448530eadca832e6a2990a7bd3c965b928917b2bbebe49b31218a86529a4e7c519e87bba194da78e3f71b0ecca7ca6308f5d50a05a2cb2938d64a1fee087832322a88c6f64802e58badaf6039050774e284a0b5e3e7f81b2ba19b7efb03d9f2188d49f2ff0e8099971271bd0fe3678b68e7a74d07b1eae4b87a7b893f9fb7cbe712a2401507b393ab8176a0ac6793b32d4d90c7ffed5b68b6601dc9c55a6361bb864151a7cb5abc46118612ce5d8e8600b23fb15a4b245158d5a93d60a2c0c6259ec68a29079891378848830cdd80bcdf0d4b38b31961e31b65c236adecc328f50d2b784e3fc12e32bc994691e0684a9b84433aa2cd725d70d6a01f3decb1e026a4e810ced4a00f134b843e03eb27f85e6b98d8e7f12cda178330ce0d2fa6b6e3aa67774265c9cc2fe1d7c0869d05b1178bbdcd9b5cd5565c1752bed94bf36ac743f8cba1c8c32fc915556963f3f0688781b0b32cb0d71b37f089e438ba9acc0bf9db8bc283e88223bb890f47f697707dcc8324801d80adfcfdea602cc573e1f16114198fe71f2c13ac942d5113c2daf230ebf174a85ff365f3e7059ac47d4ac5bf68d3d9c554f3fc64bb75fd439ee745a99fb08850b3b41619eaea4a30de7a607d105837e4776a4adf3a1f2c6728dc1fd4fdf270534f178d6536eabc691d242249b84a17dc6390e9721b2232088ecf4d82b468805ab8a5335cba3cce2b8d4f058dce7539a7e14ae6fbb7bd3485a9268621793f94673e457bf9dae0b3d1aaa52b935b49c24b788ac32b1000dd93ed8bd337bed14d4429f2fdd685ced69dc49998dde24a6af288bd4768aa54d5c971ed3aa74852b0b40399fd1e68f313619d273440801fd233df6fd329c4c5f2d59e27030d57105012b19062bb3c9e2f3d585bf59b804b133e6f46ec2e6d88a0f9a09985dd26c396f247a6d13bfdee507130931fda7c89315e3ec4c2848d0c72672ad6090e50ba0feeaa248ad5d81d3d4ecca2a3c85aad6d7e5ee9ae6f67794ccc514e9c6096fae0243f8bbdcacf773ba6d1df15a02a1631c594e13c5541a9093ed9c1001f0c4f78db0812c88da7b0007ae833b13fe829a5e0cf3d14f479db84cab5111d12e81f86d21a5575f473d2b44d4b947dce9e7ec283990c7785858b2c6d51fb65ffc396c075634dea5b64e23d4f61602a36502b0c20db35ac091a13e3d7a46b6370903abd124d6de1e7531df1a59250a08bf064d176899eb091efa797d464be76696ec2a1878922898f0d58990cb63de9580271faf82aab7d5de664d0bc097e4a24036318ca5bb57a9be7eec4fed1cb94c462dc7e8c015b92814d33c783cf1be00ce8a4e28358bbfd4c4006912b7b68a85ff5dbd043f0c9d91585ff1851d686154387e773c3bf240183b9e424b1bdd657bc9007196ab12621e57c46c279da24632d70d378f30327dc517cb20166123bf376dd043c92ca73d29a60e9bc17a8f42fc2a25f334b1b75e9990c96bd473b870d6e825763a4b36d2e2ef7dec70b663565dd4f40853a82ea8860d0ba2c1defa369ea2186eb7e2a52dcacbf1b2126d246e3abd4d1ad611da370cc39db4a9a656ca98b9c2f73f952edf3598d7579b414ca09ce8ab501245f73a7f93901adc825c3b0e0765530fa3774c67196e89a5d8134c3cb41b85beff740f602827f46227e22564a517278cc13c9d8dbd705d9e2aad693e7ff43674631fdf0e62b24cbc10115cdb712aa5051c228ffd1565af91144c03f711eef9f23c626194e1bb8a5761c462ca36564a75db3def5587f1adf44ca9c2c0bf6d41e5cd79f340e505a0a476addb9215a8b127c4d8a52f00e6bac972c0796d788ef9d9faff5a0f5d53ca7a51198fbbee1f6058e9fcee288f434d2d9478b0ab048d1616f4340529b0dba0ec9dea884cfb97b1339c3671f1e6caadb5a658883332a6fda5cc77010879180e6c5239bbe954f38e1fb8748939a4fcfbbbfcb7133f1544e3647d65a564f1fb993bc47366235371ff2626e125d585e5ebddd0fa9a2d641dbca432b6a2e1774ad01be9d097e906d297fbc281ffb0fb4261c040e47af4ad99d60d7761e9adaf7cb7a3dae550f7278024c44e167729afd09db9a6dbcbac48e43a8ed56034ae87221e69434ffe812359f7e67416296a0d73f86b0cd04d5c5ed6c664ce353f565732a5e5ba9fcaac6d2d6fddb98c9f796dfda0d81922560b6fa044213adc2e5aad055afe8b55b8318d4021f2628f4e564da6d2d6e0a04206458a47f01112313af24cff56cebc5f31db719c4c6010704c74ecd78e75763274e59eda0edb41b7b650989be3d12ce11da06956813c8e72ab5b9902a7711feef4b75a170c15b9ed692da26aa2b8e44eb0af70a0813451ba666b0a5c020da273207da6f1fde6e231ed1a35692ecd4ee3b00c56cda80cd612ef898997babcc4541c6ab6c3469b240be51414b525e7056021f3f359d46f99d0ff09c011fc88629d1a94afb533bfcefe3bbf081c3d7efaed8058003f388aaddb16b13c1e9046a9eeceea33946c58e035df188fdfcece96ce34d5b224f399f0694218f3acccbb5a8760223f53741ddecf8969e2b2b90d93196a5a5e813f66774e51fa20a6dfe4534d37087eb9b37c95eb8ad3f9e4282f12286327041253a0b04ef7be483cbfc61a9d3a08ab03dd71c3974f97c3920038a5a58a3ab1139d1a89f8511f070d11790b39b9507027346b47ec4b8d6387ea89037e27a159bf90101197123ca0880bcb050a9f0f74debea4f722e9d300e3f9560af9ffb1a30730dd4ada4c7a23f7feba9c2b199fd169eda543fd1d07eebd2cc3f34e4e45bc0913019a1e84bb9c8352a5e30f60742e676930ea220877214a1081fba3bcf492d46e82b7422a23ad87a4d6cb48668df7c77dfd7ed31fdc51b4caf51fd17b9c93bcd43355de31579793d3718992f3bc280fa42ecacbbd0cd728a5c87d06099a866dd3bc47dcd075bcad79d203a9dd2099ed98c42da7d16d2871dc83513f63ba615904a3c352554b8b441e2619830fd782da099d8092954ab5bc9fba6947bd5865b2b7624f00aa8ee8f96d744bed892a6270500c7c8018b934b1a6f3b791a91ca3a3d4a892c2e3d61b07eabddbcab39a8b845e7fae4be3f350ff10e37a914e158028e580dcc8c9b101637ad972c09ae2b1b5b9b6380e60a60967007a8ab544d6f1560a76bf3ef542bbad0a5f67ef49508f945aa10e7dd724087fd4cecd82c97598c9f7855d5bb7125e1204d6457a4bb65c0f221ef7bea3484c3b7f96f245ac14ef82d1f19cfaafc07303983887a099d9322d31547ca121f224febf57e624abea2d9edb4b12fa0c97e9dffa8c98ca71fe3928575511cf248c807b58ad3f6e291b3baa2bb7774ec03e294bb12bbc7dbd7c7be155a8d5212a3ffba5bb63c133f7f7842f46cc07f6414901b7be1735be4c8539bcf0036f13d67fd8fbfbb4a61b96aedfb564f8b8868e81c4b3f0f47440e4a24c6ead01640988622b582eae5cf5ea4d73c21e9aaed88472d8276229f46e3bb9ab582c59f18b332aba9cd5870a83b51d59ae7b578afa6fc43cbf87a9225729aad094683e1def81005ed877f69ffd65f014fecd9ec0a6645fe05a2704804a4cb82f1e104572925587810447fba561ceeb13f994a91ca4847e30f9822e5cc8d1b3ee64fc48521adae58445f3446b1c2903afeabcad8599c9d193764d2525d59771129bd425f097c02137336f1a81cd01f147829451066b176afae16888e8f022a3fb2de089212d2ab14ec24bfbb98fe4b02c31b5c42858d3d2411b02b0eb4d3a3960361abdc8f992064a68f895b0a1ce359ab205e397bd2efc91b395c67b00d891a8ef055641997eab5f8a37172fbbf5d94d1b8b3a4d0994590873132b8f0cfcc750ea29e00bd84e048e335aae497f6bc5791b51dd8acbe2e6c239ebb481e575638d8a0fe86c8b519c937823ea1a51cf4fb223dded9f16804515ef57410d719c0938a6df831b9471bbb8c8eb87e2593f2ca7b69d3223b60c83bbcf8c18ca34430fbf917bdb5e34d4d055f4879a6a4534ebedcd16a7360fba8c066aef0c5c7a860966122564f372f4623ec8982cff567eb9b954700779a7eefdeae74e232d07534d3082fbfe4a9992c62cba566952dbec6f9390d34d423b6d49db42dab7eae14cf88a7c5831939bf7b9f9e93ff0c311ac37cc08590b3b464568f2091352796b155af609aef5b739a5bff4ebc96cb33079d8e5c2a18be1f85eba1b11b782639d4336965b7211e6bac0284555c5c64cab3d7f01fd065b5ac5ac7f3834b74f208ba028bd6a74461a2e3249bdad0853f968b8b88bb32852178d7572699a83c13cacc7278cc3f3bfe54d6463e43eaaa8c4d24cb3411257be52b670a3235215d3724a92625c3fd0964173d44808337714f00cbec1fbcca711794aa6db4176a9c0f94f61fd8262ccd9f1b4f870ee9c68ace67148caadac926957315a62a0eefbb761badf18d59d8ff44ad50c127a95ed36493364974a83443c3648b94c8fc5263d3812433b5b32481ac56c68e5467041a9aafc726e8c6b453eb81bd2850a2b0a0ab0dd892758799d33ac7b81f47f0539b0f44ad96953a09fc8df5e667555fdf885dfbe3510e3184c91fe9f0c8b70adae228c21767a1db697d8d135e2450c6446cd91a0d03d3db5a8c0cd9ef696e0bc98f8fa8991f811f55420440c0ec0b2bc7c537ba55a4451019780a10d1cc733bed0cc24b902f50e96c453bf6651574489eeb6be29094a441789eba006043d42a1912cb0467ea3846ca2394a827acccf5b71fd8c3395a660c83782cae71be1fcc6b2594fe5e9d975c119e916e257fc3423a76709e2a76ea1694a53ab14f1e57f06086e84f5d4ad5bdce8c21f6cdc121a19f527851d1d1695142b11a9996470c0517f673d6223d5cf1ce5dcbe8334b7cff4937d637c0b0abac50dbd0eae6da4f321ea9c24502dcfb1c75f666e2ebb2e72d4185218d0c9b3e52fd1cd1ca69ba5c5efad824ef447d30f0e0c1e8976dc4ac44c24ba5c9a5e74b0a93ebf17957a2593ad26da95ac6dd957d5c494d8d69139be897bbcf501091fd264f2aea64b03af555c541867a59bee0577eea33f4fa0e0c305ffdf4614c5734a5fcb5a969de3a0b381aa54b63457a7f773c031ea97e3d611e8a6f3f46d371d41a1faf6ed982d4c1767e3be9fc3ad65afaa368271bdb958425282bc2f9c1bf22bc9468f773de8f2e3271581678ae5720d6b4a86b344ca362030c62c69c0ab3661fd209b594f521fd316b77469a5716913f45bcfda614a30d2b84fe9c4c89288541a3eb03a0e5ab089e42906b264dbd83b2dc7d2e8466cf61b71aeec16f8ba2d4e7459d5495a804eab7883155107194653aa027a546197759347e5d1ded9a86ac2ff1efdb64dcb3668eaf1cf8283dc8534f7f3aef275f295b89276584189207e9d9318b4b0d26981fcbb951ab30318ed935e76e48f47cce09abc38c08b65398571490256c3ba55840a4ebb99ac7571c1ca26e0de4faa6f6c2cb131f69c1a60a91956705da65e95309b088a6675e43ec3a46fbeed88c93adf53b99677ade9214420f9d6fe7af1af51ecf7ab3937289b899e607536ef066783873097ecdeaac01a4dad515b8f0a93d5d5b376a0385cd19ce8af3ad27edf49e29ecd15d009aba6ce36e3297696fea7439c10aa8a6dda26e045bc3b23ba860dd592f9af113248b4bb87536b44c6f3ea84a2beef322f89f452894143a760ccd115fde979ce22df0c972aba55e824732421727dc293dbc952993ef9709cc162712e4ba0f282e4828db5cae2dda17a2567614382f7432a863669d314396274666a4155247f34e1bfcf307d6bbd1d687229cfc254b93399e0ca411da5238168bcfdb817ba76df22db45e2442c9203f6c294de5833e220428f1c5f00919dc95ea9b41908c3d505bab6d9d61b7abeff0a50253d84e6e5f988599bbd8d91fcd40e98d1387f85a9ece6c7bc921adf5d5b79297533dd99d85b8521626911ecba49bbb926d8f6d942023e4ea5d29189b3e84427814cbf32085eec4a9398c4ffe00860a4290cb9620d34805d600f5b39b2f5fcead98a0f00dbe5920f36cda3a320e032856c704973e815dd2a6df55774c1fdd196fed707e0787d5aa96235d047169d4521aa4616f75ffe20aa97d628aba6b02fbc903c33bf5358d22492fb377eaca9434d152ded8d55ece173874000989abead5610f592e6bff13e355e89ca65e9352d2cc0c8e8c8f880e575a0c028f97dddfbc1021573b09b3fa3c0d59f1d5cf80967281216aa875e7ff6be97bacf72d9717c439986947f06d8e896b9b491cdebea3719c2f1f33f4f50e3cf121ff207b1065987ad11cd69ae2ca75a1a93768a0176b07b41759fd7ff6126c77da28d6672e182715d83cd86b29154da958ec41572cc1d92a79cad131a76b4a10f4a999417401339999c09f617d65e10a07ce81ea0dfe92698c09e41198cac0a4ca05024417998a453c2cff3b0f3ba4a1a0c90ece3c4804b3bdf7c26af48e70d6a465286b47f76fb319666d3ad601e112fb288a3da8e14e991d53da31b15661bebae9e9f9d9d6bd3f2b663d06de74d98325bea9874e077d47cc6a4e2b246ea17604fab6a364a193c82d8db985b8893f189c06c22bcd1e69913faac36f781029f079cb8c62287fd48de0e1ea62c255e713f3ef4d5fad5458cd8616f6ccad9264b27897c2cc2cbd1d7bc66695bfa46487be4e94ed4dc94cc0303556c5887e8c64dab57c6ed16ad233176afc8832a45e23825bfaf9d086d101acc56c087e30381e6e5157b3ecdff8ee3bd478e89b0ffb70926ddf84cac9644a8023847ec6edeaa54a23d5a51eb2bd395cb9e840c712e114c7f83ced83dabd7cddb59927b7fda6cc0cef39376c8e97696033a8e9579a3126718c684b36f67e1b95fd12f439487019aeabce58596a2d5046d568f09621cfbf60641a9d29514d25df50d126ceec4a227831fe694c86bc98fab2500dec20598fccba17d423eecd9f009625c4e07217dae405de9b6b806e41c15d73f0072196)], + [len -> (Uint32 10003)], + [full_len -> (Uint32 10587)], + [value_reserialized -> (ByStr 0xfd1027ab9fea32aa32379fb5973737271546abe3eb18f224ca6b0eca2cf365b504ce74674f4e45fe95efe38eb421eb464c2fe624f6f382e143dfcd9d794798b4bca9829a733e22ae2f4e5db6f3c6d66840256ff767008f9a1c8afc3c09b6372c21530ca236fa95bc41bac0426bf4470617cc4b84f6ff2d440696194487271ce53038a9e0e7422084b970855f00670faa243b90a0de96aefbb5e2cc09441d23854b25e184e73f650dcbf3fb4d95124ad6147c8b354712ff8f3ad30bb7e1093e105069f09cb79bed6b8a40c13a9d3e4ca52e6f93a14ef7a537874621213def551cb5e2c34c25b386c9fcea0c2f73a3a294eac3fbaa397fd579360956fe98ab83cd9fbf055dcf2f76b9038b0a8f96c2b0976749dab1338999816ab96826a14e9d3b2d13da99d0eae7aa71b7e4019d9cdc741e2dd43d06b3d6ef15fe96f757953a6925b8db5480b5a50e3b4a05aee8ee2db835c60432b03967e0a8b4ea4d582eea7a9a08e815a542b6ca071270da44c9922e898288566b379b9ad8776180cd2ef2830ec2beb389c6a7d5cf3f2631fe76decc8bf3e4a00d33be2de1f05d13a996134dbb550102646272e162f5edf390c236e62f6317ce86d36c28c961e8ef7a7d28f0db9f891f9eb0d9aea539b643d3e36245dcc4ffbd9f14999fac2e83ef8d36eb2ca61250803de9e55e829eec555b27ae36f89b02b84d22b02e7895fff250d90eae203725a4a406c521f0167471fb15cfd7f2301dbfe8f8f92f2904ecba3810ec98af70139fe692a635b6fc03c298519144f4a8a2b1e99d76bc10bda957c98c962af2ba83a11806eb04cce47a3bb9e7080a4d9dce73b38e7470f1dcf943480d3c3b297742bf2a1a7e158053c1ac31a9cf82f885002c1a70a05a06e6d2d405e11e9b1739bee34e4dbe692da45200ace30f32ec7c582c426a8a0fdb531a54497513ebfd23c46df6655122163c4daec34e6200eff1a3dd8a56b08beebb2916827468f94e25d0aa55c9cb4865d6bf93d9f2aa79b2c506e3ee42725e74857da64d96436559328f09979d1f3a0ac9d9e57b3d9eed2c79565885a0e7bded90f5c49cc250d4bd416c98acdbe6d1242d497288a73809a299a3e7dc385475f3edf88fb8a58685686fd07a3c6ce4bc1506bb3447e786965b52076f264d4b1c20e5891eb01c9cbca29ca7966d9f4afcc9fc882313fe78b2f619d8581f5e734cbbc4b6057aadba8b2783ec8c0cb3765308691312599973d6d706dd15978613198347f947361fd2a62d47d9f2b441e70778eb4fe36dc1b1448400808e95434334909a0fffc50149032e914512eac90ee93bd42ee4cdb0169784c3e6e14c8727cb5f4ac6f09a2e8f3658d932aa7125129bf8c44462d235d5ca3b1499bbde9122b294f1631c874751c05be0dbd85ecd76b3878fa1ab2dfa340d6f6b292e13bc5101ca473c4e7187349f49b77e5fb85c93bc4787f67f6c73cd7ee13cc38adbb6cbf80875faf802977b1e4a33cf5b869cf813795a4b83b52bea5db8023aa37926704d399dbdc07380a27de2090f49874188885c1410a941612e3cbd0daa3f0e9bb03adc04baa39ff5a15c863956ae25d46f4651145018062510525473c8ee56aa441b00284864d6ee35800bedcf0f0229490c41a02fb2dc576dbeff02fef82b548e89551980a4ce81734245ebd19cc46ef85c343c9e8d3ca3b6c78fb1191ac7284f2adcab376c58e89de6e6cf920f7c9caaefdbebc75d43e667217e0ee2c76216a1081ae410f41bf9117610259031fa64ab7f6db709fdecf9841036c5121bb32ad2393c67793ea194df33b0b66dafe7c732039610815591b89f398ea50fe8a857d63519e1459c6f0f6104a43a740040577df77e4986423547cbb89bb1356905a49253297e3b16c864e5faf5b323b4fa21462aa58bb036962f187abecadff6e9fddd0cba0ca6a55cbc20c81d206f71f31a92ac8c6c05d7ac2936e5bbe2b33607415eb26eaa54c8d84d2cc995581bdb16c2861dd0f3e02e02bfcd738372562784c84cdf2f23cdcf4e5af1c8101350eaaf741d113e01b02ea8ff1c7e05c76baeb5fea802ab842d8ae402e3c085301138b41e6859c6ba779a154b3f349f08a75216930c3e9440601f64c8feab21752b86db43ca2cac1a52560612134f4233c43bd8d5899599389925a4d123ee506e2c40ecd529b5fc462caea75e4ff1904447cc1ef5acbee90878ce75f33cf81b0c95c1daf9a92802424892c1c1cdbc348d6c04d690a53b05a91666b27a8342891edda43f1ba02df2f7bc0754169d847ec6cb05a5be68dc602e9761409671b6f37e2fbbc52621caa1b3430b74fa502bde589b44d63bda32ef44adec77756c3f61e8ee63a18e44f27ce017e72bda3fbc009a8abc342479c3bbe5eff6a386758cfaa5b6b7b0e37a9d5ab521377e7eda753cce5f1c4c78fc91dcc9e7696d0ab5f1a246b05767ec25475f50847c745b1cb9ebe00613a2ed4df139c63f9df39cd455a4f9f03e161997e0264bb9243dd8b9f5834ebc3a79504a511d6ca04387dd1629df620bacbd2f9e4ca791bf1e499c4bd63687599a613f8be24aa975c3f8b45778e7b2c041d749e3650c0dbdefb0f11e30e0a10b54aeed76cdbc24ced95c2964d971a0edb10473dec81139127df22a136db0bd238c4d1090dcd876bbe72add03e2e163f62a3e49136aa4b6548733022d5e592dfba77900f9bd769143c81a305a59d1cb8075a8729cac49ff13b4551fd2634df233b4d3d15ca2d6fff083374bdc9a57a9eac94f3e12de3b4e228b16e90298b000d2c38cb886487b46c277a9c29c58f79a6a77422f8390e472d62034a4e454b7ee2947146d28b258fa5daf311d9ccb5325832d2178245528cb4c0750c19dbb9ecdf681ac26de84f77dc93bc30300beb11f883b54a629ab94e26459b5ee8b2e4a76448904d0aab3c27ce841da681378a04b17610473fb61bf9690b9526ab2a643f52f38cfd7ebe0fd6ca6f6aa84cd4dcf07e14856f0f98da8477185c99ce3a7c714cc4ed3d844f27ec1a5866c740161ba59a4bb168a2fc5c3a8aa4c286c18ebc46ebf685ca0bf4255c49a06aa0782b0bcac925c9e45b37a54c993a8bd532e1ce9712dc854e744333f17aa7d2503a7efca0736718a29da781de21f6dea8891df363559261c114126fa9a03d7a0cd942a7728aba5f6e8cbd5882b351d124615a7fc94c186dd4a87c0a7d30ddcbd1c8575ff8bc20932149d70786aef56d4ee02bc17391c25bf43a2492d4aef368434b127f3c387d1ac36202afa8046663f85acb571d4e093c5b058087594a5a6f25d404742cd0675e33f999f850ba3170670ca4498f772dab378c636323a66f500d21d6dfb39b30b84f35ca4df48a73e68f8f7054690eba1c79d858e295c821678072305c0d753226b3975512374f3e10f089cf4f3a1b377dbbd140620e60ac0172d327e112bfd2583952b78cfee367f8b8160a0689a981135ac23e8be26604511802865e94886571ad6103a7ab6a845bd47529373e5648215948ed8f54c509593d21e324e596afffbbe666f6cd0287e39e1fca61f747a58829564f69039f251df4db8d2257a8e995f633d0fb6c767f4b71c3d2daa16acc6f71d6b12b7d24a99ea501fdec75585695f0f7a87e769c434f71a0e352b7ba91403492dbceb33778ca8f36424e38b1444da7205b091365d4598431da60f8d642b8a51165a2cb4163c84607eccda8293da8fff358bd505638a129050e2be9cd1b3d8489183cdd279ef2dac8001d8e3983ee8d485656994d20a8e49a2356d9e1df5c304924c9554250bebb002a6eb553c701d27b0c8ff7c8467739bea88811bb70c368b004ded217ab9333fac7a34d690be8227f7aa1cda61b5f58e93a57610c2e76ff3228b05db2d10e579aa62c1404b822d91845aa417c4302cf1518a800222ccf73bec3f8e4f743c9967ea6d24fbd58c978d57fcb07404ab4809118e63222fc800a7e333f130ef109e75039ae4d6f009ccc7ed3a09845e8e2f9f0e2379b0d34522beb7f5aa9408ab2450e8e36ccc03d3e844e873c7165342ad94ebef06f19e44f21ce355e00499ad74bf8b0314752a360e356b9b7e4415a199ab4f4b3a2201d217ebe2fb052e0b5b72f85fc09051bfc2d60226099f177e915ebb68fa46b6ad3342d3174fa20293c1eefa59b85418313c5cf17ae6faae5b3104d76ba75a70a97c36b0450d1831963f69063335193a3c46cbb7dc04ff77c4b0cc970f8508ccc8475b1d8db78387e2cbaa5142ec8bb0a66fe1511d7e00887922c34b82653dce9a773d4cf843b2df7c28ce3bb61c208aaf55c6cb5ee750623ae3a9bc54cd5e48513012b2e822db6a89e58214cd9c71ac6ce1ec2f6864ff40cbdf51f69b3482653db158a9fc376a82d26b0f9e6ea5dbcf9f32d13b223fe50324311bef14ea5eb4f62637f3bd7f79dacb7ae014c18b2c1a206ee47e7c9b2c8383e9ea5365d42ff8e18b8019f0c3e1f6d13b32d5ef37d2ceb3df7e61d41edc185b1901df27ad3dc03d180e27ff79260b297b525ae3771783f9d9b1f48374e301f8b8dbeaebb14e58ec230d2f187e56b87c622df9889da205c3ee3a56bbc9144f391a2fc5e7d38c65640de762a70c0ba881d3e3963159dcdeaf3169c1f2bff1a94a33ec0888fd741c30647395d910674cbcf932fefe8ce5f8473c6cb9168c6e47128f03fc4f828ef54f22de0d96b4df2e17ee9f92cab674d7a8880d608ff6ad837f2701955d1b81b8e80895a480aa4981eb9f05eb9fc5b78629162093cc587bb2c0d5d95740784173af66249cedc355c14eccc665814320416581062968a28f2df06bd7127ecacd64d4f13deaa0ac5c74c310826209a6b5177c201c7e34789a99921ef883dcbc0ec47147b03a4e0769487b7251ea7ecdbebeaad14453985468d6d536045cf43ace99e2548492320432a6c55075fb284d05524b2f2045f768f5082d8fb5f255fa0c44592f429f6f522472953185fb4b14d5e12bfe7d0175c108339ab9ccf21d992334ed57f68697f999443c0b213bef55f5ba6428032152ea52288ab46c974881a61016c9b3c646518a7b50db66025c76fda0286c0cdddeb2927b1c6cb1d7f9eae2272fb5c5c43c67b7c482100857763376c85414a2d12ea8cd043d3e816675ed6a4956e5909201b23aea5f4ff92aa7a2194543ba0a3b4d90304b665dd781633c9358ea851c1c03940da4b16459593a3b633a52b81c602ce060acca5d339b1fe65e0141742964fea8cf1cc188e9d3f4ec3f6d083e289f19de78bf7f90009d909c6f3ff83c3088f4eb1d5d77065f65e35eafc8db77b850d54da999a3e1982c8c358e7b566d88806c13485a1313b2b836eef50060ab019327303c59259730b87d2728ab2f8897fd78b8190cc83c5620409e7aef73e7fde83327917bf5268b115c5c5f035b1e669bfd7b64fc179989b547b0466aca868ffae9053934411ea988920e5d3e62a407a61e0af37bece5ae42c7e77feff6814fc2ef724a46b41b6b7ba449a230a6f41eb70c2233514539ac5aa3c542bf0ce28c82d66bfe8c53b383a9df54e99a9a3c52d264289f2a84c9c9e94660f786e6c7b7a54f16b30bd65b3d4c5d88af5e8e2da43860331961baca8570905f09d1c915790b85ef4e4b1783dd62b446feff3dec54073daf7beba3a8a291a326495e971ce63df6ca4d767b4c4c7a66093da8babc21be4ccbfdd634edb3797e0e21ddc6f6ee7d673c50b7aa0bb6b422c1e63f5652b7c60f1549e1c4ab655ba99e9020e1b11be699808d40c675c4693e52b9785856d57cca37af89b5332582e5e1b8d628bf620396473c2bacff4922e3c469bfd92dadf215a0406ee211eb248dfdbfe05c83ecf41b660bd58fa7749437a5bd398e06f5ddde0d50239cabe9e1c8e8eb41d980647fa72e99faf1ab3212617cda0c337c22e3a247ba8e3cf5464456b96f5767451aa9a8956c342eabe91d32777e1e5692716c2271f7a2d63d13213d7ef2cc271594bc3f87ae9bb5c3f2d33b7a0b9a2e80737a8455ff2cd1012ce07d446a275aabb819294878b5ca49e04cbd8242cf60f2444587599abc37ed1e068e15d6d0ac6f023bcf13b0438ca03d98f5472e56039844c7a53445d506627834db9a81590271cdc57eb8f8c070a96f01061827731784694b19b611a7713185a292c93a46b8f5eebadb1d836a5170717898656b215774e12ce3e7cb2efbf435f7f6155fe0d60dbe9cccf1aed31b576031480b9362c55f84461c9c3567c94fd7080f977193ddf2089166a3f7152af17e7c38cf765a789df901491c6b2e098a5d073811e8f81dbc3673d2c4e8287e1c0f4d9c359e00e21789a12e4af733f46cdd71e2243b3dd14b915f7303bb5a7dee7d96d890a962e70b85e0431cc13c662a661b5da19976e4c836921fb9f0927e8913316521d56cb57883e2a2a5f7176e24ceb0ac02b16fdf7b61a72e95877982ad2d0a8c571ad1f2b54ef71c681e6e96381930fe5efb934079af88761f195ad82224537006e54622badbb19a39d09882a1c9e72d4f8930caed09a53a402ef1932dee086bfea3501f1c52e95ce88984c7a2124825c4d44bbd6c52800b4694d06efdd18baa1054f28438ab6968da660a22888ada1daac131a937589477b58534a1f813307c185aea551333d82b56fcd17652c5f8c74298da3611ba88a2bdb70cb8f25959c426aa3dbd736c8105f7628716d3e0023219674a7ce2ae84358b3013f678f9af0f59c56f1ca2141fae78ed64e3a9bab60577070f834de4e9bad2bdd8e1ee6db3e07f45d4b965a2d525e327cec85271115078c9040f862f725fdb10340ff97a108ea4e8c00e8fe05df884651c26056afbd3fd2afdfe95c2127f82b376335aaab6f6850583e405264b490bda00b9f43d08292326e14501d90f83b22b6ced6cee5e80cf708ac2546385f846678f7f58caa51bb1a6b7fc56bc7b546d100c62a81c59554caabeb23656fc398a19c5c14acddf9291241f4d66a26c45d644dcacc7110d14c3320f3067aea15a12f4151ad17485d8a23fcbf881976c6624b009d7560682494053888a9f5fc9f0699c7da3f095284a6cb2c3929d33002ce4e6cdcdd1f634981e54baccec74191d77c9efb9ed63902a4634dc45149c6097a0fea9de22890c6252c0d95f21e448530eadca832e6a2990a7bd3c965b928917b2bbebe49b31218a86529a4e7c519e87bba194da78e3f71b0ecca7ca6308f5d50a05a2cb2938d64a1fee087832322a88c6f64802e58badaf6039050774e284a0b5e3e7f81b2ba19b7efb03d9f2188d49f2ff0e8099971271bd0fe3678b68e7a74d07b1eae4b87a7b893f9fb7cbe712a2401507b393ab8176a0ac6793b32d4d90c7ffed5b68b6601dc9c55a6361bb864151a7cb5abc46118612ce5d8e8600b23fb15a4b245158d5a93d60a2c0c6259ec68a29079891378848830cdd80bcdf0d4b38b31961e31b65c236adecc328f50d2b784e3fc12e32bc994691e0684a9b84433aa2cd725d70d6a01f3decb1e026a4e810ced4a00f134b843e03eb27f85e6b98d8e7f12cda178330ce0d2fa6b6e3aa67774265c9cc2fe1d7c0869d05b1178bbdcd9b5cd5565c1752bed94bf36ac743f8cba1c8c32fc915556963f3f0688781b0b32cb0d71b37f089e438ba9acc0bf9db8bc283e88223bb890f47f697707dcc8324801d80adfcfdea602cc573e1f16114198fe71f2c13ac942d5113c2daf230ebf174a85ff365f3e7059ac47d4ac5bf68d3d9c554f3fc64bb75fd439ee745a99fb08850b3b41619eaea4a30de7a607d105837e4776a4adf3a1f2c6728dc1fd4fdf270534f178d6536eabc691d242249b84a17dc6390e9721b2232088ecf4d82b468805ab8a5335cba3cce2b8d4f058dce7539a7e14ae6fbb7bd3485a9268621793f94673e457bf9dae0b3d1aaa52b935b49c24b788ac32b1000dd93ed8bd337bed14d4429f2fdd685ced69dc49998dde24a6af288bd4768aa54d5c971ed3aa74852b0b40399fd1e68f313619d273440801fd233df6fd329c4c5f2d59e27030d57105012b19062bb3c9e2f3d585bf59b804b133e6f46ec2e6d88a0f9a09985dd26c396f247a6d13bfdee507130931fda7c89315e3ec4c2848d0c72672ad6090e50ba0feeaa248ad5d81d3d4ecca2a3c85aad6d7e5ee9ae6f67794ccc514e9c6096fae0243f8bbdcacf773ba6d1df15a02a1631c594e13c5541a9093ed9c1001f0c4f78db0812c88da7b0007ae833b13fe829a5e0cf3d14f479db84cab5111d12e81f86d21a5575f473d2b44d4b947dce9e7ec283990c7785858b2c6d51fb65ffc396c075634dea5b64e23d4f61602a36502b0c20db35ac091a13e3d7a46b6370903abd124d6de1e7531df1a59250a08bf064d176899eb091efa797d464be76696ec2a1878922898f0d58990cb63de9580271faf82aab7d5de664d0bc097e4a24036318ca5bb57a9be7eec4fed1cb94c462dc7e8c015b92814d33c783cf1be00ce8a4e28358bbfd4c4006912b7b68a85ff5dbd043f0c9d91585ff1851d686154387e773c3bf240183b9e424b1bdd657bc9007196ab12621e57c46c279da24632d70d378f30327dc517cb20166123bf376dd043c92ca73d29a60e9bc17a8f42fc2a25f334b1b75e9990c96bd473b870d6e825763a4b36d2e2ef7dec70b663565dd4f40853a82ea8860d0ba2c1defa369ea2186eb7e2a52dcacbf1b2126d246e3abd4d1ad611da370cc39db4a9a656ca98b9c2f73f952edf3598d7579b414ca09ce8ab501245f73a7f93901adc825c3b0e0765530fa3774c67196e89a5d8134c3cb41b85beff740f602827f46227e22564a517278cc13c9d8dbd705d9e2aad693e7ff43674631fdf0e62b24cbc10115cdb712aa5051c228ffd1565af91144c03f711eef9f23c626194e1bb8a5761c462ca36564a75db3def5587f1adf44ca9c2c0bf6d41e5cd79f340e505a0a476addb9215a8b127c4d8a52f00e6bac972c0796d788ef9d9faff5a0f5d53ca7a51198fbbee1f6058e9fcee288f434d2d9478b0ab048d1616f4340529b0dba0ec9dea884cfb97b1339c3671f1e6caadb5a658883332a6fda5cc77010879180e6c5239bbe954f38e1fb8748939a4fcfbbbfcb7133f1544e3647d65a564f1fb993bc47366235371ff2626e125d585e5ebddd0fa9a2d641dbca432b6a2e1774ad01be9d097e906d297fbc281ffb0fb4261c040e47af4ad99d60d7761e9adaf7cb7a3dae550f7278024c44e167729afd09db9a6dbcbac48e43a8ed56034ae87221e69434ffe812359f7e67416296a0d73f86b0cd04d5c5ed6c664ce353f565732a5e5ba9fcaac6d2d6fddb98c9f796dfda0d81922560b6fa044213adc2e5aad055afe8b55b8318d4021f2628f4e564da6d2d6e0a04206458a47f01112313af24cff56cebc5f31db719c4c6010704c74ecd78e75763274e59eda0edb41b7b650989be3d12ce11da06956813c8e72ab5b9902a7711feef4b75a170c15b9ed692da26aa2b8e44eb0af70a0813451ba666b0a5c020da273207da6f1fde6e231ed1a35692ecd4ee3b00c56cda80cd612ef898997babcc4541c6ab6c3469b240be51414b525e7056021f3f359d46f99d0ff09c011fc88629d1a94afb533bfcefe3bbf081c3d7efaed8058003f388aaddb16b13c1e9046a9eeceea33946c58e035df188fdfcece96ce34d5b224f399f0694218f3acccbb5a8760223f53741ddecf8969e2b2b90d93196a5a5e813f66774e51fa20a6dfe4534d37087eb9b37c95eb8ad3f9e4282f12286327041253a0b04ef7be483cbfc61a9d3a08ab03dd71c3974f97c3920038a5a58a3ab1139d1a89f8511f070d11790b39b9507027346b47ec4b8d6387ea89037e27a159bf90101197123ca0880bcb050a9f0f74debea4f722e9d300e3f9560af9ffb1a30730dd4ada4c7a23f7feba9c2b199fd169eda543fd1d07eebd2cc3f34e4e45bc0913019a1e84bb9c8352a5e30f60742e676930ea220877214a1081fba3bcf492d46e82b7422a23ad87a4d6cb48668df7c77dfd7ed31fdc51b4caf51fd17b9c93bcd43355de31579793d3718992f3bc280fa42ecacbbd0cd728a5c87d06099a866dd3bc47dcd075bcad79d203a9dd2099ed98c42da7d16d2871dc83513f63ba615904a3c352554b8b441e2619830fd782da099d8092954ab5bc9fba6947bd5865b2b7624f00aa8ee8f96d744bed892a6270500c7c8018b934b1a6f3b791a91ca3a3d4a892c2e3d61b07eabddbcab39a8b845e7fae4be3f350ff10e37a914e158028e580dcc8c9b101637ad972c09ae2b1b5b9b6380e60a60967007a8ab544d6f1560a76bf3ef542bbad0a5f67ef49508f945aa10e7dd724087fd4cecd82c97598c9f7855d5bb7125e1204d6457a4bb65c0f221ef7bea3484c3b7f96f245ac14ef82d1f19cfaafc07303983887a099d9322d31547ca121f224febf57e624abea2d9edb4b12fa0c97e9dffa8c98ca71fe3928575511cf248c807b58ad3f6e291b3baa2bb7774ec03e294bb12bbc7dbd7c7be155a8d5212a3ffba5bb63c133f7f7842f46cc07f6414901b7be1735be4c8539bcf0036f13d67fd8fbfbb4a61b96aedfb564f8b8868e81c4b3f0f47440e4a24c6ead01640988622b582eae5cf5ea4d73c21e9aaed88472d8276229f46e3bb9ab582c59f18b332aba9cd5870a83b51d59ae7b578afa6fc43cbf87a9225729aad094683e1def81005ed877f69ffd65f014fecd9ec0a6645fe05a2704804a4cb82f1e104572925587810447fba561ceeb13f994a91ca4847e30f9822e5cc8d1b3ee64fc48521adae58445f3446b1c2903afeabcad8599c9d193764d2525d59771129bd425f097c02137336f1a81cd01f147829451066b176afae16888e8f022a3fb2de089212d2ab14ec24bfbb98fe4b02c31b5c42858d3d2411b02b0eb4d3a3960361abdc8f992064a68f895b0a1ce359ab205e397bd2efc91b395c67b00d891a8ef055641997eab5f8a37172fbbf5d94d1b8b3a4d0994590873132b8f0cfcc750ea29e00bd84e048e335aae497f6bc5791b51dd8acbe2e6c239ebb481e575638d8a0fe86c8b519c937823ea1a51cf4fb223dded9f16804515ef57410d719c0938a6df831b9471bbb8c8eb87e2593f2ca7b69d3223b60c83bbcf8c18ca34430fbf917bdb5e34d4d055f4879a6a4534ebedcd16a7360fba8c066aef0c5c7a860966122564f372f4623ec8982cff567eb9b954700779a7eefdeae74e232d07534d3082fbfe4a9992c62cba566952dbec6f9390d34d423b6d49db42dab7eae14cf88a7c5831939bf7b9f9e93ff0c311ac37cc08590b3b464568f2091352796b155af609aef5b739a5bff4ebc96cb33079d8e5c2a18be1f85eba1b11b782639d4336965b7211e6bac0284555c5c64cab3d7f01fd065b5ac5ac7f3834b74f208ba028bd6a74461a2e3249bdad0853f968b8b88bb32852178d7572699a83c13cacc7278cc3f3bfe54d6463e43eaaa8c4d24cb3411257be52b670a3235215d3724a92625c3fd0964173d44808337714f00cbec1fbcca711794aa6db4176a9c0f94f61fd8262ccd9f1b4f870ee9c68ace67148caadac926957315a62a0eefbb761badf18d59d8ff44ad50c127a95ed36493364974a83443c3648b94c8fc5263d3812433b5b32481ac56c68e5467041a9aafc726e8c6b453eb81bd2850a2b0a0ab0dd892758799d33ac7b81f47f0539b0f44ad96953a09fc8df5e667555fdf885dfbe3510e3184c91fe9f0c8b70adae228c21767a1db697d8d135e2450c6446cd91a0d03d3db5a8c0cd9ef696e0bc98f8fa8991f811f55420440c0ec0b2bc7c537ba55a4451019780a10d1cc733bed0cc24b902f50e96c453bf6651574489eeb6be29094a441789eba006043d42a1912cb0467ea3846ca2394a827acccf5b71fd8c3395a660c83782cae71be1fcc6b2594fe5e9d975c119e916e257fc3423a76709e2a76ea1694a53ab14f1e57f06086e84f5d4ad5bdce8c21f6cdc121a19f527851d1d1695142b11a9996470c0517f673d6223d5cf1ce5dcbe8334b7cff4937d637c0b0abac50dbd0eae6da4f321ea9c24502dcfb1c75f666e2ebb2e72d4185218d0c9b3e52fd1cd1ca69ba5c5efad824ef447d30f0e0c1e8976dc4ac44c24ba5c9a5e74b0a93ebf17957a2593ad26da95ac6dd957d5c494d8d69139be897bbcf501091fd264f2aea64b03af555c541867a59bee0577eea33f4fa0e0c305ffdf4614c5734a5fcb5a969de3a0b381aa54b63457a7f773c031ea97e3d611e8a6f3f46d371d41a1faf6ed982d4c1767e3be9fc3ad65afaa368271bdb958425282bc2f9c1bf22bc9468f773de8f2e3271581678ae5720d6b4a86b344ca362030c62c69c0ab3661fd209b594f521fd316b77469a5716913f45bcfda614a30d2b84fe9c4c89288541a3eb03a0e5ab089e42906b264dbd83b2dc7d2e8466cf61b71aeec16f8ba2d4e7459d5495a804eab7883155107194653aa027a546197759347e5d1ded9a86ac2ff1efdb64dcb3668eaf1cf8283dc8534f7f3aef275f295b89276584189207e9d9318b4b0d26981fcbb951ab30318ed935e76e48f47cce09abc38c08b65398571490256c3ba55840a4ebb99ac7571c1ca26e0de4faa6f6c2cb131f69c1a60a91956705da65e95309b088a6675e43ec3a46fbeed88c93adf53b99677ade9214420f9d6fe7af1af51ecf7ab3937289b899e607536ef066783873097ecdeaac01a4dad515b8f0a93d5d5b376a0385cd19ce8af3ad27edf49e29ecd15d009aba6ce36e3297696fea7439c10aa8a6dda26e045bc3b23ba860dd592f9af113248b4bb87536b44c6f3ea84a2beef322f89f452894143a760ccd115fde979ce22df0c972aba55e824732421727dc293dbc952993ef9709cc162712e4ba0f282e4828db5cae2dda17a2567614382f7432a863669d314396274666a4155247f34e1bfcf307d6bbd1d687229cfc254b93399e0ca411da5238168bcfdb817ba76df22db45e2442c9203f6c294de5833e220428f1c5f00919dc95ea9b41908c3d505bab6d9d61b7abeff0a50253d84e6e5f988599bbd8d91fcd40e98d1387f85a9ece6c7bc921adf5d5b79297533dd99d85b8521626911ecba49bbb926d8f6d942023e4ea5d29189b3e84427814cbf32085eec4a9398c4ffe00860a4290cb9620d34805d600f5b39b2f5fcead98a0f00dbe5920f36cda3a320e032856c704973e815dd2a6df55774c1fdd196fed707e0787d5aa96235d047169d4521aa4616f75ffe20aa97d628aba6b02fbc903c33bf5358d22492fb377eaca9434d152ded8d55ece173874000989abead5610f592e6bff13e355e89ca65e9352d2cc0c8e8c8f880e575a0c028f97dddfbc1021573b09b3fa3c0d59f1d5cf80967281216aa875e7ff6be97bacf72d9717c439986947f06d8e896b9b491cdebea3719c2f1f33f4f50e3cf121ff207b1065987ad11cd69ae2ca75a1a93768a0176b07b41759fd7ff6126c77da28d6672e182715d83cd86b29154da958ec41572cc1d92a79cad131a76b4a10f4a999417401339999c09f617d65e10a07ce81ea0dfe92698c09e41198cac0a4ca05024417998a453c2cff3b0f3ba4a1a0c90ece3c4804b3bdf7c26af48e70d6a465286b47f76fb319666d3ad601e112fb288a3da8e14e991d53da31b15661bebae9e9f9d9d6bd3f2b663d06de74d98325bea9874e077d47cc6a4e2b246ea17604fab6a364a193c82d8db985b8893f189c06c22bcd1e69913faac36f781029f079cb8c62287fd48de0e1ea62c255e713f3ef4d5fad5458cd8616f6ccad9264b27897c2cc2cbd1d7bc66695bfa46487be4e94ed4dc94cc0303556c5887e8c64dab57c6ed16ad233176afc8832a45e23825bfaf9d086d101acc56c087e30381e6e5157b3ecdff8ee3bd478e89b0ffb70926ddf84cac9644a8023847ec6edeaa54a23d5a51eb2bd395cb9e840c712e114c7f83ced83dabd7cddb59927b7fda6cc0cef39376c8e97696033a8e9579a3126718c684b36f67e1b95fd12f439487019aeabce58596a2d5046d568f09621cfbf60641a9d29514d25df50d126ceec4a227831fe694c86bc98fab2500dec20598fccba17d423eecd9f009625c4e07217dae405de9b6b806e41c15d73f0072196)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [bs -> (ByStr 0xab9fea32aa32379fb5973737271546abe3eb18f224ca6b0eca2cf365b504ce74674f4e45fe95efe38eb421eb464c2fe624f6f382e143dfcd9d794798b4bca9829a733e22ae2f4e5db6f3c6d66840256ff767008f9a1c8afc3c09b6372c21530ca236fa95bc41bac0426bf4470617cc4b84f6ff2d440696194487271ce53038a9e0e7422084b970855f00670faa243b90a0de96aefbb5e2cc09441d23854b25e184e73f650dcbf3fb4d95124ad6147c8b354712ff8f3ad30bb7e1093e105069f09cb79bed6b8a40c13a9d3e4ca52e6f93a14ef7a537874621213def551cb5e2c34c25b386c9fcea0c2f73a3a294eac3fbaa397fd579360956fe98ab83cd9fbf055dcf2f76b9038b0a8f96c2b0976749dab1338999816ab96826a14e9d3b2d13da99d0eae7aa71b7e4019d9cdc741e2dd43d06b3d6ef15fe96f757953a6925b8db5480b5a50e3b4a05aee8ee2db835c60432b03967e0a8b4ea4d582eea7a9a08e815a542b6ca071270da44c9922e898288566b379b9ad8776180cd2ef2830ec2beb389c6a7d5cf3f2631fe76decc8bf3e4a00d33be2de1f05d13a996134dbb550102646272e162f5edf390c236e62f6317ce86d36c28c961e8ef7a7d28f0db9f891f9eb0d9aea539b643d3e36245dcc4ffbd9f14999fac2e83ef8d36eb2ca61250803de9e55e829eec555b27ae36f89b02b84d22b02e7895fff250d90eae203725a4a406c521f0167471fb15cfd7f2301dbfe8f8f92f2904ecba3810ec98af70139fe692a635b6fc03c298519144f4a8a2b1e99d76bc10bda957c98c962af2ba83a11806eb04cce47a3bb9e7080a4d9dce73b38e7470f1dcf943480d3c3b297742bf2a1a7e158053c1ac31a9cf82f885002c1a70a05a06e6d2d405e11e9b1739bee34e4dbe692da45200ace30f32ec7c582c426a8a0fdb531a54497513ebfd23c46df6655122163c4daec34e6200eff1a3dd8a56b08beebb2916827468f94e25d0aa55c9cb4865d6bf93d9f2aa79b2c506e3ee42725e74857da64d96436559328f09979d1f3a0ac9d9e57b3d9eed2c79565885a0e7bded90f5c49cc250d4bd416c98acdbe6d1242d497288a73809a299a3e7dc385475f3edf88fb8a58685686fd07a3c6ce4bc1506bb3447e786965b52076f264d4b1c20e5891eb01c9cbca29ca7966d9f4afcc9fc882313fe78b2f619d8581f5e734cbbc4b6057aadba8b2783ec8c0cb3765308691312599973d6d706dd15978613198347f947361fd2a62d47d9f2b441e70778eb4fe36dc1b1448400808e95434334909a0fffc50149032e914512eac90ee93bd42ee4cdb0169784c3e6e14c8727cb5f4ac6f09a2e8f3658d932aa7125129bf8c44462d235d5ca3b1499bbde9122b294f1631c874751c05be0dbd85ecd76b3878fa1ab2dfa340d6f6b292e13bc5101ca473c4e7187349f49b77e5fb85c93bc4787f67f6c73cd7ee13cc38adbb6cbf80875faf802977b1e4a33cf5b869cf813795a4b83b52bea5db8023aa37926704d399dbdc07380a27de2090f49874188885c1410a941612e3cbd0daa3f0e9bb03adc04baa39ff5a15c863956ae25d46f4651145018062510525473c8ee56aa441b00284864d6ee35800bedcf0f0229490c41a02fb2dc576dbeff02fef82b548e89551980a4ce81734245ebd19cc46ef85c343c9e8d3ca3b6c78fb1191ac7284f2adcab376c58e89de6e6cf920f7c9caaefdbebc75d43e667217e0ee2c76216a1081ae410f41bf9117610259031fa64ab7f6db709fdecf9841036c5121bb32ad2393c67793ea194df33b0b66dafe7c732039610815591b89f398ea50fe8a857d63519e1459c6f0f6104a43a740040577df77e4986423547cbb89bb1356905a49253297e3b16c864e5faf5b323b4fa21462aa58bb036962f187abecadff6e9fddd0cba0ca6a55cbc20c81d206f71f31a92ac8c6c05d7ac2936e5bbe2b33607415eb26eaa54c8d84d2cc995581bdb16c2861dd0f3e02e02bfcd738372562784c84cdf2f23cdcf4e5af1c8101350eaaf741d113e01b02ea8ff1c7e05c76baeb5fea802ab842d8ae402e3c085301138b41e6859c6ba779a154b3f349f08a75216930c3e9440601f64c8feab21752b86db43ca2cac1a52560612134f4233c43bd8d5899599389925a4d123ee506e2c40ecd529b5fc462caea75e4ff1904447cc1ef5acbee90878ce75f33cf81b0c95c1daf9a92802424892c1c1cdbc348d6c04d690a53b05a91666b27a8342891edda43f1ba02df2f7bc0754169d847ec6cb05a5be68dc602e9761409671b6f37e2fbbc52621caa1b3430b74fa502bde589b44d63bda32ef44adec77756c3f61e8ee63a18e44f27ce017e72bda3fbc009a8abc342479c3bbe5eff6a386758cfaa5b6b7b0e37a9d5ab521377e7eda753cce5f1c4c78fc91dcc9e7696d0ab5f1a246b05767ec25475f50847c745b1cb9ebe00613a2ed4df139c63f9df39cd455a4f9f03e161997e0264bb9243dd8b9f5834ebc3a79504a511d6ca04387dd1629df620bacbd2f9e4ca791bf1e499c4bd63687599a613f8be24aa975c3f8b45778e7b2c041d749e3650c0dbdefb0f11e30e0a10b54aeed76cdbc24ced95c2964d971a0edb10473dec81139127df22a136db0bd238c4d1090dcd876bbe72add03e2e163f62a3e49136aa4b6548733022d5e592dfba77900f9bd769143c81a305a59d1cb8075a8729cac49ff13b4551fd2634df233b4d3d15ca2d6fff083374bdc9a57a9eac94f3e12de3b4e228b16e90298b000d2c38cb886487b46c277a9c29c58f79a6a77422f8390e472d62034a4e454b7ee2947146d28b258fa5daf311d9ccb5325832d2178245528cb4c0750c19dbb9ecdf681ac26de84f77dc93bc30300beb11f883b54a629ab94e26459b5ee8b2e4a76448904d0aab3c27ce841da681378a04b17610473fb61bf9690b9526ab2a643f52f38cfd7ebe0fd6ca6f6aa84cd4dcf07e14856f0f98da8477185c99ce3a7c714cc4ed3d844f27ec1a5866c740161ba59a4bb168a2fc5c3a8aa4c286c18ebc46ebf685ca0bf4255c49a06aa0782b0bcac925c9e45b37a54c993a8bd532e1ce9712dc854e744333f17aa7d2503a7efca0736718a29da781de21f6dea8891df363559261c114126fa9a03d7a0cd942a7728aba5f6e8cbd5882b351d124615a7fc94c186dd4a87c0a7d30ddcbd1c8575ff8bc20932149d70786aef56d4ee02bc17391c25bf43a2492d4aef368434b127f3c387d1ac36202afa8046663f85acb571d4e093c5b058087594a5a6f25d404742cd0675e33f999f850ba3170670ca4498f772dab378c636323a66f500d21d6dfb39b30b84f35ca4df48a73e68f8f7054690eba1c79d858e295c821678072305c0d753226b3975512374f3e10f089cf4f3a1b377dbbd140620e60ac0172d327e112bfd2583952b78cfee367f8b8160a0689a981135ac23e8be26604511802865e94886571ad6103a7ab6a845bd47529373e5648215948ed8f54c509593d21e324e596afffbbe666f6cd0287e39e1fca61f747a58829564f69039f251df4db8d2257a8e995f633d0fb6c767f4b71c3d2daa16acc6f71d6b12b7d24a99ea501fdec75585695f0f7a87e769c434f71a0e352b7ba91403492dbceb33778ca8f36424e38b1444da7205b091365d4598431da60f8d642b8a51165a2cb4163c84607eccda8293da8fff358bd505638a129050e2be9cd1b3d8489183cdd279ef2dac8001d8e3983ee8d485656994d20a8e49a2356d9e1df5c304924c9554250bebb002a6eb553c701d27b0c8ff7c8467739bea88811bb70c368b004ded217ab9333fac7a34d690be8227f7aa1cda61b5f58e93a57610c2e76ff3228b05db2d10e579aa62c1404b822d91845aa417c4302cf1518a800222ccf73bec3f8e4f743c9967ea6d24fbd58c978d57fcb07404ab4809118e63222fc800a7e333f130ef109e75039ae4d6f009ccc7ed3a09845e8e2f9f0e2379b0d34522beb7f5aa9408ab2450e8e36ccc03d3e844e873c7165342ad94ebef06f19e44f21ce355e00499ad74bf8b0314752a360e356b9b7e4415a199ab4f4b3a2201d217ebe2fb052e0b5b72f85fc09051bfc2d60226099f177e915ebb68fa46b6ad3342d3174fa20293c1eefa59b85418313c5cf17ae6faae5b3104d76ba75a70a97c36b0450d1831963f69063335193a3c46cbb7dc04ff77c4b0cc970f8508ccc8475b1d8db78387e2cbaa5142ec8bb0a66fe1511d7e00887922c34b82653dce9a773d4cf843b2df7c28ce3bb61c208aaf55c6cb5ee750623ae3a9bc54cd5e48513012b2e822db6a89e58214cd9c71ac6ce1ec2f6864ff40cbdf51f69b3482653db158a9fc376a82d26b0f9e6ea5dbcf9f32d13b223fe50324311bef14ea5eb4f62637f3bd7f79dacb7ae014c18b2c1a206ee47e7c9b2c8383e9ea5365d42ff8e18b8019f0c3e1f6d13b32d5ef37d2ceb3df7e61d41edc185b1901df27ad3dc03d180e27ff79260b297b525ae3771783f9d9b1f48374e301f8b8dbeaebb14e58ec230d2f187e56b87c622df9889da205c3ee3a56bbc9144f391a2fc5e7d38c65640de762a70c0ba881d3e3963159dcdeaf3169c1f2bff1a94a33ec0888fd741c30647395d910674cbcf932fefe8ce5f8473c6cb9168c6e47128f03fc4f828ef54f22de0d96b4df2e17ee9f92cab674d7a8880d608ff6ad837f2701955d1b81b8e80895a480aa4981eb9f05eb9fc5b78629162093cc587bb2c0d5d95740784173af66249cedc355c14eccc665814320416581062968a28f2df06bd7127ecacd64d4f13deaa0ac5c74c310826209a6b5177c201c7e34789a99921ef883dcbc0ec47147b03a4e0769487b7251ea7ecdbebeaad14453985468d6d536045cf43ace99e2548492320432a6c55075fb284d05524b2f2045f768f5082d8fb5f255fa0c44592f429f6f522472953185fb4b14d5e12bfe7d0175c108339ab9ccf21d992334ed57f68697f999443c0b213bef55f5ba6428032152ea52288ab46c974881a61016c9b3c646518a7b50db66025c76fda0286c0cdddeb2927b1c6cb1d7f9eae2272fb5c5c43c67b7c482100857763376c85414a2d12ea8cd043d3e816675ed6a4956e5909201b23aea5f4ff92aa7a2194543ba0a3b4d90304b665dd781633c9358ea851c1c03940da4b16459593a3b633a52b81c602ce060acca5d339b1fe65e0141742964fea8cf1cc188e9d3f4ec3f6d083e289f19de78bf7f90009d909c6f3ff83c3088f4eb1d5d77065f65e35eafc8db77b850d54da999a3e1982c8c358e7b566d88806c13485a1313b2b836eef50060ab019327303c59259730b87d2728ab2f8897fd78b8190cc83c5620409e7aef73e7fde83327917bf5268b115c5c5f035b1e669bfd7b64fc179989b547b0466aca868ffae9053934411ea988920e5d3e62a407a61e0af37bece5ae42c7e77feff6814fc2ef724a46b41b6b7ba449a230a6f41eb70c2233514539ac5aa3c542bf0ce28c82d66bfe8c53b383a9df54e99a9a3c52d264289f2a84c9c9e94660f786e6c7b7a54f16b30bd65b3d4c5d88af5e8e2da43860331961baca8570905f09d1c915790b85ef4e4b1783dd62b446feff3dec54073daf7beba3a8a291a326495e971ce63df6ca4d767b4c4c7a66093da8babc21be4ccbfdd634edb3797e0e21ddc6f6ee7d673c50b7aa0bb6b422c1e63f5652b7c60f1549e1c4ab655ba99e9020e1b11be699808d40c675c4693e52b9785856d57cca37af89b5332582e5e1b8d628bf620396473c2bacff4922e3c469bfd92dadf215a0406ee211eb248dfdbfe05c83ecf41b660bd58fa7749437a5bd398e06f5ddde0d50239cabe9e1c8e8eb41d980647fa72e99faf1ab3212617cda0c337c22e3a247ba8e3cf5464456b96f5767451aa9a8956c342eabe91d32777e1e5692716c2271f7a2d63d13213d7ef2cc271594bc3f87ae9bb5c3f2d33b7a0b9a2e80737a8455ff2cd1012ce07d446a275aabb819294878b5ca49e04cbd8242cf60f2444587599abc37ed1e068e15d6d0ac6f023bcf13b0438ca03d98f5472e56039844c7a53445d506627834db9a81590271cdc57eb8f8c070a96f01061827731784694b19b611a7713185a292c93a46b8f5eebadb1d836a5170717898656b215774e12ce3e7cb2efbf435f7f6155fe0d60dbe9cccf1aed31b576031480b9362c55f84461c9c3567c94fd7080f977193ddf2089166a3f7152af17e7c38cf765a789df901491c6b2e098a5d073811e8f81dbc3673d2c4e8287e1c0f4d9c359e00e21789a12e4af733f46cdd71e2243b3dd14b915f7303bb5a7dee7d96d890a962e70b85e0431cc13c662a661b5da19976e4c836921fb9f0927e8913316521d56cb57883e2a2a5f7176e24ceb0ac02b16fdf7b61a72e95877982ad2d0a8c571ad1f2b54ef71c681e6e96381930fe5efb934079af88761f195ad82224537006e54622badbb19a39d09882a1c9e72d4f8930caed09a53a402ef1932dee086bfea3501f1c52e95ce88984c7a2124825c4d44bbd6c52800b4694d06efdd18baa1054f28438ab6968da660a22888ada1daac131a937589477b58534a1f813307c185aea551333d82b56fcd17652c5f8c74298da3611ba88a2bdb70cb8f25959c426aa3dbd736c8105f7628716d3e0023219674a7ce2ae84358b3013f678f9af0f59c56f1ca2141fae78ed64e3a9bab60577070f834de4e9bad2bdd8e1ee6db3e07f45d4b965a2d525e327cec85271115078c9040f862f725fdb10340ff97a108ea4e8c00e8fe05df884651c26056afbd3fd2afdfe95c2127f82b376335aaab6f6850583e405264b490bda00b9f43d08292326e14501d90f83b22b6ced6cee5e80cf708ac2546385f846678f7f58caa51bb1a6b7fc56bc7b546d100c62a81c59554caabeb23656fc398a19c5c14acddf9291241f4d66a26c45d644dcacc7110d14c3320f3067aea15a12f4151ad17485d8a23fcbf881976c6624b009d7560682494053888a9f5fc9f0699c7da3f095284a6cb2c3929d33002ce4e6cdcdd1f634981e54baccec74191d77c9efb9ed63902a4634dc45149c6097a0fea9de22890c6252c0d95f21e448530eadca832e6a2990a7bd3c965b928917b2bbebe49b31218a86529a4e7c519e87bba194da78e3f71b0ecca7ca6308f5d50a05a2cb2938d64a1fee087832322a88c6f64802e58badaf6039050774e284a0b5e3e7f81b2ba19b7efb03d9f2188d49f2ff0e8099971271bd0fe3678b68e7a74d07b1eae4b87a7b893f9fb7cbe712a2401507b393ab8176a0ac6793b32d4d90c7ffed5b68b6601dc9c55a6361bb864151a7cb5abc46118612ce5d8e8600b23fb15a4b245158d5a93d60a2c0c6259ec68a29079891378848830cdd80bcdf0d4b38b31961e31b65c236adecc328f50d2b784e3fc12e32bc994691e0684a9b84433aa2cd725d70d6a01f3decb1e026a4e810ced4a00f134b843e03eb27f85e6b98d8e7f12cda178330ce0d2fa6b6e3aa67774265c9cc2fe1d7c0869d05b1178bbdcd9b5cd5565c1752bed94bf36ac743f8cba1c8c32fc915556963f3f0688781b0b32cb0d71b37f089e438ba9acc0bf9db8bc283e88223bb890f47f697707dcc8324801d80adfcfdea602cc573e1f16114198fe71f2c13ac942d5113c2daf230ebf174a85ff365f3e7059ac47d4ac5bf68d3d9c554f3fc64bb75fd439ee745a99fb08850b3b41619eaea4a30de7a607d105837e4776a4adf3a1f2c6728dc1fd4fdf270534f178d6536eabc691d242249b84a17dc6390e9721b2232088ecf4d82b468805ab8a5335cba3cce2b8d4f058dce7539a7e14ae6fbb7bd3485a9268621793f94673e457bf9dae0b3d1aaa52b935b49c24b788ac32b1000dd93ed8bd337bed14d4429f2fdd685ced69dc49998dde24a6af288bd4768aa54d5c971ed3aa74852b0b40399fd1e68f313619d273440801fd233df6fd329c4c5f2d59e27030d57105012b19062bb3c9e2f3d585bf59b804b133e6f46ec2e6d88a0f9a09985dd26c396f247a6d13bfdee507130931fda7c89315e3ec4c2848d0c72672ad6090e50ba0feeaa248ad5d81d3d4ecca2a3c85aad6d7e5ee9ae6f67794ccc514e9c6096fae0243f8bbdcacf773ba6d1df15a02a1631c594e13c5541a9093ed9c1001f0c4f78db0812c88da7b0007ae833b13fe829a5e0cf3d14f479db84cab5111d12e81f86d21a5575f473d2b44d4b947dce9e7ec283990c7785858b2c6d51fb65ffc396c075634dea5b64e23d4f61602a36502b0c20db35ac091a13e3d7a46b6370903abd124d6de1e7531df1a59250a08bf064d176899eb091efa797d464be76696ec2a1878922898f0d58990cb63de9580271faf82aab7d5de664d0bc097e4a24036318ca5bb57a9be7eec4fed1cb94c462dc7e8c015b92814d33c783cf1be00ce8a4e28358bbfd4c4006912b7b68a85ff5dbd043f0c9d91585ff1851d686154387e773c3bf240183b9e424b1bdd657bc9007196ab12621e57c46c279da24632d70d378f30327dc517cb20166123bf376dd043c92ca73d29a60e9bc17a8f42fc2a25f334b1b75e9990c96bd473b870d6e825763a4b36d2e2ef7dec70b663565dd4f40853a82ea8860d0ba2c1defa369ea2186eb7e2a52dcacbf1b2126d246e3abd4d1ad611da370cc39db4a9a656ca98b9c2f73f952edf3598d7579b414ca09ce8ab501245f73a7f93901adc825c3b0e0765530fa3774c67196e89a5d8134c3cb41b85beff740f602827f46227e22564a517278cc13c9d8dbd705d9e2aad693e7ff43674631fdf0e62b24cbc10115cdb712aa5051c228ffd1565af91144c03f711eef9f23c626194e1bb8a5761c462ca36564a75db3def5587f1adf44ca9c2c0bf6d41e5cd79f340e505a0a476addb9215a8b127c4d8a52f00e6bac972c0796d788ef9d9faff5a0f5d53ca7a51198fbbee1f6058e9fcee288f434d2d9478b0ab048d1616f4340529b0dba0ec9dea884cfb97b1339c3671f1e6caadb5a658883332a6fda5cc77010879180e6c5239bbe954f38e1fb8748939a4fcfbbbfcb7133f1544e3647d65a564f1fb993bc47366235371ff2626e125d585e5ebddd0fa9a2d641dbca432b6a2e1774ad01be9d097e906d297fbc281ffb0fb4261c040e47af4ad99d60d7761e9adaf7cb7a3dae550f7278024c44e167729afd09db9a6dbcbac48e43a8ed56034ae87221e69434ffe812359f7e67416296a0d73f86b0cd04d5c5ed6c664ce353f565732a5e5ba9fcaac6d2d6fddb98c9f796dfda0d81922560b6fa044213adc2e5aad055afe8b55b8318d4021f2628f4e564da6d2d6e0a04206458a47f01112313af24cff56cebc5f31db719c4c6010704c74ecd78e75763274e59eda0edb41b7b650989be3d12ce11da06956813c8e72ab5b9902a7711feef4b75a170c15b9ed692da26aa2b8e44eb0af70a0813451ba666b0a5c020da273207da6f1fde6e231ed1a35692ecd4ee3b00c56cda80cd612ef898997babcc4541c6ab6c3469b240be51414b525e7056021f3f359d46f99d0ff09c011fc88629d1a94afb533bfcefe3bbf081c3d7efaed8058003f388aaddb16b13c1e9046a9eeceea33946c58e035df188fdfcece96ce34d5b224f399f0694218f3acccbb5a8760223f53741ddecf8969e2b2b90d93196a5a5e813f66774e51fa20a6dfe4534d37087eb9b37c95eb8ad3f9e4282f12286327041253a0b04ef7be483cbfc61a9d3a08ab03dd71c3974f97c3920038a5a58a3ab1139d1a89f8511f070d11790b39b9507027346b47ec4b8d6387ea89037e27a159bf90101197123ca0880bcb050a9f0f74debea4f722e9d300e3f9560af9ffb1a30730dd4ada4c7a23f7feba9c2b199fd169eda543fd1d07eebd2cc3f34e4e45bc0913019a1e84bb9c8352a5e30f60742e676930ea220877214a1081fba3bcf492d46e82b7422a23ad87a4d6cb48668df7c77dfd7ed31fdc51b4caf51fd17b9c93bcd43355de31579793d3718992f3bc280fa42ecacbbd0cd728a5c87d06099a866dd3bc47dcd075bcad79d203a9dd2099ed98c42da7d16d2871dc83513f63ba615904a3c352554b8b441e2619830fd782da099d8092954ab5bc9fba6947bd5865b2b7624f00aa8ee8f96d744bed892a6270500c7c8018b934b1a6f3b791a91ca3a3d4a892c2e3d61b07eabddbcab39a8b845e7fae4be3f350ff10e37a914e158028e580dcc8c9b101637ad972c09ae2b1b5b9b6380e60a60967007a8ab544d6f1560a76bf3ef542bbad0a5f67ef49508f945aa10e7dd724087fd4cecd82c97598c9f7855d5bb7125e1204d6457a4bb65c0f221ef7bea3484c3b7f96f245ac14ef82d1f19cfaafc07303983887a099d9322d31547ca121f224febf57e624abea2d9edb4b12fa0c97e9dffa8c98ca71fe3928575511cf248c807b58ad3f6e291b3baa2bb7774ec03e294bb12bbc7dbd7c7be155a8d5212a3ffba5bb63c133f7f7842f46cc07f6414901b7be1735be4c8539bcf0036f13d67fd8fbfbb4a61b96aedfb564f8b8868e81c4b3f0f47440e4a24c6ead01640988622b582eae5cf5ea4d73c21e9aaed88472d8276229f46e3bb9ab582c59f18b332aba9cd5870a83b51d59ae7b578afa6fc43cbf87a9225729aad094683e1def81005ed877f69ffd65f014fecd9ec0a6645fe05a2704804a4cb82f1e104572925587810447fba561ceeb13f994a91ca4847e30f9822e5cc8d1b3ee64fc48521adae58445f3446b1c2903afeabcad8599c9d193764d2525d59771129bd425f097c02137336f1a81cd01f147829451066b176afae16888e8f022a3fb2de089212d2ab14ec24bfbb98fe4b02c31b5c42858d3d2411b02b0eb4d3a3960361abdc8f992064a68f895b0a1ce359ab205e397bd2efc91b395c67b00d891a8ef055641997eab5f8a37172fbbf5d94d1b8b3a4d0994590873132b8f0cfcc750ea29e00bd84e048e335aae497f6bc5791b51dd8acbe2e6c239ebb481e575638d8a0fe86c8b519c937823ea1a51cf4fb223dded9f16804515ef57410d719c0938a6df831b9471bbb8c8eb87e2593f2ca7b69d3223b60c83bbcf8c18ca34430fbf917bdb5e34d4d055f4879a6a4534ebedcd16a7360fba8c066aef0c5c7a860966122564f372f4623ec8982cff567eb9b954700779a7eefdeae74e232d07534d3082fbfe4a9992c62cba566952dbec6f9390d34d423b6d49db42dab7eae14cf88a7c5831939bf7b9f9e93ff0c311ac37cc08590b3b464568f2091352796b155af609aef5b739a5bff4ebc96cb33079d8e5c2a18be1f85eba1b11b782639d4336965b7211e6bac0284555c5c64cab3d7f01fd065b5ac5ac7f3834b74f208ba028bd6a74461a2e3249bdad0853f968b8b88bb32852178d7572699a83c13cacc7278cc3f3bfe54d6463e43eaaa8c4d24cb3411257be52b670a3235215d3724a92625c3fd0964173d44808337714f00cbec1fbcca711794aa6db4176a9c0f94f61fd8262ccd9f1b4f870ee9c68ace67148caadac926957315a62a0eefbb761badf18d59d8ff44ad50c127a95ed36493364974a83443c3648b94c8fc5263d3812433b5b32481ac56c68e5467041a9aafc726e8c6b453eb81bd2850a2b0a0ab0dd892758799d33ac7b81f47f0539b0f44ad96953a09fc8df5e667555fdf885dfbe3510e3184c91fe9f0c8b70adae228c21767a1db697d8d135e2450c6446cd91a0d03d3db5a8c0cd9ef696e0bc98f8fa8991f811f55420440c0ec0b2bc7c537ba55a4451019780a10d1cc733bed0cc24b902f50e96c453bf6651574489eeb6be29094a441789eba006043d42a1912cb0467ea3846ca2394a827acccf5b71fd8c3395a660c83782cae71be1fcc6b2594fe5e9d975c119e916e257fc3423a76709e2a76ea1694a53ab14f1e57f06086e84f5d4ad5bdce8c21f6cdc121a19f527851d1d1695142b11a9996470c0517f673d6223d5cf1ce5dcbe8334b7cff4937d637c0b0abac50dbd0eae6da4f321ea9c24502dcfb1c75f666e2ebb2e72d4185218d0c9b3e52fd1cd1ca69ba5c5efad824ef447d30f0e0c1e8976dc4ac44c24ba5c9a5e74b0a93ebf17957a2593ad26da95ac6dd957d5c494d8d69139be897bbcf501091fd264f2aea64b03af555c541867a59bee0577eea33f4fa0e0c305ffdf4614c5734a5fcb5a969de3a0b381aa54b63457a7f773c031ea97e3d611e8a6f3f46d371d41a1faf6ed982d4c1767e3be9fc3ad65afaa368271bdb958425282bc2f9c1bf22bc9468f773de8f2e3271581678ae5720d6b4a86b344ca362030c62c69c0ab3661fd209b594f521fd316b77469a5716913f45bcfda614a30d2b84fe9c4c89288541a3eb03a0e5ab089e42906b264dbd83b2dc7d2e8466cf61b71aeec16f8ba2d4e7459d5495a804eab7883155107194653aa027a546197759347e5d1ded9a86ac2ff1efdb64dcb3668eaf1cf8283dc8534f7f3aef275f295b89276584189207e9d9318b4b0d26981fcbb951ab30318ed935e76e48f47cce09abc38c08b65398571490256c3ba55840a4ebb99ac7571c1ca26e0de4faa6f6c2cb131f69c1a60a91956705da65e95309b088a6675e43ec3a46fbeed88c93adf53b99677ade9214420f9d6fe7af1af51ecf7ab3937289b899e607536ef066783873097ecdeaac01a4dad515b8f0a93d5d5b376a0385cd19ce8af3ad27edf49e29ecd15d009aba6ce36e3297696fea7439c10aa8a6dda26e045bc3b23ba860dd592f9af113248b4bb87536b44c6f3ea84a2beef322f89f452894143a760ccd115fde979ce22df0c972aba55e824732421727dc293dbc952993ef9709cc162712e4ba0f282e4828db5cae2dda17a2567614382f7432a863669d314396274666a4155247f34e1bfcf307d6bbd1d687229cfc254b93399e0ca411da5238168bcfdb817ba76df22db45e2442c9203f6c294de5833e220428f1c5f00919dc95ea9b41908c3d505bab6d9d61b7abeff0a50253d84e6e5f988599bbd8d91fcd40e98d1387f85a9ece6c7bc921adf5d5b79297533dd99d85b8521626911ecba49bbb926d8f6d942023e4ea5d29189b3e84427814cbf32085eec4a9398c4ffe00860a4290cb9620d34805d600f5b39b2f5fcead98a0f00dbe5920f36cda3a320e032856c704973e815dd2a6df55774c1fdd196fed707e0787d5aa96235d047169d4521aa4616f75ffe20aa97d628aba6b02fbc903c33bf5358d22492fb377eaca9434d152ded8d55ece173874000989abead5610f592e6bff13e355e89ca65e9352d2cc0c8e8c8f880e575a0c028f97dddfbc1021573b09b3fa3c0d59f1d5cf80967281216aa875e7ff6be97bacf72d9717c439986947f06d8e896b9b491cdebea3719c2f1f33f4f50e3cf121ff207b1065987ad11cd69ae2ca75a1a93768a0176b07b41759fd7ff6126c77da28d6672e182715d83cd86b29154da958ec41572cc1d92a79cad131a76b4a10f4a999417401339999c09f617d65e10a07ce81ea0dfe92698c09e41198cac0a4ca05024417998a453c2cff3b0f3ba4a1a0c90ece3c4804b3bdf7c26af48e70d6a465286b47f76fb319666d3ad601e112fb288a3da8e14e991d53da31b15661bebae9e9f9d9d6bd3f2b663d06de74d98325bea9874e077d47cc6a4e2b246ea17604fab6a364a193c82d8db985b8893f189c06c22bcd1e69913faac36f781029f079cb8c62287fd48de0e1ea62c255e713f3ef4d5fad5458cd8616f6ccad9264b27897c2cc2cbd1d7bc66695bfa46487be4e94ed4dc94cc0303556c5887e8c64dab57c6ed16ad233176afc8832a45e23825bfaf9d086d101acc56c087e30381e6e5157b3ecdff8ee3bd478e89b0ffb70926ddf84cac9644a8023847ec6edeaa54a23d5a51eb2bd395cb9e840c712e114c7f83ced83dabd7cddb59927b7fda6cc0cef39376c8e97696033a8e9579a3126718c684b36f67e1b95fd12f439487019aeabce58596a2d5046d568f09621cfbf60641a9d29514d25df50d126ceec4a227831fe694c86bc98fab2500dec20598fccba17d423eecd9f009625c4e07217dae405de9b6b806e41c15d73f0072196)], + [bs_opt -> (Some (Pair (ByStr 0xab9fea32aa32379fb5973737271546abe3eb18f224ca6b0eca2cf365b504ce74674f4e45fe95efe38eb421eb464c2fe624f6f382e143dfcd9d794798b4bca9829a733e22ae2f4e5db6f3c6d66840256ff767008f9a1c8afc3c09b6372c21530ca236fa95bc41bac0426bf4470617cc4b84f6ff2d440696194487271ce53038a9e0e7422084b970855f00670faa243b90a0de96aefbb5e2cc09441d23854b25e184e73f650dcbf3fb4d95124ad6147c8b354712ff8f3ad30bb7e1093e105069f09cb79bed6b8a40c13a9d3e4ca52e6f93a14ef7a537874621213def551cb5e2c34c25b386c9fcea0c2f73a3a294eac3fbaa397fd579360956fe98ab83cd9fbf055dcf2f76b9038b0a8f96c2b0976749dab1338999816ab96826a14e9d3b2d13da99d0eae7aa71b7e4019d9cdc741e2dd43d06b3d6ef15fe96f757953a6925b8db5480b5a50e3b4a05aee8ee2db835c60432b03967e0a8b4ea4d582eea7a9a08e815a542b6ca071270da44c9922e898288566b379b9ad8776180cd2ef2830ec2beb389c6a7d5cf3f2631fe76decc8bf3e4a00d33be2de1f05d13a996134dbb550102646272e162f5edf390c236e62f6317ce86d36c28c961e8ef7a7d28f0db9f891f9eb0d9aea539b643d3e36245dcc4ffbd9f14999fac2e83ef8d36eb2ca61250803de9e55e829eec555b27ae36f89b02b84d22b02e7895fff250d90eae203725a4a406c521f0167471fb15cfd7f2301dbfe8f8f92f2904ecba3810ec98af70139fe692a635b6fc03c298519144f4a8a2b1e99d76bc10bda957c98c962af2ba83a11806eb04cce47a3bb9e7080a4d9dce73b38e7470f1dcf943480d3c3b297742bf2a1a7e158053c1ac31a9cf82f885002c1a70a05a06e6d2d405e11e9b1739bee34e4dbe692da45200ace30f32ec7c582c426a8a0fdb531a54497513ebfd23c46df6655122163c4daec34e6200eff1a3dd8a56b08beebb2916827468f94e25d0aa55c9cb4865d6bf93d9f2aa79b2c506e3ee42725e74857da64d96436559328f09979d1f3a0ac9d9e57b3d9eed2c79565885a0e7bded90f5c49cc250d4bd416c98acdbe6d1242d497288a73809a299a3e7dc385475f3edf88fb8a58685686fd07a3c6ce4bc1506bb3447e786965b52076f264d4b1c20e5891eb01c9cbca29ca7966d9f4afcc9fc882313fe78b2f619d8581f5e734cbbc4b6057aadba8b2783ec8c0cb3765308691312599973d6d706dd15978613198347f947361fd2a62d47d9f2b441e70778eb4fe36dc1b1448400808e95434334909a0fffc50149032e914512eac90ee93bd42ee4cdb0169784c3e6e14c8727cb5f4ac6f09a2e8f3658d932aa7125129bf8c44462d235d5ca3b1499bbde9122b294f1631c874751c05be0dbd85ecd76b3878fa1ab2dfa340d6f6b292e13bc5101ca473c4e7187349f49b77e5fb85c93bc4787f67f6c73cd7ee13cc38adbb6cbf80875faf802977b1e4a33cf5b869cf813795a4b83b52bea5db8023aa37926704d399dbdc07380a27de2090f49874188885c1410a941612e3cbd0daa3f0e9bb03adc04baa39ff5a15c863956ae25d46f4651145018062510525473c8ee56aa441b00284864d6ee35800bedcf0f0229490c41a02fb2dc576dbeff02fef82b548e89551980a4ce81734245ebd19cc46ef85c343c9e8d3ca3b6c78fb1191ac7284f2adcab376c58e89de6e6cf920f7c9caaefdbebc75d43e667217e0ee2c76216a1081ae410f41bf9117610259031fa64ab7f6db709fdecf9841036c5121bb32ad2393c67793ea194df33b0b66dafe7c732039610815591b89f398ea50fe8a857d63519e1459c6f0f6104a43a740040577df77e4986423547cbb89bb1356905a49253297e3b16c864e5faf5b323b4fa21462aa58bb036962f187abecadff6e9fddd0cba0ca6a55cbc20c81d206f71f31a92ac8c6c05d7ac2936e5bbe2b33607415eb26eaa54c8d84d2cc995581bdb16c2861dd0f3e02e02bfcd738372562784c84cdf2f23cdcf4e5af1c8101350eaaf741d113e01b02ea8ff1c7e05c76baeb5fea802ab842d8ae402e3c085301138b41e6859c6ba779a154b3f349f08a75216930c3e9440601f64c8feab21752b86db43ca2cac1a52560612134f4233c43bd8d5899599389925a4d123ee506e2c40ecd529b5fc462caea75e4ff1904447cc1ef5acbee90878ce75f33cf81b0c95c1daf9a92802424892c1c1cdbc348d6c04d690a53b05a91666b27a8342891edda43f1ba02df2f7bc0754169d847ec6cb05a5be68dc602e9761409671b6f37e2fbbc52621caa1b3430b74fa502bde589b44d63bda32ef44adec77756c3f61e8ee63a18e44f27ce017e72bda3fbc009a8abc342479c3bbe5eff6a386758cfaa5b6b7b0e37a9d5ab521377e7eda753cce5f1c4c78fc91dcc9e7696d0ab5f1a246b05767ec25475f50847c745b1cb9ebe00613a2ed4df139c63f9df39cd455a4f9f03e161997e0264bb9243dd8b9f5834ebc3a79504a511d6ca04387dd1629df620bacbd2f9e4ca791bf1e499c4bd63687599a613f8be24aa975c3f8b45778e7b2c041d749e3650c0dbdefb0f11e30e0a10b54aeed76cdbc24ced95c2964d971a0edb10473dec81139127df22a136db0bd238c4d1090dcd876bbe72add03e2e163f62a3e49136aa4b6548733022d5e592dfba77900f9bd769143c81a305a59d1cb8075a8729cac49ff13b4551fd2634df233b4d3d15ca2d6fff083374bdc9a57a9eac94f3e12de3b4e228b16e90298b000d2c38cb886487b46c277a9c29c58f79a6a77422f8390e472d62034a4e454b7ee2947146d28b258fa5daf311d9ccb5325832d2178245528cb4c0750c19dbb9ecdf681ac26de84f77dc93bc30300beb11f883b54a629ab94e26459b5ee8b2e4a76448904d0aab3c27ce841da681378a04b17610473fb61bf9690b9526ab2a643f52f38cfd7ebe0fd6ca6f6aa84cd4dcf07e14856f0f98da8477185c99ce3a7c714cc4ed3d844f27ec1a5866c740161ba59a4bb168a2fc5c3a8aa4c286c18ebc46ebf685ca0bf4255c49a06aa0782b0bcac925c9e45b37a54c993a8bd532e1ce9712dc854e744333f17aa7d2503a7efca0736718a29da781de21f6dea8891df363559261c114126fa9a03d7a0cd942a7728aba5f6e8cbd5882b351d124615a7fc94c186dd4a87c0a7d30ddcbd1c8575ff8bc20932149d70786aef56d4ee02bc17391c25bf43a2492d4aef368434b127f3c387d1ac36202afa8046663f85acb571d4e093c5b058087594a5a6f25d404742cd0675e33f999f850ba3170670ca4498f772dab378c636323a66f500d21d6dfb39b30b84f35ca4df48a73e68f8f7054690eba1c79d858e295c821678072305c0d753226b3975512374f3e10f089cf4f3a1b377dbbd140620e60ac0172d327e112bfd2583952b78cfee367f8b8160a0689a981135ac23e8be26604511802865e94886571ad6103a7ab6a845bd47529373e5648215948ed8f54c509593d21e324e596afffbbe666f6cd0287e39e1fca61f747a58829564f69039f251df4db8d2257a8e995f633d0fb6c767f4b71c3d2daa16acc6f71d6b12b7d24a99ea501fdec75585695f0f7a87e769c434f71a0e352b7ba91403492dbceb33778ca8f36424e38b1444da7205b091365d4598431da60f8d642b8a51165a2cb4163c84607eccda8293da8fff358bd505638a129050e2be9cd1b3d8489183cdd279ef2dac8001d8e3983ee8d485656994d20a8e49a2356d9e1df5c304924c9554250bebb002a6eb553c701d27b0c8ff7c8467739bea88811bb70c368b004ded217ab9333fac7a34d690be8227f7aa1cda61b5f58e93a57610c2e76ff3228b05db2d10e579aa62c1404b822d91845aa417c4302cf1518a800222ccf73bec3f8e4f743c9967ea6d24fbd58c978d57fcb07404ab4809118e63222fc800a7e333f130ef109e75039ae4d6f009ccc7ed3a09845e8e2f9f0e2379b0d34522beb7f5aa9408ab2450e8e36ccc03d3e844e873c7165342ad94ebef06f19e44f21ce355e00499ad74bf8b0314752a360e356b9b7e4415a199ab4f4b3a2201d217ebe2fb052e0b5b72f85fc09051bfc2d60226099f177e915ebb68fa46b6ad3342d3174fa20293c1eefa59b85418313c5cf17ae6faae5b3104d76ba75a70a97c36b0450d1831963f69063335193a3c46cbb7dc04ff77c4b0cc970f8508ccc8475b1d8db78387e2cbaa5142ec8bb0a66fe1511d7e00887922c34b82653dce9a773d4cf843b2df7c28ce3bb61c208aaf55c6cb5ee750623ae3a9bc54cd5e48513012b2e822db6a89e58214cd9c71ac6ce1ec2f6864ff40cbdf51f69b3482653db158a9fc376a82d26b0f9e6ea5dbcf9f32d13b223fe50324311bef14ea5eb4f62637f3bd7f79dacb7ae014c18b2c1a206ee47e7c9b2c8383e9ea5365d42ff8e18b8019f0c3e1f6d13b32d5ef37d2ceb3df7e61d41edc185b1901df27ad3dc03d180e27ff79260b297b525ae3771783f9d9b1f48374e301f8b8dbeaebb14e58ec230d2f187e56b87c622df9889da205c3ee3a56bbc9144f391a2fc5e7d38c65640de762a70c0ba881d3e3963159dcdeaf3169c1f2bff1a94a33ec0888fd741c30647395d910674cbcf932fefe8ce5f8473c6cb9168c6e47128f03fc4f828ef54f22de0d96b4df2e17ee9f92cab674d7a8880d608ff6ad837f2701955d1b81b8e80895a480aa4981eb9f05eb9fc5b78629162093cc587bb2c0d5d95740784173af66249cedc355c14eccc665814320416581062968a28f2df06bd7127ecacd64d4f13deaa0ac5c74c310826209a6b5177c201c7e34789a99921ef883dcbc0ec47147b03a4e0769487b7251ea7ecdbebeaad14453985468d6d536045cf43ace99e2548492320432a6c55075fb284d05524b2f2045f768f5082d8fb5f255fa0c44592f429f6f522472953185fb4b14d5e12bfe7d0175c108339ab9ccf21d992334ed57f68697f999443c0b213bef55f5ba6428032152ea52288ab46c974881a61016c9b3c646518a7b50db66025c76fda0286c0cdddeb2927b1c6cb1d7f9eae2272fb5c5c43c67b7c482100857763376c85414a2d12ea8cd043d3e816675ed6a4956e5909201b23aea5f4ff92aa7a2194543ba0a3b4d90304b665dd781633c9358ea851c1c03940da4b16459593a3b633a52b81c602ce060acca5d339b1fe65e0141742964fea8cf1cc188e9d3f4ec3f6d083e289f19de78bf7f90009d909c6f3ff83c3088f4eb1d5d77065f65e35eafc8db77b850d54da999a3e1982c8c358e7b566d88806c13485a1313b2b836eef50060ab019327303c59259730b87d2728ab2f8897fd78b8190cc83c5620409e7aef73e7fde83327917bf5268b115c5c5f035b1e669bfd7b64fc179989b547b0466aca868ffae9053934411ea988920e5d3e62a407a61e0af37bece5ae42c7e77feff6814fc2ef724a46b41b6b7ba449a230a6f41eb70c2233514539ac5aa3c542bf0ce28c82d66bfe8c53b383a9df54e99a9a3c52d264289f2a84c9c9e94660f786e6c7b7a54f16b30bd65b3d4c5d88af5e8e2da43860331961baca8570905f09d1c915790b85ef4e4b1783dd62b446feff3dec54073daf7beba3a8a291a326495e971ce63df6ca4d767b4c4c7a66093da8babc21be4ccbfdd634edb3797e0e21ddc6f6ee7d673c50b7aa0bb6b422c1e63f5652b7c60f1549e1c4ab655ba99e9020e1b11be699808d40c675c4693e52b9785856d57cca37af89b5332582e5e1b8d628bf620396473c2bacff4922e3c469bfd92dadf215a0406ee211eb248dfdbfe05c83ecf41b660bd58fa7749437a5bd398e06f5ddde0d50239cabe9e1c8e8eb41d980647fa72e99faf1ab3212617cda0c337c22e3a247ba8e3cf5464456b96f5767451aa9a8956c342eabe91d32777e1e5692716c2271f7a2d63d13213d7ef2cc271594bc3f87ae9bb5c3f2d33b7a0b9a2e80737a8455ff2cd1012ce07d446a275aabb819294878b5ca49e04cbd8242cf60f2444587599abc37ed1e068e15d6d0ac6f023bcf13b0438ca03d98f5472e56039844c7a53445d506627834db9a81590271cdc57eb8f8c070a96f01061827731784694b19b611a7713185a292c93a46b8f5eebadb1d836a5170717898656b215774e12ce3e7cb2efbf435f7f6155fe0d60dbe9cccf1aed31b576031480b9362c55f84461c9c3567c94fd7080f977193ddf2089166a3f7152af17e7c38cf765a789df901491c6b2e098a5d073811e8f81dbc3673d2c4e8287e1c0f4d9c359e00e21789a12e4af733f46cdd71e2243b3dd14b915f7303bb5a7dee7d96d890a962e70b85e0431cc13c662a661b5da19976e4c836921fb9f0927e8913316521d56cb57883e2a2a5f7176e24ceb0ac02b16fdf7b61a72e95877982ad2d0a8c571ad1f2b54ef71c681e6e96381930fe5efb934079af88761f195ad82224537006e54622badbb19a39d09882a1c9e72d4f8930caed09a53a402ef1932dee086bfea3501f1c52e95ce88984c7a2124825c4d44bbd6c52800b4694d06efdd18baa1054f28438ab6968da660a22888ada1daac131a937589477b58534a1f813307c185aea551333d82b56fcd17652c5f8c74298da3611ba88a2bdb70cb8f25959c426aa3dbd736c8105f7628716d3e0023219674a7ce2ae84358b3013f678f9af0f59c56f1ca2141fae78ed64e3a9bab60577070f834de4e9bad2bdd8e1ee6db3e07f45d4b965a2d525e327cec85271115078c9040f862f725fdb10340ff97a108ea4e8c00e8fe05df884651c26056afbd3fd2afdfe95c2127f82b376335aaab6f6850583e405264b490bda00b9f43d08292326e14501d90f83b22b6ced6cee5e80cf708ac2546385f846678f7f58caa51bb1a6b7fc56bc7b546d100c62a81c59554caabeb23656fc398a19c5c14acddf9291241f4d66a26c45d644dcacc7110d14c3320f3067aea15a12f4151ad17485d8a23fcbf881976c6624b009d7560682494053888a9f5fc9f0699c7da3f095284a6cb2c3929d33002ce4e6cdcdd1f634981e54baccec74191d77c9efb9ed63902a4634dc45149c6097a0fea9de22890c6252c0d95f21e448530eadca832e6a2990a7bd3c965b928917b2bbebe49b31218a86529a4e7c519e87bba194da78e3f71b0ecca7ca6308f5d50a05a2cb2938d64a1fee087832322a88c6f64802e58badaf6039050774e284a0b5e3e7f81b2ba19b7efb03d9f2188d49f2ff0e8099971271bd0fe3678b68e7a74d07b1eae4b87a7b893f9fb7cbe712a2401507b393ab8176a0ac6793b32d4d90c7ffed5b68b6601dc9c55a6361bb864151a7cb5abc46118612ce5d8e8600b23fb15a4b245158d5a93d60a2c0c6259ec68a29079891378848830cdd80bcdf0d4b38b31961e31b65c236adecc328f50d2b784e3fc12e32bc994691e0684a9b84433aa2cd725d70d6a01f3decb1e026a4e810ced4a00f134b843e03eb27f85e6b98d8e7f12cda178330ce0d2fa6b6e3aa67774265c9cc2fe1d7c0869d05b1178bbdcd9b5cd5565c1752bed94bf36ac743f8cba1c8c32fc915556963f3f0688781b0b32cb0d71b37f089e438ba9acc0bf9db8bc283e88223bb890f47f697707dcc8324801d80adfcfdea602cc573e1f16114198fe71f2c13ac942d5113c2daf230ebf174a85ff365f3e7059ac47d4ac5bf68d3d9c554f3fc64bb75fd439ee745a99fb08850b3b41619eaea4a30de7a607d105837e4776a4adf3a1f2c6728dc1fd4fdf270534f178d6536eabc691d242249b84a17dc6390e9721b2232088ecf4d82b468805ab8a5335cba3cce2b8d4f058dce7539a7e14ae6fbb7bd3485a9268621793f94673e457bf9dae0b3d1aaa52b935b49c24b788ac32b1000dd93ed8bd337bed14d4429f2fdd685ced69dc49998dde24a6af288bd4768aa54d5c971ed3aa74852b0b40399fd1e68f313619d273440801fd233df6fd329c4c5f2d59e27030d57105012b19062bb3c9e2f3d585bf59b804b133e6f46ec2e6d88a0f9a09985dd26c396f247a6d13bfdee507130931fda7c89315e3ec4c2848d0c72672ad6090e50ba0feeaa248ad5d81d3d4ecca2a3c85aad6d7e5ee9ae6f67794ccc514e9c6096fae0243f8bbdcacf773ba6d1df15a02a1631c594e13c5541a9093ed9c1001f0c4f78db0812c88da7b0007ae833b13fe829a5e0cf3d14f479db84cab5111d12e81f86d21a5575f473d2b44d4b947dce9e7ec283990c7785858b2c6d51fb65ffc396c075634dea5b64e23d4f61602a36502b0c20db35ac091a13e3d7a46b6370903abd124d6de1e7531df1a59250a08bf064d176899eb091efa797d464be76696ec2a1878922898f0d58990cb63de9580271faf82aab7d5de664d0bc097e4a24036318ca5bb57a9be7eec4fed1cb94c462dc7e8c015b92814d33c783cf1be00ce8a4e28358bbfd4c4006912b7b68a85ff5dbd043f0c9d91585ff1851d686154387e773c3bf240183b9e424b1bdd657bc9007196ab12621e57c46c279da24632d70d378f30327dc517cb20166123bf376dd043c92ca73d29a60e9bc17a8f42fc2a25f334b1b75e9990c96bd473b870d6e825763a4b36d2e2ef7dec70b663565dd4f40853a82ea8860d0ba2c1defa369ea2186eb7e2a52dcacbf1b2126d246e3abd4d1ad611da370cc39db4a9a656ca98b9c2f73f952edf3598d7579b414ca09ce8ab501245f73a7f93901adc825c3b0e0765530fa3774c67196e89a5d8134c3cb41b85beff740f602827f46227e22564a517278cc13c9d8dbd705d9e2aad693e7ff43674631fdf0e62b24cbc10115cdb712aa5051c228ffd1565af91144c03f711eef9f23c626194e1bb8a5761c462ca36564a75db3def5587f1adf44ca9c2c0bf6d41e5cd79f340e505a0a476addb9215a8b127c4d8a52f00e6bac972c0796d788ef9d9faff5a0f5d53ca7a51198fbbee1f6058e9fcee288f434d2d9478b0ab048d1616f4340529b0dba0ec9dea884cfb97b1339c3671f1e6caadb5a658883332a6fda5cc77010879180e6c5239bbe954f38e1fb8748939a4fcfbbbfcb7133f1544e3647d65a564f1fb993bc47366235371ff2626e125d585e5ebddd0fa9a2d641dbca432b6a2e1774ad01be9d097e906d297fbc281ffb0fb4261c040e47af4ad99d60d7761e9adaf7cb7a3dae550f7278024c44e167729afd09db9a6dbcbac48e43a8ed56034ae87221e69434ffe812359f7e67416296a0d73f86b0cd04d5c5ed6c664ce353f565732a5e5ba9fcaac6d2d6fddb98c9f796dfda0d81922560b6fa044213adc2e5aad055afe8b55b8318d4021f2628f4e564da6d2d6e0a04206458a47f01112313af24cff56cebc5f31db719c4c6010704c74ecd78e75763274e59eda0edb41b7b650989be3d12ce11da06956813c8e72ab5b9902a7711feef4b75a170c15b9ed692da26aa2b8e44eb0af70a0813451ba666b0a5c020da273207da6f1fde6e231ed1a35692ecd4ee3b00c56cda80cd612ef898997babcc4541c6ab6c3469b240be51414b525e7056021f3f359d46f99d0ff09c011fc88629d1a94afb533bfcefe3bbf081c3d7efaed8058003f388aaddb16b13c1e9046a9eeceea33946c58e035df188fdfcece96ce34d5b224f399f0694218f3acccbb5a8760223f53741ddecf8969e2b2b90d93196a5a5e813f66774e51fa20a6dfe4534d37087eb9b37c95eb8ad3f9e4282f12286327041253a0b04ef7be483cbfc61a9d3a08ab03dd71c3974f97c3920038a5a58a3ab1139d1a89f8511f070d11790b39b9507027346b47ec4b8d6387ea89037e27a159bf90101197123ca0880bcb050a9f0f74debea4f722e9d300e3f9560af9ffb1a30730dd4ada4c7a23f7feba9c2b199fd169eda543fd1d07eebd2cc3f34e4e45bc0913019a1e84bb9c8352a5e30f60742e676930ea220877214a1081fba3bcf492d46e82b7422a23ad87a4d6cb48668df7c77dfd7ed31fdc51b4caf51fd17b9c93bcd43355de31579793d3718992f3bc280fa42ecacbbd0cd728a5c87d06099a866dd3bc47dcd075bcad79d203a9dd2099ed98c42da7d16d2871dc83513f63ba615904a3c352554b8b441e2619830fd782da099d8092954ab5bc9fba6947bd5865b2b7624f00aa8ee8f96d744bed892a6270500c7c8018b934b1a6f3b791a91ca3a3d4a892c2e3d61b07eabddbcab39a8b845e7fae4be3f350ff10e37a914e158028e580dcc8c9b101637ad972c09ae2b1b5b9b6380e60a60967007a8ab544d6f1560a76bf3ef542bbad0a5f67ef49508f945aa10e7dd724087fd4cecd82c97598c9f7855d5bb7125e1204d6457a4bb65c0f221ef7bea3484c3b7f96f245ac14ef82d1f19cfaafc07303983887a099d9322d31547ca121f224febf57e624abea2d9edb4b12fa0c97e9dffa8c98ca71fe3928575511cf248c807b58ad3f6e291b3baa2bb7774ec03e294bb12bbc7dbd7c7be155a8d5212a3ffba5bb63c133f7f7842f46cc07f6414901b7be1735be4c8539bcf0036f13d67fd8fbfbb4a61b96aedfb564f8b8868e81c4b3f0f47440e4a24c6ead01640988622b582eae5cf5ea4d73c21e9aaed88472d8276229f46e3bb9ab582c59f18b332aba9cd5870a83b51d59ae7b578afa6fc43cbf87a9225729aad094683e1def81005ed877f69ffd65f014fecd9ec0a6645fe05a2704804a4cb82f1e104572925587810447fba561ceeb13f994a91ca4847e30f9822e5cc8d1b3ee64fc48521adae58445f3446b1c2903afeabcad8599c9d193764d2525d59771129bd425f097c02137336f1a81cd01f147829451066b176afae16888e8f022a3fb2de089212d2ab14ec24bfbb98fe4b02c31b5c42858d3d2411b02b0eb4d3a3960361abdc8f992064a68f895b0a1ce359ab205e397bd2efc91b395c67b00d891a8ef055641997eab5f8a37172fbbf5d94d1b8b3a4d0994590873132b8f0cfcc750ea29e00bd84e048e335aae497f6bc5791b51dd8acbe2e6c239ebb481e575638d8a0fe86c8b519c937823ea1a51cf4fb223dded9f16804515ef57410d719c0938a6df831b9471bbb8c8eb87e2593f2ca7b69d3223b60c83bbcf8c18ca34430fbf917bdb5e34d4d055f4879a6a4534ebedcd16a7360fba8c066aef0c5c7a860966122564f372f4623ec8982cff567eb9b954700779a7eefdeae74e232d07534d3082fbfe4a9992c62cba566952dbec6f9390d34d423b6d49db42dab7eae14cf88a7c5831939bf7b9f9e93ff0c311ac37cc08590b3b464568f2091352796b155af609aef5b739a5bff4ebc96cb33079d8e5c2a18be1f85eba1b11b782639d4336965b7211e6bac0284555c5c64cab3d7f01fd065b5ac5ac7f3834b74f208ba028bd6a74461a2e3249bdad0853f968b8b88bb32852178d7572699a83c13cacc7278cc3f3bfe54d6463e43eaaa8c4d24cb3411257be52b670a3235215d3724a92625c3fd0964173d44808337714f00cbec1fbcca711794aa6db4176a9c0f94f61fd8262ccd9f1b4f870ee9c68ace67148caadac926957315a62a0eefbb761badf18d59d8ff44ad50c127a95ed36493364974a83443c3648b94c8fc5263d3812433b5b32481ac56c68e5467041a9aafc726e8c6b453eb81bd2850a2b0a0ab0dd892758799d33ac7b81f47f0539b0f44ad96953a09fc8df5e667555fdf885dfbe3510e3184c91fe9f0c8b70adae228c21767a1db697d8d135e2450c6446cd91a0d03d3db5a8c0cd9ef696e0bc98f8fa8991f811f55420440c0ec0b2bc7c537ba55a4451019780a10d1cc733bed0cc24b902f50e96c453bf6651574489eeb6be29094a441789eba006043d42a1912cb0467ea3846ca2394a827acccf5b71fd8c3395a660c83782cae71be1fcc6b2594fe5e9d975c119e916e257fc3423a76709e2a76ea1694a53ab14f1e57f06086e84f5d4ad5bdce8c21f6cdc121a19f527851d1d1695142b11a9996470c0517f673d6223d5cf1ce5dcbe8334b7cff4937d637c0b0abac50dbd0eae6da4f321ea9c24502dcfb1c75f666e2ebb2e72d4185218d0c9b3e52fd1cd1ca69ba5c5efad824ef447d30f0e0c1e8976dc4ac44c24ba5c9a5e74b0a93ebf17957a2593ad26da95ac6dd957d5c494d8d69139be897bbcf501091fd264f2aea64b03af555c541867a59bee0577eea33f4fa0e0c305ffdf4614c5734a5fcb5a969de3a0b381aa54b63457a7f773c031ea97e3d611e8a6f3f46d371d41a1faf6ed982d4c1767e3be9fc3ad65afaa368271bdb958425282bc2f9c1bf22bc9468f773de8f2e3271581678ae5720d6b4a86b344ca362030c62c69c0ab3661fd209b594f521fd316b77469a5716913f45bcfda614a30d2b84fe9c4c89288541a3eb03a0e5ab089e42906b264dbd83b2dc7d2e8466cf61b71aeec16f8ba2d4e7459d5495a804eab7883155107194653aa027a546197759347e5d1ded9a86ac2ff1efdb64dcb3668eaf1cf8283dc8534f7f3aef275f295b89276584189207e9d9318b4b0d26981fcbb951ab30318ed935e76e48f47cce09abc38c08b65398571490256c3ba55840a4ebb99ac7571c1ca26e0de4faa6f6c2cb131f69c1a60a91956705da65e95309b088a6675e43ec3a46fbeed88c93adf53b99677ade9214420f9d6fe7af1af51ecf7ab3937289b899e607536ef066783873097ecdeaac01a4dad515b8f0a93d5d5b376a0385cd19ce8af3ad27edf49e29ecd15d009aba6ce36e3297696fea7439c10aa8a6dda26e045bc3b23ba860dd592f9af113248b4bb87536b44c6f3ea84a2beef322f89f452894143a760ccd115fde979ce22df0c972aba55e824732421727dc293dbc952993ef9709cc162712e4ba0f282e4828db5cae2dda17a2567614382f7432a863669d314396274666a4155247f34e1bfcf307d6bbd1d687229cfc254b93399e0ca411da5238168bcfdb817ba76df22db45e2442c9203f6c294de5833e220428f1c5f00919dc95ea9b41908c3d505bab6d9d61b7abeff0a50253d84e6e5f988599bbd8d91fcd40e98d1387f85a9ece6c7bc921adf5d5b79297533dd99d85b8521626911ecba49bbb926d8f6d942023e4ea5d29189b3e84427814cbf32085eec4a9398c4ffe00860a4290cb9620d34805d600f5b39b2f5fcead98a0f00dbe5920f36cda3a320e032856c704973e815dd2a6df55774c1fdd196fed707e0787d5aa96235d047169d4521aa4616f75ffe20aa97d628aba6b02fbc903c33bf5358d22492fb377eaca9434d152ded8d55ece173874000989abead5610f592e6bff13e355e89ca65e9352d2cc0c8e8c8f880e575a0c028f97dddfbc1021573b09b3fa3c0d59f1d5cf80967281216aa875e7ff6be97bacf72d9717c439986947f06d8e896b9b491cdebea3719c2f1f33f4f50e3cf121ff207b1065987ad11cd69ae2ca75a1a93768a0176b07b41759fd7ff6126c77da28d6672e182715d83cd86b29154da958ec41572cc1d92a79cad131a76b4a10f4a999417401339999c09f617d65e10a07ce81ea0dfe92698c09e41198cac0a4ca05024417998a453c2cff3b0f3ba4a1a0c90ece3c4804b3bdf7c26af48e70d6a465286b47f76fb319666d3ad601e112fb288a3da8e14e991d53da31b15661bebae9e9f9d9d6bd3f2b663d06de74d98325bea9874e077d47cc6a4e2b246ea17604fab6a364a193c82d8db985b8893f189c06c22bcd1e69913faac36f781029f079cb8c62287fd48de0e1ea62c255e713f3ef4d5fad5458cd8616f6ccad9264b27897c2cc2cbd1d7bc66695bfa46487be4e94ed4dc94cc0303556c5887e8c64dab57c6ed16ad233176afc8832a45e23825bfaf9d086d101acc56c087e30381e6e5157b3ecdff8ee3bd478e89b0ffb70926ddf84cac9644a8023847ec6edeaa54a23d5a51eb2bd395cb9e840c712e114c7f83ced83dabd7cddb59927b7fda6cc0cef39376c8e97696033a8e9579a3126718c684b36f67e1b95fd12f439487019aeabce58596a2d5046d568f09621cfbf60641a9d29514d25df50d126ceec4a227831fe694c86bc98fab2500dec20598fccba17d423eecd9f009625c4e07217dae405de9b6b806e41c15d73f0072196) (Uint32 10587)))], + [pos -> (Uint32 584)], + [value -> (ByStr 0xfdfd002647a3bace0f093205bbc8ecbc6445c4031ab4fe72413f4be81cb914a4cfaa1a721d74236461f5259ce901c905724cf3634199ceae04cb334ad9916a2ee14f141ab8d574c748106593968dd7c892e1eba70ffc99df83ae7aefc6e54f7d1273f0661760ac448d4106e4565aeb004a5fdf4be35a1b6e6885d8ec0c4637124e1ceb365b957d9445fecd8cfdd458a06191348a0eb5a611cd2459eea69c06d615d78c8322dda7371b5e3e88bc3f47b51a911fd3d8e8d621bdc49d38b89d9302a9392d2909f303a0d84d9fafaf33b4dc8ad7623af733f34cc00837a69265e852e0de7eb3877bd01fb6af13327b699b1e985a3aea2d256e89cab5cecf962db53bfd4501a0c5db83063ff6d0ae8dde37959186b7000509b2a03e2b7f42c47c35607626d0912b3e9f427b9bc282c57bfa45272882b3278ee383b758d3a1408fa3a6a93077810c58db78babc2a705e5db50bf8445927d0d7aa26b73ed63b6485e05936074c0a9e392c5ebf93451ebe9a929496b8482d2c49a77ece82cafcc031a026e791bdcbc257804df01d861132c8d3cb3eb2ed7f1a087d98f367b0fb12a2452d8afac24ce1806a1fa9a6b7352e8216c85b2ffc3fdbd96c190907bdf0f0e08b735f8bf4a1f32403b79cb0b9cf0a6b02684b76a89a18101fc89d11214ce9eaa6047fe2e4bb7888253453e072fecc42458022975fbb1e36695e181711e99d76de99c8bdbffc0813821d707e4b92851077a79f59532301c161308ff0f3426e2fa570b3c0b2fbcfcc5136657b3b07da7f5b926d0a13d5e410175fc3c0aca6d78facb9d379b6fa2efc5923fd1027ab9fea32aa32379fb5973737271546abe3eb18f224ca6b0eca2cf365b504ce74674f4e45fe95efe38eb421eb464c2fe624f6f382e143dfcd9d794798b4bca9829a733e22ae2f4e5db6f3c6d66840256ff767008f9a1c8afc3c09b6372c21530ca236fa95bc41bac0426bf4470617cc4b84f6ff2d440696194487271ce53038a9e0e7422084b970855f00670faa243b90a0de96aefbb5e2cc09441d23854b25e184e73f650dcbf3fb4d95124ad6147c8b354712ff8f3ad30bb7e1093e105069f09cb79bed6b8a40c13a9d3e4ca52e6f93a14ef7a537874621213def551cb5e2c34c25b386c9fcea0c2f73a3a294eac3fbaa397fd579360956fe98ab83cd9fbf055dcf2f76b9038b0a8f96c2b0976749dab1338999816ab96826a14e9d3b2d13da99d0eae7aa71b7e4019d9cdc741e2dd43d06b3d6ef15fe96f757953a6925b8db5480b5a50e3b4a05aee8ee2db835c60432b03967e0a8b4ea4d582eea7a9a08e815a542b6ca071270da44c9922e898288566b379b9ad8776180cd2ef2830ec2beb389c6a7d5cf3f2631fe76decc8bf3e4a00d33be2de1f05d13a996134dbb550102646272e162f5edf390c236e62f6317ce86d36c28c961e8ef7a7d28f0db9f891f9eb0d9aea539b643d3e36245dcc4ffbd9f14999fac2e83ef8d36eb2ca61250803de9e55e829eec555b27ae36f89b02b84d22b02e7895fff250d90eae203725a4a406c521f0167471fb15cfd7f2301dbfe8f8f92f2904ecba3810ec98af70139fe692a635b6fc03c298519144f4a8a2b1e99d76bc10bda957c98c962af2ba83a11806eb04cce47a3bb9e7080a4d9dce73b38e7470f1dcf943480d3c3b297742bf2a1a7e158053c1ac31a9cf82f885002c1a70a05a06e6d2d405e11e9b1739bee34e4dbe692da45200ace30f32ec7c582c426a8a0fdb531a54497513ebfd23c46df6655122163c4daec34e6200eff1a3dd8a56b08beebb2916827468f94e25d0aa55c9cb4865d6bf93d9f2aa79b2c506e3ee42725e74857da64d96436559328f09979d1f3a0ac9d9e57b3d9eed2c79565885a0e7bded90f5c49cc250d4bd416c98acdbe6d1242d497288a73809a299a3e7dc385475f3edf88fb8a58685686fd07a3c6ce4bc1506bb3447e786965b52076f264d4b1c20e5891eb01c9cbca29ca7966d9f4afcc9fc882313fe78b2f619d8581f5e734cbbc4b6057aadba8b2783ec8c0cb3765308691312599973d6d706dd15978613198347f947361fd2a62d47d9f2b441e70778eb4fe36dc1b1448400808e95434334909a0fffc50149032e914512eac90ee93bd42ee4cdb0169784c3e6e14c8727cb5f4ac6f09a2e8f3658d932aa7125129bf8c44462d235d5ca3b1499bbde9122b294f1631c874751c05be0dbd85ecd76b3878fa1ab2dfa340d6f6b292e13bc5101ca473c4e7187349f49b77e5fb85c93bc4787f67f6c73cd7ee13cc38adbb6cbf80875faf802977b1e4a33cf5b869cf813795a4b83b52bea5db8023aa37926704d399dbdc07380a27de2090f49874188885c1410a941612e3cbd0daa3f0e9bb03adc04baa39ff5a15c863956ae25d46f4651145018062510525473c8ee56aa441b00284864d6ee35800bedcf0f0229490c41a02fb2dc576dbeff02fef82b548e89551980a4ce81734245ebd19cc46ef85c343c9e8d3ca3b6c78fb1191ac7284f2adcab376c58e89de6e6cf920f7c9caaefdbebc75d43e667217e0ee2c76216a1081ae410f41bf9117610259031fa64ab7f6db709fdecf9841036c5121bb32ad2393c67793ea194df33b0b66dafe7c732039610815591b89f398ea50fe8a857d63519e1459c6f0f6104a43a740040577df77e4986423547cbb89bb1356905a49253297e3b16c864e5faf5b323b4fa21462aa58bb036962f187abecadff6e9fddd0cba0ca6a55cbc20c81d206f71f31a92ac8c6c05d7ac2936e5bbe2b33607415eb26eaa54c8d84d2cc995581bdb16c2861dd0f3e02e02bfcd738372562784c84cdf2f23cdcf4e5af1c8101350eaaf741d113e01b02ea8ff1c7e05c76baeb5fea802ab842d8ae402e3c085301138b41e6859c6ba779a154b3f349f08a75216930c3e9440601f64c8feab21752b86db43ca2cac1a52560612134f4233c43bd8d5899599389925a4d123ee506e2c40ecd529b5fc462caea75e4ff1904447cc1ef5acbee90878ce75f33cf81b0c95c1daf9a92802424892c1c1cdbc348d6c04d690a53b05a91666b27a8342891edda43f1ba02df2f7bc0754169d847ec6cb05a5be68dc602e9761409671b6f37e2fbbc52621caa1b3430b74fa502bde589b44d63bda32ef44adec77756c3f61e8ee63a18e44f27ce017e72bda3fbc009a8abc342479c3bbe5eff6a386758cfaa5b6b7b0e37a9d5ab521377e7eda753cce5f1c4c78fc91dcc9e7696d0ab5f1a246b05767ec25475f50847c745b1cb9ebe00613a2ed4df139c63f9df39cd455a4f9f03e161997e0264bb9243dd8b9f5834ebc3a79504a511d6ca04387dd1629df620bacbd2f9e4ca791bf1e499c4bd63687599a613f8be24aa975c3f8b45778e7b2c041d749e3650c0dbdefb0f11e30e0a10b54aeed76cdbc24ced95c2964d971a0edb10473dec81139127df22a136db0bd238c4d1090dcd876bbe72add03e2e163f62a3e49136aa4b6548733022d5e592dfba77900f9bd769143c81a305a59d1cb8075a8729cac49ff13b4551fd2634df233b4d3d15ca2d6fff083374bdc9a57a9eac94f3e12de3b4e228b16e90298b000d2c38cb886487b46c277a9c29c58f79a6a77422f8390e472d62034a4e454b7ee2947146d28b258fa5daf311d9ccb5325832d2178245528cb4c0750c19dbb9ecdf681ac26de84f77dc93bc30300beb11f883b54a629ab94e26459b5ee8b2e4a76448904d0aab3c27ce841da681378a04b17610473fb61bf9690b9526ab2a643f52f38cfd7ebe0fd6ca6f6aa84cd4dcf07e14856f0f98da8477185c99ce3a7c714cc4ed3d844f27ec1a5866c740161ba59a4bb168a2fc5c3a8aa4c286c18ebc46ebf685ca0bf4255c49a06aa0782b0bcac925c9e45b37a54c993a8bd532e1ce9712dc854e744333f17aa7d2503a7efca0736718a29da781de21f6dea8891df363559261c114126fa9a03d7a0cd942a7728aba5f6e8cbd5882b351d124615a7fc94c186dd4a87c0a7d30ddcbd1c8575ff8bc20932149d70786aef56d4ee02bc17391c25bf43a2492d4aef368434b127f3c387d1ac36202afa8046663f85acb571d4e093c5b058087594a5a6f25d404742cd0675e33f999f850ba3170670ca4498f772dab378c636323a66f500d21d6dfb39b30b84f35ca4df48a73e68f8f7054690eba1c79d858e295c821678072305c0d753226b3975512374f3e10f089cf4f3a1b377dbbd140620e60ac0172d327e112bfd2583952b78cfee367f8b8160a0689a981135ac23e8be26604511802865e94886571ad6103a7ab6a845bd47529373e5648215948ed8f54c509593d21e324e596afffbbe666f6cd0287e39e1fca61f747a58829564f69039f251df4db8d2257a8e995f633d0fb6c767f4b71c3d2daa16acc6f71d6b12b7d24a99ea501fdec75585695f0f7a87e769c434f71a0e352b7ba91403492dbceb33778ca8f36424e38b1444da7205b091365d4598431da60f8d642b8a51165a2cb4163c84607eccda8293da8fff358bd505638a129050e2be9cd1b3d8489183cdd279ef2dac8001d8e3983ee8d485656994d20a8e49a2356d9e1df5c304924c9554250bebb002a6eb553c701d27b0c8ff7c8467739bea88811bb70c368b004ded217ab9333fac7a34d690be8227f7aa1cda61b5f58e93a57610c2e76ff3228b05db2d10e579aa62c1404b822d91845aa417c4302cf1518a800222ccf73bec3f8e4f743c9967ea6d24fbd58c978d57fcb07404ab4809118e63222fc800a7e333f130ef109e75039ae4d6f009ccc7ed3a09845e8e2f9f0e2379b0d34522beb7f5aa9408ab2450e8e36ccc03d3e844e873c7165342ad94ebef06f19e44f21ce355e00499ad74bf8b0314752a360e356b9b7e4415a199ab4f4b3a2201d217ebe2fb052e0b5b72f85fc09051bfc2d60226099f177e915ebb68fa46b6ad3342d3174fa20293c1eefa59b85418313c5cf17ae6faae5b3104d76ba75a70a97c36b0450d1831963f69063335193a3c46cbb7dc04ff77c4b0cc970f8508ccc8475b1d8db78387e2cbaa5142ec8bb0a66fe1511d7e00887922c34b82653dce9a773d4cf843b2df7c28ce3bb61c208aaf55c6cb5ee750623ae3a9bc54cd5e48513012b2e822db6a89e58214cd9c71ac6ce1ec2f6864ff40cbdf51f69b3482653db158a9fc376a82d26b0f9e6ea5dbcf9f32d13b223fe50324311bef14ea5eb4f62637f3bd7f79dacb7ae014c18b2c1a206ee47e7c9b2c8383e9ea5365d42ff8e18b8019f0c3e1f6d13b32d5ef37d2ceb3df7e61d41edc185b1901df27ad3dc03d180e27ff79260b297b525ae3771783f9d9b1f48374e301f8b8dbeaebb14e58ec230d2f187e56b87c622df9889da205c3ee3a56bbc9144f391a2fc5e7d38c65640de762a70c0ba881d3e3963159dcdeaf3169c1f2bff1a94a33ec0888fd741c30647395d910674cbcf932fefe8ce5f8473c6cb9168c6e47128f03fc4f828ef54f22de0d96b4df2e17ee9f92cab674d7a8880d608ff6ad837f2701955d1b81b8e80895a480aa4981eb9f05eb9fc5b78629162093cc587bb2c0d5d95740784173af66249cedc355c14eccc665814320416581062968a28f2df06bd7127ecacd64d4f13deaa0ac5c74c310826209a6b5177c201c7e34789a99921ef883dcbc0ec47147b03a4e0769487b7251ea7ecdbebeaad14453985468d6d536045cf43ace99e2548492320432a6c55075fb284d05524b2f2045f768f5082d8fb5f255fa0c44592f429f6f522472953185fb4b14d5e12bfe7d0175c108339ab9ccf21d992334ed57f68697f999443c0b213bef55f5ba6428032152ea52288ab46c974881a61016c9b3c646518a7b50db66025c76fda0286c0cdddeb2927b1c6cb1d7f9eae2272fb5c5c43c67b7c482100857763376c85414a2d12ea8cd043d3e816675ed6a4956e5909201b23aea5f4ff92aa7a2194543ba0a3b4d90304b665dd781633c9358ea851c1c03940da4b16459593a3b633a52b81c602ce060acca5d339b1fe65e0141742964fea8cf1cc188e9d3f4ec3f6d083e289f19de78bf7f90009d909c6f3ff83c3088f4eb1d5d77065f65e35eafc8db77b850d54da999a3e1982c8c358e7b566d88806c13485a1313b2b836eef50060ab019327303c59259730b87d2728ab2f8897fd78b8190cc83c5620409e7aef73e7fde83327917bf5268b115c5c5f035b1e669bfd7b64fc179989b547b0466aca868ffae9053934411ea988920e5d3e62a407a61e0af37bece5ae42c7e77feff6814fc2ef724a46b41b6b7ba449a230a6f41eb70c2233514539ac5aa3c542bf0ce28c82d66bfe8c53b383a9df54e99a9a3c52d264289f2a84c9c9e94660f786e6c7b7a54f16b30bd65b3d4c5d88af5e8e2da43860331961baca8570905f09d1c915790b85ef4e4b1783dd62b446feff3dec54073daf7beba3a8a291a326495e971ce63df6ca4d767b4c4c7a66093da8babc21be4ccbfdd634edb3797e0e21ddc6f6ee7d673c50b7aa0bb6b422c1e63f5652b7c60f1549e1c4ab655ba99e9020e1b11be699808d40c675c4693e52b9785856d57cca37af89b5332582e5e1b8d628bf620396473c2bacff4922e3c469bfd92dadf215a0406ee211eb248dfdbfe05c83ecf41b660bd58fa7749437a5bd398e06f5ddde0d50239cabe9e1c8e8eb41d980647fa72e99faf1ab3212617cda0c337c22e3a247ba8e3cf5464456b96f5767451aa9a8956c342eabe91d32777e1e5692716c2271f7a2d63d13213d7ef2cc271594bc3f87ae9bb5c3f2d33b7a0b9a2e80737a8455ff2cd1012ce07d446a275aabb819294878b5ca49e04cbd8242cf60f2444587599abc37ed1e068e15d6d0ac6f023bcf13b0438ca03d98f5472e56039844c7a53445d506627834db9a81590271cdc57eb8f8c070a96f01061827731784694b19b611a7713185a292c93a46b8f5eebadb1d836a5170717898656b215774e12ce3e7cb2efbf435f7f6155fe0d60dbe9cccf1aed31b576031480b9362c55f84461c9c3567c94fd7080f977193ddf2089166a3f7152af17e7c38cf765a789df901491c6b2e098a5d073811e8f81dbc3673d2c4e8287e1c0f4d9c359e00e21789a12e4af733f46cdd71e2243b3dd14b915f7303bb5a7dee7d96d890a962e70b85e0431cc13c662a661b5da19976e4c836921fb9f0927e8913316521d56cb57883e2a2a5f7176e24ceb0ac02b16fdf7b61a72e95877982ad2d0a8c571ad1f2b54ef71c681e6e96381930fe5efb934079af88761f195ad82224537006e54622badbb19a39d09882a1c9e72d4f8930caed09a53a402ef1932dee086bfea3501f1c52e95ce88984c7a2124825c4d44bbd6c52800b4694d06efdd18baa1054f28438ab6968da660a22888ada1daac131a937589477b58534a1f813307c185aea551333d82b56fcd17652c5f8c74298da3611ba88a2bdb70cb8f25959c426aa3dbd736c8105f7628716d3e0023219674a7ce2ae84358b3013f678f9af0f59c56f1ca2141fae78ed64e3a9bab60577070f834de4e9bad2bdd8e1ee6db3e07f45d4b965a2d525e327cec85271115078c9040f862f725fdb10340ff97a108ea4e8c00e8fe05df884651c26056afbd3fd2afdfe95c2127f82b376335aaab6f6850583e405264b490bda00b9f43d08292326e14501d90f83b22b6ced6cee5e80cf708ac2546385f846678f7f58caa51bb1a6b7fc56bc7b546d100c62a81c59554caabeb23656fc398a19c5c14acddf9291241f4d66a26c45d644dcacc7110d14c3320f3067aea15a12f4151ad17485d8a23fcbf881976c6624b009d7560682494053888a9f5fc9f0699c7da3f095284a6cb2c3929d33002ce4e6cdcdd1f634981e54baccec74191d77c9efb9ed63902a4634dc45149c6097a0fea9de22890c6252c0d95f21e448530eadca832e6a2990a7bd3c965b928917b2bbebe49b31218a86529a4e7c519e87bba194da78e3f71b0ecca7ca6308f5d50a05a2cb2938d64a1fee087832322a88c6f64802e58badaf6039050774e284a0b5e3e7f81b2ba19b7efb03d9f2188d49f2ff0e8099971271bd0fe3678b68e7a74d07b1eae4b87a7b893f9fb7cbe712a2401507b393ab8176a0ac6793b32d4d90c7ffed5b68b6601dc9c55a6361bb864151a7cb5abc46118612ce5d8e8600b23fb15a4b245158d5a93d60a2c0c6259ec68a29079891378848830cdd80bcdf0d4b38b31961e31b65c236adecc328f50d2b784e3fc12e32bc994691e0684a9b84433aa2cd725d70d6a01f3decb1e026a4e810ced4a00f134b843e03eb27f85e6b98d8e7f12cda178330ce0d2fa6b6e3aa67774265c9cc2fe1d7c0869d05b1178bbdcd9b5cd5565c1752bed94bf36ac743f8cba1c8c32fc915556963f3f0688781b0b32cb0d71b37f089e438ba9acc0bf9db8bc283e88223bb890f47f697707dcc8324801d80adfcfdea602cc573e1f16114198fe71f2c13ac942d5113c2daf230ebf174a85ff365f3e7059ac47d4ac5bf68d3d9c554f3fc64bb75fd439ee745a99fb08850b3b41619eaea4a30de7a607d105837e4776a4adf3a1f2c6728dc1fd4fdf270534f178d6536eabc691d242249b84a17dc6390e9721b2232088ecf4d82b468805ab8a5335cba3cce2b8d4f058dce7539a7e14ae6fbb7bd3485a9268621793f94673e457bf9dae0b3d1aaa52b935b49c24b788ac32b1000dd93ed8bd337bed14d4429f2fdd685ced69dc49998dde24a6af288bd4768aa54d5c971ed3aa74852b0b40399fd1e68f313619d273440801fd233df6fd329c4c5f2d59e27030d57105012b19062bb3c9e2f3d585bf59b804b133e6f46ec2e6d88a0f9a09985dd26c396f247a6d13bfdee507130931fda7c89315e3ec4c2848d0c72672ad6090e50ba0feeaa248ad5d81d3d4ecca2a3c85aad6d7e5ee9ae6f67794ccc514e9c6096fae0243f8bbdcacf773ba6d1df15a02a1631c594e13c5541a9093ed9c1001f0c4f78db0812c88da7b0007ae833b13fe829a5e0cf3d14f479db84cab5111d12e81f86d21a5575f473d2b44d4b947dce9e7ec283990c7785858b2c6d51fb65ffc396c075634dea5b64e23d4f61602a36502b0c20db35ac091a13e3d7a46b6370903abd124d6de1e7531df1a59250a08bf064d176899eb091efa797d464be76696ec2a1878922898f0d58990cb63de9580271faf82aab7d5de664d0bc097e4a24036318ca5bb57a9be7eec4fed1cb94c462dc7e8c015b92814d33c783cf1be00ce8a4e28358bbfd4c4006912b7b68a85ff5dbd043f0c9d91585ff1851d686154387e773c3bf240183b9e424b1bdd657bc9007196ab12621e57c46c279da24632d70d378f30327dc517cb20166123bf376dd043c92ca73d29a60e9bc17a8f42fc2a25f334b1b75e9990c96bd473b870d6e825763a4b36d2e2ef7dec70b663565dd4f40853a82ea8860d0ba2c1defa369ea2186eb7e2a52dcacbf1b2126d246e3abd4d1ad611da370cc39db4a9a656ca98b9c2f73f952edf3598d7579b414ca09ce8ab501245f73a7f93901adc825c3b0e0765530fa3774c67196e89a5d8134c3cb41b85beff740f602827f46227e22564a517278cc13c9d8dbd705d9e2aad693e7ff43674631fdf0e62b24cbc10115cdb712aa5051c228ffd1565af91144c03f711eef9f23c626194e1bb8a5761c462ca36564a75db3def5587f1adf44ca9c2c0bf6d41e5cd79f340e505a0a476addb9215a8b127c4d8a52f00e6bac972c0796d788ef9d9faff5a0f5d53ca7a51198fbbee1f6058e9fcee288f434d2d9478b0ab048d1616f4340529b0dba0ec9dea884cfb97b1339c3671f1e6caadb5a658883332a6fda5cc77010879180e6c5239bbe954f38e1fb8748939a4fcfbbbfcb7133f1544e3647d65a564f1fb993bc47366235371ff2626e125d585e5ebddd0fa9a2d641dbca432b6a2e1774ad01be9d097e906d297fbc281ffb0fb4261c040e47af4ad99d60d7761e9adaf7cb7a3dae550f7278024c44e167729afd09db9a6dbcbac48e43a8ed56034ae87221e69434ffe812359f7e67416296a0d73f86b0cd04d5c5ed6c664ce353f565732a5e5ba9fcaac6d2d6fddb98c9f796dfda0d81922560b6fa044213adc2e5aad055afe8b55b8318d4021f2628f4e564da6d2d6e0a04206458a47f01112313af24cff56cebc5f31db719c4c6010704c74ecd78e75763274e59eda0edb41b7b650989be3d12ce11da06956813c8e72ab5b9902a7711feef4b75a170c15b9ed692da26aa2b8e44eb0af70a0813451ba666b0a5c020da273207da6f1fde6e231ed1a35692ecd4ee3b00c56cda80cd612ef898997babcc4541c6ab6c3469b240be51414b525e7056021f3f359d46f99d0ff09c011fc88629d1a94afb533bfcefe3bbf081c3d7efaed8058003f388aaddb16b13c1e9046a9eeceea33946c58e035df188fdfcece96ce34d5b224f399f0694218f3acccbb5a8760223f53741ddecf8969e2b2b90d93196a5a5e813f66774e51fa20a6dfe4534d37087eb9b37c95eb8ad3f9e4282f12286327041253a0b04ef7be483cbfc61a9d3a08ab03dd71c3974f97c3920038a5a58a3ab1139d1a89f8511f070d11790b39b9507027346b47ec4b8d6387ea89037e27a159bf90101197123ca0880bcb050a9f0f74debea4f722e9d300e3f9560af9ffb1a30730dd4ada4c7a23f7feba9c2b199fd169eda543fd1d07eebd2cc3f34e4e45bc0913019a1e84bb9c8352a5e30f60742e676930ea220877214a1081fba3bcf492d46e82b7422a23ad87a4d6cb48668df7c77dfd7ed31fdc51b4caf51fd17b9c93bcd43355de31579793d3718992f3bc280fa42ecacbbd0cd728a5c87d06099a866dd3bc47dcd075bcad79d203a9dd2099ed98c42da7d16d2871dc83513f63ba615904a3c352554b8b441e2619830fd782da099d8092954ab5bc9fba6947bd5865b2b7624f00aa8ee8f96d744bed892a6270500c7c8018b934b1a6f3b791a91ca3a3d4a892c2e3d61b07eabddbcab39a8b845e7fae4be3f350ff10e37a914e158028e580dcc8c9b101637ad972c09ae2b1b5b9b6380e60a60967007a8ab544d6f1560a76bf3ef542bbad0a5f67ef49508f945aa10e7dd724087fd4cecd82c97598c9f7855d5bb7125e1204d6457a4bb65c0f221ef7bea3484c3b7f96f245ac14ef82d1f19cfaafc07303983887a099d9322d31547ca121f224febf57e624abea2d9edb4b12fa0c97e9dffa8c98ca71fe3928575511cf248c807b58ad3f6e291b3baa2bb7774ec03e294bb12bbc7dbd7c7be155a8d5212a3ffba5bb63c133f7f7842f46cc07f6414901b7be1735be4c8539bcf0036f13d67fd8fbfbb4a61b96aedfb564f8b8868e81c4b3f0f47440e4a24c6ead01640988622b582eae5cf5ea4d73c21e9aaed88472d8276229f46e3bb9ab582c59f18b332aba9cd5870a83b51d59ae7b578afa6fc43cbf87a9225729aad094683e1def81005ed877f69ffd65f014fecd9ec0a6645fe05a2704804a4cb82f1e104572925587810447fba561ceeb13f994a91ca4847e30f9822e5cc8d1b3ee64fc48521adae58445f3446b1c2903afeabcad8599c9d193764d2525d59771129bd425f097c02137336f1a81cd01f147829451066b176afae16888e8f022a3fb2de089212d2ab14ec24bfbb98fe4b02c31b5c42858d3d2411b02b0eb4d3a3960361abdc8f992064a68f895b0a1ce359ab205e397bd2efc91b395c67b00d891a8ef055641997eab5f8a37172fbbf5d94d1b8b3a4d0994590873132b8f0cfcc750ea29e00bd84e048e335aae497f6bc5791b51dd8acbe2e6c239ebb481e575638d8a0fe86c8b519c937823ea1a51cf4fb223dded9f16804515ef57410d719c0938a6df831b9471bbb8c8eb87e2593f2ca7b69d3223b60c83bbcf8c18ca34430fbf917bdb5e34d4d055f4879a6a4534ebedcd16a7360fba8c066aef0c5c7a860966122564f372f4623ec8982cff567eb9b954700779a7eefdeae74e232d07534d3082fbfe4a9992c62cba566952dbec6f9390d34d423b6d49db42dab7eae14cf88a7c5831939bf7b9f9e93ff0c311ac37cc08590b3b464568f2091352796b155af609aef5b739a5bff4ebc96cb33079d8e5c2a18be1f85eba1b11b782639d4336965b7211e6bac0284555c5c64cab3d7f01fd065b5ac5ac7f3834b74f208ba028bd6a74461a2e3249bdad0853f968b8b88bb32852178d7572699a83c13cacc7278cc3f3bfe54d6463e43eaaa8c4d24cb3411257be52b670a3235215d3724a92625c3fd0964173d44808337714f00cbec1fbcca711794aa6db4176a9c0f94f61fd8262ccd9f1b4f870ee9c68ace67148caadac926957315a62a0eefbb761badf18d59d8ff44ad50c127a95ed36493364974a83443c3648b94c8fc5263d3812433b5b32481ac56c68e5467041a9aafc726e8c6b453eb81bd2850a2b0a0ab0dd892758799d33ac7b81f47f0539b0f44ad96953a09fc8df5e667555fdf885dfbe3510e3184c91fe9f0c8b70adae228c21767a1db697d8d135e2450c6446cd91a0d03d3db5a8c0cd9ef696e0bc98f8fa8991f811f55420440c0ec0b2bc7c537ba55a4451019780a10d1cc733bed0cc24b902f50e96c453bf6651574489eeb6be29094a441789eba006043d42a1912cb0467ea3846ca2394a827acccf5b71fd8c3395a660c83782cae71be1fcc6b2594fe5e9d975c119e916e257fc3423a76709e2a76ea1694a53ab14f1e57f06086e84f5d4ad5bdce8c21f6cdc121a19f527851d1d1695142b11a9996470c0517f673d6223d5cf1ce5dcbe8334b7cff4937d637c0b0abac50dbd0eae6da4f321ea9c24502dcfb1c75f666e2ebb2e72d4185218d0c9b3e52fd1cd1ca69ba5c5efad824ef447d30f0e0c1e8976dc4ac44c24ba5c9a5e74b0a93ebf17957a2593ad26da95ac6dd957d5c494d8d69139be897bbcf501091fd264f2aea64b03af555c541867a59bee0577eea33f4fa0e0c305ffdf4614c5734a5fcb5a969de3a0b381aa54b63457a7f773c031ea97e3d611e8a6f3f46d371d41a1faf6ed982d4c1767e3be9fc3ad65afaa368271bdb958425282bc2f9c1bf22bc9468f773de8f2e3271581678ae5720d6b4a86b344ca362030c62c69c0ab3661fd209b594f521fd316b77469a5716913f45bcfda614a30d2b84fe9c4c89288541a3eb03a0e5ab089e42906b264dbd83b2dc7d2e8466cf61b71aeec16f8ba2d4e7459d5495a804eab7883155107194653aa027a546197759347e5d1ded9a86ac2ff1efdb64dcb3668eaf1cf8283dc8534f7f3aef275f295b89276584189207e9d9318b4b0d26981fcbb951ab30318ed935e76e48f47cce09abc38c08b65398571490256c3ba55840a4ebb99ac7571c1ca26e0de4faa6f6c2cb131f69c1a60a91956705da65e95309b088a6675e43ec3a46fbeed88c93adf53b99677ade9214420f9d6fe7af1af51ecf7ab3937289b899e607536ef066783873097ecdeaac01a4dad515b8f0a93d5d5b376a0385cd19ce8af3ad27edf49e29ecd15d009aba6ce36e3297696fea7439c10aa8a6dda26e045bc3b23ba860dd592f9af113248b4bb87536b44c6f3ea84a2beef322f89f452894143a760ccd115fde979ce22df0c972aba55e824732421727dc293dbc952993ef9709cc162712e4ba0f282e4828db5cae2dda17a2567614382f7432a863669d314396274666a4155247f34e1bfcf307d6bbd1d687229cfc254b93399e0ca411da5238168bcfdb817ba76df22db45e2442c9203f6c294de5833e220428f1c5f00919dc95ea9b41908c3d505bab6d9d61b7abeff0a50253d84e6e5f988599bbd8d91fcd40e98d1387f85a9ece6c7bc921adf5d5b79297533dd99d85b8521626911ecba49bbb926d8f6d942023e4ea5d29189b3e84427814cbf32085eec4a9398c4ffe00860a4290cb9620d34805d600f5b39b2f5fcead98a0f00dbe5920f36cda3a320e032856c704973e815dd2a6df55774c1fdd196fed707e0787d5aa96235d047169d4521aa4616f75ffe20aa97d628aba6b02fbc903c33bf5358d22492fb377eaca9434d152ded8d55ece173874000989abead5610f592e6bff13e355e89ca65e9352d2cc0c8e8c8f880e575a0c028f97dddfbc1021573b09b3fa3c0d59f1d5cf80967281216aa875e7ff6be97bacf72d9717c439986947f06d8e896b9b491cdebea3719c2f1f33f4f50e3cf121ff207b1065987ad11cd69ae2ca75a1a93768a0176b07b41759fd7ff6126c77da28d6672e182715d83cd86b29154da958ec41572cc1d92a79cad131a76b4a10f4a999417401339999c09f617d65e10a07ce81ea0dfe92698c09e41198cac0a4ca05024417998a453c2cff3b0f3ba4a1a0c90ece3c4804b3bdf7c26af48e70d6a465286b47f76fb319666d3ad601e112fb288a3da8e14e991d53da31b15661bebae9e9f9d9d6bd3f2b663d06de74d98325bea9874e077d47cc6a4e2b246ea17604fab6a364a193c82d8db985b8893f189c06c22bcd1e69913faac36f781029f079cb8c62287fd48de0e1ea62c255e713f3ef4d5fad5458cd8616f6ccad9264b27897c2cc2cbd1d7bc66695bfa46487be4e94ed4dc94cc0303556c5887e8c64dab57c6ed16ad233176afc8832a45e23825bfaf9d086d101acc56c087e30381e6e5157b3ecdff8ee3bd478e89b0ffb70926ddf84cac9644a8023847ec6edeaa54a23d5a51eb2bd395cb9e840c712e114c7f83ced83dabd7cddb59927b7fda6cc0cef39376c8e97696033a8e9579a3126718c684b36f67e1b95fd12f439487019aeabce58596a2d5046d568f09621cfbf60641a9d29514d25df50d126ceec4a227831fe694c86bc98fab2500dec20598fccba17d423eecd9f009625c4e07217dae405de9b6b806e41c15d73f0072196)], + [bytes -> (ByStr10587 0xfdfd002647a3bace0f093205bbc8ecbc6445c4031ab4fe72413f4be81cb914a4cfaa1a721d74236461f5259ce901c905724cf3634199ceae04cb334ad9916a2ee14f141ab8d574c748106593968dd7c892e1eba70ffc99df83ae7aefc6e54f7d1273f0661760ac448d4106e4565aeb004a5fdf4be35a1b6e6885d8ec0c4637124e1ceb365b957d9445fecd8cfdd458a06191348a0eb5a611cd2459eea69c06d615d78c8322dda7371b5e3e88bc3f47b51a911fd3d8e8d621bdc49d38b89d9302a9392d2909f303a0d84d9fafaf33b4dc8ad7623af733f34cc00837a69265e852e0de7eb3877bd01fb6af13327b699b1e985a3aea2d256e89cab5cecf962db53bfd4501a0c5db83063ff6d0ae8dde37959186b7000509b2a03e2b7f42c47c35607626d0912b3e9f427b9bc282c57bfa45272882b3278ee383b758d3a1408fa3a6a93077810c58db78babc2a705e5db50bf8445927d0d7aa26b73ed63b6485e05936074c0a9e392c5ebf93451ebe9a929496b8482d2c49a77ece82cafcc031a026e791bdcbc257804df01d861132c8d3cb3eb2ed7f1a087d98f367b0fb12a2452d8afac24ce1806a1fa9a6b7352e8216c85b2ffc3fdbd96c190907bdf0f0e08b735f8bf4a1f32403b79cb0b9cf0a6b02684b76a89a18101fc89d11214ce9eaa6047fe2e4bb7888253453e072fecc42458022975fbb1e36695e181711e99d76de99c8bdbffc0813821d707e4b92851077a79f59532301c161308ff0f3426e2fa570b3c0b2fbcfcc5136657b3b07da7f5b926d0a13d5e410175fc3c0aca6d78facb9d379b6fa2efc5923fd1027ab9fea32aa32379fb5973737271546abe3eb18f224ca6b0eca2cf365b504ce74674f4e45fe95efe38eb421eb464c2fe624f6f382e143dfcd9d794798b4bca9829a733e22ae2f4e5db6f3c6d66840256ff767008f9a1c8afc3c09b6372c21530ca236fa95bc41bac0426bf4470617cc4b84f6ff2d440696194487271ce53038a9e0e7422084b970855f00670faa243b90a0de96aefbb5e2cc09441d23854b25e184e73f650dcbf3fb4d95124ad6147c8b354712ff8f3ad30bb7e1093e105069f09cb79bed6b8a40c13a9d3e4ca52e6f93a14ef7a537874621213def551cb5e2c34c25b386c9fcea0c2f73a3a294eac3fbaa397fd579360956fe98ab83cd9fbf055dcf2f76b9038b0a8f96c2b0976749dab1338999816ab96826a14e9d3b2d13da99d0eae7aa71b7e4019d9cdc741e2dd43d06b3d6ef15fe96f757953a6925b8db5480b5a50e3b4a05aee8ee2db835c60432b03967e0a8b4ea4d582eea7a9a08e815a542b6ca071270da44c9922e898288566b379b9ad8776180cd2ef2830ec2beb389c6a7d5cf3f2631fe76decc8bf3e4a00d33be2de1f05d13a996134dbb550102646272e162f5edf390c236e62f6317ce86d36c28c961e8ef7a7d28f0db9f891f9eb0d9aea539b643d3e36245dcc4ffbd9f14999fac2e83ef8d36eb2ca61250803de9e55e829eec555b27ae36f89b02b84d22b02e7895fff250d90eae203725a4a406c521f0167471fb15cfd7f2301dbfe8f8f92f2904ecba3810ec98af70139fe692a635b6fc03c298519144f4a8a2b1e99d76bc10bda957c98c962af2ba83a11806eb04cce47a3bb9e7080a4d9dce73b38e7470f1dcf943480d3c3b297742bf2a1a7e158053c1ac31a9cf82f885002c1a70a05a06e6d2d405e11e9b1739bee34e4dbe692da45200ace30f32ec7c582c426a8a0fdb531a54497513ebfd23c46df6655122163c4daec34e6200eff1a3dd8a56b08beebb2916827468f94e25d0aa55c9cb4865d6bf93d9f2aa79b2c506e3ee42725e74857da64d96436559328f09979d1f3a0ac9d9e57b3d9eed2c79565885a0e7bded90f5c49cc250d4bd416c98acdbe6d1242d497288a73809a299a3e7dc385475f3edf88fb8a58685686fd07a3c6ce4bc1506bb3447e786965b52076f264d4b1c20e5891eb01c9cbca29ca7966d9f4afcc9fc882313fe78b2f619d8581f5e734cbbc4b6057aadba8b2783ec8c0cb3765308691312599973d6d706dd15978613198347f947361fd2a62d47d9f2b441e70778eb4fe36dc1b1448400808e95434334909a0fffc50149032e914512eac90ee93bd42ee4cdb0169784c3e6e14c8727cb5f4ac6f09a2e8f3658d932aa7125129bf8c44462d235d5ca3b1499bbde9122b294f1631c874751c05be0dbd85ecd76b3878fa1ab2dfa340d6f6b292e13bc5101ca473c4e7187349f49b77e5fb85c93bc4787f67f6c73cd7ee13cc38adbb6cbf80875faf802977b1e4a33cf5b869cf813795a4b83b52bea5db8023aa37926704d399dbdc07380a27de2090f49874188885c1410a941612e3cbd0daa3f0e9bb03adc04baa39ff5a15c863956ae25d46f4651145018062510525473c8ee56aa441b00284864d6ee35800bedcf0f0229490c41a02fb2dc576dbeff02fef82b548e89551980a4ce81734245ebd19cc46ef85c343c9e8d3ca3b6c78fb1191ac7284f2adcab376c58e89de6e6cf920f7c9caaefdbebc75d43e667217e0ee2c76216a1081ae410f41bf9117610259031fa64ab7f6db709fdecf9841036c5121bb32ad2393c67793ea194df33b0b66dafe7c732039610815591b89f398ea50fe8a857d63519e1459c6f0f6104a43a740040577df77e4986423547cbb89bb1356905a49253297e3b16c864e5faf5b323b4fa21462aa58bb036962f187abecadff6e9fddd0cba0ca6a55cbc20c81d206f71f31a92ac8c6c05d7ac2936e5bbe2b33607415eb26eaa54c8d84d2cc995581bdb16c2861dd0f3e02e02bfcd738372562784c84cdf2f23cdcf4e5af1c8101350eaaf741d113e01b02ea8ff1c7e05c76baeb5fea802ab842d8ae402e3c085301138b41e6859c6ba779a154b3f349f08a75216930c3e9440601f64c8feab21752b86db43ca2cac1a52560612134f4233c43bd8d5899599389925a4d123ee506e2c40ecd529b5fc462caea75e4ff1904447cc1ef5acbee90878ce75f33cf81b0c95c1daf9a92802424892c1c1cdbc348d6c04d690a53b05a91666b27a8342891edda43f1ba02df2f7bc0754169d847ec6cb05a5be68dc602e9761409671b6f37e2fbbc52621caa1b3430b74fa502bde589b44d63bda32ef44adec77756c3f61e8ee63a18e44f27ce017e72bda3fbc009a8abc342479c3bbe5eff6a386758cfaa5b6b7b0e37a9d5ab521377e7eda753cce5f1c4c78fc91dcc9e7696d0ab5f1a246b05767ec25475f50847c745b1cb9ebe00613a2ed4df139c63f9df39cd455a4f9f03e161997e0264bb9243dd8b9f5834ebc3a79504a511d6ca04387dd1629df620bacbd2f9e4ca791bf1e499c4bd63687599a613f8be24aa975c3f8b45778e7b2c041d749e3650c0dbdefb0f11e30e0a10b54aeed76cdbc24ced95c2964d971a0edb10473dec81139127df22a136db0bd238c4d1090dcd876bbe72add03e2e163f62a3e49136aa4b6548733022d5e592dfba77900f9bd769143c81a305a59d1cb8075a8729cac49ff13b4551fd2634df233b4d3d15ca2d6fff083374bdc9a57a9eac94f3e12de3b4e228b16e90298b000d2c38cb886487b46c277a9c29c58f79a6a77422f8390e472d62034a4e454b7ee2947146d28b258fa5daf311d9ccb5325832d2178245528cb4c0750c19dbb9ecdf681ac26de84f77dc93bc30300beb11f883b54a629ab94e26459b5ee8b2e4a76448904d0aab3c27ce841da681378a04b17610473fb61bf9690b9526ab2a643f52f38cfd7ebe0fd6ca6f6aa84cd4dcf07e14856f0f98da8477185c99ce3a7c714cc4ed3d844f27ec1a5866c740161ba59a4bb168a2fc5c3a8aa4c286c18ebc46ebf685ca0bf4255c49a06aa0782b0bcac925c9e45b37a54c993a8bd532e1ce9712dc854e744333f17aa7d2503a7efca0736718a29da781de21f6dea8891df363559261c114126fa9a03d7a0cd942a7728aba5f6e8cbd5882b351d124615a7fc94c186dd4a87c0a7d30ddcbd1c8575ff8bc20932149d70786aef56d4ee02bc17391c25bf43a2492d4aef368434b127f3c387d1ac36202afa8046663f85acb571d4e093c5b058087594a5a6f25d404742cd0675e33f999f850ba3170670ca4498f772dab378c636323a66f500d21d6dfb39b30b84f35ca4df48a73e68f8f7054690eba1c79d858e295c821678072305c0d753226b3975512374f3e10f089cf4f3a1b377dbbd140620e60ac0172d327e112bfd2583952b78cfee367f8b8160a0689a981135ac23e8be26604511802865e94886571ad6103a7ab6a845bd47529373e5648215948ed8f54c509593d21e324e596afffbbe666f6cd0287e39e1fca61f747a58829564f69039f251df4db8d2257a8e995f633d0fb6c767f4b71c3d2daa16acc6f71d6b12b7d24a99ea501fdec75585695f0f7a87e769c434f71a0e352b7ba91403492dbceb33778ca8f36424e38b1444da7205b091365d4598431da60f8d642b8a51165a2cb4163c84607eccda8293da8fff358bd505638a129050e2be9cd1b3d8489183cdd279ef2dac8001d8e3983ee8d485656994d20a8e49a2356d9e1df5c304924c9554250bebb002a6eb553c701d27b0c8ff7c8467739bea88811bb70c368b004ded217ab9333fac7a34d690be8227f7aa1cda61b5f58e93a57610c2e76ff3228b05db2d10e579aa62c1404b822d91845aa417c4302cf1518a800222ccf73bec3f8e4f743c9967ea6d24fbd58c978d57fcb07404ab4809118e63222fc800a7e333f130ef109e75039ae4d6f009ccc7ed3a09845e8e2f9f0e2379b0d34522beb7f5aa9408ab2450e8e36ccc03d3e844e873c7165342ad94ebef06f19e44f21ce355e00499ad74bf8b0314752a360e356b9b7e4415a199ab4f4b3a2201d217ebe2fb052e0b5b72f85fc09051bfc2d60226099f177e915ebb68fa46b6ad3342d3174fa20293c1eefa59b85418313c5cf17ae6faae5b3104d76ba75a70a97c36b0450d1831963f69063335193a3c46cbb7dc04ff77c4b0cc970f8508ccc8475b1d8db78387e2cbaa5142ec8bb0a66fe1511d7e00887922c34b82653dce9a773d4cf843b2df7c28ce3bb61c208aaf55c6cb5ee750623ae3a9bc54cd5e48513012b2e822db6a89e58214cd9c71ac6ce1ec2f6864ff40cbdf51f69b3482653db158a9fc376a82d26b0f9e6ea5dbcf9f32d13b223fe50324311bef14ea5eb4f62637f3bd7f79dacb7ae014c18b2c1a206ee47e7c9b2c8383e9ea5365d42ff8e18b8019f0c3e1f6d13b32d5ef37d2ceb3df7e61d41edc185b1901df27ad3dc03d180e27ff79260b297b525ae3771783f9d9b1f48374e301f8b8dbeaebb14e58ec230d2f187e56b87c622df9889da205c3ee3a56bbc9144f391a2fc5e7d38c65640de762a70c0ba881d3e3963159dcdeaf3169c1f2bff1a94a33ec0888fd741c30647395d910674cbcf932fefe8ce5f8473c6cb9168c6e47128f03fc4f828ef54f22de0d96b4df2e17ee9f92cab674d7a8880d608ff6ad837f2701955d1b81b8e80895a480aa4981eb9f05eb9fc5b78629162093cc587bb2c0d5d95740784173af66249cedc355c14eccc665814320416581062968a28f2df06bd7127ecacd64d4f13deaa0ac5c74c310826209a6b5177c201c7e34789a99921ef883dcbc0ec47147b03a4e0769487b7251ea7ecdbebeaad14453985468d6d536045cf43ace99e2548492320432a6c55075fb284d05524b2f2045f768f5082d8fb5f255fa0c44592f429f6f522472953185fb4b14d5e12bfe7d0175c108339ab9ccf21d992334ed57f68697f999443c0b213bef55f5ba6428032152ea52288ab46c974881a61016c9b3c646518a7b50db66025c76fda0286c0cdddeb2927b1c6cb1d7f9eae2272fb5c5c43c67b7c482100857763376c85414a2d12ea8cd043d3e816675ed6a4956e5909201b23aea5f4ff92aa7a2194543ba0a3b4d90304b665dd781633c9358ea851c1c03940da4b16459593a3b633a52b81c602ce060acca5d339b1fe65e0141742964fea8cf1cc188e9d3f4ec3f6d083e289f19de78bf7f90009d909c6f3ff83c3088f4eb1d5d77065f65e35eafc8db77b850d54da999a3e1982c8c358e7b566d88806c13485a1313b2b836eef50060ab019327303c59259730b87d2728ab2f8897fd78b8190cc83c5620409e7aef73e7fde83327917bf5268b115c5c5f035b1e669bfd7b64fc179989b547b0466aca868ffae9053934411ea988920e5d3e62a407a61e0af37bece5ae42c7e77feff6814fc2ef724a46b41b6b7ba449a230a6f41eb70c2233514539ac5aa3c542bf0ce28c82d66bfe8c53b383a9df54e99a9a3c52d264289f2a84c9c9e94660f786e6c7b7a54f16b30bd65b3d4c5d88af5e8e2da43860331961baca8570905f09d1c915790b85ef4e4b1783dd62b446feff3dec54073daf7beba3a8a291a326495e971ce63df6ca4d767b4c4c7a66093da8babc21be4ccbfdd634edb3797e0e21ddc6f6ee7d673c50b7aa0bb6b422c1e63f5652b7c60f1549e1c4ab655ba99e9020e1b11be699808d40c675c4693e52b9785856d57cca37af89b5332582e5e1b8d628bf620396473c2bacff4922e3c469bfd92dadf215a0406ee211eb248dfdbfe05c83ecf41b660bd58fa7749437a5bd398e06f5ddde0d50239cabe9e1c8e8eb41d980647fa72e99faf1ab3212617cda0c337c22e3a247ba8e3cf5464456b96f5767451aa9a8956c342eabe91d32777e1e5692716c2271f7a2d63d13213d7ef2cc271594bc3f87ae9bb5c3f2d33b7a0b9a2e80737a8455ff2cd1012ce07d446a275aabb819294878b5ca49e04cbd8242cf60f2444587599abc37ed1e068e15d6d0ac6f023bcf13b0438ca03d98f5472e56039844c7a53445d506627834db9a81590271cdc57eb8f8c070a96f01061827731784694b19b611a7713185a292c93a46b8f5eebadb1d836a5170717898656b215774e12ce3e7cb2efbf435f7f6155fe0d60dbe9cccf1aed31b576031480b9362c55f84461c9c3567c94fd7080f977193ddf2089166a3f7152af17e7c38cf765a789df901491c6b2e098a5d073811e8f81dbc3673d2c4e8287e1c0f4d9c359e00e21789a12e4af733f46cdd71e2243b3dd14b915f7303bb5a7dee7d96d890a962e70b85e0431cc13c662a661b5da19976e4c836921fb9f0927e8913316521d56cb57883e2a2a5f7176e24ceb0ac02b16fdf7b61a72e95877982ad2d0a8c571ad1f2b54ef71c681e6e96381930fe5efb934079af88761f195ad82224537006e54622badbb19a39d09882a1c9e72d4f8930caed09a53a402ef1932dee086bfea3501f1c52e95ce88984c7a2124825c4d44bbd6c52800b4694d06efdd18baa1054f28438ab6968da660a22888ada1daac131a937589477b58534a1f813307c185aea551333d82b56fcd17652c5f8c74298da3611ba88a2bdb70cb8f25959c426aa3dbd736c8105f7628716d3e0023219674a7ce2ae84358b3013f678f9af0f59c56f1ca2141fae78ed64e3a9bab60577070f834de4e9bad2bdd8e1ee6db3e07f45d4b965a2d525e327cec85271115078c9040f862f725fdb10340ff97a108ea4e8c00e8fe05df884651c26056afbd3fd2afdfe95c2127f82b376335aaab6f6850583e405264b490bda00b9f43d08292326e14501d90f83b22b6ced6cee5e80cf708ac2546385f846678f7f58caa51bb1a6b7fc56bc7b546d100c62a81c59554caabeb23656fc398a19c5c14acddf9291241f4d66a26c45d644dcacc7110d14c3320f3067aea15a12f4151ad17485d8a23fcbf881976c6624b009d7560682494053888a9f5fc9f0699c7da3f095284a6cb2c3929d33002ce4e6cdcdd1f634981e54baccec74191d77c9efb9ed63902a4634dc45149c6097a0fea9de22890c6252c0d95f21e448530eadca832e6a2990a7bd3c965b928917b2bbebe49b31218a86529a4e7c519e87bba194da78e3f71b0ecca7ca6308f5d50a05a2cb2938d64a1fee087832322a88c6f64802e58badaf6039050774e284a0b5e3e7f81b2ba19b7efb03d9f2188d49f2ff0e8099971271bd0fe3678b68e7a74d07b1eae4b87a7b893f9fb7cbe712a2401507b393ab8176a0ac6793b32d4d90c7ffed5b68b6601dc9c55a6361bb864151a7cb5abc46118612ce5d8e8600b23fb15a4b245158d5a93d60a2c0c6259ec68a29079891378848830cdd80bcdf0d4b38b31961e31b65c236adecc328f50d2b784e3fc12e32bc994691e0684a9b84433aa2cd725d70d6a01f3decb1e026a4e810ced4a00f134b843e03eb27f85e6b98d8e7f12cda178330ce0d2fa6b6e3aa67774265c9cc2fe1d7c0869d05b1178bbdcd9b5cd5565c1752bed94bf36ac743f8cba1c8c32fc915556963f3f0688781b0b32cb0d71b37f089e438ba9acc0bf9db8bc283e88223bb890f47f697707dcc8324801d80adfcfdea602cc573e1f16114198fe71f2c13ac942d5113c2daf230ebf174a85ff365f3e7059ac47d4ac5bf68d3d9c554f3fc64bb75fd439ee745a99fb08850b3b41619eaea4a30de7a607d105837e4776a4adf3a1f2c6728dc1fd4fdf270534f178d6536eabc691d242249b84a17dc6390e9721b2232088ecf4d82b468805ab8a5335cba3cce2b8d4f058dce7539a7e14ae6fbb7bd3485a9268621793f94673e457bf9dae0b3d1aaa52b935b49c24b788ac32b1000dd93ed8bd337bed14d4429f2fdd685ced69dc49998dde24a6af288bd4768aa54d5c971ed3aa74852b0b40399fd1e68f313619d273440801fd233df6fd329c4c5f2d59e27030d57105012b19062bb3c9e2f3d585bf59b804b133e6f46ec2e6d88a0f9a09985dd26c396f247a6d13bfdee507130931fda7c89315e3ec4c2848d0c72672ad6090e50ba0feeaa248ad5d81d3d4ecca2a3c85aad6d7e5ee9ae6f67794ccc514e9c6096fae0243f8bbdcacf773ba6d1df15a02a1631c594e13c5541a9093ed9c1001f0c4f78db0812c88da7b0007ae833b13fe829a5e0cf3d14f479db84cab5111d12e81f86d21a5575f473d2b44d4b947dce9e7ec283990c7785858b2c6d51fb65ffc396c075634dea5b64e23d4f61602a36502b0c20db35ac091a13e3d7a46b6370903abd124d6de1e7531df1a59250a08bf064d176899eb091efa797d464be76696ec2a1878922898f0d58990cb63de9580271faf82aab7d5de664d0bc097e4a24036318ca5bb57a9be7eec4fed1cb94c462dc7e8c015b92814d33c783cf1be00ce8a4e28358bbfd4c4006912b7b68a85ff5dbd043f0c9d91585ff1851d686154387e773c3bf240183b9e424b1bdd657bc9007196ab12621e57c46c279da24632d70d378f30327dc517cb20166123bf376dd043c92ca73d29a60e9bc17a8f42fc2a25f334b1b75e9990c96bd473b870d6e825763a4b36d2e2ef7dec70b663565dd4f40853a82ea8860d0ba2c1defa369ea2186eb7e2a52dcacbf1b2126d246e3abd4d1ad611da370cc39db4a9a656ca98b9c2f73f952edf3598d7579b414ca09ce8ab501245f73a7f93901adc825c3b0e0765530fa3774c67196e89a5d8134c3cb41b85beff740f602827f46227e22564a517278cc13c9d8dbd705d9e2aad693e7ff43674631fdf0e62b24cbc10115cdb712aa5051c228ffd1565af91144c03f711eef9f23c626194e1bb8a5761c462ca36564a75db3def5587f1adf44ca9c2c0bf6d41e5cd79f340e505a0a476addb9215a8b127c4d8a52f00e6bac972c0796d788ef9d9faff5a0f5d53ca7a51198fbbee1f6058e9fcee288f434d2d9478b0ab048d1616f4340529b0dba0ec9dea884cfb97b1339c3671f1e6caadb5a658883332a6fda5cc77010879180e6c5239bbe954f38e1fb8748939a4fcfbbbfcb7133f1544e3647d65a564f1fb993bc47366235371ff2626e125d585e5ebddd0fa9a2d641dbca432b6a2e1774ad01be9d097e906d297fbc281ffb0fb4261c040e47af4ad99d60d7761e9adaf7cb7a3dae550f7278024c44e167729afd09db9a6dbcbac48e43a8ed56034ae87221e69434ffe812359f7e67416296a0d73f86b0cd04d5c5ed6c664ce353f565732a5e5ba9fcaac6d2d6fddb98c9f796dfda0d81922560b6fa044213adc2e5aad055afe8b55b8318d4021f2628f4e564da6d2d6e0a04206458a47f01112313af24cff56cebc5f31db719c4c6010704c74ecd78e75763274e59eda0edb41b7b650989be3d12ce11da06956813c8e72ab5b9902a7711feef4b75a170c15b9ed692da26aa2b8e44eb0af70a0813451ba666b0a5c020da273207da6f1fde6e231ed1a35692ecd4ee3b00c56cda80cd612ef898997babcc4541c6ab6c3469b240be51414b525e7056021f3f359d46f99d0ff09c011fc88629d1a94afb533bfcefe3bbf081c3d7efaed8058003f388aaddb16b13c1e9046a9eeceea33946c58e035df188fdfcece96ce34d5b224f399f0694218f3acccbb5a8760223f53741ddecf8969e2b2b90d93196a5a5e813f66774e51fa20a6dfe4534d37087eb9b37c95eb8ad3f9e4282f12286327041253a0b04ef7be483cbfc61a9d3a08ab03dd71c3974f97c3920038a5a58a3ab1139d1a89f8511f070d11790b39b9507027346b47ec4b8d6387ea89037e27a159bf90101197123ca0880bcb050a9f0f74debea4f722e9d300e3f9560af9ffb1a30730dd4ada4c7a23f7feba9c2b199fd169eda543fd1d07eebd2cc3f34e4e45bc0913019a1e84bb9c8352a5e30f60742e676930ea220877214a1081fba3bcf492d46e82b7422a23ad87a4d6cb48668df7c77dfd7ed31fdc51b4caf51fd17b9c93bcd43355de31579793d3718992f3bc280fa42ecacbbd0cd728a5c87d06099a866dd3bc47dcd075bcad79d203a9dd2099ed98c42da7d16d2871dc83513f63ba615904a3c352554b8b441e2619830fd782da099d8092954ab5bc9fba6947bd5865b2b7624f00aa8ee8f96d744bed892a6270500c7c8018b934b1a6f3b791a91ca3a3d4a892c2e3d61b07eabddbcab39a8b845e7fae4be3f350ff10e37a914e158028e580dcc8c9b101637ad972c09ae2b1b5b9b6380e60a60967007a8ab544d6f1560a76bf3ef542bbad0a5f67ef49508f945aa10e7dd724087fd4cecd82c97598c9f7855d5bb7125e1204d6457a4bb65c0f221ef7bea3484c3b7f96f245ac14ef82d1f19cfaafc07303983887a099d9322d31547ca121f224febf57e624abea2d9edb4b12fa0c97e9dffa8c98ca71fe3928575511cf248c807b58ad3f6e291b3baa2bb7774ec03e294bb12bbc7dbd7c7be155a8d5212a3ffba5bb63c133f7f7842f46cc07f6414901b7be1735be4c8539bcf0036f13d67fd8fbfbb4a61b96aedfb564f8b8868e81c4b3f0f47440e4a24c6ead01640988622b582eae5cf5ea4d73c21e9aaed88472d8276229f46e3bb9ab582c59f18b332aba9cd5870a83b51d59ae7b578afa6fc43cbf87a9225729aad094683e1def81005ed877f69ffd65f014fecd9ec0a6645fe05a2704804a4cb82f1e104572925587810447fba561ceeb13f994a91ca4847e30f9822e5cc8d1b3ee64fc48521adae58445f3446b1c2903afeabcad8599c9d193764d2525d59771129bd425f097c02137336f1a81cd01f147829451066b176afae16888e8f022a3fb2de089212d2ab14ec24bfbb98fe4b02c31b5c42858d3d2411b02b0eb4d3a3960361abdc8f992064a68f895b0a1ce359ab205e397bd2efc91b395c67b00d891a8ef055641997eab5f8a37172fbbf5d94d1b8b3a4d0994590873132b8f0cfcc750ea29e00bd84e048e335aae497f6bc5791b51dd8acbe2e6c239ebb481e575638d8a0fe86c8b519c937823ea1a51cf4fb223dded9f16804515ef57410d719c0938a6df831b9471bbb8c8eb87e2593f2ca7b69d3223b60c83bbcf8c18ca34430fbf917bdb5e34d4d055f4879a6a4534ebedcd16a7360fba8c066aef0c5c7a860966122564f372f4623ec8982cff567eb9b954700779a7eefdeae74e232d07534d3082fbfe4a9992c62cba566952dbec6f9390d34d423b6d49db42dab7eae14cf88a7c5831939bf7b9f9e93ff0c311ac37cc08590b3b464568f2091352796b155af609aef5b739a5bff4ebc96cb33079d8e5c2a18be1f85eba1b11b782639d4336965b7211e6bac0284555c5c64cab3d7f01fd065b5ac5ac7f3834b74f208ba028bd6a74461a2e3249bdad0853f968b8b88bb32852178d7572699a83c13cacc7278cc3f3bfe54d6463e43eaaa8c4d24cb3411257be52b670a3235215d3724a92625c3fd0964173d44808337714f00cbec1fbcca711794aa6db4176a9c0f94f61fd8262ccd9f1b4f870ee9c68ace67148caadac926957315a62a0eefbb761badf18d59d8ff44ad50c127a95ed36493364974a83443c3648b94c8fc5263d3812433b5b32481ac56c68e5467041a9aafc726e8c6b453eb81bd2850a2b0a0ab0dd892758799d33ac7b81f47f0539b0f44ad96953a09fc8df5e667555fdf885dfbe3510e3184c91fe9f0c8b70adae228c21767a1db697d8d135e2450c6446cd91a0d03d3db5a8c0cd9ef696e0bc98f8fa8991f811f55420440c0ec0b2bc7c537ba55a4451019780a10d1cc733bed0cc24b902f50e96c453bf6651574489eeb6be29094a441789eba006043d42a1912cb0467ea3846ca2394a827acccf5b71fd8c3395a660c83782cae71be1fcc6b2594fe5e9d975c119e916e257fc3423a76709e2a76ea1694a53ab14f1e57f06086e84f5d4ad5bdce8c21f6cdc121a19f527851d1d1695142b11a9996470c0517f673d6223d5cf1ce5dcbe8334b7cff4937d637c0b0abac50dbd0eae6da4f321ea9c24502dcfb1c75f666e2ebb2e72d4185218d0c9b3e52fd1cd1ca69ba5c5efad824ef447d30f0e0c1e8976dc4ac44c24ba5c9a5e74b0a93ebf17957a2593ad26da95ac6dd957d5c494d8d69139be897bbcf501091fd264f2aea64b03af555c541867a59bee0577eea33f4fa0e0c305ffdf4614c5734a5fcb5a969de3a0b381aa54b63457a7f773c031ea97e3d611e8a6f3f46d371d41a1faf6ed982d4c1767e3be9fc3ad65afaa368271bdb958425282bc2f9c1bf22bc9468f773de8f2e3271581678ae5720d6b4a86b344ca362030c62c69c0ab3661fd209b594f521fd316b77469a5716913f45bcfda614a30d2b84fe9c4c89288541a3eb03a0e5ab089e42906b264dbd83b2dc7d2e8466cf61b71aeec16f8ba2d4e7459d5495a804eab7883155107194653aa027a546197759347e5d1ded9a86ac2ff1efdb64dcb3668eaf1cf8283dc8534f7f3aef275f295b89276584189207e9d9318b4b0d26981fcbb951ab30318ed935e76e48f47cce09abc38c08b65398571490256c3ba55840a4ebb99ac7571c1ca26e0de4faa6f6c2cb131f69c1a60a91956705da65e95309b088a6675e43ec3a46fbeed88c93adf53b99677ade9214420f9d6fe7af1af51ecf7ab3937289b899e607536ef066783873097ecdeaac01a4dad515b8f0a93d5d5b376a0385cd19ce8af3ad27edf49e29ecd15d009aba6ce36e3297696fea7439c10aa8a6dda26e045bc3b23ba860dd592f9af113248b4bb87536b44c6f3ea84a2beef322f89f452894143a760ccd115fde979ce22df0c972aba55e824732421727dc293dbc952993ef9709cc162712e4ba0f282e4828db5cae2dda17a2567614382f7432a863669d314396274666a4155247f34e1bfcf307d6bbd1d687229cfc254b93399e0ca411da5238168bcfdb817ba76df22db45e2442c9203f6c294de5833e220428f1c5f00919dc95ea9b41908c3d505bab6d9d61b7abeff0a50253d84e6e5f988599bbd8d91fcd40e98d1387f85a9ece6c7bc921adf5d5b79297533dd99d85b8521626911ecba49bbb926d8f6d942023e4ea5d29189b3e84427814cbf32085eec4a9398c4ffe00860a4290cb9620d34805d600f5b39b2f5fcead98a0f00dbe5920f36cda3a320e032856c704973e815dd2a6df55774c1fdd196fed707e0787d5aa96235d047169d4521aa4616f75ffe20aa97d628aba6b02fbc903c33bf5358d22492fb377eaca9434d152ded8d55ece173874000989abead5610f592e6bff13e355e89ca65e9352d2cc0c8e8c8f880e575a0c028f97dddfbc1021573b09b3fa3c0d59f1d5cf80967281216aa875e7ff6be97bacf72d9717c439986947f06d8e896b9b491cdebea3719c2f1f33f4f50e3cf121ff207b1065987ad11cd69ae2ca75a1a93768a0176b07b41759fd7ff6126c77da28d6672e182715d83cd86b29154da958ec41572cc1d92a79cad131a76b4a10f4a999417401339999c09f617d65e10a07ce81ea0dfe92698c09e41198cac0a4ca05024417998a453c2cff3b0f3ba4a1a0c90ece3c4804b3bdf7c26af48e70d6a465286b47f76fb319666d3ad601e112fb288a3da8e14e991d53da31b15661bebae9e9f9d9d6bd3f2b663d06de74d98325bea9874e077d47cc6a4e2b246ea17604fab6a364a193c82d8db985b8893f189c06c22bcd1e69913faac36f781029f079cb8c62287fd48de0e1ea62c255e713f3ef4d5fad5458cd8616f6ccad9264b27897c2cc2cbd1d7bc66695bfa46487be4e94ed4dc94cc0303556c5887e8c64dab57c6ed16ad233176afc8832a45e23825bfaf9d086d101acc56c087e30381e6e5157b3ecdff8ee3bd478e89b0ffb70926ddf84cac9644a8023847ec6edeaa54a23d5a51eb2bd395cb9e840c712e114c7f83ced83dabd7cddb59927b7fda6cc0cef39376c8e97696033a8e9579a3126718c684b36f67e1b95fd12f439487019aeabce58596a2d5046d568f09621cfbf60641a9d29514d25df50d126ceec4a227831fe694c86bc98fab2500dec20598fccba17d423eecd9f009625c4e07217dae405de9b6b806e41c15d73f0072196)] } +Gas remaining: 3895572 diff --git a/tests/eval/good/gold/polynetwork_getBookKeeper.scilexp.gold b/tests/eval/good/gold/polynetwork_getBookKeeper.scilexp.gold new file mode 100644 index 000000000..e0b16a872 --- /dev/null +++ b/tests/eval/good/gold/polynetwork_getBookKeeper.scilexp.gold @@ -0,0 +1,26 @@ +(Pair (ByStr20 0xdae1f6cfd5508bc3c9e20226201855a3919d1a94) (List (ByStr20 0x02cbc020209ef8835388882e2c4c4e6acef96f28), (ByStr20 0xb98d72dc7743ede561f225e1bf258f49aea8f786), (ByStr20 0xda9cdffbfccab4181efc77831dc8ce7c442a7c7f), (ByStr20 0x5d60f39ab5bec41fa712562a5c098d8a128cd406), (ByStr20 0xa42a4e85034d5bebc225743da400cc4c0e43727a), (ByStr20 0x7fbfc361a31bdbc57ccc7917fe5dbdbba744e3a8), (ByStr20 0x09732fac787afb2c5d3abb45f3927da18504f10f), (Nil))), +{ [l7 -> (List (Polynetwork.Pubkey (ByStr67 0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c)), (Polynetwork.Pubkey (ByStr67 0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f)), (Polynetwork.Pubkey (ByStr67 0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0)), (Polynetwork.Pubkey (ByStr67 0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712)), (Polynetwork.Pubkey (ByStr67 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce)), (Polynetwork.Pubkey (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250)), (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)), (Nil))], + [l6 -> (List (Polynetwork.Pubkey (ByStr67 0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f)), (Polynetwork.Pubkey (ByStr67 0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0)), (Polynetwork.Pubkey (ByStr67 0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712)), (Polynetwork.Pubkey (ByStr67 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce)), (Polynetwork.Pubkey (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250)), (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)), (Nil))], + [l5 -> (List (Polynetwork.Pubkey (ByStr67 0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0)), (Polynetwork.Pubkey (ByStr67 0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712)), (Polynetwork.Pubkey (ByStr67 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce)), (Polynetwork.Pubkey (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250)), (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)), (Nil))], + [l4 -> (List (Polynetwork.Pubkey (ByStr67 0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712)), (Polynetwork.Pubkey (ByStr67 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce)), (Polynetwork.Pubkey (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250)), (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)), (Nil))], + [l3 -> (List (Polynetwork.Pubkey (ByStr67 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce)), (Polynetwork.Pubkey (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250)), (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)), (Nil))], + [l2 -> (List (Polynetwork.Pubkey (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250)), (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)), (Nil))], + [l1 -> (List (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)), (Nil))], + [l0 -> (Nil)], + [t7 -> (Polynetwork.Pubkey (ByStr67 0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c))], + [t6 -> (Polynetwork.Pubkey (ByStr67 0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f))], + [t5 -> (Polynetwork.Pubkey (ByStr67 0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0))], + [t4 -> (Polynetwork.Pubkey (ByStr67 0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712))], + [t3 -> (Polynetwork.Pubkey (ByStr67 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce))], + [t2 -> (Polynetwork.Pubkey (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250))], + [t1 -> (Polynetwork.Pubkey (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197))], + [m -> (Uint32 5)], + [n -> (Uint32 7)], + [p7 -> (ByStr67 0x120504eb1baab602c5899282561cdaaa7aabbcdd0ccfcbc3e79793ac24acf90778f35a059fca7f73aeb60666178db8f704b58452b7a0b86219402c0770fcb52ac9828c)], + [p6 -> (ByStr67 0x1205048b8af6210ecfdcbcab22552ef8d8cf41c6f86f9cf9ab53d865741cfdb833f06b72fcc7e7d8b9e738b565edf42d8769fd161178432eadb2e446dd0a8785ba088f)], + [p5 -> (ByStr67 0x1205048172918540b2b512eae1872a2a2e3a28d989c60d95dab8829ada7d7dd706d658df044eb93bbe698eff62156fc14d6d07b7aebfbc1a98ec4180b4346e67cc3fb0)], + [p4 -> (ByStr67 0x120504679930a42aaf3c69798ca8a3f12e134c019405818d783d11748e039de8515988754f348293c65055f0f1a9a5e895e4e7269739e243a661fff801941352c38712)], + [p3 -> (ByStr67 0x120504482acb6564b19b90653f6e9c806292e8aa83f78e7a9382a24a6efe41c0c06f39ef0a95ee60ad9213eb0be343b703dd32b12db32f098350cf3f4fc3bad6db23ce)], + [p2 -> (ByStr67 0x120504468dd1899ed2d1cc2b829882a165a0ecb6a745af0c72eb2982d66b4311b4ef73cff28a6492b076445337d8037c6c7be4d3ec9c4dbe8d7dc65d458181de7b5250)], + [p1 -> (ByStr67 0x1205041e0779f5c5ccb2612352fe4a200f99d3e7758e70ba53f607c59ff22a30f678ff757519efff911efc7ed326890a2752b9456cc0054f9b63215f1d616e574d6197)] } +Gas remaining: 3993877 diff --git a/tests/eval/good/gold/polynetwork_header.scilexp.gold b/tests/eval/good/gold/polynetwork_header.scilexp.gold index c65b06f53..2931bed29 100644 --- a/tests/eval/good/gold/polynetwork_header.scilexp.gold +++ b/tests/eval/good/gold/polynetwork_header.scilexp.gold @@ -1,5 +1,5 @@ -(Some (Pair (Header (Uint32 1) (Uint64 4) (ByStr32 0x386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c3) (ByStr32 0x0000000000000000000000000000000000000000000000000000000000000000) (ByStr32 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) (ByStr32 0xae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc577) (Uint32 1572256323) (Uint32 1) (Uint64 2214801009744602529) (ByStr 0x7b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d) (ByStr20 0x0000000000000000000000000000000000000000)) (Uint32 447))), +(Some (Pair (Polynetwork.Header (Uint32 1) (Uint64 4) (ByStr32 0x386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c3) (ByStr32 0x0000000000000000000000000000000000000000000000000000000000000000) (ByStr32 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) (ByStr32 0xae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc577) (Uint32 1572256323) (Uint32 1) (Uint64 2214801009744602529) (ByStr 0x7b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d) (ByStr20 0x0000000000000000000000000000000000000000)) (Uint32 447))), { [pos -> (Uint32 0)], [header -> (ByStr 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000)], [headerx -> (ByStr447 0x010000000400000000000000386916e6b10e902a0bec78be62532262148c4a5e3952db4bfed00d27e5c779c30000000000000000000000000000000000000000000000000000000000000000e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855ae0798d0ecaed2b778eddebf18f071a561c53658c05e76cedecc27cafbdbc57743bab65d01000000a1e500aac88dbc1efd0c017b226c6561646572223a362c227672665f76616c7565223a22424543366e384b56653635556f6b474d79766e656a6f50763167586e46684a56776b35673141384d484b4b646768486e5478486e43497466484161706f686c5535666c314d79576a524d51717245586752556d38564f593d222c227672665f70726f6f66223a2246456a4d5266564e6c336a5937396650735130474d4e3261432b36554c487768742f4f697a6e4a424d7a394d634d64412b6b7232632f7852533354687979623466436366715a35766678684f4d6c474d5036417472413d3d222c226c6173745f636f6e6669675f626c6f636b5f6e756d223a302c226e65775f636861696e5f636f6e666967223a6e756c6c7d0000000000000000000000000000000000000000)] } -Gas remaining: 3991730 \ No newline at end of file +Gas remaining: 3991638 diff --git a/tests/eval/good/gold/polynetwork_next_var_uint1.scilexp.gold b/tests/eval/good/gold/polynetwork_next_var_uint1.scilexp.gold new file mode 100644 index 000000000..88825d4ec --- /dev/null +++ b/tests/eval/good/gold/polynetwork_next_var_uint1.scilexp.gold @@ -0,0 +1,10 @@ +(True), +{ [value_reserialized -> (ByStr 0x64)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [ui -> (Uint64 100)], + [ui_opt -> (Some (Pair (Uint64 100) (Uint32 1)))], + [pos -> (Uint32 0)], + [value -> (ByStr 0x64)], + [uint_value -> (ByStr1 0x64)] } +Gas remaining: 4001054 diff --git a/tests/eval/good/gold/polynetwork_next_var_uint2.scilexp.gold b/tests/eval/good/gold/polynetwork_next_var_uint2.scilexp.gold new file mode 100644 index 000000000..ae5db6068 --- /dev/null +++ b/tests/eval/good/gold/polynetwork_next_var_uint2.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xfdfd00)], + [len -> (Uint32 3)], + [full_len -> (Uint32 4)], + [value_reserialized -> (ByStr 0xfdfd00)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [ui -> (Uint64 253)], + [ui_opt -> (Some (Pair (Uint64 253) (Uint32 4)))], + [pos -> (Uint32 1)], + [value -> (ByStr 0x64fdfd00)], + [num_hex -> (ByStr4 0x64fdfd00)] } +Gas remaining: 4000935 diff --git a/tests/eval/good/gold/polynetwork_next_var_uint3.scilexp.gold b/tests/eval/good/gold/polynetwork_next_var_uint3.scilexp.gold new file mode 100644 index 000000000..1124538e0 --- /dev/null +++ b/tests/eval/good/gold/polynetwork_next_var_uint3.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xfde803)], + [len -> (Uint32 3)], + [full_len -> (Uint32 7)], + [value_reserialized -> (ByStr 0xfde803)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [ui -> (Uint64 1000)], + [ui_opt -> (Some (Pair (Uint64 1000) (Uint32 7)))], + [pos -> (Uint32 4)], + [value -> (ByStr 0x64fdfd00fde803)], + [num_hex -> (ByStr7 0x64fdfd00fde803)] } +Gas remaining: 4000914 diff --git a/tests/eval/good/gold/polynetwork_next_var_uint4.scilexp.gold b/tests/eval/good/gold/polynetwork_next_var_uint4.scilexp.gold new file mode 100644 index 000000000..5f462c91e --- /dev/null +++ b/tests/eval/good/gold/polynetwork_next_var_uint4.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xfdffff)], + [len -> (Uint32 3)], + [full_len -> (Uint32 10)], + [value_reserialized -> (ByStr 0xfdffff)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [ui -> (Uint64 65535)], + [ui_opt -> (Some (Pair (Uint64 65535) (Uint32 10)))], + [pos -> (Uint32 7)], + [value -> (ByStr 0x64fdfd00fde803fdffff)], + [num_hex -> (ByStr10 0x64fdfd00fde803fdffff)] } +Gas remaining: 4000893 diff --git a/tests/eval/good/gold/polynetwork_next_var_uint5.scilexp.gold b/tests/eval/good/gold/polynetwork_next_var_uint5.scilexp.gold new file mode 100644 index 000000000..9c64d456b --- /dev/null +++ b/tests/eval/good/gold/polynetwork_next_var_uint5.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xfe9f860200)], + [len -> (Uint32 5)], + [full_len -> (Uint32 15)], + [value_reserialized -> (ByStr 0xfe9f860200)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [ui -> (Uint64 165535)], + [ui_opt -> (Some (Pair (Uint64 165535) (Uint32 15)))], + [pos -> (Uint32 10)], + [value -> (ByStr 0x64fdfd00fde803fdfffffe9f860200)], + [num_hex -> (ByStr15 0x64fdfd00fde803fdfffffe9f860200)] } +Gas remaining: 4000832 diff --git a/tests/eval/good/gold/polynetwork_next_var_uint6.scilexp.gold b/tests/eval/good/gold/polynetwork_next_var_uint6.scilexp.gold new file mode 100644 index 000000000..9e3327d2a --- /dev/null +++ b/tests/eval/good/gold/polynetwork_next_var_uint6.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xfeffffffff)], + [len -> (Uint32 5)], + [full_len -> (Uint32 20)], + [value_reserialized -> (ByStr 0xfeffffffff)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [ui -> (Uint64 4294967295)], + [ui_opt -> (Some (Pair (Uint64 4294967295) (Uint32 20)))], + [pos -> (Uint32 15)], + [value -> (ByStr 0x64fdfd00fde803fdfffffe9f860200feffffffff)], + [num_hex -> (ByStr20 0x64fdfd00fde803fdfffffe9f860200feffffffff)] } +Gas remaining: 4000797 diff --git a/tests/eval/good/gold/polynetwork_next_var_uint7.scilexp.gold b/tests/eval/good/gold/polynetwork_next_var_uint7.scilexp.gold new file mode 100644 index 000000000..8a9d7bf56 --- /dev/null +++ b/tests/eval/good/gold/polynetwork_next_var_uint7.scilexp.gold @@ -0,0 +1,13 @@ +(True), +{ [value_sub -> (ByStr 0xffffe30b5403000000)], + [len -> (Uint32 9)], + [full_len -> (Uint32 29)], + [value_reserialized -> (ByStr 0xffffe30b5403000000)], + [empty -> (ByStr 0x)], + [emptyx -> (ByStr0 0x)], + [ui -> (Uint64 14294967295)], + [ui_opt -> (Some (Pair (Uint64 14294967295) (Uint32 29)))], + [pos -> (Uint32 20)], + [value -> (ByStr 0x64fdfd00fde803fdfffffe9f860200feffffffffffffe30b5403000000)], + [num_hex -> (ByStr29 0x64fdfd00fde803fdfffffe9f860200feffffffffffffe30b5403000000)] } +Gas remaining: 4000730 diff --git a/tests/eval/good/gold/ripemd160_1.scilexp.gold b/tests/eval/good/gold/ripemd160_1.scilexp.gold index 904f3c542..4c90ca48b 100644 --- a/tests/eval/good/gold/ripemd160_1.scilexp.gold +++ b/tests/eval/good/gold/ripemd160_1.scilexp.gold @@ -6,4 +6,4 @@ [v1 -> (Int32 42)], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001741 +Gas remaining: 4001223 diff --git a/tests/eval/good/gold/ripemd160_2.scilexp.gold b/tests/eval/good/gold/ripemd160_2.scilexp.gold index 1fbb2caba..7e5868155 100644 --- a/tests/eval/good/gold/ripemd160_2.scilexp.gold +++ b/tests/eval/good/gold/ripemd160_2.scilexp.gold @@ -8,4 +8,4 @@ [v1 -> (Int64 42)], [k2 -> (Int64 2)], [k1 -> (Int64 1)] } -Gas remaining: 4001737 +Gas remaining: 4001219 diff --git a/tests/eval/good/gold/ripemd160_5.scilexp.gold b/tests/eval/good/gold/ripemd160_5.scilexp.gold index 4d14fc456..201923d48 100644 --- a/tests/eval/good/gold/ripemd160_5.scilexp.gold +++ b/tests/eval/good/gold/ripemd160_5.scilexp.gold @@ -19,4 +19,4 @@ [v3 -> (Int128 43)], [v2 -> (Int64 2)], [v1 -> (Int32 1)] } -Gas remaining: 4001716 +Gas remaining: 4001198 diff --git a/tests/eval/good/gold/str-char-1.scilexp.gold b/tests/eval/good/gold/str-char-1.scilexp.gold index eb7e403a7..56833f5f9 100644 --- a/tests/eval/good/gold/str-char-1.scilexp.gold +++ b/tests/eval/good/gold/str-char-1.scilexp.gold @@ -2,4 +2,4 @@ "), { [s1 -> (String "hi ")] } -Gas remaining: 4001754 +Gas remaining: 4001236 diff --git a/tests/eval/good/gold/string1.scilexp.gold b/tests/eval/good/gold/string1.scilexp.gold index 710bdd6f9..9c85ca69b 100644 --- a/tests/eval/good/gold/string1.scilexp.gold +++ b/tests/eval/good/gold/string1.scilexp.gold @@ -6,4 +6,4 @@ [s -> (String "abc")], [k2 -> (Int32 2)], [k1 -> (Int32 1)] } -Gas remaining: 4001741 +Gas remaining: 4001223 diff --git a/tests/eval/good/gold/string2.scilexp.gold b/tests/eval/good/gold/string2.scilexp.gold index ded4f13ae..59fd83ceb 100644 --- a/tests/eval/good/gold/string2.scilexp.gold +++ b/tests/eval/good/gold/string2.scilexp.gold @@ -2,4 +2,4 @@ { [t -> (String "def ")], [s -> (String "abc ")] } -Gas remaining: 4001752 +Gas remaining: 4001234 diff --git a/tests/eval/good/gold/times_two.scilexp.gold b/tests/eval/good/gold/times_two.scilexp.gold index 5683416e3..16c7a1e5b 100644 --- a/tests/eval/good/gold/times_two.scilexp.gold +++ b/tests/eval/good/gold/times_two.scilexp.gold @@ -6,4 +6,4 @@ [two -> (Nat 2)], [one -> (Nat 1)], [zero -> (Nat 0)] } -Gas remaining: 4001645 +Gas remaining: 4001127 diff --git a/tests/eval/good/gold/to_bystr.scilexp.gold b/tests/eval/good/gold/to_bystr.scilexp.gold index 217c68e5b..e0c6f82db 100644 --- a/tests/eval/good/gold/to_bystr.scilexp.gold +++ b/tests/eval/good/gold/to_bystr.scilexp.gold @@ -4,4 +4,4 @@ [res1 -> (True)], [y -> (ByStr 0xfb19)], [x -> (ByStr2 0xfb19)] } -Gas remaining: 4001731 +Gas remaining: 4001213 diff --git a/tests/eval/good/gold/type_subst1.scilexp.gold b/tests/eval/good/gold/type_subst1.scilexp.gold index 5180733c5..f3f35ff20 100644 --- a/tests/eval/good/gold/type_subst1.scilexp.gold +++ b/tests/eval/good/gold/type_subst1.scilexp.gold @@ -1,4 +1,4 @@ , { [tf_applied -> ], [tf -> ] } -Gas remaining: 4001750 +Gas remaining: 4001232 diff --git a/tests/eval/good/gold/type_subst2.scilexp.gold b/tests/eval/good/gold/type_subst2.scilexp.gold index d20a0c4f0..5a38a26e9 100644 --- a/tests/eval/good/gold/type_subst2.scilexp.gold +++ b/tests/eval/good/gold/type_subst2.scilexp.gold @@ -1,4 +1,4 @@ (None), { [tf_applied -> (None)], [tf -> ] } -Gas remaining: 4001751 +Gas remaining: 4001233 diff --git a/tests/eval/good/gold/uint_conversions.scilexp.gold b/tests/eval/good/gold/uint_conversions.scilexp.gold index 6f51e111a..18611e691 100644 --- a/tests/eval/good/gold/uint_conversions.scilexp.gold +++ b/tests/eval/good/gold/uint_conversions.scilexp.gold @@ -22,4 +22,4 @@ [big_num -> (Uint64 999999999999999999)], [minus_one -> (Int32 -1)], [one -> (Int32 1)] } -Gas remaining: 4001455 +Gas remaining: 4000937 diff --git a/tests/runner/Polynetwork/message_1.json b/tests/runner/Polynetwork/message_1.json index 6b2982c63..b3a983881 100644 --- a/tests/runner/Polynetwork/message_1.json +++ b/tests/runner/Polynetwork/message_1.json @@ -2,6 +2,7 @@ "_tag": "initGenesisBlock", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "rawHeader", diff --git a/tests/runner/Polynetwork/message_2.json b/tests/runner/Polynetwork/message_2.json index c56e95f6c..9b540b240 100644 --- a/tests/runner/Polynetwork/message_2.json +++ b/tests/runner/Polynetwork/message_2.json @@ -2,6 +2,7 @@ "_tag": "verifyHeaderAndExecuteTx", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "proof", diff --git a/tests/runner/Polynetwork/message_25.json b/tests/runner/Polynetwork/message_25.json index 6b2982c63..b3a983881 100644 --- a/tests/runner/Polynetwork/message_25.json +++ b/tests/runner/Polynetwork/message_25.json @@ -2,6 +2,7 @@ "_tag": "initGenesisBlock", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "rawHeader", diff --git a/tests/runner/Polynetwork/message_26.json b/tests/runner/Polynetwork/message_26.json index c56e95f6c..9b540b240 100644 --- a/tests/runner/Polynetwork/message_26.json +++ b/tests/runner/Polynetwork/message_26.json @@ -2,6 +2,7 @@ "_tag": "verifyHeaderAndExecuteTx", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "proof", diff --git a/tests/runner/Polynetwork/message_27.json b/tests/runner/Polynetwork/message_27.json index 61f80e359..0c23249fe 100644 --- a/tests/runner/Polynetwork/message_27.json +++ b/tests/runner/Polynetwork/message_27.json @@ -2,6 +2,7 @@ "_tag": "changeBookKeeper", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "pubkeys", diff --git a/tests/runner/Polynetwork/message_28.json b/tests/runner/Polynetwork/message_28.json index 5da864e8d..d85d8313d 100644 --- a/tests/runner/Polynetwork/message_28.json +++ b/tests/runner/Polynetwork/message_28.json @@ -2,6 +2,7 @@ "_tag": "verifyHeaderAndExecuteTx", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "proof", diff --git a/tests/runner/Polynetwork/message_3.json b/tests/runner/Polynetwork/message_3.json index 61f80e359..0c23249fe 100644 --- a/tests/runner/Polynetwork/message_3.json +++ b/tests/runner/Polynetwork/message_3.json @@ -2,6 +2,7 @@ "_tag": "changeBookKeeper", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "pubkeys", diff --git a/tests/runner/Polynetwork/message_4.json b/tests/runner/Polynetwork/message_4.json index 5da864e8d..d85d8313d 100644 --- a/tests/runner/Polynetwork/message_4.json +++ b/tests/runner/Polynetwork/message_4.json @@ -2,6 +2,7 @@ "_tag": "verifyHeaderAndExecuteTx", "_amount": "0", "_sender" : "0x12345678901234567890123456789012345678ab", + "_origin" : "0x12345678901234567890123456789012345678ab", "params": [ { "vname" : "proof", diff --git a/tests/runner/Polynetwork/output_1.json b/tests/runner/Polynetwork/output_1.json index 4416b697d..a2445adb0 100644 --- a/tests/runner/Polynetwork/output_1.json +++ b/tests/runner/Polynetwork/output_1.json @@ -1,6 +1,6 @@ { "scilla_major_version": "0", - "gas_remaining": "2992", + "gas_remaining": "2984", "_accepted": "false", "messages": [], "states": [ diff --git a/tests/runner/Polynetwork/output_2.json b/tests/runner/Polynetwork/output_2.json index 149c7aab0..7d7a2c1ff 100644 --- a/tests/runner/Polynetwork/output_2.json +++ b/tests/runner/Polynetwork/output_2.json @@ -1,6 +1,6 @@ { "scilla_major_version": "0", - "gas_remaining": "4629", + "gas_remaining": "4621", "_accepted": "false", "messages": [ { diff --git a/tests/runner/Polynetwork/output_25.json b/tests/runner/Polynetwork/output_25.json new file mode 100644 index 000000000..9063f902f --- /dev/null +++ b/tests/runner/Polynetwork/output_25.json @@ -0,0 +1,25 @@ +{ + "gas_remaining": "7198", + "errors": [ + { + "error_message": + "Exception thrown: (Message [(_exception : (String \"Already Initialized\"))])", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 68, + "column": 5 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + }, + { + "error_message": "Raised from initGenesisBlock", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 46, + "column": 12 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + } + ], + "warnings": [] +} \ No newline at end of file diff --git a/tests/runner/Polynetwork/output_26.json b/tests/runner/Polynetwork/output_26.json new file mode 100644 index 000000000..f050ce6b7 --- /dev/null +++ b/tests/runner/Polynetwork/output_26.json @@ -0,0 +1,25 @@ +{ + "gas_remaining": "4685", + "errors": [ + { + "error_message": + "Exception thrown: (Message [(_exception : (String \"Txn already executed\"))])", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 80, + "column": 7 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + }, + { + "error_message": "Raised from verifyHeaderAndExecuteTx", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 134, + "column": 12 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + } + ], + "warnings": [] +} \ No newline at end of file diff --git a/tests/runner/Polynetwork/output_27.json b/tests/runner/Polynetwork/output_27.json new file mode 100644 index 000000000..cf502518c --- /dev/null +++ b/tests/runner/Polynetwork/output_27.json @@ -0,0 +1,25 @@ +{ + "gas_remaining": "3642", + "errors": [ + { + "error_message": + "Exception thrown: (Message [(_exception : (String \"Header height lower than cur epoch heigh / Next bookkeeper empty\"))])", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 258, + "column": 9 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + }, + { + "error_message": "Raised from changeBookKeeper", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 227, + "column": 12 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + } + ], + "warnings": [] +} \ No newline at end of file diff --git a/tests/runner/Polynetwork/output_28.json b/tests/runner/Polynetwork/output_28.json new file mode 100644 index 000000000..340dfb9a1 --- /dev/null +++ b/tests/runner/Polynetwork/output_28.json @@ -0,0 +1,25 @@ +{ + "gas_remaining": "2318", + "errors": [ + { + "error_message": + "Exception thrown: (Message [(_exception : (String \"Txn already executed\"))])", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 80, + "column": 7 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + }, + { + "error_message": "Raised from verifyHeaderAndExecuteTx", + "start_location": { + "file": "tests/contracts/Polynetwork.scilla", + "line": 134, + "column": 12 + }, + "end_location": { "file": "", "line": 0, "column": 0 } + } + ], + "warnings": [] +} \ No newline at end of file diff --git a/tests/runner/Polynetwork/output_3.json b/tests/runner/Polynetwork/output_3.json index 53ef4e779..da43ef7dc 100644 --- a/tests/runner/Polynetwork/output_3.json +++ b/tests/runner/Polynetwork/output_3.json @@ -1,6 +1,6 @@ { "scilla_major_version": "0", - "gas_remaining": "1851", + "gas_remaining": "1843", "_accepted": "false", "messages": [], "states": [ diff --git a/tests/runner/Polynetwork/output_4.json b/tests/runner/Polynetwork/output_4.json index f42d7e25a..c3cb0901e 100644 --- a/tests/runner/Polynetwork/output_4.json +++ b/tests/runner/Polynetwork/output_4.json @@ -1,6 +1,6 @@ { "scilla_major_version": "0", - "gas_remaining": "2262", + "gas_remaining": "2254", "_accepted": "false", "messages": [ { diff --git a/tests/runner/Polynetwork/state_1.json b/tests/runner/Polynetwork/state_1.json index 4a66db407..06e5afbe3 100644 --- a/tests/runner/Polynetwork/state_1.json +++ b/tests/runner/Polynetwork/state_1.json @@ -3,5 +3,30 @@ "vname": "_balance", "type": "Uint128", "value": "0" + }, + { + "vname": "f_curKeepers", + "type": "List (ByStr20)", + "value": [] + }, + { + "vname": "f_curStartHeight", + "type": "Uint32", + "value": "0" + }, + { + "vname": "f_zilToPolyTxHashMap", + "type": "Map (Uint256) (ByStr32)", + "value": [] + }, + { + "vname": "f_zilToPolyTxHashIndex", + "type": "Uint256", + "value": "0" + }, + { + "vname": "f_fromChainTxExist", + "type": "Map (Uint64) (Map (ByStr32) (Polynetwork.Unit))", + "value": [] } ] From cc3dcb24cafbb10a3086caa219c1efc159046de1 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Sun, 20 Dec 2020 15:19:18 +0530 Subject: [PATCH 31/33] Fix bugs in tests in creating div by zero error --- tests/eval/good/polynetwork_extract_bystr1.scilexp | 2 +- tests/eval/good/polynetwork_extract_bystr2.scilexp | 2 +- tests/eval/good/polynetwork_extract_bystr3.scilexp | 2 +- tests/eval/good/polynetwork_next_var_uint1.scilexp | 2 +- tests/eval/good/polynetwork_next_var_uint2.scilexp | 2 +- tests/eval/good/polynetwork_next_var_uint3.scilexp | 2 +- tests/eval/good/polynetwork_next_var_uint4.scilexp | 2 +- tests/eval/good/polynetwork_next_var_uint5.scilexp | 2 +- tests/eval/good/polynetwork_next_var_uint6.scilexp | 2 +- tests/eval/good/polynetwork_next_var_uint7.scilexp | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/eval/good/polynetwork_extract_bystr1.scilexp b/tests/eval/good/polynetwork_extract_bystr1.scilexp index 26abb249b..bd7d29eba 100644 --- a/tests/eval/good/polynetwork_extract_bystr1.scilexp +++ b/tests/eval/good/polynetwork_extract_bystr1.scilexp @@ -17,6 +17,6 @@ match bs_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_extract_bystr2.scilexp b/tests/eval/good/polynetwork_extract_bystr2.scilexp index 4de000d3a..e427869c7 100644 --- a/tests/eval/good/polynetwork_extract_bystr2.scilexp +++ b/tests/eval/good/polynetwork_extract_bystr2.scilexp @@ -17,6 +17,6 @@ match bs_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_extract_bystr3.scilexp b/tests/eval/good/polynetwork_extract_bystr3.scilexp index 64c3123ef..ba9fd3d03 100644 --- a/tests/eval/good/polynetwork_extract_bystr3.scilexp +++ b/tests/eval/good/polynetwork_extract_bystr3.scilexp @@ -17,6 +17,6 @@ match bs_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_next_var_uint1.scilexp b/tests/eval/good/polynetwork_next_var_uint1.scilexp index b408a2fd1..7e7bbd694 100644 --- a/tests/eval/good/polynetwork_next_var_uint1.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint1.scilexp @@ -14,6 +14,6 @@ match ui_opt with builtin eq value value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_next_var_uint2.scilexp b/tests/eval/good/polynetwork_next_var_uint2.scilexp index f7e01986f..dee6f35b7 100644 --- a/tests/eval/good/polynetwork_next_var_uint2.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint2.scilexp @@ -17,6 +17,6 @@ match ui_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_next_var_uint3.scilexp b/tests/eval/good/polynetwork_next_var_uint3.scilexp index 5e7c46f4f..cd931a937 100644 --- a/tests/eval/good/polynetwork_next_var_uint3.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint3.scilexp @@ -17,6 +17,6 @@ match ui_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_next_var_uint4.scilexp b/tests/eval/good/polynetwork_next_var_uint4.scilexp index 9b11d1f4a..c2b949708 100644 --- a/tests/eval/good/polynetwork_next_var_uint4.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint4.scilexp @@ -17,6 +17,6 @@ match ui_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_next_var_uint5.scilexp b/tests/eval/good/polynetwork_next_var_uint5.scilexp index ba39ee50f..eeeeb2572 100644 --- a/tests/eval/good/polynetwork_next_var_uint5.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint5.scilexp @@ -17,6 +17,6 @@ match ui_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_next_var_uint6.scilexp b/tests/eval/good/polynetwork_next_var_uint6.scilexp index 1b6558644..1c34de064 100644 --- a/tests/eval/good/polynetwork_next_var_uint6.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint6.scilexp @@ -17,6 +17,6 @@ match ui_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end diff --git a/tests/eval/good/polynetwork_next_var_uint7.scilexp b/tests/eval/good/polynetwork_next_var_uint7.scilexp index 1ea21efe5..f4d9ad743 100644 --- a/tests/eval/good/polynetwork_next_var_uint7.scilexp +++ b/tests/eval/good/polynetwork_next_var_uint7.scilexp @@ -17,6 +17,6 @@ match ui_opt with builtin eq value_sub value_reserialized | None => (* division by zero to create an error *) - let dummy = builtin div pos pos in + let dummy = builtin div zero_uint32 zero_uint32 in False end From bd6231738eabb8a039b64e5b48879435fc698586 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Tue, 5 Jan 2021 20:17:17 +0530 Subject: [PATCH 32/33] Rename osubstr to substr_safe based on review comment --- src/stdlib/Conversions.scillib | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stdlib/Conversions.scillib b/src/stdlib/Conversions.scillib index 01302431e..06b358652 100644 --- a/src/stdlib/Conversions.scillib +++ b/src/stdlib/Conversions.scillib @@ -26,7 +26,7 @@ type IntegerEncoding = | BigEndian (* does not throw exceptions *) -let osubstr : ByStr -> Uint32 -> Uint32 -> Option ByStr = +let substr_safe : ByStr -> Uint32 -> Uint32 -> Option ByStr = fun (bs : ByStr) => fun (pos : Uint32) => fun (len : Uint32) => @@ -55,7 +55,7 @@ let extract_scillaval : forall 'A. forall 'B. (ByStr -> Option 'B) -> ('B -> 'A) fun (bs : ByStr) => fun (pos : Uint32) => fun (len : Uint32) => (* Byte size of the Uint value. *) - let subbs_opt = osubstr bs pos len in + let subbs_opt = substr_safe bs pos len in match subbs_opt with | Some subbs => let subbs_x_opt = to_bystrx subbs in From 5f46817fb73c527df05b89cffe52566e43fdd2d5 Mon Sep 17 00:00:00 2001 From: Vaivaswatha Nagaraj Date: Thu, 7 Jan 2021 14:29:45 +0530 Subject: [PATCH 33/33] Add a reference for ecrecover --- src/stdlib/Polynetwork.scillib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stdlib/Polynetwork.scillib b/src/stdlib/Polynetwork.scillib index afd8efb0d..7821e6c3c 100644 --- a/src/stdlib/Polynetwork.scillib +++ b/src/stdlib/Polynetwork.scillib @@ -524,6 +524,7 @@ let verifyPubkey : List Pubkey -> Pair ByStr20 (List ByStr20) = getBookKeeper m pubKeys (* Mimics ethereum's recovery of address from message and a signature. *) +(* https://ethereum.stackexchange.com/questions/13778/get-public-key-of-any-ethereum-account *) let ecrecover : ByStr -> ByStr64 -> Uint32 -> ByStr20 = fun (msg : ByStr) => fun (sig : ByStr64) => @@ -544,7 +545,6 @@ let ecrecover : ByStr -> ByStr64 -> Uint32 -> ByStr20 = sommer addr_opt exnobj (* See EthCrossChainUtils.sol:verifySig *) - let verifySig : ByStr -> List Signature -> List ByStr20 -> Uint32 -> Bool = fun (rawHeader : ByStr) => fun (siglist : List Signature) =>