فهرست منبع

Ensure that address struct members can be saved to state

Signed-off-by: Sean Young <sean@mess.org>
Sean Young 3 سال پیش
والد
کامیت
2faf4277f7
4فایلهای تغییر یافته به همراه909 افزوده شده و 8 حذف شده
  1. 10 4
      src/emit/mod.rs
  2. 15 4
      tests/contract.rs
  3. 728 0
      tests/contract_testcases/ewasm/rubixi.dot
  4. 156 0
      tests/contract_testcases/ewasm/rubixi.sol

+ 10 - 4
src/emit/mod.rs

@@ -956,13 +956,19 @@ pub trait TargetRuntime<'a> {
                 self.set_storage(bin, function, slot_ptr, m);
             }
             ast::Type::Address(_) | ast::Type::Contract(_) => {
-                let address = bin.builder.build_alloca(bin.address_type(ns), "address");
+                if dest.is_pointer_value() {
+                    bin.builder.build_store(slot_ptr, *slot);
 
-                bin.builder.build_store(address, dest.into_array_value());
+                    self.set_storage(bin, function, slot_ptr, dest.into_pointer_value());
+                } else {
+                    let address = bin.builder.build_alloca(bin.address_type(ns), "address");
 
-                bin.builder.build_store(slot_ptr, *slot);
+                    bin.builder.build_store(address, dest.into_array_value());
 
-                self.set_storage(bin, function, slot_ptr, address);
+                    bin.builder.build_store(slot_ptr, *slot);
+
+                    self.set_storage(bin, function, slot_ptr, address);
+                }
             }
             _ => {
                 bin.builder.build_store(slot_ptr, *slot);

+ 15 - 4
tests/contract.rs

@@ -1,4 +1,4 @@
-use solang::{file_resolver::FileResolver, parse_and_resolve, Target};
+use solang::{codegen, file_resolver::FileResolver, parse_and_resolve, sema::ast::Level, Target};
 use std::{
     ffi::OsStr,
     fs::{read_dir, File},
@@ -56,7 +56,19 @@ fn parse_file(path: PathBuf, target: Target) -> io::Result<()> {
     // The files may have had their end of lines mangled on Windows
     cache.set_file_contents(&filename, source.replace("\r\n", "\n"));
 
-    let ns = parse_and_resolve(OsStr::new(&filename), &mut cache, target);
+    let mut ns = parse_and_resolve(OsStr::new(&filename), &mut cache, target);
+
+    if ns.diagnostics.iter().all(|diag| diag.level != Level::Error) {
+        // codegen all the contracts
+        codegen::codegen(
+            &mut ns,
+            &codegen::Options {
+                math_overflow_check: false,
+                opt_level: codegen::OptimizationLevel::Default,
+                ..Default::default()
+            },
+        );
+    }
 
     let mut path = path;
 
@@ -64,10 +76,9 @@ fn parse_file(path: PathBuf, target: Target) -> io::Result<()> {
 
     let generated_dot = ns.dotgraphviz();
 
+    // uncomment the next three lines to regenerate the test data
     // use std::io::Write;
-
     // let mut file = File::create(&path)?;
-
     // file.write_all(generated_dot.as_bytes())?;
 
     let mut file = File::open(&path)?;

+ 728 - 0
tests/contract_testcases/ewasm/rubixi.dot

@@ -0,0 +1,728 @@
+strict digraph "tests/contract_testcases/ewasm/rubixi.sol" {
+	Participant [label="name:Participant\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:25:17-28\nfield name:etherAddress ty:address\nfield name:payout ty:uint256"]
+	contract [label="contract Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:4:2-18"]
+	var [label="variable balance\nvisibility private\ntests/contract_testcases/ewasm/rubixi.sol:7:10-34"]
+	number_literal [label="uint256 literal: 0\ntests/contract_testcases/ewasm/rubixi.sol:7:33-34"]
+	var_6 [label="variable collectedFees\nvisibility private\ntests/contract_testcases/ewasm/rubixi.sol:8:10-40"]
+	number_literal_7 [label="uint256 literal: 0\ntests/contract_testcases/ewasm/rubixi.sol:8:39-40"]
+	var_8 [label="variable feePercent\nvisibility private\ntests/contract_testcases/ewasm/rubixi.sol:9:10-38"]
+	number_literal_9 [label="uint256 literal: 10\ntests/contract_testcases/ewasm/rubixi.sol:9:36-38"]
+	var_10 [label="variable pyramidMultiplier\nvisibility private\ntests/contract_testcases/ewasm/rubixi.sol:10:10-46"]
+	number_literal_11 [label="uint256 literal: 300\ntests/contract_testcases/ewasm/rubixi.sol:10:43-46"]
+	var_12 [label="variable payoutOrder\nvisibility private\ntests/contract_testcases/ewasm/rubixi.sol:11:10-38"]
+	number_literal_13 [label="uint256 literal: 0\ntests/contract_testcases/ewasm/rubixi.sol:11:37-38"]
+	var_14 [label="variable creator\nvisibility private\ntests/contract_testcases/ewasm/rubixi.sol:13:10-33"]
+	var_15 [label="variable participants\nvisibility private\ntests/contract_testcases/ewasm/rubixi.sol:30:10-44"]
+	DynamicPyramid [label="function DynamicPyramid\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:17:10-42\nsignature DynamicPyramid()\nvisibility public\nmutability nonpayable"]
+	expr [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:18:18-38"]
+	assign [label="assign\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:18:18-25"]
+	storage_var [label="storage variable\nRubixi.creator\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:18:18-25"]
+	cast [label="cast address\ntests/contract_testcases/ewasm/rubixi.sol:18:28-38"]
+	builtins [label="builtin Sender\ntests/contract_testcases/ewasm/rubixi.sol:18:28-38"]
+	onlyowner [label="modifier onlyowner\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:21:10-29\nmutability nonpayable"]
+	if [label="if\ntests/contract_testcases/ewasm/rubixi.sol:22:18-47"]
+	equal [label="equal\ntests/contract_testcases/ewasm/rubixi.sol:22:33-35"]
+	cast_25 [label="cast address\ntests/contract_testcases/ewasm/rubixi.sol:22:22-32"]
+	builtins_26 [label="builtin Sender\ntests/contract_testcases/ewasm/rubixi.sol:22:22-32"]
+	storage_load [label="storage load address\ntests/contract_testcases/ewasm/rubixi.sol:22:36-43"]
+	storage_var_28 [label="storage variable\nRubixi.creator\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:22:36-43"]
+	underscore [label="undersore\ntests/contract_testcases/ewasm/rubixi.sol:22:45-46"]
+	node_30 [label="constructor \ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:33:10-25\nsignature ()\nvisibility public\nmutability nonpayable"]
+	expr_31 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:34:18-24"]
+	call_internal_function [label="call internal function\ntests/contract_testcases/ewasm/rubixi.sol:34:18-24"]
+	internal_function [label="function() internal returns (void)\nRubixi.init\ntests/contract_testcases/ewasm/rubixi.sol:34:18-24"]
+	init [label="function init\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:38:10-33\nsignature init()\nvisibility private\nmutability nonpayable"]
+	if_35 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:40:18-43:19"]
+	less [label="less\ntests/contract_testcases/ewasm/rubixi.sol:40:32-33"]
+	cast_37 [label="cast uint128\ntests/contract_testcases/ewasm/rubixi.sol:40:22-31"]
+	builtins_38 [label="builtin Value\ntests/contract_testcases/ewasm/rubixi.sol:40:22-31"]
+	number_literal_39 [label="uint128 literal: 1000000000000000000\ntests/contract_testcases/ewasm/rubixi.sol:40:34-41"]
+	expr_40 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:41:26-52"]
+	assign_41 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:41:40-42"]
+	storage_var_42 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:41:26-39"]
+	add [label="add\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:41:40-42"]
+	storage_load_44 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:41:40-42"]
+	storage_var_45 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:41:26-39"]
+	sign_ext [label="sign extend uint256\ntests/contract_testcases/ewasm/rubixi.sol:41:43-52"]
+	builtins_47 [label="builtin Value\ntests/contract_testcases/ewasm/rubixi.sol:41:43-52"]
+	return [label="return\ntests/contract_testcases/ewasm/rubixi.sol:42:26-32"]
+	var_decl [label="variable decl uint256 _fee\ntests/contract_testcases/ewasm/rubixi.sol:45:18-40"]
+	storage_load_50 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:45:30-40"]
+	storage_var_51 [label="storage variable\nRubixi.feePercent\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:45:30-40"]
+	if_52 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:47:18-55"]
+	more_equal [label="more equal\ntests/contract_testcases/ewasm/rubixi.sol:47:32-34"]
+	cast_54 [label="cast uint128\ntests/contract_testcases/ewasm/rubixi.sol:47:22-31"]
+	builtins_55 [label="builtin Value\ntests/contract_testcases/ewasm/rubixi.sol:47:22-31"]
+	number_literal_56 [label="uint128 literal: 50000000000000000000\ntests/contract_testcases/ewasm/rubixi.sol:47:35-43"]
+	expr_57 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:47:45-54"]
+	assign_58 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:47:50-52"]
+	variable [label="variable: _fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:47:45-49"]
+	divide [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:47:50-52"]
+	variable_61 [label="variable: _fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:47:45-49"]
+	number_literal_62 [label="uint256 literal: 2\ntests/contract_testcases/ewasm/rubixi.sol:47:53-54"]
+	expr_63 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:49:18-33"]
+	call_internal_function_64 [label="call internal function\ntests/contract_testcases/ewasm/rubixi.sol:49:18-33"]
+	internal_function_65 [label="function(uint256) internal returns (void)\nRubixi.addPayout\ntests/contract_testcases/ewasm/rubixi.sol:49:18-33"]
+	variable_66 [label="variable: _fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:49:28-32"]
+	addPayout [label="function addPayout\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:53:10-47\nsignature addPayout(uint256)\nvisibility private\nmutability nonpayable"]
+	parameters [label="parameters\nuint256 _fee"]
+	expr_69 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:55:18-99"]
+	builtins_70 [label="builtin ArrayPush\ntests/contract_testcases/ewasm/rubixi.sol:55:31-35"]
+	storage_var_71 [label="storage variable\nRubixi.participants\nstruct Rubixi.Participant[] storage\ntests/contract_testcases/ewasm/rubixi.sol:55:18-30"]
+	struct_literal [label="struct literal: struct Rubixi.Participant\ntests/contract_testcases/ewasm/rubixi.sol:55:36-98"]
+	cast_73 [label="cast address\ntests/contract_testcases/ewasm/rubixi.sol:55:36-98"]
+	builtins_74 [label="builtin Sender\ntests/contract_testcases/ewasm/rubixi.sol:55:48-58"]
+	divide_75 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:55:92-93"]
+	multiply [label="multiply\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:55:71-72"]
+	sign_ext_77 [label="sign extend uint256\ntests/contract_testcases/ewasm/rubixi.sol:55:61-70"]
+	builtins_78 [label="builtin Value\ntests/contract_testcases/ewasm/rubixi.sol:55:61-70"]
+	storage_load_79 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:55:73-90"]
+	storage_var_80 [label="storage variable\nRubixi.pyramidMultiplier\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:55:73-90"]
+	number_literal_81 [label="uint256 literal: 100\ntests/contract_testcases/ewasm/rubixi.sol:55:94-97"]
+	if_82 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:58:18-59:78"]
+	equal_83 [label="equal\ntests/contract_testcases/ewasm/rubixi.sol:58:42-44"]
+	array_length [label="array length uint256\nelement struct Rubixi.Participant\ntests/contract_testcases/ewasm/rubixi.sol:58:35-41"]
+	storage_var_85 [label="storage variable\nRubixi.participants\nstruct Rubixi.Participant[] storage\ntests/contract_testcases/ewasm/rubixi.sol:58:22-34"]
+	number_literal_86 [label="uint256 literal: 10\ntests/contract_testcases/ewasm/rubixi.sol:58:45-47"]
+	expr_87 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:58:49-72"]
+	assign_88 [label="assign\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:58:49-66"]
+	storage_var_89 [label="storage variable\nRubixi.pyramidMultiplier\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:58:49-66"]
+	number_literal_90 [label="uint256 literal: 200\ntests/contract_testcases/ewasm/rubixi.sol:58:69-72"]
+	if_91 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:59:23-78"]
+	equal_92 [label="equal\ntests/contract_testcases/ewasm/rubixi.sol:59:47-49"]
+	array_length_93 [label="array length uint256\nelement struct Rubixi.Participant\ntests/contract_testcases/ewasm/rubixi.sol:59:40-46"]
+	storage_var_94 [label="storage variable\nRubixi.participants\nstruct Rubixi.Participant[] storage\ntests/contract_testcases/ewasm/rubixi.sol:59:27-39"]
+	number_literal_95 [label="uint256 literal: 25\ntests/contract_testcases/ewasm/rubixi.sol:59:50-52"]
+	expr_96 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:59:54-77"]
+	assign_97 [label="assign\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:59:54-71"]
+	storage_var_98 [label="storage variable\nRubixi.pyramidMultiplier\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:59:54-71"]
+	number_literal_99 [label="uint256 literal: 150\ntests/contract_testcases/ewasm/rubixi.sol:59:74-77"]
+	expr_100 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:62:18-61"]
+	assign_101 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:62:26-28"]
+	storage_var_102 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:62:18-25"]
+	add_103 [label="add\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:62:26-28"]
+	storage_load_104 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:62:26-28"]
+	storage_var_105 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:62:18-25"]
+	divide_106 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:62:56-57"]
+	multiply_107 [label="multiply\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:62:40-41"]
+	sign_ext_108 [label="sign extend uint256\ntests/contract_testcases/ewasm/rubixi.sol:62:30-39"]
+	builtins_109 [label="builtin Value\ntests/contract_testcases/ewasm/rubixi.sol:62:30-39"]
+	subtract [label="subtract\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:62:47-48"]
+	number_literal_111 [label="uint256 literal: 100\ntests/contract_testcases/ewasm/rubixi.sol:62:43-46"]
+	variable_112 [label="variable: _fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:62:49-53"]
+	number_literal_113 [label="uint256 literal: 100\ntests/contract_testcases/ewasm/rubixi.sol:62:58-61"]
+	expr_114 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:63:18-59"]
+	assign_115 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:63:32-34"]
+	storage_var_116 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:63:18-31"]
+	add_117 [label="add\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:63:32-34"]
+	storage_load_118 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:63:32-34"]
+	storage_var_119 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:63:18-31"]
+	divide_120 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:63:54-55"]
+	multiply_121 [label="multiply\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:63:46-47"]
+	sign_ext_122 [label="sign extend uint256\ntests/contract_testcases/ewasm/rubixi.sol:63:36-45"]
+	builtins_123 [label="builtin Value\ntests/contract_testcases/ewasm/rubixi.sol:63:36-45"]
+	variable_124 [label="variable: _fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:63:48-52"]
+	number_literal_125 [label="uint256 literal: 100\ntests/contract_testcases/ewasm/rubixi.sol:63:56-59"]
+	while [label="while\ntests/contract_testcases/ewasm/rubixi.sol:66:18-72:19"]
+	more [label="more\ntests/contract_testcases/ewasm/rubixi.sol:66:33-34"]
+	storage_load_128 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:66:25-32"]
+	storage_var_129 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:66:25-32"]
+	storage_load_130 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:66:35-67"]
+	var_decl_131 [label="variable decl uint256 payoutToSend\ntests/contract_testcases/ewasm/rubixi.sol:67:26-78"]
+	storage_load_132 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:67:72-78"]
+	expr_133 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:70:26-69"]
+	assign_134 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:70:34-36"]
+	storage_var_135 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:70:26-33"]
+	subtract_136 [label="subtract\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:70:34-36"]
+	storage_load_137 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:70:34-36"]
+	storage_var_138 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:70:26-33"]
+	storage_load_139 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:70:37-69"]
+	expr_140 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:71:26-42"]
+	assign_141 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:71:38-40"]
+	storage_var_142 [label="storage variable\nRubixi.payoutOrder\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:71:26-37"]
+	add_143 [label="add\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:71:38-40"]
+	storage_load_144 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:71:38-40"]
+	storage_var_145 [label="storage variable\nRubixi.payoutOrder\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:71:26-37"]
+	number_literal_146 [label="uint256 literal: 1\ntests/contract_testcases/ewasm/rubixi.sol:71:41-42"]
+	collectAllFees [label="function collectAllFees\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:76:10-52\nsignature collectAllFees()\nvisibility public\nmutability nonpayable"]
+	if_148 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:77:18-51"]
+	equal_149 [label="equal\ntests/contract_testcases/ewasm/rubixi.sol:77:36-38"]
+	storage_load_150 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:77:22-35"]
+	storage_var_151 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:77:22-35"]
+	number_literal_152 [label="uint256 literal: 0\ntests/contract_testcases/ewasm/rubixi.sol:77:39-40"]
+	expr_153 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:77:42-50"]
+	builtins_154 [label="builtin Revert\ntests/contract_testcases/ewasm/rubixi.sol:77:42-48"]
+	expr_155 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:79:18-67"]
+	builtins_156 [label="builtin PayableTransfer\ntests/contract_testcases/ewasm/rubixi.sol:79:18-67"]
+	cast_157 [label="cast address payable\ntests/contract_testcases/ewasm/rubixi.sol:79:18-34"]
+	storage_load_158 [label="storage load address\ntests/contract_testcases/ewasm/rubixi.sol:79:18-34"]
+	storage_var_159 [label="storage variable\nRubixi.creator\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:79:26-33"]
+	cast_160 [label="cast uint128\ntests/contract_testcases/ewasm/rubixi.sol:79:44-66"]
+	trunc [label="truncate uint128\ntests/contract_testcases/ewasm/rubixi.sol:79:44-66"]
+	storage_load_162 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:79:44-66"]
+	storage_var_163 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:79:52-65"]
+	expr_164 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:80:18-35"]
+	assign_165 [label="assign\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:80:18-31"]
+	storage_var_166 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:80:18-31"]
+	number_literal_167 [label="uint256 literal: 0\ntests/contract_testcases/ewasm/rubixi.sol:80:34-35"]
+	collectFeesInEther [label="function collectFeesInEther\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:83:10-65\nsignature collectFeesInEther(uint256)\nvisibility public\nmutability nonpayable"]
+	parameters_169 [label="parameters\nuint256 _amt"]
+	expr_170 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:84:18-33"]
+	assign_171 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:84:23-25"]
+	variable_172 [label="variable: _amt\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:84:18-22"]
+	multiply_173 [label="multiply\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:84:23-25"]
+	variable_174 [label="variable: _amt\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:84:18-22"]
+	number_literal_175 [label="uint256 literal: 1000000000000000000\ntests/contract_testcases/ewasm/rubixi.sol:84:26-33"]
+	if_176 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:85:18-61"]
+	more_177 [label="more\ntests/contract_testcases/ewasm/rubixi.sol:85:27-28"]
+	variable_178 [label="variable: _amt\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:85:22-26"]
+	storage_load_179 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:85:29-42"]
+	storage_var_180 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:85:29-42"]
+	expr_181 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:85:44-60"]
+	call_internal_function_182 [label="call internal function\ntests/contract_testcases/ewasm/rubixi.sol:85:44-60"]
+	internal_function_183 [label="function() internal returns (void)\nRubixi.collectAllFees\ntests/contract_testcases/ewasm/rubixi.sol:85:44-60"]
+	if_184 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:87:18-51"]
+	equal_185 [label="equal\ntests/contract_testcases/ewasm/rubixi.sol:87:36-38"]
+	storage_load_186 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:87:22-35"]
+	storage_var_187 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:87:22-35"]
+	number_literal_188 [label="uint256 literal: 0\ntests/contract_testcases/ewasm/rubixi.sol:87:39-40"]
+	expr_189 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:87:42-50"]
+	builtins_190 [label="builtin Revert\ntests/contract_testcases/ewasm/rubixi.sol:87:42-48"]
+	expr_191 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:89:18-58"]
+	builtins_192 [label="builtin PayableTransfer\ntests/contract_testcases/ewasm/rubixi.sol:89:18-58"]
+	cast_193 [label="cast address payable\ntests/contract_testcases/ewasm/rubixi.sol:89:18-34"]
+	storage_load_194 [label="storage load address\ntests/contract_testcases/ewasm/rubixi.sol:89:18-34"]
+	storage_var_195 [label="storage variable\nRubixi.creator\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:89:26-33"]
+	cast_196 [label="cast uint128\ntests/contract_testcases/ewasm/rubixi.sol:89:44-57"]
+	trunc_197 [label="truncate uint128\ntests/contract_testcases/ewasm/rubixi.sol:89:44-57"]
+	variable_198 [label="variable: _amt\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:89:52-56"]
+	expr_199 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:90:18-39"]
+	assign_200 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:90:32-34"]
+	storage_var_201 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:90:18-31"]
+	subtract_202 [label="subtract\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:90:32-34"]
+	storage_load_203 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:90:32-34"]
+	storage_var_204 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:90:18-31"]
+	variable_205 [label="variable: _amt\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:90:35-39"]
+	collectPercentOfFees [label="function collectPercentOfFees\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:93:10-69\nsignature collectPercentOfFees(uint256)\nvisibility public\nmutability nonpayable"]
+	parameters_207 [label="parameters\nuint256 _pcent"]
+	if_208 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:94:18-67"]
+	logical_or [label="logical or\ntests/contract_testcases/ewasm/rubixi.sol:94:41-43"]
+	equal_210 [label="equal\ntests/contract_testcases/ewasm/rubixi.sol:94:36-38"]
+	storage_load_211 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:94:22-35"]
+	storage_var_212 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:94:22-35"]
+	number_literal_213 [label="uint256 literal: 0\ntests/contract_testcases/ewasm/rubixi.sol:94:39-40"]
+	more_214 [label="more\ntests/contract_testcases/ewasm/rubixi.sol:94:51-52"]
+	variable_215 [label="variable: _pcent\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:94:44-50"]
+	number_literal_216 [label="uint256 literal: 100\ntests/contract_testcases/ewasm/rubixi.sol:94:53-56"]
+	expr_217 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:94:58-66"]
+	builtins_218 [label="builtin Revert\ntests/contract_testcases/ewasm/rubixi.sol:94:58-64"]
+	var_decl_219 [label="variable decl uint256 feesToCollect\ntests/contract_testcases/ewasm/rubixi.sol:96:18-67"]
+	multiply_220 [label="multiply\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:96:59-60"]
+	divide_221 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:96:53-54"]
+	storage_load_222 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:96:39-52"]
+	storage_var_223 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:96:39-52"]
+	number_literal_224 [label="uint256 literal: 100\ntests/contract_testcases/ewasm/rubixi.sol:96:55-58"]
+	variable_225 [label="variable: _pcent\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:96:61-67"]
+	expr_226 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:97:18-67"]
+	builtins_227 [label="builtin PayableTransfer\ntests/contract_testcases/ewasm/rubixi.sol:97:18-67"]
+	cast_228 [label="cast address payable\ntests/contract_testcases/ewasm/rubixi.sol:97:18-34"]
+	storage_load_229 [label="storage load address\ntests/contract_testcases/ewasm/rubixi.sol:97:18-34"]
+	storage_var_230 [label="storage variable\nRubixi.creator\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:97:26-33"]
+	cast_231 [label="cast uint128\ntests/contract_testcases/ewasm/rubixi.sol:97:44-66"]
+	trunc_232 [label="truncate uint128\ntests/contract_testcases/ewasm/rubixi.sol:97:44-66"]
+	variable_233 [label="variable: feesToCollect\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:97:52-65"]
+	expr_234 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:98:18-48"]
+	assign_235 [label="assign\nvoid\ntests/contract_testcases/ewasm/rubixi.sol:98:32-34"]
+	storage_var_236 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:98:18-31"]
+	subtract_237 [label="subtract\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:98:32-34"]
+	storage_load_238 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:98:32-34"]
+	storage_var_239 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:98:18-31"]
+	variable_240 [label="variable: feesToCollect\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:98:35-48"]
+	changeOwner [label="function changeOwner\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:102:10-63\nsignature changeOwner(address)\nvisibility public\nmutability nonpayable"]
+	parameters_242 [label="parameters\naddress _owner"]
+	expr_243 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:103:18-34"]
+	assign_244 [label="assign\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:103:18-25"]
+	storage_var_245 [label="storage variable\nRubixi.creator\naddress storage\ntests/contract_testcases/ewasm/rubixi.sol:103:18-25"]
+	variable_246 [label="variable: _owner\naddress\ntests/contract_testcases/ewasm/rubixi.sol:103:28-34"]
+	changeMultiplier [label="function changeMultiplier\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:106:10-64\nsignature changeMultiplier(uint256)\nvisibility public\nmutability nonpayable"]
+	parameters_248 [label="parameters\nuint256 _mult"]
+	if_249 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:107:18-59"]
+	logical_or_250 [label="logical or\ntests/contract_testcases/ewasm/rubixi.sol:107:34-36"]
+	more_251 [label="more\ntests/contract_testcases/ewasm/rubixi.sol:107:28-29"]
+	variable_252 [label="variable: _mult\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:107:22-27"]
+	number_literal_253 [label="uint256 literal: 300\ntests/contract_testcases/ewasm/rubixi.sol:107:30-33"]
+	less_254 [label="less\ntests/contract_testcases/ewasm/rubixi.sol:107:43-44"]
+	variable_255 [label="variable: _mult\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:107:37-42"]
+	number_literal_256 [label="uint256 literal: 120\ntests/contract_testcases/ewasm/rubixi.sol:107:45-48"]
+	expr_257 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:107:50-58"]
+	builtins_258 [label="builtin Revert\ntests/contract_testcases/ewasm/rubixi.sol:107:50-56"]
+	expr_259 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:109:18-43"]
+	assign_260 [label="assign\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:109:18-35"]
+	storage_var_261 [label="storage variable\nRubixi.pyramidMultiplier\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:109:18-35"]
+	variable_262 [label="variable: _mult\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:109:38-43"]
+	changeFeePercentage [label="function changeFeePercentage\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:112:10-66\nsignature changeFeePercentage(uint256)\nvisibility public\nmutability nonpayable"]
+	parameters_264 [label="parameters\nuint256 _fee"]
+	if_265 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:113:18-42"]
+	more_266 [label="more\ntests/contract_testcases/ewasm/rubixi.sol:113:27-28"]
+	variable_267 [label="variable: _fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:113:22-26"]
+	number_literal_268 [label="uint256 literal: 10\ntests/contract_testcases/ewasm/rubixi.sol:113:29-31"]
+	expr_269 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:113:33-41"]
+	builtins_270 [label="builtin Revert\ntests/contract_testcases/ewasm/rubixi.sol:113:33-39"]
+	expr_271 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:115:18-35"]
+	assign_272 [label="assign\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:115:18-28"]
+	storage_var_273 [label="storage variable\nRubixi.feePercent\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:115:18-28"]
+	variable_274 [label="variable: _fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:115:31-35"]
+	currentMultiplier [label="function currentMultiplier\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:119:10-95\nsignature currentMultiplier()\nvisibility public\nmutability view"]
+	returns [label="returns\nuint256 multiplier\nstring info"]
+	expr_277 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:120:18-48"]
+	assign_278 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:120:29-30"]
+	variable_279 [label="variable: multiplier\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:120:18-28"]
+	storage_load_280 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:120:31-48"]
+	storage_var_281 [label="storage variable\nRubixi.pyramidMultiplier\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:120:31-48"]
+	expr_282 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:121:18-314"]
+	assign_283 [label="assign\nstring\ntests/contract_testcases/ewasm/rubixi.sol:121:23-24"]
+	variable_284 [label="variable: info\nstring\ntests/contract_testcases/ewasm/rubixi.sol:121:18-22"]
+	alloc_array [label="alloc array string\ninitializer: 54686973206d756c7469706c696572206170706c69657320746f20796f7520617320736f6f6e206173207472616e73616374696f6e2069732072656365697665642c206d6179206265206c6f776572656420746f2068617374656e207061796f757473206f7220696e63726561736564206966207061796f75747320617265206661737420656e6f7567682e2044756520746f206e6f20666c6f6174206f7220646563696d616c732c206d756c7469706c696572206973207831303020666f722061206672616374696f6e616c206d756c7469706c69657220652e672e203235302069732061637475616c6c79206120322e3578206d756c7469706c6965722e20436170706564206174203378206d617820616e6420312e3278206d696e2e\ntests/contract_testcases/ewasm/rubixi.sol:121:25-314"]
+	number_literal_286 [label="uint32 literal: 287\ntests/contract_testcases/ewasm/rubixi.sol:121:25-314"]
+	currentFeePercentage [label="function currentFeePercentage\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:124:10-91\nsignature currentFeePercentage()\nvisibility public\nmutability view"]
+	returns_288 [label="returns\nuint256 fee\nstring info"]
+	expr_289 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:125:18-34"]
+	assign_290 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:125:22-23"]
+	variable_291 [label="variable: fee\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:125:18-21"]
+	storage_load_292 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:125:24-34"]
+	storage_var_293 [label="storage variable\nRubixi.feePercent\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:125:24-34"]
+	expr_294 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:126:18-159"]
+	assign_295 [label="assign\nstring\ntests/contract_testcases/ewasm/rubixi.sol:126:23-24"]
+	variable_296 [label="variable: info\nstring\ntests/contract_testcases/ewasm/rubixi.sol:126:18-22"]
+	alloc_array_297 [label="alloc array string\ninitializer: 53686f776e20696e202520666f726d2e204665652069732068616c766564283530252920666f7220616d6f756e747320657175616c206f722067726561746572207468616e203530206574686572732e2028466565206d6179206368616e67652c206275742069732063617070656420746f2061206d6178696d756d206f662031302529\ntests/contract_testcases/ewasm/rubixi.sol:126:25-159"]
+	number_literal_298 [label="uint32 literal: 132\ntests/contract_testcases/ewasm/rubixi.sol:126:25-159"]
+	currentPyramidBalanceApproximately [label="function currentPyramidBalanceApproximately\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:129:10-116\nsignature currentPyramidBalanceApproximately()\nvisibility public\nmutability view"]
+	returns_300 [label="returns\nuint256 pyramidBalance\nstring info"]
+	expr_301 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:130:18-52"]
+	assign_302 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:130:33-34"]
+	variable_303 [label="variable: pyramidBalance\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:130:18-32"]
+	divide_304 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:130:43-44"]
+	storage_load_305 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:130:35-42"]
+	storage_var_306 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:130:35-42"]
+	number_literal_307 [label="uint256 literal: 1000000000000000000\ntests/contract_testcases/ewasm/rubixi.sol:130:45-52"]
+	expr_308 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:131:18-229"]
+	assign_309 [label="assign\nstring\ntests/contract_testcases/ewasm/rubixi.sol:131:23-24"]
+	variable_310 [label="variable: info\nstring\ntests/contract_testcases/ewasm/rubixi.sol:131:18-22"]
+	alloc_array_311 [label="alloc array string\ninitializer: 416c6c2062616c616e63652076616c75657320617265206d6561737572656420696e204574686572732c206e6f746520746861742064756520746f206e6f20646563696d616c20706c6163696e672c2074686573652076616c7565732073686f7720757020617320696e746567657273206f6e6c792c2077697468696e2074686520636f6e747261637420697473656c6620796f752077696c6c206765742074686520657861637420646563696d616c2076616c756520796f752061726520737570706f73656420746f\ntests/contract_testcases/ewasm/rubixi.sol:131:25-229"]
+	number_literal_312 [label="uint32 literal: 202\ntests/contract_testcases/ewasm/rubixi.sol:131:25-229"]
+	nextPayoutWhenPyramidBalanceTotalsApproximately [label="function nextPayoutWhenPyramidBalanceTotalsApproximately\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:134:10-108\nsignature nextPayoutWhenPyramidBalanceTotalsApproximately()\nvisibility public\nmutability view"]
+	returns_314 [label="returns\nuint256 balancePayout"]
+	expr_315 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:135:18-76"]
+	assign_316 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:135:32-33"]
+	variable_317 [label="variable: balancePayout\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:135:18-31"]
+	divide_318 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:135:67-68"]
+	storage_load_319 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:135:34-66"]
+	number_literal_320 [label="uint256 literal: 1000000000000000000\ntests/contract_testcases/ewasm/rubixi.sol:135:69-76"]
+	feesSeperateFromBalanceApproximately [label="function feesSeperateFromBalanceApproximately\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:138:10-88\nsignature feesSeperateFromBalanceApproximately()\nvisibility public\nmutability view"]
+	returns_322 [label="returns\nuint256 fees"]
+	expr_323 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:139:18-48"]
+	assign_324 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:139:23-24"]
+	variable_325 [label="variable: fees\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:139:18-22"]
+	divide_326 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:139:39-40"]
+	storage_load_327 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:139:25-38"]
+	storage_var_328 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:139:25-38"]
+	number_literal_329 [label="uint256 literal: 1000000000000000000\ntests/contract_testcases/ewasm/rubixi.sol:139:41-48"]
+	totalParticipants [label="function totalParticipants\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:142:10-70\nsignature totalParticipants()\nvisibility public\nmutability view"]
+	returns_331 [label="returns\nuint256 count"]
+	expr_332 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:143:18-45"]
+	assign_333 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:143:24-25"]
+	variable_334 [label="variable: count\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:143:18-23"]
+	array_length_335 [label="array length uint256\nelement struct Rubixi.Participant\ntests/contract_testcases/ewasm/rubixi.sol:143:39-45"]
+	storage_var_336 [label="storage variable\nRubixi.participants\nstruct Rubixi.Participant[] storage\ntests/contract_testcases/ewasm/rubixi.sol:143:26-38"]
+	numberOfParticipantsWaitingForPayout [label="function numberOfParticipantsWaitingForPayout\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:146:10-89\nsignature numberOfParticipantsWaitingForPayout()\nvisibility public\nmutability view"]
+	returns_338 [label="returns\nuint256 count"]
+	expr_339 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:147:18-59"]
+	assign_340 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:147:24-25"]
+	variable_341 [label="variable: count\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:147:18-23"]
+	subtract_342 [label="subtract\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:147:46-47"]
+	array_length_343 [label="array length uint256\nelement struct Rubixi.Participant\ntests/contract_testcases/ewasm/rubixi.sol:147:39-45"]
+	storage_var_344 [label="storage variable\nRubixi.participants\nstruct Rubixi.Participant[] storage\ntests/contract_testcases/ewasm/rubixi.sol:147:26-38"]
+	storage_load_345 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:147:48-59"]
+	storage_var_346 [label="storage variable\nRubixi.payoutOrder\nuint256 storage\ntests/contract_testcases/ewasm/rubixi.sol:147:48-59"]
+	participantDetails [label="function participantDetails\ncontract: Rubixi\ntests/contract_testcases/ewasm/rubixi.sol:150:10-108\nsignature participantDetails(uint256)\nvisibility public\nmutability view"]
+	parameters_348 [label="parameters\nuint256 orderInPyramid"]
+	returns_349 [label="returns\naddress Address\nuint256 Payout"]
+	if_350 [label="if\ntests/contract_testcases/ewasm/rubixi.sol:151:18-154:19"]
+	less_equal [label="less equal\ntests/contract_testcases/ewasm/rubixi.sol:151:37-39"]
+	variable_352 [label="variable: orderInPyramid\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:151:22-36"]
+	array_length_353 [label="array length uint256\nelement struct Rubixi.Participant\ntests/contract_testcases/ewasm/rubixi.sol:151:53-59"]
+	storage_var_354 [label="storage variable\nRubixi.participants\nstruct Rubixi.Participant[] storage\ntests/contract_testcases/ewasm/rubixi.sol:151:40-52"]
+	expr_355 [label="expression\ntests/contract_testcases/ewasm/rubixi.sol:153:26-80"]
+	assign_356 [label="assign\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:153:33-34"]
+	variable_357 [label="variable: Payout\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:153:26-32"]
+	divide_358 [label="divide\nuint256\ntests/contract_testcases/ewasm/rubixi.sol:153:71-72"]
+	storage_load_359 [label="storage load uint256\ntests/contract_testcases/ewasm/rubixi.sol:153:35-70"]
+	number_literal_360 [label="uint256 literal: 1000000000000000000\ntests/contract_testcases/ewasm/rubixi.sol:153:73-80"]
+	diagnostic [label="pragma ‘solidity’ is ignored\nlevel Debug\ntests/contract_testcases/ewasm/rubixi.sol:2:9-25"]
+	diagnostic_363 [label="found contract ‘Rubixi’\nlevel Debug\ntests/contract_testcases/ewasm/rubixi.sol:4:2-18"]
+	diagnostic_364 [label="local variable 'payoutToSend' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/ewasm/rubixi.sol:67:31-43"]
+	diagnostic_365 [label="return variable 'Address' has never been assigned\nlevel Warning\ntests/contract_testcases/ewasm/rubixi.sol:150:87-94"]
+	structs -> Participant
+	contracts -> contract
+	contract -> var [label="variable"]
+	var -> number_literal [label="initializer"]
+	contract -> var_6 [label="variable"]
+	var_6 -> number_literal_7 [label="initializer"]
+	contract -> var_8 [label="variable"]
+	var_8 -> number_literal_9 [label="initializer"]
+	contract -> var_10 [label="variable"]
+	var_10 -> number_literal_11 [label="initializer"]
+	contract -> var_12 [label="variable"]
+	var_12 -> number_literal_13 [label="initializer"]
+	contract -> var_14 [label="variable"]
+	contract -> var_15 [label="variable"]
+	contract -> DynamicPyramid [label="function"]
+	DynamicPyramid -> expr [label="body"]
+	expr -> assign [label="expr"]
+	assign -> storage_var [label="left"]
+	assign -> cast [label="right"]
+	cast -> builtins [label="expr"]
+	contract -> onlyowner [label="modifier"]
+	onlyowner -> if [label="body"]
+	if -> equal [label="cond"]
+	equal -> cast_25 [label="left"]
+	cast_25 -> builtins_26 [label="expr"]
+	equal -> storage_load [label="right"]
+	storage_load -> storage_var_28 [label="expr"]
+	if -> underscore [label="then"]
+	contract -> node_30 [label="constructor"]
+	node_30 -> expr_31 [label="body"]
+	expr_31 -> call_internal_function [label="expr"]
+	call_internal_function -> internal_function [label="function"]
+	contract -> init [label="function"]
+	init -> if_35 [label="body"]
+	if_35 -> less [label="cond"]
+	less -> cast_37 [label="left"]
+	cast_37 -> builtins_38 [label="expr"]
+	less -> number_literal_39 [label="right"]
+	if_35 -> expr_40 [label="then"]
+	expr_40 -> assign_41 [label="expr"]
+	assign_41 -> storage_var_42 [label="left"]
+	assign_41 -> add [label="right"]
+	add -> storage_load_44 [label="left"]
+	storage_load_44 -> storage_var_45 [label="expr"]
+	add -> sign_ext [label="right"]
+	sign_ext -> builtins_47 [label="expr"]
+	expr_40 -> return [label="next"]
+	if_35 -> var_decl [label="next"]
+	var_decl -> storage_load_50 [label="init"]
+	storage_load_50 -> storage_var_51 [label="expr"]
+	var_decl -> if_52 [label="next"]
+	if_52 -> more_equal [label="cond"]
+	more_equal -> cast_54 [label="left"]
+	cast_54 -> builtins_55 [label="expr"]
+	more_equal -> number_literal_56 [label="right"]
+	if_52 -> expr_57 [label="then"]
+	expr_57 -> assign_58 [label="expr"]
+	assign_58 -> variable [label="left"]
+	assign_58 -> divide [label="right"]
+	divide -> variable_61 [label="left"]
+	divide -> number_literal_62 [label="right"]
+	if_52 -> expr_63 [label="next"]
+	expr_63 -> call_internal_function_64 [label="expr"]
+	call_internal_function_64 -> internal_function_65 [label="function"]
+	call_internal_function_64 -> variable_66 [label="arg #0"]
+	contract -> addPayout [label="function"]
+	addPayout -> parameters [label="parameters"]
+	addPayout -> expr_69 [label="body"]
+	expr_69 -> builtins_70 [label="expr"]
+	builtins_70 -> storage_var_71 [label="arg #0"]
+	builtins_70 -> struct_literal [label="arg #1"]
+	struct_literal -> cast_73 [label="arg #0"]
+	cast_73 -> builtins_74 [label="expr"]
+	struct_literal -> divide_75 [label="arg #1"]
+	divide_75 -> multiply [label="left"]
+	multiply -> sign_ext_77 [label="left"]
+	sign_ext_77 -> builtins_78 [label="expr"]
+	multiply -> storage_load_79 [label="right"]
+	storage_load_79 -> storage_var_80 [label="expr"]
+	divide_75 -> number_literal_81 [label="right"]
+	expr_69 -> if_82 [label="next"]
+	if_82 -> equal_83 [label="cond"]
+	equal_83 -> array_length [label="left"]
+	array_length -> storage_var_85 [label="array"]
+	equal_83 -> number_literal_86 [label="right"]
+	if_82 -> expr_87 [label="then"]
+	expr_87 -> assign_88 [label="expr"]
+	assign_88 -> storage_var_89 [label="left"]
+	assign_88 -> number_literal_90 [label="right"]
+	if_82 -> if_91 [label="else"]
+	if_91 -> equal_92 [label="cond"]
+	equal_92 -> array_length_93 [label="left"]
+	array_length_93 -> storage_var_94 [label="array"]
+	equal_92 -> number_literal_95 [label="right"]
+	if_91 -> expr_96 [label="then"]
+	expr_96 -> assign_97 [label="expr"]
+	assign_97 -> storage_var_98 [label="left"]
+	assign_97 -> number_literal_99 [label="right"]
+	if_82 -> expr_100 [label="next"]
+	expr_100 -> assign_101 [label="expr"]
+	assign_101 -> storage_var_102 [label="left"]
+	assign_101 -> add_103 [label="right"]
+	add_103 -> storage_load_104 [label="left"]
+	storage_load_104 -> storage_var_105 [label="expr"]
+	add_103 -> divide_106 [label="right"]
+	divide_106 -> multiply_107 [label="left"]
+	multiply_107 -> sign_ext_108 [label="left"]
+	sign_ext_108 -> builtins_109 [label="expr"]
+	multiply_107 -> subtract [label="right"]
+	subtract -> number_literal_111 [label="left"]
+	subtract -> variable_112 [label="right"]
+	divide_106 -> number_literal_113 [label="right"]
+	expr_100 -> expr_114 [label="next"]
+	expr_114 -> assign_115 [label="expr"]
+	assign_115 -> storage_var_116 [label="left"]
+	assign_115 -> add_117 [label="right"]
+	add_117 -> storage_load_118 [label="left"]
+	storage_load_118 -> storage_var_119 [label="expr"]
+	add_117 -> divide_120 [label="right"]
+	divide_120 -> multiply_121 [label="left"]
+	multiply_121 -> sign_ext_122 [label="left"]
+	sign_ext_122 -> builtins_123 [label="expr"]
+	multiply_121 -> variable_124 [label="right"]
+	divide_120 -> number_literal_125 [label="right"]
+	expr_114 -> while [label="next"]
+	while -> more [label="cond"]
+	more -> storage_load_128 [label="left"]
+	storage_load_128 -> storage_var_129 [label="expr"]
+	more -> storage_load_130 [label="right"]
+	while -> var_decl_131 [label="body"]
+	var_decl_131 -> storage_load_132 [label="init"]
+	var_decl_131 -> expr_133 [label="next"]
+	expr_133 -> assign_134 [label="expr"]
+	assign_134 -> storage_var_135 [label="left"]
+	assign_134 -> subtract_136 [label="right"]
+	subtract_136 -> storage_load_137 [label="left"]
+	storage_load_137 -> storage_var_138 [label="expr"]
+	subtract_136 -> storage_load_139 [label="right"]
+	expr_133 -> expr_140 [label="next"]
+	expr_140 -> assign_141 [label="expr"]
+	assign_141 -> storage_var_142 [label="left"]
+	assign_141 -> add_143 [label="right"]
+	add_143 -> storage_load_144 [label="left"]
+	storage_load_144 -> storage_var_145 [label="expr"]
+	add_143 -> number_literal_146 [label="right"]
+	contract -> collectAllFees [label="function"]
+	collectAllFees -> if_148 [label="body"]
+	if_148 -> equal_149 [label="cond"]
+	equal_149 -> storage_load_150 [label="left"]
+	storage_load_150 -> storage_var_151 [label="expr"]
+	equal_149 -> number_literal_152 [label="right"]
+	if_148 -> expr_153 [label="then"]
+	expr_153 -> builtins_154 [label="expr"]
+	if_148 -> expr_155 [label="next"]
+	expr_155 -> builtins_156 [label="expr"]
+	builtins_156 -> cast_157 [label="arg #0"]
+	cast_157 -> storage_load_158 [label="expr"]
+	storage_load_158 -> storage_var_159 [label="expr"]
+	builtins_156 -> cast_160 [label="arg #1"]
+	cast_160 -> trunc [label="expr"]
+	trunc -> storage_load_162 [label="expr"]
+	storage_load_162 -> storage_var_163 [label="expr"]
+	expr_155 -> expr_164 [label="next"]
+	expr_164 -> assign_165 [label="expr"]
+	assign_165 -> storage_var_166 [label="left"]
+	assign_165 -> number_literal_167 [label="right"]
+	contract -> collectFeesInEther [label="function"]
+	collectFeesInEther -> parameters_169 [label="parameters"]
+	collectFeesInEther -> expr_170 [label="body"]
+	expr_170 -> assign_171 [label="expr"]
+	assign_171 -> variable_172 [label="left"]
+	assign_171 -> multiply_173 [label="right"]
+	multiply_173 -> variable_174 [label="left"]
+	multiply_173 -> number_literal_175 [label="right"]
+	expr_170 -> if_176 [label="next"]
+	if_176 -> more_177 [label="cond"]
+	more_177 -> variable_178 [label="left"]
+	more_177 -> storage_load_179 [label="right"]
+	storage_load_179 -> storage_var_180 [label="expr"]
+	if_176 -> expr_181 [label="then"]
+	expr_181 -> call_internal_function_182 [label="expr"]
+	call_internal_function_182 -> internal_function_183 [label="function"]
+	if_176 -> if_184 [label="next"]
+	if_184 -> equal_185 [label="cond"]
+	equal_185 -> storage_load_186 [label="left"]
+	storage_load_186 -> storage_var_187 [label="expr"]
+	equal_185 -> number_literal_188 [label="right"]
+	if_184 -> expr_189 [label="then"]
+	expr_189 -> builtins_190 [label="expr"]
+	if_184 -> expr_191 [label="next"]
+	expr_191 -> builtins_192 [label="expr"]
+	builtins_192 -> cast_193 [label="arg #0"]
+	cast_193 -> storage_load_194 [label="expr"]
+	storage_load_194 -> storage_var_195 [label="expr"]
+	builtins_192 -> cast_196 [label="arg #1"]
+	cast_196 -> trunc_197 [label="expr"]
+	trunc_197 -> variable_198 [label="expr"]
+	expr_191 -> expr_199 [label="next"]
+	expr_199 -> assign_200 [label="expr"]
+	assign_200 -> storage_var_201 [label="left"]
+	assign_200 -> subtract_202 [label="right"]
+	subtract_202 -> storage_load_203 [label="left"]
+	storage_load_203 -> storage_var_204 [label="expr"]
+	subtract_202 -> variable_205 [label="right"]
+	contract -> collectPercentOfFees [label="function"]
+	collectPercentOfFees -> parameters_207 [label="parameters"]
+	collectPercentOfFees -> if_208 [label="body"]
+	if_208 -> logical_or [label="cond"]
+	logical_or -> equal_210 [label="left"]
+	equal_210 -> storage_load_211 [label="left"]
+	storage_load_211 -> storage_var_212 [label="expr"]
+	equal_210 -> number_literal_213 [label="right"]
+	logical_or -> more_214 [label="right"]
+	more_214 -> variable_215 [label="left"]
+	more_214 -> number_literal_216 [label="right"]
+	if_208 -> expr_217 [label="then"]
+	expr_217 -> builtins_218 [label="expr"]
+	if_208 -> var_decl_219 [label="next"]
+	var_decl_219 -> multiply_220 [label="init"]
+	multiply_220 -> divide_221 [label="left"]
+	divide_221 -> storage_load_222 [label="left"]
+	storage_load_222 -> storage_var_223 [label="expr"]
+	divide_221 -> number_literal_224 [label="right"]
+	multiply_220 -> variable_225 [label="right"]
+	var_decl_219 -> expr_226 [label="next"]
+	expr_226 -> builtins_227 [label="expr"]
+	builtins_227 -> cast_228 [label="arg #0"]
+	cast_228 -> storage_load_229 [label="expr"]
+	storage_load_229 -> storage_var_230 [label="expr"]
+	builtins_227 -> cast_231 [label="arg #1"]
+	cast_231 -> trunc_232 [label="expr"]
+	trunc_232 -> variable_233 [label="expr"]
+	expr_226 -> expr_234 [label="next"]
+	expr_234 -> assign_235 [label="expr"]
+	assign_235 -> storage_var_236 [label="left"]
+	assign_235 -> subtract_237 [label="right"]
+	subtract_237 -> storage_load_238 [label="left"]
+	storage_load_238 -> storage_var_239 [label="expr"]
+	subtract_237 -> variable_240 [label="right"]
+	contract -> changeOwner [label="function"]
+	changeOwner -> parameters_242 [label="parameters"]
+	changeOwner -> expr_243 [label="body"]
+	expr_243 -> assign_244 [label="expr"]
+	assign_244 -> storage_var_245 [label="left"]
+	assign_244 -> variable_246 [label="right"]
+	contract -> changeMultiplier [label="function"]
+	changeMultiplier -> parameters_248 [label="parameters"]
+	changeMultiplier -> if_249 [label="body"]
+	if_249 -> logical_or_250 [label="cond"]
+	logical_or_250 -> more_251 [label="left"]
+	more_251 -> variable_252 [label="left"]
+	more_251 -> number_literal_253 [label="right"]
+	logical_or_250 -> less_254 [label="right"]
+	less_254 -> variable_255 [label="left"]
+	less_254 -> number_literal_256 [label="right"]
+	if_249 -> expr_257 [label="then"]
+	expr_257 -> builtins_258 [label="expr"]
+	if_249 -> expr_259 [label="next"]
+	expr_259 -> assign_260 [label="expr"]
+	assign_260 -> storage_var_261 [label="left"]
+	assign_260 -> variable_262 [label="right"]
+	contract -> changeFeePercentage [label="function"]
+	changeFeePercentage -> parameters_264 [label="parameters"]
+	changeFeePercentage -> if_265 [label="body"]
+	if_265 -> more_266 [label="cond"]
+	more_266 -> variable_267 [label="left"]
+	more_266 -> number_literal_268 [label="right"]
+	if_265 -> expr_269 [label="then"]
+	expr_269 -> builtins_270 [label="expr"]
+	if_265 -> expr_271 [label="next"]
+	expr_271 -> assign_272 [label="expr"]
+	assign_272 -> storage_var_273 [label="left"]
+	assign_272 -> variable_274 [label="right"]
+	contract -> currentMultiplier [label="function"]
+	currentMultiplier -> returns [label="returns"]
+	currentMultiplier -> expr_277 [label="body"]
+	expr_277 -> assign_278 [label="expr"]
+	assign_278 -> variable_279 [label="left"]
+	assign_278 -> storage_load_280 [label="right"]
+	storage_load_280 -> storage_var_281 [label="expr"]
+	expr_277 -> expr_282 [label="next"]
+	expr_282 -> assign_283 [label="expr"]
+	assign_283 -> variable_284 [label="left"]
+	assign_283 -> alloc_array [label="right"]
+	alloc_array -> number_literal_286 [label="length"]
+	contract -> currentFeePercentage [label="function"]
+	currentFeePercentage -> returns_288 [label="returns"]
+	currentFeePercentage -> expr_289 [label="body"]
+	expr_289 -> assign_290 [label="expr"]
+	assign_290 -> variable_291 [label="left"]
+	assign_290 -> storage_load_292 [label="right"]
+	storage_load_292 -> storage_var_293 [label="expr"]
+	expr_289 -> expr_294 [label="next"]
+	expr_294 -> assign_295 [label="expr"]
+	assign_295 -> variable_296 [label="left"]
+	assign_295 -> alloc_array_297 [label="right"]
+	alloc_array_297 -> number_literal_298 [label="length"]
+	contract -> currentPyramidBalanceApproximately [label="function"]
+	currentPyramidBalanceApproximately -> returns_300 [label="returns"]
+	currentPyramidBalanceApproximately -> expr_301 [label="body"]
+	expr_301 -> assign_302 [label="expr"]
+	assign_302 -> variable_303 [label="left"]
+	assign_302 -> divide_304 [label="right"]
+	divide_304 -> storage_load_305 [label="left"]
+	storage_load_305 -> storage_var_306 [label="expr"]
+	divide_304 -> number_literal_307 [label="right"]
+	expr_301 -> expr_308 [label="next"]
+	expr_308 -> assign_309 [label="expr"]
+	assign_309 -> variable_310 [label="left"]
+	assign_309 -> alloc_array_311 [label="right"]
+	alloc_array_311 -> number_literal_312 [label="length"]
+	contract -> nextPayoutWhenPyramidBalanceTotalsApproximately [label="function"]
+	nextPayoutWhenPyramidBalanceTotalsApproximately -> returns_314 [label="returns"]
+	nextPayoutWhenPyramidBalanceTotalsApproximately -> expr_315 [label="body"]
+	expr_315 -> assign_316 [label="expr"]
+	assign_316 -> variable_317 [label="left"]
+	assign_316 -> divide_318 [label="right"]
+	divide_318 -> storage_load_319 [label="left"]
+	divide_318 -> number_literal_320 [label="right"]
+	contract -> feesSeperateFromBalanceApproximately [label="function"]
+	feesSeperateFromBalanceApproximately -> returns_322 [label="returns"]
+	feesSeperateFromBalanceApproximately -> expr_323 [label="body"]
+	expr_323 -> assign_324 [label="expr"]
+	assign_324 -> variable_325 [label="left"]
+	assign_324 -> divide_326 [label="right"]
+	divide_326 -> storage_load_327 [label="left"]
+	storage_load_327 -> storage_var_328 [label="expr"]
+	divide_326 -> number_literal_329 [label="right"]
+	contract -> totalParticipants [label="function"]
+	totalParticipants -> returns_331 [label="returns"]
+	totalParticipants -> expr_332 [label="body"]
+	expr_332 -> assign_333 [label="expr"]
+	assign_333 -> variable_334 [label="left"]
+	assign_333 -> array_length_335 [label="right"]
+	array_length_335 -> storage_var_336 [label="array"]
+	contract -> numberOfParticipantsWaitingForPayout [label="function"]
+	numberOfParticipantsWaitingForPayout -> returns_338 [label="returns"]
+	numberOfParticipantsWaitingForPayout -> expr_339 [label="body"]
+	expr_339 -> assign_340 [label="expr"]
+	assign_340 -> variable_341 [label="left"]
+	assign_340 -> subtract_342 [label="right"]
+	subtract_342 -> array_length_343 [label="left"]
+	array_length_343 -> storage_var_344 [label="array"]
+	subtract_342 -> storage_load_345 [label="right"]
+	storage_load_345 -> storage_var_346 [label="expr"]
+	contract -> participantDetails [label="function"]
+	participantDetails -> parameters_348 [label="parameters"]
+	participantDetails -> returns_349 [label="returns"]
+	participantDetails -> if_350 [label="body"]
+	if_350 -> less_equal [label="cond"]
+	less_equal -> variable_352 [label="left"]
+	less_equal -> array_length_353 [label="right"]
+	array_length_353 -> storage_var_354 [label="array"]
+	if_350 -> expr_355 [label="then"]
+	expr_355 -> assign_356 [label="expr"]
+	assign_356 -> variable_357 [label="left"]
+	assign_356 -> divide_358 [label="right"]
+	divide_358 -> storage_load_359 [label="left"]
+	divide_358 -> number_literal_360 [label="right"]
+	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_363 [label="Debug"]
+	diagnostics -> diagnostic_364 [label="Warning"]
+	diagnostics -> diagnostic_365 [label="Warning"]
+}

+ 156 - 0
tests/contract_testcases/ewasm/rubixi.sol

@@ -0,0 +1,156 @@
+ // rubixi.sol
+ pragma solidity ^0.8.11;
+
+ contract Rubixi {
+
+         //Declare variables for storage critical to contract
+         uint private balance = 0;
+         uint private collectedFees = 0;
+         uint private feePercent = 10;
+         uint private pyramidMultiplier = 300;
+         uint private payoutOrder = 0;
+
+         address private creator;
+
+         //Sets creator
+         // <yes> <report> ACCESS_CONTROL
+         function DynamicPyramid() public {
+                 creator = msg.sender; //anyone can call this
+         }
+
+         modifier onlyowner {
+                 if (msg.sender == creator) _;
+         }
+
+         struct Participant {
+                 address etherAddress;
+                 uint payout;
+         }
+
+         Participant[] private participants;
+
+         //Fallback function
+         constructor () {
+                 init();
+         }
+
+         //init function run on fallback
+         function init() private {
+                 //Ensures only tx with value of 1 ether or greater are processed and added to pyramid
+                 if (msg.value < 1 ether) {
+                         collectedFees += msg.value;
+                         return;
+                 }
+
+                 uint _fee = feePercent;
+                 //50% fee rebate on any ether value of 50 or greater
+                 if (msg.value >= 50 ether) _fee /= 2;
+
+                 addPayout(_fee);
+         }
+
+         //Function called for valid tx to the contract
+         function addPayout(uint _fee) private {
+                 //Adds new address to participant array
+                 participants.push(Participant(msg.sender, (msg.value * pyramidMultiplier) / 100));
+
+                 //These statements ensure a quicker payout system to later pyramid entrants, so the pyramid has a longer lifespan
+                 if (participants.length == 10) pyramidMultiplier = 200;
+                 else if (participants.length == 25) pyramidMultiplier = 150;
+
+                 // collect fees and update contract balance
+                 balance += (msg.value * (100 - _fee)) / 100;
+                 collectedFees += (msg.value * _fee) / 100;
+
+                 //Pays earlier participiants if balance sufficient
+                 while (balance > participants[payoutOrder].payout) {
+                         uint payoutToSend = participants[payoutOrder].payout;
+                         //payable(participants[payoutOrder].etherAddress).transfer(uint128(payoutToSend));
+
+                         balance -= participants[payoutOrder].payout;
+                         payoutOrder += 1;
+                 }
+         }
+
+         //Fee functions for creator
+         function collectAllFees() public onlyowner {
+                 if (collectedFees == 0) revert();
+
+                 payable(creator).transfer(uint128(collectedFees));
+                 collectedFees = 0;
+         }
+
+         function collectFeesInEther(uint _amt) public onlyowner {
+                 _amt *= 1 ether;
+                 if (_amt > collectedFees) collectAllFees();
+
+                 if (collectedFees == 0) revert();
+
+                 payable(creator).transfer(uint128(_amt));
+                 collectedFees -= _amt;
+         }
+
+         function collectPercentOfFees(uint _pcent) public onlyowner {
+                 if (collectedFees == 0 || _pcent > 100) revert();
+
+                 uint feesToCollect = collectedFees / 100 * _pcent;
+                 payable(creator).transfer(uint128(feesToCollect));
+                 collectedFees -= feesToCollect;
+         }
+
+         //Functions for changing variables related to the contract
+         function changeOwner(address _owner) public onlyowner {
+                 creator = _owner;
+         }
+
+         function changeMultiplier(uint _mult) public onlyowner {
+                 if (_mult > 300 || _mult < 120) revert();
+
+                 pyramidMultiplier = _mult;
+         }
+
+         function changeFeePercentage(uint _fee) public onlyowner {
+                 if (_fee > 10) revert();
+
+                 feePercent = _fee;
+         }
+
+         //Functions to provide information to end-user using JSON interface or other interfaces
+         function currentMultiplier() view public returns(uint multiplier, string memory info) {
+                 multiplier = pyramidMultiplier;
+                 info = 'This multiplier applies to you as soon as transaction is received, may be lowered to hasten payouts or increased if payouts are fast enough. Due to no float or decimals, multiplier is x100 for a fractional multiplier e.g. 250 is actually a 2.5x multiplier. Capped at 3x max and 1.2x min.';
+         }
+
+         function currentFeePercentage() view public returns(uint fee, string memory info) {
+                 fee = feePercent;
+                 info = 'Shown in % form. Fee is halved(50%) for amounts equal or greater than 50 ethers. (Fee may change, but is capped to a maximum of 10%)';
+         }
+
+         function currentPyramidBalanceApproximately() view public returns(uint pyramidBalance, string memory info) {
+                 pyramidBalance = balance / 1 ether;
+                 info = 'All balance values are measured in Ethers, note that due to no decimal placing, these values show up as integers only, within the contract itself you will get the exact decimal value you are supposed to';
+         }
+
+         function nextPayoutWhenPyramidBalanceTotalsApproximately() view public returns(uint balancePayout) {
+                 balancePayout = participants[payoutOrder].payout / 1 ether;
+         }
+
+         function feesSeperateFromBalanceApproximately() view public returns(uint fees) {
+                 fees = collectedFees / 1 ether;
+         }
+
+         function totalParticipants() view public returns(uint count) {
+                 count = participants.length;
+         }
+
+         function numberOfParticipantsWaitingForPayout() view public returns(uint count) {
+                 count = participants.length - payoutOrder;
+         }
+
+         function participantDetails(uint orderInPyramid) view public returns(address Address, uint Payout) {
+                 if (orderInPyramid <= participants.length) {
+                         //Address = participants[orderInPyramid].etherAddress;
+                         Payout = participants[orderInPyramid].payout / 1 ether;
+                 }
+         }
+ }