Zilliqa / scilla

Scilla - A Smart Contract Intermediate Level Language
https://scilla-lang.org
GNU General Public License v3.0
240 stars 78 forks source link

Cashflow problem between 2 contracts #1200

Closed maxhiker closed 1 year ago

maxhiker commented 1 year ago

Is it normal behavior? Tested on isolated server 0.8.2.rc2

Actors: user: account with enough balance contract Operator, balance zero contract Treasury, balance unlimited

Flow: Operator borrow some amount from Treasury, accept it, then return it back.

user: (Operator.TestCashFlow-->{ Treasury.MoneyAsked( howmany: x )-->*.AddFunds( _amount: x ); Treasury.AddFunds( _amount: x ) })

Error: The balance is too low to transfer all the funds in the messages: balance = 0, amount to transfer = 2

Operator contract:

scilla_version 0

library Operator

let one_msg = fun (msg : Message) => let nil_msg = Nil {Message} in Cons {Message} msg nil_msg

let zero128 = Uint128 0 let two128 = Uint128 2

contract Operator ( init_treasury_addr: ByStr20 )

field treasury_addr: ByStr20 = init_treasury_addr

transition TestCashFlow() var_treasury_addr <- treasury_addr;

( borrow from treasury ) msg = { _tag : "SendMoney"; _recipient: var_treasury_addr; _amount: zero128; amount: two128 }; msgs = one_msg msg; send msgs;

( return to treasury ) msg = { _tag : "AddFunds"; _recipient: var_treasury_addr; _amount: two128 }; msgs = one_msg msg; send msgs

end

transition AddFunds() accept end

Treasury contract:

scilla_version 0

library Treasury

let one_msg = fun (msg : Message) => let nil_msg = Nil {Message} in Cons {Message} msg nil_msg

contract Treasury ( )

transition MoneyAsked(amount: Uint128) msg = { _tag : "AddFunds"; _recipient: _sender; _amount: amount }; msgs = one_msg msg; send msgs end

transition AddFunds() accept end