Jelajahi Sumber

Do not permit value transfers in CPI

Ethereum offers a native way of doing balance transfers along with
external calls. This is not possible with Solana. Solang always the
value be specified in the instruction data but this is entirely
forgable.

Remove this.

Signed-off-by: Sean Young <sean@mess.org>
Sean Young 3 tahun lalu
induk
melakukan
144584ebdf
41 mengubah file dengan 624 tambahan dan 926 penghapusan
  1. 20 1
      docs/targets/solana.rst
  2. 0 6
      integration/solana/balances.sol
  3. 21 8
      integration/solana/balances.spec.ts
  4. 92 71
      src/emit/mod.rs
  5. 4 18
      src/emit/solana.rs
  6. 8 0
      src/sema/builtin.rs
  7. 32 16
      src/sema/expression.rs
  8. TEMPAT SAMPAH
      stdlib/bpf/solana.bc
  9. 0 60
      stdlib/solana.c
  10. 28 34
      tests/contract_testcases/solana/address_member_call.dot
  11. 40 46
      tests/contract_testcases/solana/call/call_args_three_ways.dot
  12. 5 3
      tests/contract_testcases/solana/doccomments_everywhere.dot
  13. 3 8
      tests/solana.rs
  14. 8 8
      tests/solana_tests/abi.rs
  15. 15 16
      tests/solana_tests/accessor.rs
  16. 7 7
      tests/solana_tests/account_info.rs
  17. 54 74
      tests/solana_tests/arrays.rs
  18. 18 148
      tests/solana_tests/balance.rs
  19. 5 6
      tests/solana_tests/builtin.rs
  20. 21 38
      tests/solana_tests/call.rs
  21. 4 4
      tests/solana_tests/constant.rs
  22. 6 7
      tests/solana_tests/create_contract.rs
  23. 9 9
      tests/solana_tests/destructure.rs
  24. 4 4
      tests/solana_tests/events.rs
  25. 13 18
      tests/solana_tests/expressions.rs
  26. 9 12
      tests/solana_tests/hash.rs
  27. 44 67
      tests/solana_tests/mappings.rs
  28. 1 7
      tests/solana_tests/math.rs
  29. 3 3
      tests/solana_tests/modifiers.rs
  30. 19 53
      tests/solana_tests/primitives.rs
  31. 16 17
      tests/solana_tests/rational.rs
  32. 21 21
      tests/solana_tests/returns.rs
  33. 1 4
      tests/solana_tests/signature_verify.rs
  34. 18 21
      tests/solana_tests/simple.rs
  35. 45 69
      tests/solana_tests/storage.rs
  36. 5 5
      tests/solana_tests/unused_variable_elimination.rs
  37. 4 4
      tests/solana_tests/using.rs
  38. 2 2
      tests/solana_tests/vector_to_slice.rs
  39. 8 20
      tests/solana_tests/yul.rs
  40. 7 7
      vscode/src/test/suite/extension.test.ts
  41. 4 4
      vscode/src/testFixture/hover1.sol

+ 20 - 1
docs/targets/solana.rst

@@ -10,7 +10,7 @@ Solana has the following differences to Ethereum Solidity:
 - There is no ``ecrecover()`` builtin function, but there is a ``signatureVerify()`` function which can check ed25519
   signatures.
 - Solana has no concept of gas, so there is no gas functions
-- Solana balance is stored in a ``uint64``, so ``msg.value``, *address* ``.balance``, ``.transfer()`` and ``.send()``
+- Solana balance is stored in a ``uint64``, so *address* ``.balance``, ``.transfer()`` and ``.send()``
   all use uint64 rather than `uint256`.
 
 This is how to build your Solidity for Solana:
@@ -73,6 +73,25 @@ package has `documentation <https://solana-labs.github.io/solana-solidity.js/>`_
 are `some examples <https://solana-labs.github.io/solana-solidity.js/>`_. There is also
 `solang's integration tests <https://github.com/hyperledger-labs/solang/tree/main/integration/solana>`_.
 
+.. _value_transfer:
+
+Transfering native value with a function call
+_____________________________________________
+
+The Solidity langauge on Ethereum allows value transfers with an external call
+or constructor, using the ``auction.bid{value: 501}()`` syntax.
+Solana Cross Program Invocation (CPI) does not support this. This means that:
+
+ - Specifying `value:`` on an external call or constructor is not permitted
+ - The `payable` keyword has no effect
+ - `msg.value` is not supported
+
+.. note::
+
+    Hypothetically, the caller could transfer native balance and then inform the
+    callee about the amount transferred by specifying this in the instruction data.
+    However, it would be trivial to forge such an operation.
+
 Receive function
 ________________
 

+ 0 - 6
integration/solana/balances.sol

@@ -10,10 +10,4 @@ contract balances {
 	function send(address payable addr, uint64 amount) public returns (bool) {
 		return addr.send(amount);
 	}
-
-	function pay_me() public payable {
-		uint64 v = msg.value;
-
-		print("Thank you very much for {}".format(v));
-	}
 }

+ 21 - 8
integration/solana/balances.spec.ts

@@ -1,12 +1,13 @@
 import expect from 'expect';
 import { publicKeyToHex } from '@solana/solidity';
+import * as web3 from '@solana/web3.js';
 import { loadContract } from './setup';
 
 describe('Deploy solang contract and test', function () {
     this.timeout(500000);
 
     it('balances', async function () {
-        let { contract, connection, payer } = await loadContract('balances', 'balances.abi');
+        let { contract, connection, payer, storage } = await loadContract('balances', 'balances.abi');
 
         let res = await contract.functions.get_balance(publicKeyToHex(payer.publicKey), {
             accounts: [payer.publicKey],
@@ -18,14 +19,26 @@ describe('Deploy solang contract and test', function () {
 
         expect(bal + 5000).toBe(rpc_bal);
 
-        // @solana/solidity needs a fix for this
-        // res = await token.functions.pay_me({
-        //     value: 1000,
-        //     writableAccounts: [payerAccount.publicKey],
-        // });
+        // we wish to test the `.send()` function, so first top up the storage balance
+        let before_bal = await connection.getBalance(storage.publicKey);
 
-        // expect(res.log).toContain('Thank you very much for 1000');
+        /// transfer some lamports to the storage account
+        var transaction = new web3.Transaction().add(
+            web3.SystemProgram.transfer({
+                fromPubkey: payer.publicKey,
+                toPubkey: storage.publicKey,
+                lamports: 1500,
+            }),
+        );
 
-        // expect(await connection.getBalance(token.storageAccount)).toBe(1000);
+        // Sign transaction, broadcast, and confirm
+        await web3.sendAndConfirmTransaction(connection, transaction, [payer]);
+
+        await contract.functions.send(publicKeyToHex(payer.publicKey), 500, {
+            writableAccounts: [payer.publicKey],
+            //  signers: [storage],
+        });
+
+        expect(await connection.getBalance(storage.publicKey)).toBe(before_bal + 1000);
     });
 });

+ 92 - 71
src/emit/mod.rs

@@ -339,41 +339,43 @@ pub trait TargetRuntime<'a> {
 
     /// If we receive a value transfer, and we are "payable", abort with revert
     fn abort_if_value_transfer(&self, binary: &Binary, function: FunctionValue, ns: &Namespace) {
-        let value = self.value_transferred(binary, ns);
+        if ns.target != Target::Solana {
+            let value = self.value_transferred(binary, ns);
 
-        let got_value = binary.builder.build_int_compare(
-            IntPredicate::NE,
-            value,
-            binary.value_type(ns).const_zero(),
-            "is_value_transfer",
-        );
+            let got_value = binary.builder.build_int_compare(
+                IntPredicate::NE,
+                value,
+                binary.value_type(ns).const_zero(),
+                "is_value_transfer",
+            );
 
-        let not_value_transfer = binary
-            .context
-            .append_basic_block(function, "not_value_transfer");
-        let abort_value_transfer = binary
-            .context
-            .append_basic_block(function, "abort_value_transfer");
-
-        binary.builder.build_conditional_branch(
-            got_value,
-            abort_value_transfer,
-            not_value_transfer,
-        );
+            let not_value_transfer = binary
+                .context
+                .append_basic_block(function, "not_value_transfer");
+            let abort_value_transfer = binary
+                .context
+                .append_basic_block(function, "abort_value_transfer");
 
-        binary.builder.position_at_end(abort_value_transfer);
+            binary.builder.build_conditional_branch(
+                got_value,
+                abort_value_transfer,
+                not_value_transfer,
+            );
 
-        self.assert_failure(
-            binary,
-            binary
-                .context
-                .i8_type()
-                .ptr_type(AddressSpace::Generic)
-                .const_null(),
-            binary.context.i32_type().const_zero(),
-        );
+            binary.builder.position_at_end(abort_value_transfer);
 
-        binary.builder.position_at_end(not_value_transfer);
+            self.assert_failure(
+                binary,
+                binary
+                    .context
+                    .i8_type()
+                    .ptr_type(AddressSpace::Generic)
+                    .const_null(),
+                binary.context.i32_type().const_zero(),
+            );
+
+            binary.builder.position_at_end(not_value_transfer);
+        }
     }
 
     /// Recursively load a type from bin storage
@@ -4485,60 +4487,79 @@ pub trait TargetRuntime<'a> {
             return;
         }
 
-        let got_value = if bin.function_abort_value_transfers {
-            bin.context.bool_type().const_zero()
+        if ns.target == Target::Solana {
+            match fallback {
+                Some((cfg_no, _)) => {
+                    let args = if ns.target == Target::Solana {
+                        vec![function.get_last_param().unwrap().into()]
+                    } else {
+                        vec![]
+                    };
+
+                    bin.builder.build_call(functions[&cfg_no], &args, "");
+
+                    self.return_empty_abi(bin);
+                }
+                None => {
+                    self.return_code(bin, bin.context.i32_type().const_int(2, false));
+                }
+            }
         } else {
-            let value = self.value_transferred(bin, ns);
+            let got_value = if bin.function_abort_value_transfers {
+                bin.context.bool_type().const_zero()
+            } else {
+                let value = self.value_transferred(bin, ns);
 
-            bin.builder.build_int_compare(
-                IntPredicate::NE,
-                value,
-                bin.value_type(ns).const_zero(),
-                "is_value_transfer",
-            )
-        };
+                bin.builder.build_int_compare(
+                    IntPredicate::NE,
+                    value,
+                    bin.value_type(ns).const_zero(),
+                    "is_value_transfer",
+                )
+            };
 
-        let fallback_block = bin.context.append_basic_block(function, "fallback");
-        let receive_block = bin.context.append_basic_block(function, "receive");
+            let fallback_block = bin.context.append_basic_block(function, "fallback");
+            let receive_block = bin.context.append_basic_block(function, "receive");
 
-        bin.builder
-            .build_conditional_branch(got_value, receive_block, fallback_block);
+            bin.builder
+                .build_conditional_branch(got_value, receive_block, fallback_block);
 
-        bin.builder.position_at_end(fallback_block);
+            bin.builder.position_at_end(fallback_block);
 
-        match fallback {
-            Some((cfg_no, _)) => {
-                let args = if ns.target == Target::Solana {
-                    vec![function.get_last_param().unwrap().into()]
-                } else {
-                    vec![]
-                };
+            match fallback {
+                Some((cfg_no, _)) => {
+                    let args = if ns.target == Target::Solana {
+                        vec![function.get_last_param().unwrap().into()]
+                    } else {
+                        vec![]
+                    };
 
-                bin.builder.build_call(functions[&cfg_no], &args, "");
+                    bin.builder.build_call(functions[&cfg_no], &args, "");
 
-                self.return_empty_abi(bin);
-            }
-            None => {
-                self.return_code(bin, bin.context.i32_type().const_int(2, false));
+                    self.return_empty_abi(bin);
+                }
+                None => {
+                    self.return_code(bin, bin.context.i32_type().const_int(2, false));
+                }
             }
-        }
 
-        bin.builder.position_at_end(receive_block);
+            bin.builder.position_at_end(receive_block);
 
-        match receive {
-            Some((cfg_no, _)) => {
-                let args = if ns.target == Target::Solana {
-                    vec![function.get_last_param().unwrap().into()]
-                } else {
-                    vec![]
-                };
+            match receive {
+                Some((cfg_no, _)) => {
+                    let args = if ns.target == Target::Solana {
+                        vec![function.get_last_param().unwrap().into()]
+                    } else {
+                        vec![]
+                    };
 
-                bin.builder.build_call(functions[&cfg_no], &args, "");
+                    bin.builder.build_call(functions[&cfg_no], &args, "");
 
-                self.return_empty_abi(bin);
-            }
-            None => {
-                self.return_code(bin, bin.context.i32_type().const_int(2, false));
+                    self.return_empty_abi(bin);
+                }
+                None => {
+                    self.return_code(bin, bin.context.i32_type().const_int(2, false));
+                }
             }
         }
     }

+ 4 - 18
src/emit/solana.rs

@@ -525,7 +525,7 @@ impl SolanaTarget {
                 dispatch_function,
                 &contract.functions,
                 None,
-                |func| func.nonpayable,
+                |_| false,
             );
 
             let function_block = binary
@@ -3314,20 +3314,9 @@ impl<'a> TargetRuntime<'a> for SolanaTarget {
         binary.builder.build_return(Some(&ret));
     }
 
-    /// Value received
-    fn value_transferred<'b>(&self, binary: &Binary<'b>, _ns: &ast::Namespace) -> IntValue<'b> {
-        let parameters = self.sol_parameters(binary);
-
-        binary
-            .builder
-            .build_load(
-                binary
-                    .builder
-                    .build_struct_gep(parameters, 14, "value")
-                    .unwrap(),
-                "value",
-            )
-            .into_int_value()
+    /// Value received is not available on solana
+    fn value_transferred<'b>(&self, _binary: &Binary<'b>, _ns: &ast::Namespace) -> IntValue<'b> {
+        unreachable!();
     }
 
     /// Send value to address
@@ -3551,9 +3540,6 @@ impl<'a> TargetRuntime<'a> for SolanaTarget {
 
                 binary.builder.build_load(sender_address, "sender_address")
             }
-            codegen::Expression::Builtin(_, _, codegen::Builtin::Value, _) => {
-                self.value_transferred(binary, ns).into()
-            }
             codegen::Expression::Builtin(_, _, codegen::Builtin::GetAddress, _) => {
                 let parameters = self.sol_parameters(binary);
 

+ 8 - 0
src/sema/builtin.rs

@@ -829,6 +829,14 @@ pub fn builtin_var(
                     ),
                 ));
             }
+            if ns.target == Target::Solana && p.builtin == Builtin::Value {
+                diagnostics.push(Diagnostic::error(
+                    *loc,
+                    String::from(
+                        "Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer",
+                    ),
+                ));
+            }
             return Some((p.builtin, p.ret[0].clone()));
         }
     }

+ 32 - 16
src/sema/expression.rs

@@ -7020,24 +7020,40 @@ fn parse_call_args(
     for arg in args.values() {
         match arg.name.name.as_str() {
             "value" => {
-                let ty = Type::Value;
+                if ns.target == Target::Solana {
+                    diagnostics.push(Diagnostic::error(
+                        arg.loc,
+                "Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer".to_string(),
+                    ));
 
-                let expr = expression(
-                    &arg.expr,
-                    context,
-                    ns,
-                    symtable,
-                    diagnostics,
-                    ResolveTo::Type(&ty),
-                )?;
+                    expression(
+                        &arg.expr,
+                        context,
+                        ns,
+                        symtable,
+                        diagnostics,
+                        ResolveTo::Unknown,
+                    )?;
+                } else {
+                    let ty = Type::Value;
 
-                res.value = Some(Box::new(expr.cast(
-                    &arg.expr.loc(),
-                    &ty,
-                    true,
-                    ns,
-                    diagnostics,
-                )?));
+                    let expr = expression(
+                        &arg.expr,
+                        context,
+                        ns,
+                        symtable,
+                        diagnostics,
+                        ResolveTo::Type(&ty),
+                    )?;
+
+                    res.value = Some(Box::new(expr.cast(
+                        &arg.expr.loc(),
+                        &ty,
+                        true,
+                        ns,
+                        diagnostics,
+                    )?));
+                }
             }
             "gas" => {
                 if ns.target == Target::Solana {

TEMPAT SAMPAH
stdlib/bpf/solana.bc


+ 0 - 60
stdlib/solana.c

@@ -15,8 +15,6 @@ static const SolPubkey instructions_address = {0x06, 0xa7, 0xd5, 0x17, 0x18, 0x7
 // The address 'Ed25519SigVerify111111111111111111111111111' base58 decoded
 static const SolPubkey ed25519_address = {0x03, 0x7d, 0x46, 0xd6, 0x7c, 0x93, 0xfb, 0xbe, 0x12, 0xf9, 0x42, 0x8f, 0x83, 0x8d, 0x40, 0xff, 0x05, 0x70, 0x74, 0x49, 0x27, 0xf4, 0x8a, 0x64, 0xfc, 0xca, 0x70, 0x44, 0x80, 0x00, 0x00, 0x00};
 
-static void sol_pay(SolParameters *params);
-
 uint64_t
 entrypoint(const uint8_t *input)
 {
@@ -57,8 +55,6 @@ entrypoint(const uint8_t *input)
         return ERROR_INVALID_INSTRUCTION_DATA;
     }
 
-    sol_pay(&params);
-
     return solang_dispatch(&params);
 }
 
@@ -250,62 +246,6 @@ uint64_t *sol_account_lamport(
     return NULL;
 }
 
-static void sol_pay(SolParameters *params)
-{
-    SolAccountInfo *sender = NULL, *to = NULL;
-
-    if (params->value)
-    {
-        for (int i = 0; i < params->ka_num; i++)
-        {
-            if (!sender)
-            {
-                if (SolPubkey_same(params->sender, params->ka[i].key))
-                {
-                    sender = &params->ka[i];
-                }
-            }
-            if (!to)
-            {
-                if (SolPubkey_same(params->account_id, params->ka[i].key))
-                {
-                    to = &params->ka[i];
-                }
-            }
-            if (sender && to)
-            {
-                break;
-            }
-        }
-
-        if (!sender)
-        {
-            sol_log_pubkey(params->sender);
-            sol_log("sender account missing from transaction");
-            sol_panic();
-        }
-
-        if (!to)
-        {
-            sol_log_pubkey(params->account_id);
-            sol_log("contract account missing from transaction");
-            sol_panic();
-        }
-
-        if (__builtin_sub_overflow(*sender->lamports, params->value, sender->lamports))
-        {
-            sol_log("sender does not have enough balance");
-            sol_panic();
-        }
-
-        if (__builtin_add_overflow(*to->lamports, params->value, to->lamports))
-        {
-            sol_log("recipient lamports overflows");
-            sol_panic();
-        }
-    }
-}
-
 void sol_transfer(uint8_t *to_address, uint64_t lamports, SolParameters *params)
 {
     uint64_t *from = params->ka[params->ka_cur].lamports;

+ 28 - 34
tests/contract_testcases/solana/address_member_call.dot

@@ -63,25 +63,22 @@ strict digraph "tests/contract_testcases/solana/address_member_call.sol" {
 	variable_64 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:40-41"]
 	alloc_array_65 [label="alloc array bytes\ninitializer: \ntests/contract_testcases/solana/address_member_call.sol:33:68-70"]
 	number_literal_66 [label="uint32 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:33:68-70"]
-	cast_67 [label="cast uint64\ntests/contract_testcases/solana/address_member_call.sol:33:55-66"]
-	load_68 [label="load uint64\ntests/contract_testcases/solana/address_member_call.sol:33:55-66"]
-	subscript_69 [label="subscript uint64[]\ntests/contract_testcases/solana/address_member_call.sol:33:55-66"]
-	variable_70 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:33:55-63"]
-	variable_71 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:64-65"]
-	expr_72 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:34:13-46"]
-	builtins_73 [label="builtin Require\ntests/contract_testcases/solana/address_member_call.sol:34:13-20"]
-	variable_74 [label="variable: sent\nbool\ntests/contract_testcases/solana/address_member_call.sol:34:21-25"]
-	alloc_array_75 [label="alloc array string\ninitializer: 5472616e73666572206661696c65642e\ntests/contract_testcases/solana/address_member_call.sol:34:27-45"]
-	number_literal_76 [label="uint32 literal: 16\ntests/contract_testcases/solana/address_member_call.sol:34:27-45"]
+	expr_67 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:34:13-46"]
+	builtins_68 [label="builtin Require\ntests/contract_testcases/solana/address_member_call.sol:34:13-20"]
+	variable_69 [label="variable: sent\nbool\ntests/contract_testcases/solana/address_member_call.sol:34:21-25"]
+	alloc_array_70 [label="alloc array string\ninitializer: 5472616e73666572206661696c65642e\ntests/contract_testcases/solana/address_member_call.sol:34:27-45"]
+	number_literal_71 [label="uint32 literal: 16\ntests/contract_testcases/solana/address_member_call.sol:34:27-45"]
 	emit [label="emit\nevent MyContract.Receipt\ntests/contract_testcases/solana/address_member_call.sol:37:9-43:10"]
-	cast_78 [label="cast address\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
-	builtins_79 [label="builtin Sender\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
-	number_literal_80 [label="address literal: 0\ntests/contract_testcases/solana/address_member_call.sol:39:13-54"]
-	variable_81 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:40:13-23"]
-	variable_82 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:41:13-21"]
-	variable_83 [label="variable: _payment\nstring\ntests/contract_testcases/solana/address_member_call.sol:42:13-21"]
+	cast_73 [label="cast address\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
+	builtins_74 [label="builtin Sender\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
+	number_literal_75 [label="address literal: 0\ntests/contract_testcases/solana/address_member_call.sol:39:13-54"]
+	variable_76 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:40:13-23"]
+	variable_77 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:41:13-21"]
+	variable_78 [label="variable: _payment\nstring\ntests/contract_testcases/solana/address_member_call.sol:42:13-21"]
 	diagnostic [label="pragma 'solidity' is ignored\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:1:32-2:24"]
-	diagnostic_86 [label="found contract 'MyContract'\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:3:1-45:2"]
+	diagnostic_81 [label="found contract 'MyContract'\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:3:1-45:2"]
+	diagnostic_82 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/address_member_call.sol:28:22-31"]
+	diagnostic_83 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/address_member_call.sol:33:48-66"]
 	events -> Receipt
 	contracts -> contract
 	contract -> send [label="function"]
@@ -146,23 +143,20 @@ strict digraph "tests/contract_testcases/solana/address_member_call.sol" {
 	subscript_62 -> variable_64 [label="index"]
 	call_external_function -> alloc_array_65 [label="args"]
 	alloc_array_65 -> number_literal_66 [label="length"]
-	call_external_function -> cast_67 [label="value"]
-	cast_67 -> load_68 [label="expr"]
-	load_68 -> subscript_69 [label="expr"]
-	subscript_69 -> variable_70 [label="array"]
-	subscript_69 -> variable_71 [label="index"]
-	destructure -> expr_72 [label="next"]
-	expr_72 -> builtins_73 [label="expr"]
-	builtins_73 -> variable_74 [label="arg #0"]
-	builtins_73 -> alloc_array_75 [label="arg #1"]
-	alloc_array_75 -> number_literal_76 [label="length"]
+	destructure -> expr_67 [label="next"]
+	expr_67 -> builtins_68 [label="expr"]
+	builtins_68 -> variable_69 [label="arg #0"]
+	builtins_68 -> alloc_array_70 [label="arg #1"]
+	alloc_array_70 -> number_literal_71 [label="length"]
 	for_46 -> emit [label="next"]
-	emit -> cast_78 [label="arg #0"]
-	cast_78 -> builtins_79 [label="expr"]
-	emit -> number_literal_80 [label="arg #1"]
-	emit -> variable_81 [label="arg #2"]
-	emit -> variable_82 [label="arg #3"]
-	emit -> variable_83 [label="arg #4"]
+	emit -> cast_73 [label="arg #0"]
+	cast_73 -> builtins_74 [label="expr"]
+	emit -> number_literal_75 [label="arg #1"]
+	emit -> variable_76 [label="arg #2"]
+	emit -> variable_77 [label="arg #3"]
+	emit -> variable_78 [label="arg #4"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_86 [label="Debug"]
+	diagnostics -> diagnostic_81 [label="Debug"]
+	diagnostics -> diagnostic_82 [label="Error"]
+	diagnostics -> diagnostic_83 [label="Error"]
 }

+ 40 - 46
tests/contract_testcases/solana/call/call_args_three_ways.dot

@@ -3,72 +3,66 @@ strict digraph "tests/contract_testcases/solana/call/call_args_three_ways.sol" {
 	f [label="function f\ncontract: C\ntests/contract_testcases/solana/call/call_args_three_ways.sol:2:2-21\nsignature f()\nvisibility public\nmutability nonpayable"]
 	var_decl [label="variable decl contract D d\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:3-28"]
 	constructor [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:9-28"]
-	number_literal [label="uint64 literal: 1\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:23-24"]
-	var_decl_7 [label="variable decl contract D dd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:3-29"]
-	constructor_8 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:10-27"]
-	number_literal_9 [label="uint64 literal: 1\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:25-26"]
-	var_decl_10 [label="variable decl contract D ddd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:3-28"]
-	constructor_11 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:11-28"]
-	number_literal_12 [label="uint64 literal: 1\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:24-25"]
+	var_decl_6 [label="variable decl contract D dd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:3-29"]
+	constructor_7 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:10-27"]
+	var_decl_8 [label="variable decl contract D ddd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:3-28"]
+	constructor_9 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:11-28"]
 	g [label="function g\ncontract: C\ntests/contract_testcases/solana/call/call_args_three_ways.sol:8:2-24\nsignature g(bytes32)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\ncontract D d"]
 	expr [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-21"]
 	call_external_function [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-21"]
 	external_function [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-21"]
 	variable [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-4"]
-	number_literal_19 [label="uint64 literal: 1\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:17-18"]
-	expr_20 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
-	call_external_function_21 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
-	external_function_22 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
-	variable_23 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:4-5"]
-	number_literal_24 [label="uint64 literal: 1\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:19-20"]
-	expr_25 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
-	call_external_function_26 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
-	external_function_27 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
-	variable_28 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:4-5"]
-	number_literal_29 [label="uint64 literal: 1\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:18-19"]
-	contract_30 [label="contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
-	node_31 [label="constructor \ncontract: D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:17:2-23\nsignature ()\nvisibility public\nmutability payable"]
+	expr_16 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
+	call_external_function_17 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
+	external_function_18 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
+	variable_19 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:4-5"]
+	expr_20 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
+	call_external_function_21 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
+	external_function_22 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
+	variable_23 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:4-5"]
+	contract_24 [label="contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
+	node_25 [label="constructor \ncontract: D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:17:2-23\nsignature ()\nvisibility public\nmutability payable"]
 	func [label="function func\ncontract: D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:18:2-32\nsignature func()\nvisibility public\nmutability payable"]
 	diagnostic [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/call/call_args_three_ways.sol:1:1-14:2"]
-	diagnostic_35 [label="local variable 'd' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:5-6"]
-	diagnostic_36 [label="local variable 'dd' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:5-7"]
-	diagnostic_37 [label="local variable 'ddd' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:5-8"]
-	diagnostic_38 [label="found contract 'D'\nlevel Debug\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
+	diagnostic_29 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:16-24"]
+	diagnostic_30 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:18-26"]
+	diagnostic_31 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:17-25"]
+	diagnostic_32 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:10-18"]
+	diagnostic_33 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:12-20"]
+	diagnostic_34 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:11-19"]
+	diagnostic_35 [label="found contract 'D'\nlevel Debug\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
 	contracts -> contract
 	contract -> f [label="function"]
 	f -> var_decl [label="body"]
 	var_decl -> constructor [label="init"]
-	constructor -> number_literal [label="value"]
-	var_decl -> var_decl_7 [label="next"]
-	var_decl_7 -> constructor_8 [label="init"]
-	constructor_8 -> number_literal_9 [label="value"]
-	var_decl_7 -> var_decl_10 [label="next"]
-	var_decl_10 -> constructor_11 [label="init"]
-	constructor_11 -> number_literal_12 [label="value"]
+	var_decl -> var_decl_6 [label="next"]
+	var_decl_6 -> constructor_7 [label="init"]
+	var_decl_6 -> var_decl_8 [label="next"]
+	var_decl_8 -> constructor_9 [label="init"]
 	contract -> g [label="function"]
 	g -> parameters [label="parameters"]
 	g -> expr [label="body"]
 	expr -> call_external_function [label="expr"]
 	call_external_function -> external_function [label="function"]
 	external_function -> variable [label="address"]
-	call_external_function -> number_literal_19 [label="value"]
-	expr -> expr_20 [label="next"]
+	expr -> expr_16 [label="next"]
+	expr_16 -> call_external_function_17 [label="expr"]
+	call_external_function_17 -> external_function_18 [label="function"]
+	external_function_18 -> variable_19 [label="address"]
+	expr_16 -> expr_20 [label="next"]
 	expr_20 -> call_external_function_21 [label="expr"]
 	call_external_function_21 -> external_function_22 [label="function"]
 	external_function_22 -> variable_23 [label="address"]
-	call_external_function_21 -> number_literal_24 [label="value"]
-	expr_20 -> expr_25 [label="next"]
-	expr_25 -> call_external_function_26 [label="expr"]
-	call_external_function_26 -> external_function_27 [label="function"]
-	external_function_27 -> variable_28 [label="address"]
-	call_external_function_26 -> number_literal_29 [label="value"]
-	contracts -> contract_30
-	contract_30 -> node_31 [label="constructor"]
-	contract_30 -> func [label="function"]
+	contracts -> contract_24
+	contract_24 -> node_25 [label="constructor"]
+	contract_24 -> func [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_35 [label="Warning"]
-	diagnostics -> diagnostic_36 [label="Warning"]
-	diagnostics -> diagnostic_37 [label="Warning"]
-	diagnostics -> diagnostic_38 [label="Debug"]
+	diagnostics -> diagnostic_29 [label="Error"]
+	diagnostics -> diagnostic_30 [label="Error"]
+	diagnostics -> diagnostic_31 [label="Error"]
+	diagnostics -> diagnostic_32 [label="Error"]
+	diagnostics -> diagnostic_33 [label="Error"]
+	diagnostics -> diagnostic_34 [label="Error"]
+	diagnostics -> diagnostic_35 [label="Debug"]
 }

+ 5 - 3
tests/contract_testcases/solana/doccomments_everywhere.dot

@@ -131,9 +131,10 @@ strict digraph "tests/contract_testcases/solana/doccomments_everywhere.sol" {
 	diagnostic_133 [label="'Counters' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:7:3-11"]
 	diagnostic_134 [label="'ERC1155' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:17:17-24"]
 	diagnostic_135 [label="target solana does not support receive() functions, see https://solang.readthedocs.io/en/latest/language/functions.html#fallback-and-receive-function\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:19:3-29"]
-	diagnostic_136 [label="'_tokenIds' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:28:29-38"]
-	diagnostic_137 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:53:7-50"]
-	diagnostic_138 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:86:7-38"]
+	diagnostic_136 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:59-68"]
+	diagnostic_137 [label="'_tokenIds' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:28:29-38"]
+	diagnostic_138 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:53:7-50"]
+	diagnostic_139 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:86:7-38"]
 	events -> MintProperty
 	contracts -> contract
 	contract -> tags [label="tags"]
@@ -269,4 +270,5 @@ strict digraph "tests/contract_testcases/solana/doccomments_everywhere.sol" {
 	diagnostics -> diagnostic_136 [label="Error"]
 	diagnostics -> diagnostic_137 [label="Error"]
 	diagnostics -> diagnostic_138 [label="Error"]
+	diagnostics -> diagnostic_139 [label="Error"]
 }

+ 3 - 8
tests/solana.rs

@@ -1344,12 +1344,12 @@ impl VirtualMachine {
         res
     }
 
-    fn constructor(&mut self, name: &str, args: &[Token], value: u64) {
+    fn constructor(&mut self, name: &str, args: &[Token]) {
         let program = &self.stack[0];
 
         println!("constructor for {}", hex::encode(&program.data));
 
-        let mut calldata = VirtualMachine::input(&program.data, &self.origin, value, name, &[]);
+        let mut calldata = VirtualMachine::input(&program.data, &self.origin, name, &[]);
 
         if let Some(constructor) = &program.abi.as_ref().unwrap().constructor {
             calldata.extend(&constructor.encode_input(vec![], args).unwrap());
@@ -1365,7 +1365,6 @@ impl VirtualMachine {
         name: &str,
         args: &[Token],
         seeds: &[&(Account, Vec<u8>)],
-        value: u64,
         sender: Option<&Account>,
     ) -> Vec<Token> {
         let program = &self.stack[0];
@@ -1379,7 +1378,6 @@ impl VirtualMachine {
             } else {
                 &self.origin
             },
-            value,
             name,
             seeds,
         );
@@ -1414,7 +1412,6 @@ impl VirtualMachine {
         name: &str,
         args: &[Token],
         seeds: &[&(Account, Vec<u8>)],
-        value: u64,
         sender: Option<&Account>,
     ) -> Result<u64, EbpfError<UserError>> {
         let program = &self.stack[0];
@@ -1428,7 +1425,6 @@ impl VirtualMachine {
             } else {
                 &self.origin
             },
-            value,
             name,
             seeds,
         );
@@ -1448,13 +1444,12 @@ impl VirtualMachine {
     fn input(
         recv: &Account,
         sender: &Account,
-        value: u64,
         name: &str,
         seeds: &[&(Account, Vec<u8>)],
     ) -> Vec<u8> {
         let mut calldata: Vec<u8> = recv.to_vec();
         calldata.extend_from_slice(sender);
-        calldata.extend_from_slice(&value.to_le_bytes());
+        calldata.extend_from_slice(&0u64.to_le_bytes());
 
         let mut hasher = Keccak::v256();
         let mut hash = [0u8; 32];

+ 8 - 8
tests/solana_tests/abi.rs

@@ -35,11 +35,11 @@ fn packed() {
         }"#,
     );
 
-    vm.constructor("bar", &[], 0);
+    vm.constructor("bar", &[]);
 
-    vm.function("test", &[], &[], 0, None);
-    vm.function("test2", &[], &[], 0, None);
-    vm.function("test3", &[], &[], 0, None);
+    vm.function("test", &[], &[], None);
+    vm.function("test2", &[], &[], None);
+    vm.function("test3", &[], &[], None);
 }
 
 #[test]
@@ -54,9 +54,9 @@ fn inherited() {
         }"#,
     );
 
-    vm.constructor("bar", &[], 0);
+    vm.constructor("bar", &[]);
 
-    vm.function("test", &[], &[], 0, None);
+    vm.function("test", &[], &[], None);
 
     let mut vm = build_solidity(
         r#"
@@ -67,7 +67,7 @@ fn inherited() {
             }"#,
     );
 
-    vm.constructor("bar", &[], 0);
+    vm.constructor("bar", &[]);
 
-    vm.function("test", &[], &[], 0, None);
+    vm.function("test", &[], &[], None);
 }

+ 15 - 16
tests/solana_tests/accessor.rs

@@ -10,9 +10,9 @@ fn types() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f1", &[], &[], 0, None);
+    let returns = vm.function("f1", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(102))]);
 
@@ -23,9 +23,9 @@ fn types() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f1", &[Token::Uint(U256::from(2))], &[], 0, None);
+    let returns = vm.function("f1", &[Token::Uint(U256::from(2))], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(5))]);
 
@@ -43,13 +43,12 @@ fn types() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "f1",
         &[Token::Uint(U256::from(1)), Token::Uint(U256::from(2))],
         &[],
-        0,
         None,
     );
 
@@ -67,9 +66,9 @@ fn types() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f1", &[Token::Int(U256::from(4000))], &[], 0, None);
+    let returns = vm.function("f1", &[Token::Int(U256::from(4000))], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(2))]);
 }
@@ -88,9 +87,9 @@ fn interfaces() {
         "#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f1", &[], &[], 0, None);
+    let returns = vm.function("f1", &[], &[], None);
 
     assert_eq!(returns, vec![Token::FixedBytes(b"ab".to_vec())]);
 }
@@ -104,9 +103,9 @@ fn constant() {
         }"#,
     );
 
-    vm.constructor("x", &[], 0);
+    vm.constructor("x", &[]);
 
-    let returns = vm.function("z", &[], &[], 0, None);
+    let returns = vm.function("z", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -123,9 +122,9 @@ fn constant() {
         }"#,
     );
 
-    vm.constructor("x", &[], 0);
+    vm.constructor("x", &[]);
 
-    let returns = vm.function("z", &[], &[], 0, None);
+    let returns = vm.function("z", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -142,9 +141,9 @@ fn constant() {
         }"#,
     );
 
-    vm.constructor("x", &[], 0);
+    vm.constructor("x", &[]);
 
-    let returns = vm.function("z", &[], &[], 0, None);
+    let returns = vm.function("z", &[], &[], None);
 
     assert_eq!(
         returns,

+ 7 - 7
tests/solana_tests/account_info.rs

@@ -25,11 +25,11 @@ fn lamports() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     vm.account_data.get_mut(&vm.origin).unwrap().lamports = 17672630920854456917u64;
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns[0], Token::Uint(U256::from(17672630920854456917u64)));
 }
@@ -54,9 +54,9 @@ fn owner() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     let owner = vm.stack[0].program.to_vec();
 
@@ -95,10 +95,10 @@ fn data() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     for i in 0..10 {
-        let returns = vm.function("test", &[Token::Uint(U256::from(i))], &[], 0, None);
+        let returns = vm.function("test", &[Token::Uint(U256::from(i))], &[], None);
 
         let this = &vm.stack[0].data;
 
@@ -107,7 +107,7 @@ fn data() {
         assert_eq!(returns[0], Token::Uint(U256::from(val)));
     }
 
-    let returns = vm.function("test2", &[], &[], 0, None);
+    let returns = vm.function("test2", &[], &[], None);
 
     let this = &vm.stack[0].data;
 

+ 54 - 74
tests/solana_tests/arrays.rs

@@ -17,9 +17,9 @@ fn fixed_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -51,9 +51,9 @@ fn fixed_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -96,9 +96,9 @@ fn fixed_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -127,7 +127,6 @@ fn fixed_array() {
             Token::Bool(true),
         ])],
         &[],
-        0,
         None,
     );
 
@@ -162,7 +161,7 @@ fn dynamic_array_fixed_elements() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "get",
@@ -177,14 +176,13 @@ fn dynamic_array_fixed_elements() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
     assert_eq!(returns, vec![Token::Uint(U256::from(26))]);
 
     // test that the abi encoder can handle fixed arrays
-    let returns = vm.function("set", &[], &[], 0, None);
+    let returns = vm.function("set", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -232,7 +230,7 @@ fn fixed_array_dynamic_elements() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "get",
@@ -247,13 +245,12 @@ fn fixed_array_dynamic_elements() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
     assert_eq!(returns, vec![Token::Uint(U256::from(127))]);
 
-    let returns = vm.function("set", &[], &[], 0, None);
+    let returns = vm.function("set", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -302,7 +299,7 @@ fn dynamic_array_dynamic_elements() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "get",
@@ -317,13 +314,12 @@ fn dynamic_array_dynamic_elements() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
     assert_eq!(returns, vec![Token::Uint(U256::from(127))]);
 
-    let returns = vm.function("set", &[], &[], 0, None);
+    let returns = vm.function("set", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -369,13 +365,12 @@ fn fixed_array_fixed_elements_storage() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "set_elem",
         &[Token::Uint(U256::from(2)), Token::Int(U256::from(12123123))],
         &[],
-        0,
         None,
     );
 
@@ -386,15 +381,14 @@ fn fixed_array_fixed_elements_storage() {
             Token::Int(U256::from(123456789)),
         ],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get_elem", &[Token::Uint(U256::from(2))], &[], 0, None);
+    let returns = vm.function("get_elem", &[Token::Uint(U256::from(2))], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(12123123)),],);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -415,11 +409,10 @@ fn fixed_array_fixed_elements_storage() {
             Token::Int(U256::from(4)),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -431,9 +424,9 @@ fn fixed_array_fixed_elements_storage() {
         ]),],
     );
 
-    vm.function("del", &[], &[], 0, None);
+    vm.function("del", &[], &[], None);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -475,7 +468,7 @@ fn fixed_array_dynamic_elements_storage() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "set_elem",
@@ -484,7 +477,6 @@ fn fixed_array_dynamic_elements_storage() {
             Token::String(String::from("abcd")),
         ],
         &[],
-        0,
         None,
     );
 
@@ -497,15 +489,14 @@ fn fixed_array_dynamic_elements_storage() {
             )),
         ],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get_elem", &[Token::Uint(U256::from(2))], &[], 0, None);
+    let returns = vm.function("get_elem", &[Token::Uint(U256::from(2))], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from("abcd"))]);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -528,11 +519,10 @@ fn fixed_array_dynamic_elements_storage() {
             Token::String(String::from("d")),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -544,9 +534,9 @@ fn fixed_array_dynamic_elements_storage() {
         ]),],
     );
 
-    vm.function("del", &[], &[], 0, None);
+    vm.function("del", &[], &[], None);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -600,37 +590,31 @@ fn storage_simple_dynamic_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("len", &[], &[], 0, None);
+    let returns = vm.function("len", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(0))]);
 
-    vm.function("push", &[Token::Int(U256::from(102))], &[], 0, None);
+    vm.function("push", &[Token::Int(U256::from(102))], &[], None);
 
-    vm.function("push_zero", &[], &[], 0, None);
+    vm.function("push_zero", &[], &[], None);
 
-    vm.function(
-        "push",
-        &[Token::Int(U256::from(12345678901u64))],
-        &[],
-        0,
-        None,
-    );
+    vm.function("push", &[Token::Int(U256::from(12345678901u64))], &[], None);
 
-    let returns = vm.function("subscript", &[Token::Uint(U256::from(0))], &[], 0, None);
+    let returns = vm.function("subscript", &[Token::Uint(U256::from(0))], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(102))]);
 
-    let returns = vm.function("subscript", &[Token::Uint(U256::from(1))], &[], 0, None);
+    let returns = vm.function("subscript", &[Token::Uint(U256::from(1))], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(0))]);
 
-    let returns = vm.function("subscript", &[Token::Uint(U256::from(2))], &[], 0, None);
+    let returns = vm.function("subscript", &[Token::Uint(U256::from(2))], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(12345678901u64))]);
 
-    let returns = vm.function("copy", &[], &[], 0, None);
+    let returns = vm.function("copy", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -641,11 +625,11 @@ fn storage_simple_dynamic_array() {
         ])],
     );
 
-    let returns = vm.function("pop", &[], &[], 0, None);
+    let returns = vm.function("pop", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(12345678901u64))]);
 
-    let returns = vm.function("len", &[], &[], 0, None);
+    let returns = vm.function("len", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(2))]);
 
@@ -661,11 +645,10 @@ fn storage_simple_dynamic_array() {
             Token::Int(U256::from(7)),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("copy", &[], &[], 0, None);
+    let returns = vm.function("copy", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -680,9 +663,9 @@ fn storage_simple_dynamic_array() {
         ])],
     );
 
-    vm.function("rm", &[], &[], 0, None);
+    vm.function("rm", &[], &[], None);
 
-    let returns = vm.function("len", &[], &[], 0, None);
+    let returns = vm.function("len", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(0))]);
 }
@@ -701,9 +684,9 @@ fn storage_pop_running_on_empty() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    vm.function("pop", &[], &[], 0, None);
+    vm.function("pop", &[], &[], None);
 }
 
 #[test]
@@ -758,9 +741,9 @@ fn storage_dynamic_array_of_structs() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("len", &[], &[], 0, None);
+    let returns = vm.function("len", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(0))]);
 
@@ -771,11 +754,10 @@ fn storage_dynamic_array_of_structs() {
             Token::Bool(true),
         ])],
         &[],
-        0,
         None,
     );
 
-    vm.function("push_empty", &[], &[], 0, None);
+    vm.function("push_empty", &[], &[], None);
 
     vm.function(
         "push2",
@@ -784,11 +766,10 @@ fn storage_dynamic_array_of_structs() {
             Token::Bool(true),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("subscript", &[Token::Uint(U256::from(0))], &[], 0, None);
+    let returns = vm.function("subscript", &[Token::Uint(U256::from(0))], &[], None);
 
     assert_eq!(
         returns,
@@ -798,7 +779,7 @@ fn storage_dynamic_array_of_structs() {
         ])]
     );
 
-    let returns = vm.function("subscript", &[Token::Uint(U256::from(1))], &[], 0, None);
+    let returns = vm.function("subscript", &[Token::Uint(U256::from(1))], &[], None);
 
     assert_eq!(
         returns,
@@ -808,7 +789,7 @@ fn storage_dynamic_array_of_structs() {
         ])]
     );
 
-    let returns = vm.function("subscript", &[Token::Uint(U256::from(2))], &[], 0, None);
+    let returns = vm.function("subscript", &[Token::Uint(U256::from(2))], &[], None);
 
     assert_eq!(
         returns,
@@ -818,7 +799,7 @@ fn storage_dynamic_array_of_structs() {
         ])]
     );
 
-    let returns = vm.function("copy", &[], &[], 0, None);
+    let returns = vm.function("copy", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -835,7 +816,7 @@ fn storage_dynamic_array_of_structs() {
         ])]
     );
 
-    let returns = vm.function("pop", &[], &[], 0, None);
+    let returns = vm.function("pop", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -845,7 +826,7 @@ fn storage_dynamic_array_of_structs() {
         ])]
     );
 
-    let returns = vm.function("len", &[], &[], 0, None);
+    let returns = vm.function("len", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(2))]);
 
@@ -860,11 +841,10 @@ fn storage_dynamic_array_of_structs() {
             Token::Tuple(vec![Token::Uint(U256::from(6)), Token::Bool(true)]),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("copy", &[], &[], 0, None);
+    let returns = vm.function("copy", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -878,9 +858,9 @@ fn storage_dynamic_array_of_structs() {
         ])]
     );
 
-    vm.function("rm", &[], &[], 0, None);
+    vm.function("rm", &[], &[], None);
 
-    let returns = vm.function("len", &[], &[], 0, None);
+    let returns = vm.function("len", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(0))]);
 }
@@ -899,9 +879,9 @@ fn array_literal() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("list", &[], &[], 0, None);
+    let returns = vm.function("list", &[], &[], None);
 
     assert_eq!(
         returns,

+ 18 - 148
tests/solana_tests/balance.rs

@@ -1,91 +1,6 @@
 use crate::{account_new, build_solidity, AccountState};
 use ethabi::{ethereum_types::U256, Function, StateMutability, Token};
 
-#[test]
-fn msg_value() {
-    let mut vm = build_solidity(
-        r#"
-        contract c {
-            function test() public payable returns (uint64) {
-                return msg.value * 3;
-            }
-        }"#,
-    );
-
-    vm.constructor("c", &[], 0);
-
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
-
-    let returns = vm.function("test", &[], &[], 102, None);
-
-    assert_eq!(returns[0], Token::Uint(U256::from(306)));
-
-    assert_eq!(vm.account_data[&vm.origin].lamports, 312 - 102);
-    assert_eq!(vm.account_data[&vm.stack[0].data].lamports, 102);
-}
-
-#[test]
-fn msg_value_not_enough() {
-    let mut vm = build_solidity(
-        r#"
-        contract c {
-            function test() public payable {}
-        }"#,
-    );
-
-    vm.constructor("c", &[], 0);
-
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 5;
-
-    let res = vm.function_must_fail("test", &[], &[], 102, None);
-    assert!(res.is_err());
-}
-
-#[test]
-#[should_panic]
-fn default_constructor_not_payable() {
-    let mut vm = build_solidity(r#"contract c {}"#);
-
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 2;
-
-    vm.constructor("c", &[], 1);
-}
-
-#[test]
-#[should_panic]
-fn constructor_not_payable() {
-    let mut vm = build_solidity(
-        r#"
-        contract c {
-            constructor () {}
-        }
-    "#,
-    );
-
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 2;
-
-    vm.constructor("c", &[], 1);
-}
-
-#[test]
-fn function_not_payable() {
-    let mut vm = build_solidity(
-        r#"
-        contract c {
-            function test() public {}
-        }
-    "#,
-    );
-
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 200;
-
-    vm.constructor("c", &[], 0);
-
-    let res = vm.function_must_fail("test", &[], &[], 102, None);
-
-    assert_eq!(res.ok(), Some(4294967296));
-}
-
 #[test]
 fn get_balance() {
     let mut vm = build_solidity(
@@ -97,7 +12,7 @@ fn get_balance() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -110,7 +25,7 @@ fn get_balance() {
         },
     );
 
-    let returns = vm.function("test", &[], &[], 0, Some(&new));
+    let returns = vm.function("test", &[], &[], Some(&new));
 
     assert_eq!(returns, vec![Token::Uint(U256::from(102))]);
 }
@@ -126,7 +41,7 @@ fn send_fails() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -146,7 +61,6 @@ fn send_fails() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -166,9 +80,9 @@ fn send_succeeds() {
         }"#,
     );
 
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
+    vm.account_data.get_mut(&vm.stack[0].data).unwrap().lamports = 103;
 
-    vm.constructor("c", &[], 103);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -188,17 +102,11 @@ fn send_succeeds() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
     assert_eq!(returns, vec![Token::Bool(true)]);
 
-    assert_eq!(
-        vm.account_data.get_mut(&vm.origin).unwrap().lamports,
-        312 - 103
-    );
-
     assert_eq!(vm.account_data.get_mut(&new).unwrap().lamports, 107);
 
     assert_eq!(
@@ -212,17 +120,15 @@ fn send_overflows() {
     let mut vm = build_solidity(
         r#"
         contract c {
-            constructor() payable {}
-
             function send(address payable addr, uint64 amount) public returns (bool) {
                 return addr.send(amount);
             }
         }"#,
     );
 
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
+    vm.account_data.get_mut(&vm.stack[0].data).unwrap().lamports = 103;
 
-    vm.constructor("c", &[], 103);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -242,17 +148,11 @@ fn send_overflows() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
     assert_eq!(returns, vec![Token::Bool(false)]);
 
-    assert_eq!(
-        vm.account_data.get_mut(&vm.origin).unwrap().lamports,
-        312 - 103
-    );
-
     assert_eq!(
         vm.account_data.get_mut(&new).unwrap().lamports,
         u64::MAX - 101
@@ -269,17 +169,15 @@ fn transfer_succeeds() {
     let mut vm = build_solidity(
         r#"
         contract c {
-            constructor() payable {}
-
             function transfer(address payable addr, uint64 amount) public {
                 addr.transfer(amount);
             }
         }"#,
     );
 
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
+    vm.account_data.get_mut(&vm.stack[0].data).unwrap().lamports = 103;
 
-    vm.constructor("c", &[], 103);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -299,15 +197,9 @@ fn transfer_succeeds() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
-    assert_eq!(
-        vm.account_data.get_mut(&vm.origin).unwrap().lamports,
-        312 - 103
-    );
-
     assert_eq!(vm.account_data.get_mut(&new).unwrap().lamports, 107);
 
     assert_eq!(
@@ -321,17 +213,15 @@ fn transfer_fails_not_enough() {
     let mut vm = build_solidity(
         r#"
         contract c {
-            constructor() payable {}
-
             function transfer(address payable addr, uint64 amount) public {
                 addr.transfer(amount);
             }
         }"#,
     );
 
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
+    vm.account_data.get_mut(&vm.stack[0].data).unwrap().lamports = 103;
 
-    vm.constructor("c", &[], 103);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -351,7 +241,6 @@ fn transfer_fails_not_enough() {
             Token::Uint(U256::from(104)),
         ],
         &[],
-        0,
         None,
     );
     assert!(res.is_err());
@@ -370,9 +259,9 @@ fn transfer_fails_overflow() {
         }"#,
     );
 
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
+    vm.account_data.get_mut(&vm.stack[0].data).unwrap().lamports = 103;
 
-    vm.constructor("c", &[], 103);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -392,30 +281,25 @@ fn transfer_fails_overflow() {
             Token::Uint(U256::from(104)),
         ],
         &[],
-        0,
         None,
     );
     assert!(res.is_err());
 }
 
 #[test]
-fn receive() {
+fn fallback() {
     let mut vm = build_solidity(
         r#"
         contract c {
             fallback() external {
                 print("fallback");
             }
-
-            receive() external payable {
-                print("receive");
-            }
         }"#,
     );
 
     vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     if let Some(abi) = &vm.stack[0].abi {
         let mut abi = abi.clone();
@@ -435,15 +319,9 @@ fn receive() {
         vm.stack[0].abi = Some(abi);
     }
 
-    vm.function("extinct", &[], &[], 0, None);
+    vm.function("extinct", &[], &[], None);
 
     assert_eq!(vm.logs, "fallback");
-
-    vm.logs.truncate(0);
-
-    vm.function("extinct", &[], &[], 10, None);
-
-    assert_eq!(vm.logs, "receive");
 }
 
 #[test]
@@ -459,9 +337,9 @@ fn value_overflows() {
         }"#,
     );
 
-    vm.account_data.get_mut(&vm.origin).unwrap().lamports = 312;
+    vm.account_data.get_mut(&vm.stack[0].data).unwrap().lamports = 103;
 
-    vm.constructor("c", &[], 103);
+    vm.constructor("c", &[]);
 
     let new = account_new();
 
@@ -481,7 +359,6 @@ fn value_overflows() {
             Token::Uint(U256::from(u64::MAX as u128 + 1)),
         ],
         &[],
-        0,
         None,
     );
     assert_eq!(res.ok(), Some(4294967296));
@@ -493,7 +370,6 @@ fn value_overflows() {
             Token::Uint(U256::from(u128::MAX)),
         ],
         &[],
-        0,
         None,
     );
     assert_eq!(res.ok(), Some(4294967296));
@@ -505,17 +381,11 @@ fn value_overflows() {
             Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
     assert_eq!(returns, vec![Token::Bool(false)]);
 
-    assert_eq!(
-        vm.account_data.get_mut(&vm.origin).unwrap().lamports,
-        312 - 103
-    );
-
     assert_eq!(
         vm.account_data.get_mut(&new).unwrap().lamports,
         u64::MAX - 101

+ 5 - 6
tests/solana_tests/builtin.rs

@@ -24,17 +24,17 @@ fn builtins() {
         }"#,
     );
 
-    vm.constructor("timestamp", &[], 0);
+    vm.constructor("timestamp", &[]);
 
-    let returns = vm.function("mr_now", &[], &[], 0, None);
+    let returns = vm.function("mr_now", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(1620656423))]);
 
-    let returns = vm.function("mr_slot", &[], &[], 0, None);
+    let returns = vm.function("mr_slot", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(70818331))]);
 
-    let returns = vm.function("mr_blocknumber", &[], &[], 0, None);
+    let returns = vm.function("mr_blocknumber", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(70818331))]);
 
@@ -42,7 +42,6 @@ fn builtins() {
         "msg_data",
         &[Token::Uint(U256::from(0xdeadcafeu32))],
         &[],
-        0,
         None,
     );
 
@@ -58,7 +57,7 @@ fn builtins() {
         )]
     );
 
-    let returns = vm.function("sig", &[], &[], 0, None);
+    let returns = vm.function("sig", &[], &[], None);
 
     if let Token::FixedBytes(v) = &returns[0] {
         println!("{}", hex::encode(v));

+ 21 - 38
tests/solana_tests/call.rs

@@ -23,15 +23,9 @@ fn simple_external_call() {
         }"#,
     );
 
-    vm.constructor("bar1", &[], 0);
+    vm.constructor("bar1", &[]);
 
-    vm.function(
-        "test_bar",
-        &[Token::String(String::from("yo"))],
-        &[],
-        0,
-        None,
-    );
+    vm.function("test_bar", &[Token::String(String::from("yo"))], &[], None);
 
     assert_eq!(vm.logs, "bar1 says: yo");
 
@@ -41,13 +35,12 @@ fn simple_external_call() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
     vm.function(
         "test_bar",
         &[Token::String(String::from("uncle beau"))],
         &[],
-        0,
         None,
     );
 
@@ -59,7 +52,6 @@ fn simple_external_call() {
         "test_other",
         &[Token::FixedBytes(bar1_account.to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -83,9 +75,9 @@ fn external_call_with_returns() {
         }"#,
     );
 
-    vm.constructor("bar1", &[], 0);
+    vm.constructor("bar1", &[]);
 
-    let res = vm.function("test_bar", &[Token::Int(U256::from(21))], &[], 0, None);
+    let res = vm.function("test_bar", &[Token::Int(U256::from(21))], &[], None);
 
     assert_eq!(res, vec![Token::Int(U256::from(24))]);
 
@@ -93,13 +85,12 @@ fn external_call_with_returns() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
     let res = vm.function(
         "test_other",
         &[Token::FixedBytes(bar1_account.to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -130,9 +121,9 @@ fn external_raw_call_with_returns() {
         }"#,
     );
 
-    vm.constructor("bar1", &[], 0);
+    vm.constructor("bar1", &[]);
 
-    let res = vm.function("test_bar", &[Token::Int(U256::from(21))], &[], 0, None);
+    let res = vm.function("test_bar", &[Token::Int(U256::from(21))], &[], None);
 
     assert_eq!(res, vec![Token::Int(U256::from(24))]);
 
@@ -140,13 +131,12 @@ fn external_raw_call_with_returns() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
     let res = vm.function(
         "test_other",
         &[Token::FixedBytes(bar1_account.to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -173,9 +163,9 @@ fn call_external_func_type() {
     "#,
     );
 
-    vm.constructor("testing", &[], 0);
+    vm.constructor("testing", &[]);
 
-    let res = vm.function("doTest", &[], &[], 0, None);
+    let res = vm.function("doTest", &[], &[], None);
 
     assert_eq!(
         res,
@@ -219,9 +209,9 @@ fn external_call_with_string_returns() {
         }"#,
     );
 
-    vm.constructor("bar1", &[], 0);
+    vm.constructor("bar1", &[]);
 
-    let res = vm.function("test_bar", &[Token::Int(U256::from(22))], &[], 0, None);
+    let res = vm.function("test_bar", &[Token::Int(U256::from(22))], &[], None);
 
     assert_eq!(res, vec![Token::String(String::from("foo:22"))]);
 
@@ -229,7 +219,7 @@ fn external_call_with_string_returns() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
     let bar0_account = vm.stack[0].data;
 
@@ -237,7 +227,6 @@ fn external_call_with_string_returns() {
         "test_other",
         &[Token::FixedBytes(bar1_account.to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -247,7 +236,6 @@ fn external_call_with_string_returns() {
         "test_this",
         &[Token::FixedBytes(bar1_account.to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -255,7 +243,6 @@ fn external_call_with_string_returns() {
         "test_sender",
         &[Token::FixedBytes(bar1_account.to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -286,9 +273,9 @@ fn encode_call() {
         }"#,
     );
 
-    vm.constructor("bar1", &[], 0);
+    vm.constructor("bar1", &[]);
 
-    let res = vm.function("test_bar", &[Token::Int(U256::from(21))], &[], 0, None);
+    let res = vm.function("test_bar", &[Token::Int(U256::from(21))], &[], None);
 
     assert_eq!(res, vec![Token::Int(U256::from(24))]);
 
@@ -296,13 +283,12 @@ fn encode_call() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
     let res = vm.function(
         "test_other",
         &[Token::FixedBytes(bar1_account.to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -338,9 +324,9 @@ fn internal_function_storage() {
         }"#,
     );
 
-    vm.constructor("ft", &[], 0);
+    vm.constructor("ft", &[]);
 
-    let res = vm.function("set_op", &[Token::Bool(true)], &[], 0, None);
+    let res = vm.function("set_op", &[Token::Bool(true)], &[], None);
 
     assert_eq!(res, vec![]);
 
@@ -348,13 +334,12 @@ fn internal_function_storage() {
         "test",
         &[Token::Int(U256::from(3)), Token::Int(U256::from(5))],
         &[],
-        0,
         None,
     );
 
     assert_eq!(res, vec![Token::Int(U256::from(15))]);
 
-    let res = vm.function("set_op", &[Token::Bool(false)], &[], 0, None);
+    let res = vm.function("set_op", &[Token::Bool(false)], &[], None);
 
     assert_eq!(res, vec![]);
 
@@ -362,7 +347,6 @@ fn internal_function_storage() {
         "test",
         &[Token::Int(U256::from(3)), Token::Int(U256::from(5))],
         &[],
-        0,
         None,
     );
 
@@ -406,7 +390,7 @@ fn raw_call_accounts() {
         }"#,
     );
 
-    vm.constructor("SplToken", &[], 0);
+    vm.constructor("SplToken", &[]);
 
     let token = Pubkey(
         "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
@@ -460,7 +444,6 @@ fn raw_call_accounts() {
             Token::FixedBytes(b"quinquagintaquadringentillionths".to_vec()),
         ],
         &[],
-        0,
         None,
     );
 }

+ 4 - 4
tests/solana_tests/constant.rs

@@ -18,9 +18,9 @@ fn constant() {
         "#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f", &[], &[], 0, None);
+    let returns = vm.function("f", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(42))]);
 
     let mut vm = build_solidity(
@@ -38,8 +38,8 @@ fn constant() {
         "#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f", &[], &[], 0, None);
+    let returns = vm.function("f", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(42))]);
 }

+ 6 - 7
tests/solana_tests/create_contract.rs

@@ -30,11 +30,11 @@ fn simple_create_contract() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
     let seed = vm.create_empty_account();
 
-    let bar1 = vm.function("test_other", &[], &[&seed], 0, None);
+    let bar1 = vm.function("test_other", &[], &[&seed], None);
 
     assert_eq!(vm.logs, "bar1 says: yo from bar0");
 
@@ -46,7 +46,6 @@ fn simple_create_contract() {
         "call_bar1_at_address",
         &[bar1[0].clone(), Token::String(String::from("xywoleh"))],
         &[],
-        0,
         None,
     );
 
@@ -83,9 +82,9 @@ fn missing_contract() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
-    let res = vm.function_must_fail("test_other", &[], &[], 0, None);
+    let res = vm.function_must_fail("test_other", &[], &[], None);
     assert_eq!(res, Ok(64424509440));
 }
 
@@ -111,12 +110,12 @@ fn two_contracts() {
 
     vm.set_program(0);
 
-    vm.constructor("bar0", &[], 0);
+    vm.constructor("bar0", &[]);
 
     let seed1 = vm.create_empty_account();
     let seed2 = vm.create_empty_account();
 
-    let _bar1 = vm.function("test_other", &[], &[&seed1, &seed2], 0, None);
+    let _bar1 = vm.function("test_other", &[], &[&seed1, &seed2], None);
 
     assert_eq!(vm.logs, "bar1 says: yo from bar0bar1 says: hi from bar0");
 

+ 9 - 9
tests/solana_tests/destructure.rs

@@ -15,30 +15,30 @@ fn conditional_destructure() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f", &[Token::Bool(true), Token::Bool(true)], &[], 0, None);
+    let returns = vm.function("f", &[Token::Bool(true), Token::Bool(true)], &[], None);
 
     assert_eq!(
         returns,
         vec![Token::Int(U256::from(1)), Token::Int(U256::from(2)),]
     );
 
-    let returns = vm.function("f", &[Token::Bool(true), Token::Bool(false)], &[], 0, None);
+    let returns = vm.function("f", &[Token::Bool(true), Token::Bool(false)], &[], None);
 
     assert_eq!(
         returns,
         vec![Token::Int(U256::from(3)), Token::Int(U256::from(4)),]
     );
 
-    let returns = vm.function("f", &[Token::Bool(false), Token::Bool(false)], &[], 0, None);
+    let returns = vm.function("f", &[Token::Bool(false), Token::Bool(false)], &[], None);
 
     assert_eq!(
         returns,
         vec![Token::Int(U256::from(5)), Token::Int(U256::from(6)),]
     );
 
-    let returns = vm.function("f", &[Token::Bool(false), Token::Bool(true)], &[], 0, None);
+    let returns = vm.function("f", &[Token::Bool(false), Token::Bool(true)], &[], None);
 
     assert_eq!(
         returns,
@@ -62,9 +62,9 @@ fn casting_destructure() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f", &[], &[], 0, None);
+    let returns = vm.function("f", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -81,9 +81,9 @@ fn casting_destructure() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f", &[], &[], 0, None);
+    let returns = vm.function("f", &[], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from("Hello")),]);
 }

+ 4 - 4
tests/solana_tests/events.rs

@@ -15,9 +15,9 @@ fn simple_event() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    vm.function("go", &[], &[], 0, None);
+    vm.function("go", &[], &[], None);
 
     let log = vm.events();
 
@@ -64,9 +64,9 @@ fn less_simple_event() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    vm.function("go", &[], &[], 0, None);
+    vm.function("go", &[], &[], None);
 
     let log = vm.events();
 

+ 13 - 18
tests/solana_tests/expressions.rs

@@ -18,9 +18,9 @@ fn interfaceid() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -55,9 +55,9 @@ fn write_buffer() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test1", &[], &[], 0, None);
+    let returns = vm.function("test1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -66,14 +66,14 @@ fn write_buffer() {
         )]
     );
 
-    let returns = vm.function("test2", &[], &[], 0, None);
+    let returns = vm.function("test2", &[], &[], None);
 
     let mut buf = vec![0x42u8, 0x41u8];
     buf.extend_from_slice(&vm.origin);
 
     assert_eq!(returns, vec![Token::Bytes(buf)]);
 
-    let res = vm.function_must_fail("test3", &[], &[], 0, None);
+    let res = vm.function_must_fail("test3", &[], &[], None);
     assert_eq!(res, Ok(4294967296));
 }
 
@@ -92,7 +92,7 @@ fn read_buffer() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "test1",
@@ -100,7 +100,6 @@ fn read_buffer() {
             [0xbc, 0xbc, 0xbd, 0xbe, 8, 7, 6, 5, 4, 3, 2, 1].to_vec(),
         )],
         &[],
-        0,
         None,
     );
 
@@ -120,7 +119,6 @@ fn read_buffer() {
             [0xbc, 0xbc, 0xbd, 0xbe, 8, 7, 6, 5, 4, 3, 2].to_vec(),
         )],
         &[],
-        0,
         None,
     );
     assert_eq!(res, Ok(4294967296));
@@ -128,7 +126,7 @@ fn read_buffer() {
     let mut buf = vec![0x42u8, 0x41u8];
     buf.extend_from_slice(&vm.origin);
 
-    let returns = vm.function("test2", &[Token::Bytes(buf.clone())], &[], 0, None);
+    let returns = vm.function("test2", &[Token::Bytes(buf.clone())], &[], None);
 
     assert_eq!(
         returns,
@@ -140,7 +138,7 @@ fn read_buffer() {
 
     buf.pop();
 
-    let res = vm.function_must_fail("test2", &[Token::Bytes(buf)], &[], 0, None);
+    let res = vm.function_must_fail("test2", &[Token::Bytes(buf)], &[], None);
     assert_eq!(res, Ok(4294967296));
 }
 
@@ -159,13 +157,12 @@ fn bytes_compare() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "test1",
         &[Token::FixedBytes([0xbc, 0xbc, 0xbd, 0xbe].to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -175,7 +172,6 @@ fn bytes_compare() {
         "test2",
         &[Token::FixedBytes([0xbc, 0xbc, 0xbd, 0xbe].to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -195,7 +191,7 @@ fn assignment_in_ternary() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     for _ in 0..10 {
         let left = rng.gen::<u64>();
@@ -208,7 +204,6 @@ fn assignment_in_ternary() {
                 Token::Uint(U256::from(right)),
             ],
             &[],
-            0,
             None,
         );
 
@@ -230,9 +225,9 @@ fn power() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("power", &[], &[], 0, None);
+    let returns = vm.function("power", &[], &[], None);
 
     assert_eq!(
         returns,

+ 9 - 12
tests/solana_tests/hash.rs

@@ -14,8 +14,8 @@ fn constants_hash_tests() {
         }"##,
     );
 
-    runtime.constructor("tester", &[], 0);
-    runtime.function("test", &[], &[], 0, None);
+    runtime.constructor("tester", &[]);
+    runtime.function("test", &[], &[], None);
 
     let mut runtime = build_solidity(
         r##"
@@ -28,8 +28,8 @@ fn constants_hash_tests() {
         }"##,
     );
 
-    runtime.constructor("tester", &[], 0);
-    runtime.function("test", &[], &[], 0, None);
+    runtime.constructor("tester", &[]);
+    runtime.function("test", &[], &[], None);
 
     let mut runtime = build_solidity(
         r##"
@@ -42,8 +42,8 @@ fn constants_hash_tests() {
         }"##,
     );
 
-    runtime.constructor("tester", &[], 0);
-    runtime.function("test", &[], &[], 0, None);
+    runtime.constructor("tester", &[]);
+    runtime.function("test", &[], &[], None);
 }
 
 #[test]
@@ -59,12 +59,11 @@ fn hash_tests() {
         }"##,
     );
 
-    runtime.constructor("tester", &[], 0);
+    runtime.constructor("tester", &[]);
     let hash = runtime.function(
         "test",
         &[Token::Bytes(b"Hello, World!".to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -86,12 +85,11 @@ fn hash_tests() {
         }"##,
     );
 
-    runtime.constructor("tester", &[], 0);
+    runtime.constructor("tester", &[]);
     let hash = runtime.function(
         "test",
         &[Token::Bytes(b"Hello, World!".to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -114,12 +112,11 @@ fn hash_tests() {
         }"##,
     );
 
-    runtime.constructor("tester", &[], 0);
+    runtime.constructor("tester", &[]);
     let hash = runtime.function(
         "test",
         &[Token::Bytes(b"Hello, World!".to_vec())],
         &[],
-        0,
         None,
     );
 

+ 44 - 67
tests/solana_tests/mappings.rs

@@ -22,7 +22,7 @@ fn simple_mapping() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     for i in 0..10 {
         vm.function(
@@ -32,25 +32,24 @@ fn simple_mapping() {
                 Token::Uint(U256::from(300331 + i)),
             ],
             &[],
-            0,
             None,
         );
     }
 
     for i in 0..10 {
-        let returns = vm.function("get", &[Token::Uint(U256::from(102 + i))], &[], 0, None);
+        let returns = vm.function("get", &[Token::Uint(U256::from(102 + i))], &[], None);
 
         assert_eq!(returns, vec![Token::Uint(U256::from(300331 + i))]);
     }
 
-    let returns = vm.function("get", &[Token::Uint(U256::from(101))], &[], 0, None);
+    let returns = vm.function("get", &[Token::Uint(U256::from(101))], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(0))]);
 
-    vm.function("rm", &[Token::Uint(U256::from(104))], &[], 0, None);
+    vm.function("rm", &[Token::Uint(U256::from(104))], &[], None);
 
     for i in 0..10 {
-        let returns = vm.function("get", &[Token::Uint(U256::from(102 + i))], &[], 0, None);
+        let returns = vm.function("get", &[Token::Uint(U256::from(102 + i))], &[], None);
 
         if 102 + i != 104 {
             assert_eq!(returns, vec![Token::Uint(U256::from(300331 + i))]);
@@ -90,14 +89,14 @@ fn less_simple_mapping() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "set_string",
         &[
             Token::Uint(U256::from(12313132131321312311213131u128)),
             Token::String(String::from("This is a string which should be a little longer than 32 bytes so we the the abi encoder")),
-        ], &[], 0, None
+        ], &[], None
     );
 
     vm.function(
@@ -107,7 +106,6 @@ fn less_simple_mapping() {
             Token::Int(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -115,7 +113,6 @@ fn less_simple_mapping() {
         "get",
         &[Token::Uint(U256::from(12313132131321312311213131u128))],
         &[],
-        0,
         None,
     );
 
@@ -158,14 +155,14 @@ fn string_mapping() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "set_string",
         &[
             Token::String(String::from("a")),
             Token::String(String::from("This is a string which should be a little longer than 32 bytes so we the the abi encoder")),
-        ], &[],0, None
+        ], &[], None
     );
 
     vm.function(
@@ -175,11 +172,10 @@ fn string_mapping() {
             Token::Int(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get", &[Token::String(String::from("a"))], &[], 0, None);
+    let returns = vm.function("get", &[Token::String(String::from("a"))], &[], None);
 
     assert_eq!(
         returns,
@@ -213,7 +209,7 @@ fn contract_mapping() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let index = Token::FixedBytes(account_new().to_vec());
 
@@ -222,19 +218,19 @@ fn contract_mapping() {
         &[
             index.clone(),
             Token::String(String::from("This is a string which should be a little longer than 32 bytes so we the the abi encoder")),
-        ], &[],0, None
+        ], &[], None
     );
 
-    let returns = vm.function("get", &[index.clone()], &[], 0, None);
+    let returns = vm.function("get", &[index.clone()], &[], None);
 
     assert_eq!(
         returns,
         vec![Token::String(String::from("This is a string which should be a little longer than 32 bytes so we the the abi encoder"))]
     );
 
-    vm.function("rm", &[index.clone()], &[], 0, None);
+    vm.function("rm", &[index.clone()], &[], None);
 
-    let returns = vm.function("get", &[index], &[], 0, None);
+    let returns = vm.function("get", &[index], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from(""))]);
 }
@@ -252,7 +248,7 @@ fn mapping_in_mapping() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "set",
@@ -262,7 +258,6 @@ fn mapping_in_mapping() {
             Token::FixedBytes(vec![0x98]),
         ],
         &[],
-        0,
         None,
     );
 
@@ -273,7 +268,6 @@ fn mapping_in_mapping() {
             Token::Int(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -286,7 +280,6 @@ fn mapping_in_mapping() {
             Token::Int(U256::from(103)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -299,7 +292,6 @@ fn mapping_in_mapping() {
             Token::Int(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -336,14 +328,14 @@ fn sparse_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "set_string",
         &[
             Token::Uint(U256::from(909090909)),
             Token::String(String::from("This is a string which should be a little longer than 32 bytes so we the the abi encoder")),
-        ], &[],0, None
+        ], &[], None
     );
 
     vm.function(
@@ -353,11 +345,10 @@ fn sparse_array() {
             Token::Int(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get", &[Token::Uint(U256::from(909090909))], &[], 0, None);
+    let returns = vm.function("get", &[Token::Uint(U256::from(909090909))], &[], None);
 
     assert_eq!(
         returns,
@@ -398,14 +389,14 @@ fn massive_sparse_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "set_string",
         &[
             Token::Uint(U256::from(786868768768678687686877u128)),
             Token::String(String::from("This is a string which should be a little longer than 32 bytes so we the the abi encoder")),
-        ], &[],0, None
+        ], &[], None
     );
 
     vm.function(
@@ -415,7 +406,6 @@ fn massive_sparse_array() {
             Token::Int(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -423,7 +413,6 @@ fn massive_sparse_array() {
         "get",
         &[Token::Uint(U256::from(786868768768678687686877u128))],
         &[],
-        0,
         None,
     );
 
@@ -470,18 +459,17 @@ fn mapping_in_dynamic_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "setNumber",
         &[Token::Int(U256::from(2147483647))],
         &[],
-        0,
         None,
     );
 
-    vm.function("push", &[], &[], 0, None);
-    vm.function("push", &[], &[], 0, None);
+    vm.function("push", &[], &[], None);
+    vm.function("push", &[], &[], None);
 
     for array_no in 0..2 {
         for i in 0..10 {
@@ -493,7 +481,6 @@ fn mapping_in_dynamic_array() {
                     Token::Uint(U256::from(300331 + i)),
                 ],
                 &[],
-                0,
                 None,
             );
         }
@@ -508,7 +495,6 @@ fn mapping_in_dynamic_array() {
                     Token::Uint(U256::from(102 + i + array_no * 500)),
                 ],
                 &[],
-                0,
                 None,
             );
 
@@ -520,7 +506,6 @@ fn mapping_in_dynamic_array() {
         "map",
         &[Token::Uint(U256::from(0)), Token::Uint(U256::from(101))],
         &[],
-        0,
         None,
     );
 
@@ -530,7 +515,6 @@ fn mapping_in_dynamic_array() {
         "rm",
         &[Token::Uint(U256::from(0)), Token::Uint(U256::from(104))],
         &[],
-        0,
         None,
     );
 
@@ -539,7 +523,6 @@ fn mapping_in_dynamic_array() {
             "map",
             &[Token::Uint(U256::from(0)), Token::Uint(U256::from(102 + i))],
             &[],
-            0,
             None,
         );
 
@@ -550,20 +533,20 @@ fn mapping_in_dynamic_array() {
         }
     }
 
-    let returns = vm.function("length", &[], &[], 0, None);
+    let returns = vm.function("length", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(2))]);
 
-    vm.function("pop", &[], &[], 0, None);
+    vm.function("pop", &[], &[], None);
 
-    let returns = vm.function("length", &[], &[], 0, None);
+    let returns = vm.function("length", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(1))]);
 
-    vm.function("pop", &[], &[], 0, None);
+    vm.function("pop", &[], &[], None);
 
-    let returns = vm.function("length", &[], &[], 0, None);
+    let returns = vm.function("length", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(0))]);
 
-    let returns = vm.function("number", &[], &[], 0, None);
+    let returns = vm.function("number", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(2147483647))]);
 }
@@ -606,18 +589,17 @@ fn mapping_in_struct_in_dynamic_array() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "setNumber",
         &[Token::Int(U256::from(2147483647))],
         &[],
-        0,
         None,
     );
 
-    vm.function("push", &[], &[], 0, None);
-    vm.function("push", &[], &[], 0, None);
+    vm.function("push", &[], &[], None);
+    vm.function("push", &[], &[], None);
 
     for array_no in 0..2 {
         for i in 0..10 {
@@ -629,7 +611,6 @@ fn mapping_in_struct_in_dynamic_array() {
                     Token::Uint(U256::from(300331 + i)),
                 ],
                 &[],
-                0,
                 None,
             );
         }
@@ -644,7 +625,6 @@ fn mapping_in_struct_in_dynamic_array() {
                     Token::Uint(U256::from(102 + i + array_no * 500)),
                 ],
                 &[],
-                0,
                 None,
             );
 
@@ -656,7 +636,6 @@ fn mapping_in_struct_in_dynamic_array() {
         "get",
         &[Token::Uint(U256::from(0)), Token::Uint(U256::from(101))],
         &[],
-        0,
         None,
     );
 
@@ -666,7 +645,6 @@ fn mapping_in_struct_in_dynamic_array() {
         "rm",
         &[Token::Uint(U256::from(0)), Token::Uint(U256::from(104))],
         &[],
-        0,
         None,
     );
 
@@ -675,7 +653,6 @@ fn mapping_in_struct_in_dynamic_array() {
             "get",
             &[Token::Uint(U256::from(0)), Token::Uint(U256::from(102 + i))],
             &[],
-            0,
             None,
         );
 
@@ -686,10 +663,10 @@ fn mapping_in_struct_in_dynamic_array() {
         }
     }
 
-    vm.function("pop", &[], &[], 0, None);
-    vm.function("pop", &[], &[], 0, None);
+    vm.function("pop", &[], &[], None);
+    vm.function("pop", &[], &[], None);
 
-    let returns = vm.function("number", &[], &[], 0, None);
+    let returns = vm.function("number", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(2147483647))]);
 }
@@ -727,10 +704,10 @@ contract DeleteTest {
         "#,
     );
 
-    vm.constructor("DeleteTest", &[], 0);
-    let _ = vm.function("addData", &[], &[], 0, None);
-    let _ = vm.function("deltest", &[], &[], 0, None);
-    let returns = vm.function("get", &[], &[], 0, None);
+    vm.constructor("DeleteTest", &[]);
+    let _ = vm.function("addData", &[], &[], None);
+    let _ = vm.function("deltest", &[], &[], None);
+    let returns = vm.function("get", &[], &[], None);
     assert_eq!(
         returns,
         vec![Token::Tuple(vec![
@@ -786,15 +763,15 @@ function getArrAmt() public view returns (uint) {
         "#,
     );
 
-    vm.constructor("CrowdFunding", &[], 0);
+    vm.constructor("CrowdFunding", &[]);
 
-    let ret = vm.function("newCampaign", &[], &[], 0, None);
+    let ret = vm.function("newCampaign", &[], &[], None);
 
     assert_eq!(ret, vec![Token::Uint(U256::from(0))]);
 
-    let ret = vm.function("getAmt", &[], &[], 0, None);
+    let ret = vm.function("getAmt", &[], &[], None);
     assert_eq!(ret, vec![Token::Uint(U256::from(100))]);
 
-    let ret = vm.function("getArrAmt", &[], &[], 0, None);
+    let ret = vm.function("getArrAmt", &[], &[], None);
     assert_eq!(ret, vec![Token::Uint(U256::from(105))]);
 }

+ 1 - 7
tests/solana_tests/math.rs

@@ -38,7 +38,7 @@ fn safe_math() {
         }"#,
     );
 
-    vm.constructor("math", &[], 0);
+    vm.constructor("math", &[]);
 
     let returns = vm.function(
         "mul_test",
@@ -51,7 +51,6 @@ fn safe_math() {
             )),
         ],
         &[],
-        0,
         None,
     );
 
@@ -73,7 +72,6 @@ fn safe_math() {
             )),
         ],
         &[],
-        0,
         None,
     );
 
@@ -95,7 +93,6 @@ fn safe_math() {
             )),
         ],
         &[],
-        0,
         None,
     );
 
@@ -117,7 +114,6 @@ fn safe_math() {
             )),
         ],
         &[],
-        0,
         None,
     );
 
@@ -134,7 +130,6 @@ fn safe_math() {
             )),
         ],
         &[],
-        0,
         None,
     );
 
@@ -151,7 +146,6 @@ fn safe_math() {
             )),
         ],
         &[],
-        0,
         None,
     );
 

+ 3 - 3
tests/solana_tests/modifiers.rs

@@ -26,16 +26,16 @@ fn returns_and_phis_needed() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    let returns = vm.function("func", &[Token::Bool(false)], &[], 0, None);
+    let returns = vm.function("func", &[Token::Bool(false)], &[], None);
 
     assert_eq!(
         returns,
         vec![Token::Int(U256::from(40)), Token::Bool(false)]
     );
 
-    let returns = vm.function("func", &[Token::Bool(true)], &[], 0, None);
+    let returns = vm.function("func", &[Token::Bool(true)], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(12)), Token::Bool(true)]);
 }

+ 19 - 53
tests/solana_tests/primitives.rs

@@ -24,9 +24,9 @@ fn assert_false() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    vm.function("assert_fails", &[], &[], 0, None);
+    vm.function("assert_fails", &[], &[], None);
 }
 
 #[test]
@@ -41,9 +41,9 @@ fn assert_true() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    vm.function("assert_fails", &[], &[], 0, None);
+    vm.function("assert_fails", &[], &[], None);
 }
 
 #[test]
@@ -73,18 +73,18 @@ fn boolean() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("return_true", &[], &[], 0, None);
+    let returns = vm.function("return_true", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Bool(true),]);
 
-    let returns = vm.function("return_false", &[], &[], 0, None);
+    let returns = vm.function("return_false", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Bool(false),]);
 
-    vm.function("true_arg", &[ethabi::Token::Bool(true)], &[], 0, None);
-    vm.function("false_arg", &[ethabi::Token::Bool(false)], &[], 0, None);
+    vm.function("true_arg", &[ethabi::Token::Bool(true)], &[], None);
+    vm.function("false_arg", &[ethabi::Token::Bool(false)], &[], None);
 }
 
 #[test]
@@ -107,9 +107,9 @@ fn address() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("return_address", &[], &[], 0, None);
+    let returns = vm.function("return_address", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -126,7 +126,6 @@ fn address() {
             134, 82, 130, 112, 97, 218, 24, 157, 198, 40, 105, 118, 27,
         ])],
         &[],
-        0,
         None,
     );
 }
@@ -152,19 +151,13 @@ fn test_enum() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("return_enum", &[], &[], 0, None);
+    let returns = vm.function("return_enum", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(9))]);
 
-    vm.function(
-        "enum_arg",
-        &[ethabi::Token::Uint(U256::from(6))],
-        &[],
-        0,
-        None,
-    );
+    vm.function("enum_arg", &[ethabi::Token::Uint(U256::from(6))], &[], None);
 }
 
 #[test]
@@ -206,9 +199,9 @@ fn bytes() {
 
         let mut vm = build_solidity(&src);
 
-        vm.constructor("test", &[], 0);
+        vm.constructor("test", &[]);
 
-        let returns = vm.function("return_literal", &[], &[], 0, None);
+        let returns = vm.function("return_literal", &[], &[], None);
 
         assert_eq!(
             returns,
@@ -219,7 +212,6 @@ fn bytes() {
             "return_arg",
             &[ethabi::Token::FixedBytes(vec![1, 2, 3, 4, 5, 6, 7])],
             &[],
-            0,
             None,
         );
 
@@ -245,7 +237,6 @@ fn bytes() {
                     ethabi::Token::FixedBytes(b.to_vec()),
                 ],
                 &[],
-                0,
                 None,
             );
 
@@ -267,7 +258,6 @@ fn bytes() {
                     ethabi::Token::FixedBytes(b.to_vec()),
                 ],
                 &[],
-                0,
                 None,
             );
 
@@ -282,7 +272,6 @@ fn bytes() {
                     ethabi::Token::FixedBytes(b.to_vec()),
                 ],
                 &[],
-                0,
                 None,
             );
 
@@ -301,7 +290,6 @@ fn bytes() {
                     ethabi::Token::Uint(U256::from(r)),
                 ],
                 &[],
-                0,
                 None,
             );
 
@@ -324,7 +312,6 @@ fn bytes() {
                     ethabi::Token::Uint(U256::from(r)),
                 ],
                 &[],
-                0,
                 None,
             );
 
@@ -399,7 +386,7 @@ fn uint() {
 
         let mut vm = build_solidity(&src);
 
-        vm.constructor("test", &[], 0);
+        vm.constructor("test", &[]);
 
         println!("width:{}", width);
 
@@ -422,7 +409,7 @@ fn uint() {
             truncate_uint(&mut a, width);
             truncate_uint(&mut b, width);
 
-            let res = vm.function("pass", &[ethabi::Token::Uint(a)], &[], 0, None);
+            let res = vm.function("pass", &[ethabi::Token::Uint(a)], &[], None);
 
             println!("{:x} = {:?} o", a, res);
 
@@ -430,7 +417,6 @@ fn uint() {
                 "add",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -446,7 +432,6 @@ fn uint() {
                 "sub",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -460,7 +445,6 @@ fn uint() {
                 "mul",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -474,7 +458,6 @@ fn uint() {
                 "pow",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -489,7 +472,6 @@ fn uint() {
                     "div",
                     &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                     &[],
-                    0,
                     None,
                 );
 
@@ -503,7 +485,6 @@ fn uint() {
                     "mod",
                     &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                     &[],
-                    0,
                     None,
                 );
 
@@ -518,7 +499,6 @@ fn uint() {
                 "or",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -537,7 +517,6 @@ fn uint() {
                 "and",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -556,7 +535,6 @@ fn uint() {
                 "xor",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -577,7 +555,6 @@ fn uint() {
                 "shift_left",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(U256::from(r))],
                 &[],
-                0,
                 None,
             );
 
@@ -591,7 +568,6 @@ fn uint() {
                 "shift_right",
                 &[ethabi::Token::Uint(a), ethabi::Token::Uint(U256::from(r))],
                 &[],
-                0,
                 None,
             );
 
@@ -672,7 +648,7 @@ fn int() {
 
         let mut vm = build_solidity(&src);
 
-        vm.constructor("test", &[], 0);
+        vm.constructor("test", &[]);
 
         for _ in 0..10 {
             let mut a_bs = Vec::new();
@@ -697,7 +673,6 @@ fn int() {
                 "add",
                 &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -711,7 +686,6 @@ fn int() {
                 "sub",
                 &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -723,7 +697,6 @@ fn int() {
                 "mul",
                 &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -736,7 +709,6 @@ fn int() {
                     "div",
                     &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                     &[],
-                    0,
                     None,
                 );
 
@@ -748,7 +720,6 @@ fn int() {
                     "mod",
                     &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                     &[],
-                    0,
                     None,
                 );
 
@@ -763,7 +734,6 @@ fn int() {
                 "or",
                 &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -782,7 +752,6 @@ fn int() {
                 "and",
                 &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -801,7 +770,6 @@ fn int() {
                 "xor",
                 &[ethabi::Token::Int(a), ethabi::Token::Int(b)],
                 &[],
-                0,
                 None,
             );
 
@@ -822,7 +790,6 @@ fn int() {
                 "shift_left",
                 &[ethabi::Token::Int(a), ethabi::Token::Uint(U256::from(r))],
                 &[],
-                0,
                 None,
             );
 
@@ -836,7 +803,6 @@ fn int() {
                 "shift_right",
                 &[ethabi::Token::Int(a), ethabi::Token::Uint(U256::from(r))],
                 &[],
-                0,
                 None,
             );
 

+ 16 - 17
tests/solana_tests/rational.rs

@@ -18,13 +18,13 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(4))]);
 
-    let returns = vm.function("test2", &[], &[], 0, None);
+    let returns = vm.function("test2", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(4))]);
 
@@ -38,9 +38,9 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(5))]);
 
@@ -54,9 +54,9 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(24))]);
 
@@ -70,9 +70,9 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(0))]);
 
@@ -86,9 +86,9 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(4))]);
 
@@ -101,9 +101,9 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(3))]);
 
@@ -116,9 +116,9 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[], &[], 0, None);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(15600))]);
 
@@ -131,13 +131,12 @@ fn rational() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "test",
         &[ethabi::Token::Uint(U256::from(982451653))],
         &[],
-        0,
         None,
     );
 

+ 21 - 21
tests/solana_tests/returns.rs

@@ -28,21 +28,21 @@ fn return_single() {
             }
         }"#,
     );
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("f", &[], &[], 0, None);
+    let returns = vm.function("f", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(2)),]);
 
-    let returns = vm.function("g", &[], &[], 0, None);
+    let returns = vm.function("g", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(3)),]);
 
-    let returns = vm.function("h", &[], &[], 0, None);
+    let returns = vm.function("h", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(2)),]);
 
-    let returns = vm.function("i", &[], &[], 0, None);
+    let returns = vm.function("i", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(24)),]);
 
-    let returns = vm.function("j", &[], &[], 0, None);
+    let returns = vm.function("j", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(5)),]);
 }
 
@@ -57,8 +57,8 @@ fn return_ternary() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
-    let returns = vm.function("f", &[], &[], 0, None);
+    vm.constructor("foo", &[]);
+    let returns = vm.function("f", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -74,8 +74,8 @@ fn return_ternary() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
-    let returns = vm.function("f", &[], &[], 0, None);
+    vm.constructor("foo", &[]);
+    let returns = vm.function("f", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -105,10 +105,10 @@ fn return_nothing() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
-    let _returns = vm.function("strange", &[], &[], 0, None);
-    let _returns = vm.function("inc", &[], &[], 0, None);
-    let returns = vm.function("get", &[], &[], 0, None);
+    vm.constructor("foo", &[]);
+    let _returns = vm.function("strange", &[], &[], None);
+    let _returns = vm.function("inc", &[], &[], None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(2)),]);
 
@@ -135,9 +135,9 @@ fn return_nothing() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
-    let _returns = vm.function("f", &[], &[], 0, None);
-    let returns = vm.function("get", &[], &[], 0, None);
+    vm.constructor("foo", &[]);
+    let _returns = vm.function("f", &[], &[], None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(5)),]);
 }
@@ -157,8 +157,8 @@ fn return_function() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
-    let returns = vm.function("f", &[], &[], 0, None);
+    vm.constructor("foo", &[]);
+    let returns = vm.function("f", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -178,8 +178,8 @@ fn return_function() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
-    let returns = vm.function("f", &[], &[], 0, None);
+    vm.constructor("foo", &[]);
+    let returns = vm.function("f", &[], &[], None);
 
     assert_eq!(
         returns,

+ 1 - 4
tests/solana_tests/signature_verify.rs

@@ -42,7 +42,7 @@ fn verify() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let mut csprng = rand::thread_rng();
     let keypair: Keypair = Keypair::generate(&mut csprng);
@@ -66,7 +66,6 @@ fn verify() {
             Token::Bytes(signature_bs.clone()),
         ],
         &[],
-        0,
         None,
     );
 
@@ -98,7 +97,6 @@ fn verify() {
             Token::Bytes(signature_bs.clone()),
         ],
         &[],
-        0,
         None,
     );
 
@@ -129,7 +127,6 @@ fn verify() {
             Token::Bytes(signature_bs),
         ],
         &[],
-        0,
         None,
     );
 

+ 18 - 21
tests/solana_tests/simple.rs

@@ -18,13 +18,13 @@ fn simple() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     assert_eq!(vm.logs, "Hello from constructor");
 
     vm.logs.truncate(0);
 
-    vm.function("test", &[], &[], 0, None);
+    vm.function("test", &[], &[], None);
 
     assert_eq!(vm.logs, "Hello from function");
 }
@@ -42,7 +42,7 @@ fn format() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     assert_eq!(
         vm.logs,
@@ -67,7 +67,7 @@ fn parameters() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     vm.function(
         "test",
@@ -76,7 +76,6 @@ fn parameters() {
             ethabi::Token::Uint(U256::from(10)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -91,7 +90,6 @@ fn parameters() {
             ethabi::Token::Uint(U256::from(102)),
         ],
         &[],
-        0,
         None,
     );
 
@@ -109,9 +107,9 @@ fn returns() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
-    let returns = vm.function("test", &[ethabi::Token::Uint(U256::from(10))], &[], 0, None);
+    let returns = vm.function("test", &[ethabi::Token::Uint(U256::from(10))], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(100))]);
 
@@ -124,13 +122,12 @@ fn returns() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     let returns = vm.function(
         "test",
         &[ethabi::Token::Uint(U256::from(982451653))],
         &[],
-        0,
         None,
     );
 
@@ -169,25 +166,25 @@ fn flipper() {
         }"#,
     );
 
-    vm.constructor("flipper", &[ethabi::Token::Bool(true)], 0);
+    vm.constructor("flipper", &[ethabi::Token::Bool(true)]);
 
     assert_eq!(
         vm.data()[0..17].to_vec(),
         hex::decode("6fc90ec500000000000000001800000001").unwrap()
     );
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Bool(true)]);
 
-    vm.function("flip", &[], &[], 0, None);
+    vm.function("flip", &[], &[], None);
 
     assert_eq!(
         vm.data()[0..17].to_vec(),
         hex::decode("6fc90ec500000000000000001800000000").unwrap()
     );
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Bool(false)]);
 }
@@ -223,15 +220,15 @@ fn incrementer() {
         }"#,
     );
 
-    vm.constructor("incrementer", &[ethabi::Token::Uint(U256::from(5))], 0);
+    vm.constructor("incrementer", &[ethabi::Token::Uint(U256::from(5))]);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(5))]);
 
-    vm.function("inc", &[ethabi::Token::Uint(U256::from(7))], &[], 0, None);
+    vm.function("inc", &[ethabi::Token::Uint(U256::from(7))], &[], None);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(12))]);
 }
@@ -278,7 +275,7 @@ fn two_arrays() {
         }"#,
     );
 
-    vm.constructor("two_arrays", &[], 0);
+    vm.constructor("two_arrays", &[]);
 }
 
 #[test]
@@ -303,9 +300,9 @@ fn dead_storage_bug() {
         }"#,
     );
 
-    vm.constructor("deadstorage", &[], 0);
+    vm.constructor("deadstorage", &[]);
 
-    let returns = vm.function("v", &[], &[], 0, None);
+    let returns = vm.function("v", &[], &[], None);
 
     assert_eq!(returns, vec![ethabi::Token::Uint(U256::from(9991))]);
 }

+ 45 - 69
tests/solana_tests/storage.rs

@@ -15,8 +15,8 @@ fn simple() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
-    let returns = vm.function("boom", &[], &[], 0, None);
+    vm.constructor("foo", &[]);
+    let returns = vm.function("boom", &[], &[], None);
     assert_eq!(returns, vec![Token::Int(U256::from(0)),]);
 
     let mut vm = build_solidity(
@@ -39,8 +39,8 @@ fn simple() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
-    let returns = vm.function("func", &[], &[], 0, None);
+    vm.constructor("c", &[]);
+    let returns = vm.function("func", &[], &[], None);
     assert_eq!(returns, vec![Token::Int(U256::from(1)),]);
 }
 
@@ -61,14 +61,14 @@ fn string() {
         }"#,
     );
 
-    vm.constructor("foo", &[], 0);
+    vm.constructor("foo", &[]);
 
     assert_eq!(
         vm.data()[0..20].to_vec(),
         vec![65, 177, 160, 100, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0]
     );
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from(""))]);
 
@@ -76,7 +76,6 @@ fn string() {
         "set",
         &[Token::String(String::from("Hello, World!"))],
         &[],
-        0,
         None,
     );
 
@@ -87,7 +86,7 @@ fn string() {
 
     assert_eq!(vm.data()[40..53].to_vec(), b"Hello, World!");
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from("Hello, World!"))]);
 
@@ -97,11 +96,10 @@ fn string() {
         "set",
         &[Token::String(String::from("Hallo, Werld!"))],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from("Hallo, Werld!"))]);
 
@@ -112,9 +110,9 @@ fn string() {
 
     // Try setting this to an empty string. This is also a special case where
     // the result should be offset 0
-    vm.function("set", &[Token::String(String::from(""))], &[], 0, None);
+    vm.function("set", &[Token::String(String::from(""))], &[], None);
 
-    let returns = vm.function("get", &[], &[], 0, None);
+    let returns = vm.function("get", &[], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from(""))]);
 
@@ -149,14 +147,14 @@ fn bytes() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     assert_eq!(
         vm.data()[0..20].to_vec(),
         vec![11, 66, 182, 57, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0]
     );
 
-    let returns = vm.function("foo_length", &[], &[], 0, None);
+    let returns = vm.function("foo_length", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Uint(U256::from(0))]);
 
@@ -166,7 +164,6 @@ fn bytes() {
             b"The shoemaker always wears the worst shoes".to_vec(),
         )],
         &[],
-        0,
         None,
     );
 
@@ -179,13 +176,7 @@ fn bytes() {
         .iter()
         .enumerate()
     {
-        let returns = vm.function(
-            "get_foo_offset",
-            &[Token::Uint(U256::from(i))],
-            &[],
-            0,
-            None,
-        );
+        let returns = vm.function("get_foo_offset", &[Token::Uint(U256::from(i))], &[], None);
 
         assert_eq!(returns, vec![Token::FixedBytes(vec![*b])]);
     }
@@ -194,7 +185,6 @@ fn bytes() {
         "set_foo_offset",
         &[Token::Uint(U256::from(2)), Token::FixedBytes(b"E".to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -202,7 +192,6 @@ fn bytes() {
         "set_foo_offset",
         &[Token::Uint(U256::from(7)), Token::FixedBytes(b"E".to_vec())],
         &[],
-        0,
         None,
     );
 
@@ -210,13 +199,7 @@ fn bytes() {
         .iter()
         .enumerate()
     {
-        let returns = vm.function(
-            "get_foo_offset",
-            &[Token::Uint(U256::from(i))],
-            &[],
-            0,
-            None,
-        );
+        let returns = vm.function("get_foo_offset", &[Token::Uint(U256::from(i))], &[], None);
 
         assert_eq!(returns, vec![Token::FixedBytes(vec![*b])]);
     }
@@ -248,13 +231,12 @@ fn bytes_set_subscript_range() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     vm.function(
         "set_foo_offset",
         &[Token::Uint(U256::from(0)), Token::FixedBytes(b"E".to_vec())],
         &[],
-        0,
         None,
     );
 }
@@ -285,7 +267,7 @@ fn bytes_get_subscript_range() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     vm.function(
         "set_foo",
@@ -293,7 +275,6 @@ fn bytes_get_subscript_range() {
             b"The shoemaker always wears the worst shoes".to_vec(),
         )],
         &[],
-        0,
         None,
     );
 
@@ -301,7 +282,6 @@ fn bytes_get_subscript_range() {
         "get_foo_offset",
         &[Token::Uint(U256::from(0x80000000u64))],
         &[],
-        0,
         None,
     );
 }
@@ -319,7 +299,7 @@ fn storage_alignment() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
     assert_eq!(
         vm.data()[0..40].to_vec(),
@@ -351,31 +331,31 @@ fn bytes_push_pop() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    let returns = vm.function("get_bs", &[], &[], 0, None);
+    let returns = vm.function("get_bs", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Bytes(vec!(0x0e, 0xda))]);
 
-    let returns = vm.function("pop", &[], &[], 0, None);
+    let returns = vm.function("pop", &[], &[], None);
 
     assert_eq!(returns, vec![Token::FixedBytes(vec!(0xda))]);
 
-    let returns = vm.function("get_bs", &[], &[], 0, None);
+    let returns = vm.function("get_bs", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Bytes(vec!(0x0e))]);
 
-    vm.function("push", &[Token::FixedBytes(vec![0x41])], &[], 0, None);
+    vm.function("push", &[Token::FixedBytes(vec![0x41])], &[], None);
 
     println!("data:{}", hex::encode(&vm.data()));
 
-    let returns = vm.function("get_bs", &[], &[], 0, None);
+    let returns = vm.function("get_bs", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Bytes(vec!(0x0e, 0x41))]);
 
-    vm.function("push", &[Token::FixedBytes(vec![0x01])], &[], 0, None);
+    vm.function("push", &[Token::FixedBytes(vec![0x01])], &[], None);
 
-    let returns = vm.function("get_bs", &[], &[], 0, None);
+    let returns = vm.function("get_bs", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Bytes(vec!(0x0e, 0x41, 0x01))]);
 }
@@ -394,9 +374,9 @@ fn bytes_empty_pop() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    vm.function("pop", &[], &[], 0, None);
+    vm.function("pop", &[], &[], None);
 }
 
 #[test]
@@ -426,9 +406,9 @@ fn simple_struct() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    vm.function("set_s2", &[], &[], 0, None);
+    vm.function("set_s2", &[], &[], None);
 
     assert_eq!(
         vm.data()[0..32].to_vec(),
@@ -438,7 +418,7 @@ fn simple_struct() {
         ]
     );
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -455,11 +435,10 @@ fn simple_struct() {
             Token::Uint(U256::from(3240121)),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -503,9 +482,9 @@ fn struct_in_struct() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    vm.function("set_s2", &[], &[], 0, None);
+    vm.function("set_s2", &[], &[], None);
 
     assert_eq!(
         vm.data()[0..52].to_vec(),
@@ -516,7 +495,7 @@ fn struct_in_struct() {
         ]
     );
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -541,11 +520,10 @@ fn struct_in_struct() {
             Token::Uint(U256::from(12345678901234567890u64)),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -588,9 +566,9 @@ fn string_in_struct() {
             }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    vm.function("set_s2", &[], &[], 0, None);
+    vm.function("set_s2", &[], &[], None);
 
     assert_eq!(
         vm.data()[0..64].to_vec(),
@@ -601,7 +579,7 @@ fn string_in_struct() {
         ]
     );
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -620,11 +598,10 @@ fn string_in_struct() {
             Token::Uint(U256::from(12345678901234567890u64)),
         ])],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -688,11 +665,11 @@ fn complex_struct() {
         }"#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
 
-    vm.function("set_s2", &[], &[], 0, None);
+    vm.function("set_s2", &[], &[], None);
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -737,11 +714,10 @@ fn complex_struct() {
             Token::String(String::from("yadayada")),
         ],
         &[],
-        0,
         None,
     );
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,
@@ -764,9 +740,9 @@ fn complex_struct() {
         ]
     );
 
-    vm.function("rm", &[], &[], 0, None);
+    vm.function("rm", &[], &[], None);
 
-    let returns = vm.function("get_s1", &[], &[], 0, None);
+    let returns = vm.function("get_s1", &[], &[], None);
 
     assert_eq!(
         returns,

+ 5 - 5
tests/solana_tests/unused_variable_elimination.rs

@@ -35,14 +35,14 @@ fn test_returns() {
     "#;
 
     let mut vm = build_solidity(file);
-    vm.constructor("c1", &[], 0);
-    let _ = vm.function("assign", &[], &[], 0, None);
-    let returns = vm.function("pb1", &[], &[], 0, None);
+    vm.constructor("c1", &[]);
+    let _ = vm.function("assign", &[], &[], None);
+    let returns = vm.function("pb1", &[], &[], None);
 
     assert_eq!(returns, vec![Token::Int(U256::from(5))]);
 
-    let returns = vm.function("test1", &[], &[], 0, None);
+    let returns = vm.function("test1", &[], &[], None);
     assert_eq!(returns, vec![Token::Int(U256::from(52))]);
-    let returns = vm.function("test2", &[], &[], 0, None);
+    let returns = vm.function("test2", &[], &[], None);
     assert_eq!(returns, vec![Token::Int(U256::from(5))]);
 }

+ 4 - 4
tests/solana_tests/using.rs

@@ -27,8 +27,8 @@ fn using_for_contracts() {
         }"#,
     );
 
-    runtime.constructor("C", &[], 0);
-    runtime.function("test", &[], &[], 0, None);
+    runtime.constructor("C", &[]);
+    runtime.function("test", &[], &[], None);
 
     assert_eq!(runtime.logs, "Hello");
 
@@ -70,8 +70,8 @@ fn using_for_contracts() {
         }"#,
     );
 
-    runtime.constructor("foo", &[], 0);
-    runtime.function("test", &[], &[], 0, None);
+    runtime.constructor("foo", &[]);
+    runtime.function("test", &[], &[], None);
 
     assert_eq!(runtime.logs, "X libX contractx:2");
 }

+ 2 - 2
tests/solana_tests/vector_to_slice.rs

@@ -19,8 +19,8 @@ fn test_slice_in_phi() {
     "#;
 
     let mut vm = build_solidity(file);
-    vm.constructor("c1", &[], 0);
-    let returns = vm.function("test", &[], &[], 0, None);
+    vm.constructor("c1", &[]);
+    let returns = vm.function("test", &[], &[], None);
 
     assert_eq!(returns, vec![Token::String(String::from("Hello!"))]);
 }

+ 8 - 20
tests/solana_tests/yul.rs

@@ -57,9 +57,9 @@ contract testing  {
       "#,
     );
 
-    vm.constructor("testing", &[], 0);
+    vm.constructor("testing", &[]);
 
-    let returns = vm.function("test_slot", &[], &[], 0, None);
+    let returns = vm.function("test_slot", &[], &[], None);
     assert_eq!(returns, vec![Token::Uint(U256::from(56016))]);
 
     let returns = vm.function(
@@ -71,7 +71,6 @@ contract testing  {
             Token::Uint(U256::from(11)),
         ])],
         &[],
-        0,
         None,
     );
     assert_eq!(
@@ -82,7 +81,7 @@ contract testing  {
         ]
     );
 
-    let returns = vm.function("selector_address", &[], &[], 0, None);
+    let returns = vm.function("selector_address", &[], &[], None);
     assert_eq!(
         returns,
         vec![
@@ -132,27 +131,21 @@ contract testing  {
       "#,
     );
 
-    vm.constructor("testing", &[], 0);
+    vm.constructor("testing", &[]);
 
-    let returns = vm.function("general_test", &[Token::Uint(Uint::from(5))], &[], 0, None);
+    let returns = vm.function("general_test", &[Token::Uint(Uint::from(5))], &[], None);
     assert_eq!(
         returns,
         vec![Token::Uint(Uint::from(100)), Token::Uint(Uint::from(20))]
     );
 
-    let returns = vm.function("general_test", &[Token::Uint(Uint::from(78))], &[], 0, None);
+    let returns = vm.function("general_test", &[Token::Uint(Uint::from(78))], &[], None);
     assert_eq!(
         returns,
         vec![Token::Uint(Uint::from(20)), Token::Uint(Uint::from(0))]
     );
 
-    let returns = vm.function(
-        "general_test",
-        &[Token::Uint(Uint::from(259))],
-        &[],
-        0,
-        None,
-    );
+    let returns = vm.function("general_test", &[Token::Uint(Uint::from(259))], &[], None);
     assert_eq!(
         returns,
         vec![Token::Uint(Uint::from(0)), Token::Uint(Uint::from(10))]
@@ -189,7 +182,7 @@ contract c {
         "#,
     );
 
-    vm.constructor("c", &[], 0);
+    vm.constructor("c", &[]);
     let num: Vec<u8> = vec![
         0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
         0x11, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
@@ -199,7 +192,6 @@ contract c {
         "getByte",
         &[Token::Uint(U256::from_big_endian(&num))],
         &[],
-        0,
         None,
     );
     assert_eq!(returns, vec![Token::Uint(U256::from(6))]);
@@ -208,7 +200,6 @@ contract c {
         "divide",
         &[Token::Uint(U256::from(4)), Token::Uint(U256::from(3))],
         &[],
-        0,
         None,
     );
     assert_eq!(
@@ -220,7 +211,6 @@ contract c {
         "divide",
         &[Token::Uint(U256::from(4)), Token::Uint(U256::from(0))],
         &[],
-        0,
         None,
     );
     assert_eq!(
@@ -236,7 +226,6 @@ contract c {
             Token::Uint(U256::from(3)),
         ],
         &[],
-        0,
         None,
     );
     assert_eq!(
@@ -252,7 +241,6 @@ contract c {
             Token::Uint(U256::from(0)),
         ],
         &[],
-        0,
         None,
     );
     assert_eq!(

+ 7 - 7
vscode/src/test/suite/extension.test.ts

@@ -65,7 +65,7 @@ suite('Extension Test Suite', function () {
   // Tests for hover.
   this.timeout(20000);
   const hoverdoc1 = getDocUri('hover1.sol');
-  test('Testing for Hover.', async () => {
+  test('Testing for Hover', async () => {
     await testhover(hoverdoc1);
   });
 });
@@ -89,7 +89,7 @@ async function testhover(docUri: vscode.Uri) {
 
   const contentarr1 = actualhover[0].contents as vscode.MarkdownString[];
 
-  assert.equal(contentarr1[0].value, '(mapping(address => uint256))');
+  assert.strictEqual(contentarr1[0].value, '(mapping(address => uint256))');
 
   const pos2 = new vscode.Position(78, 19);
 
@@ -101,7 +101,7 @@ async function testhover(docUri: vscode.Uri) {
 
   const contentarr2 = actualhover2[0].contents as vscode.MarkdownString[];
 
-  assert.equal(
+  assert.strictEqual(
     contentarr2[0].value,
     '```\nevent SimpleAuction.HighestBidIncreased {\n\taddress bidder,\n\tuint256 amount\n};\n```\n'
   );
@@ -116,7 +116,7 @@ async function testhover(docUri: vscode.Uri) {
 
   const contentarr3 = actualhover3[0].contents as vscode.MarkdownString[];
 
-  assert.equal(contentarr3[0].value, '[built-in]  void require (bool): Abort execution if argument evaulates to false');
+  assert.strictEqual(contentarr3[0].value, '[built-in]  void require (bool): Abort execution if argument evaulates to false');
 }
 
 async function testdiagnos(docUri: vscode.Uri, expecteddiag: vscode.Diagnostic[]) {
@@ -127,9 +127,9 @@ async function testdiagnos(docUri: vscode.Uri, expecteddiag: vscode.Diagnostic[]
   if (actualDiagnostics) {
     expecteddiag.forEach((expectedDiagnostic, i) => {
       const actualDiagnostic = actualDiagnostics[i];
-      assert.equal(actualDiagnostic.message, expectedDiagnostic.message);
-      assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range);
-      assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity);
+      assert.strictEqual(actualDiagnostic.message, expectedDiagnostic.message);
+      assert.deepStrictEqual(actualDiagnostic.range, expectedDiagnostic.range);
+      assert.strictEqual(actualDiagnostic.severity, expectedDiagnostic.severity);
     });
   } else {
     console.error('the diagnostics are incorrect', actualDiagnostics);

+ 4 - 4
vscode/src/testFixture/hover1.sol

@@ -42,7 +42,7 @@ contract SimpleAuction {
     /// together with this transaction.
     /// The value will only be refunded if the
     /// auction is not won.
-    function bid() public payable {
+    function bid(uint value) public {
         // No arguments are necessary, all
         // information is already part of
         // the transaction. The keyword payable
@@ -62,7 +62,7 @@ contract SimpleAuction {
         // function execution including
         // it having received the money).
         require(
-            msg.value > highestBid,
+            value > highestBid,
             "There already is a higher bid."
         );
 
@@ -75,8 +75,8 @@ contract SimpleAuction {
             pendingReturns[highestBidder] += highestBid;
         }
         highestBidder = msg.sender;
-        highestBid = msg.value;
-        emit HighestBidIncreased(msg.sender, msg.value);
+        highestBid = value;
+        emit HighestBidIncreased(msg.sender, value);
     }
 
     /// Withdraw a bid that was overbid.