From 95839d06236bb346e1eca883f7b9193fccd9a30f Mon Sep 17 00:00:00 2001 From: Jacob Johannsen Date: Fri, 21 May 2021 22:54:33 +0200 Subject: [PATCH 1/2] Don't fail when outgoing message amounts sum to more than current balance --- src/eval/Eval.ml | 17 +++++++-------- .../good/gold/multiple-msgs.scilla.gold | 5 ++++- tests/contracts/multiple-msgs.scilla | 8 +++++++ tests/runner/Testcontracts.ml | 2 +- tests/runner/multiple-msgs/blockchain_2.json | 1 + tests/runner/multiple-msgs/blockchain_3.json | 1 + tests/runner/multiple-msgs/message_2.json | 7 +++++++ tests/runner/multiple-msgs/message_3.json | 7 +++++++ tests/runner/multiple-msgs/output_2.json | 21 +++++++++++++++++++ tests/runner/multiple-msgs/output_3.json | 21 +++++++++++++++++++ tests/runner/multiple-msgs/state_2.json | 5 +++++ tests/runner/multiple-msgs/state_3.json | 5 +++++ 12 files changed, 88 insertions(+), 12 deletions(-) create mode 100644 tests/runner/multiple-msgs/blockchain_2.json create mode 100644 tests/runner/multiple-msgs/blockchain_3.json create mode 100644 tests/runner/multiple-msgs/message_2.json create mode 100644 tests/runner/multiple-msgs/message_3.json create mode 100644 tests/runner/multiple-msgs/output_2.json create mode 100644 tests/runner/multiple-msgs/output_3.json create mode 100644 tests/runner/multiple-msgs/state_2.json create mode 100644 tests/runner/multiple-msgs/state_3.json diff --git a/src/eval/Eval.ml b/src/eval/Eval.ml index 6d55519b1..2ffc9164b 100644 --- a/src/eval/Eval.ml +++ b/src/eval/Eval.ml @@ -900,16 +900,13 @@ let post_process_msgs cstate outs = List.fold_left amounts ~init:zero ~f:(fun z a -> add z a) in let open ContractState in - if compare cstate.balance to_be_transferred < 0 then - fail0 - @@ sprintf - "The balance is too low (%s) to transfer all the funds in the \ - messages (%s)" - (to_string cstate.balance) - (to_string to_be_transferred) - else - let balance = sub cstate.balance to_be_transferred in - pure { cstate with balance } + let balance = + if compare cstate.balance to_be_transferred < 0 then + Uint128.zero + else + sub cstate.balance to_be_transferred + in + pure { cstate with balance } (* Handle message: diff --git a/tests/checker/good/gold/multiple-msgs.scilla.gold b/tests/checker/good/gold/multiple-msgs.scilla.gold index 224d3fa4e..c87eb8eb8 100644 --- a/tests/checker/good/gold/multiple-msgs.scilla.gold +++ b/tests/checker/good/gold/multiple-msgs.scilla.gold @@ -5,7 +5,10 @@ "vname": "HelloWorld", "params": [], "fields": [], - "transitions": [ { "vname": "multipleMsgs", "params": [] } ], + "transitions": [ + { "vname": "multipleMsgs", "params": [] }, + { "vname": "multipleAmountMsgs", "params": [] } + ], "procedures": [], "events": [], "ADTs": [ diff --git a/tests/contracts/multiple-msgs.scilla b/tests/contracts/multiple-msgs.scilla index 95af77e01..fd2ece911 100644 --- a/tests/contracts/multiple-msgs.scilla +++ b/tests/contracts/multiple-msgs.scilla @@ -29,3 +29,11 @@ transition multipleMsgs() msgs2 = Cons {Message} msg2 msgs1; send msgs2 end + +transition multipleAmountMsgs() + msg1 = {_tag : ""; _recipient : _sender; _amount : Uint128 100}; + msg2 = {_tag : ""; _recipient : _sender; _amount : Uint128 100}; + msgs1 = one_msg msg1; + msgs2 = Cons {Message} msg2 msgs1; + send msgs2 +end \ No newline at end of file diff --git a/tests/runner/Testcontracts.ml b/tests/runner/Testcontracts.ml index 4bf0fa6c9..c1612a225 100644 --- a/tests/runner/Testcontracts.ml +++ b/tests/runner/Testcontracts.ml @@ -412,7 +412,7 @@ let contract_tests env = >::: build_contract_tests env "map_corners_test" succ_code 51 53 []; "multiple_msgs_test" - >::: build_contract_tests env "multiple-msgs" succ_code 1 1 []; + >::: build_contract_tests env "multiple-msgs" succ_code 1 3 []; "listiter" >::: build_contract_tests env "listiter" succ_code 1 1 []; "polynetwork" diff --git a/tests/runner/multiple-msgs/blockchain_2.json b/tests/runner/multiple-msgs/blockchain_2.json new file mode 100644 index 000000000..d962cce79 --- /dev/null +++ b/tests/runner/multiple-msgs/blockchain_2.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] diff --git a/tests/runner/multiple-msgs/blockchain_3.json b/tests/runner/multiple-msgs/blockchain_3.json new file mode 100644 index 000000000..d962cce79 --- /dev/null +++ b/tests/runner/multiple-msgs/blockchain_3.json @@ -0,0 +1 @@ +[ { "vname": "BLOCKNUMBER", "type": "BNum", "value": "100" } ] diff --git a/tests/runner/multiple-msgs/message_2.json b/tests/runner/multiple-msgs/message_2.json new file mode 100644 index 000000000..6269b7b36 --- /dev/null +++ b/tests/runner/multiple-msgs/message_2.json @@ -0,0 +1,7 @@ +{ + "_tag": "multipleAmountMsgs", + "_amount": "0", + "_sender": "0x1234567890123456789012345678906784567890", + "params": [], + "_origin": "0x1234567890123456789012345678906784567890" +} diff --git a/tests/runner/multiple-msgs/message_3.json b/tests/runner/multiple-msgs/message_3.json new file mode 100644 index 000000000..6269b7b36 --- /dev/null +++ b/tests/runner/multiple-msgs/message_3.json @@ -0,0 +1,7 @@ +{ + "_tag": "multipleAmountMsgs", + "_amount": "0", + "_sender": "0x1234567890123456789012345678906784567890", + "params": [], + "_origin": "0x1234567890123456789012345678906784567890" +} diff --git a/tests/runner/multiple-msgs/output_2.json b/tests/runner/multiple-msgs/output_2.json new file mode 100644 index 000000000..2a6726c3c --- /dev/null +++ b/tests/runner/multiple-msgs/output_2.json @@ -0,0 +1,21 @@ +{ + "scilla_major_version": "0", + "gas_remaining": "7938", + "_accepted": "false", + "messages": [ + { + "_tag": "", + "_amount": "100", + "_recipient": "0x1234567890123456789012345678906784567890", + "params": [] + }, + { + "_tag": "", + "_amount": "100", + "_recipient": "0x1234567890123456789012345678906784567890", + "params": [] + } + ], + "states": [ { "vname": "_balance", "type": "Uint128", "value": "0" } ], + "events": [] +} \ No newline at end of file diff --git a/tests/runner/multiple-msgs/output_3.json b/tests/runner/multiple-msgs/output_3.json new file mode 100644 index 000000000..701524ddc --- /dev/null +++ b/tests/runner/multiple-msgs/output_3.json @@ -0,0 +1,21 @@ +{ + "scilla_major_version": "0", + "gas_remaining": "7938", + "_accepted": "false", + "messages": [ + { + "_tag": "", + "_amount": "100", + "_recipient": "0x1234567890123456789012345678906784567890", + "params": [] + }, + { + "_tag": "", + "_amount": "100", + "_recipient": "0x1234567890123456789012345678906784567890", + "params": [] + } + ], + "states": [ { "vname": "_balance", "type": "Uint128", "value": "50" } ], + "events": [] +} \ No newline at end of file diff --git a/tests/runner/multiple-msgs/state_2.json b/tests/runner/multiple-msgs/state_2.json new file mode 100644 index 000000000..65477b09a --- /dev/null +++ b/tests/runner/multiple-msgs/state_2.json @@ -0,0 +1,5 @@ +[ + { "vname": "_balance", + "type": "Uint128", + "value": "150" } +] diff --git a/tests/runner/multiple-msgs/state_3.json b/tests/runner/multiple-msgs/state_3.json new file mode 100644 index 000000000..60e05ac52 --- /dev/null +++ b/tests/runner/multiple-msgs/state_3.json @@ -0,0 +1,5 @@ +[ + { "vname": "_balance", + "type": "Uint128", + "value": "250" } +] From b707a02dab775b933779f9733f45096fb2780d08 Mon Sep 17 00:00:00 2001 From: Jacob Johannsen Date: Sat, 22 May 2021 01:31:09 +0200 Subject: [PATCH 2/2] fmt --- src/eval/Eval.ml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/eval/Eval.ml b/src/eval/Eval.ml index 2ffc9164b..49743d1a9 100644 --- a/src/eval/Eval.ml +++ b/src/eval/Eval.ml @@ -901,10 +901,8 @@ let post_process_msgs cstate outs = in let open ContractState in let balance = - if compare cstate.balance to_be_transferred < 0 then - Uint128.zero - else - sub cstate.balance to_be_transferred + if compare cstate.balance to_be_transferred < 0 then Uint128.zero + else sub cstate.balance to_be_transferred in pure { cstate with balance }