Selaa lähdekoodia

Fix storage offset bug (#1114)

Signed-off-by: Lucas Steuernagel <lucas.tnagel@gmail.com>
Lucas Steuernagel 2 vuotta sitten
vanhempi
sitoutus
f21be2cad6

+ 1 - 1
src/codegen/expression.rs

@@ -464,7 +464,7 @@ pub fn expression(
 
                 Expression::Add(
                     *loc,
-                    ty.clone(),
+                    ns.storage_type(),
                     true,
                     Box::new(expression(var, cfg, contract_no, func, ns, vartab, opt)),
                     Box::new(Expression::NumberLiteral(*loc, ns.storage_type(), offset)),

+ 88 - 0
tests/contract_testcases/substrate/storage/double_index_storage.dot

@@ -0,0 +1,88 @@
+strict digraph "tests/contract_testcases/substrate/storage/double_index_storage.sol" {
+	Entry [label="name:Entry\ncontract: BeeeefRegistry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:4:12-17\nfield name:index ty:uint256\nfield name:timestamp ty:uint64\nfield name:account ty:address\nfield name:token ty:address"]
+	Data [label="name:Data\ncontract: BeeeefRegistry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:11:12-16\nfield name:initialised ty:bool\nfield name:entries ty:mapping(bytes32 => struct BeeeefRegistry.Entry)\nfield name:index ty:bytes32[]"]
+	contract [label="contract BeeeefRegistry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:2:1-28:2"]
+	var [label="variable entries\nvisibility private\ntests/contract_testcases/substrate/storage/double_index_storage.sol:17:5-25"]
+	getEntries [label="function getEntries\ncontract: BeeeefRegistry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:20:5-74\nsignature getEntries()\nvisibility public\nmutability view"]
+	returns [label="returns\naddress[] accounts"]
+	var_decl [label="variable decl uint256 length\ntests/contract_testcases/substrate/storage/double_index_storage.sol:21:9-25"]
+	number_literal [label="uint256 literal: 23\ntests/contract_testcases/substrate/storage/double_index_storage.sol:21:23-25"]
+	expr [label="expression\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:9-41"]
+	assign [label="assign\naddress[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:9-41"]
+	variable [label="variable: accounts\naddress[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:9-17"]
+	alloc_array [label="alloc array address[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:20-41"]
+	trunc [label="checking truncate uint32\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:34-40"]
+	variable_15 [label="variable: length\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:34-40"]
+	for [label="for\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:9-26:10"]
+	var_decl_17 [label="variable decl uint256 i\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:14-24"]
+	number_literal_18 [label="uint256 literal: 0\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:23-24"]
+	less [label="less\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:26-36"]
+	variable_20 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:26-27"]
+	variable_21 [label="variable: length\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:30-36"]
+	expr_22 [label="expression\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:38-41"]
+	post_increment [label="post increment\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:38-41"]
+	variable_24 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:38-39"]
+	var_decl_25 [label="variable decl struct BeeeefRegistry.Entry entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:13-67"]
+	storage_load [label="storage load struct BeeeefRegistry.Entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:34-67"]
+	subscript [label="subscript mapping(bytes32 => struct BeeeefRegistry.Entry) storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:34-67"]
+	structmember [label="struct member #1 mapping(bytes32 => struct BeeeefRegistry.Entry) storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:42-49"]
+	storage_var [label="storage variable\nBeeeefRegistry.entries\nstruct BeeeefRegistry.Data storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:34-41"]
+	storage_load_30 [label="storage load bytes32\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-66"]
+	subscript_31 [label="subscript bytes32[] storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-66"]
+	structmember_32 [label="struct member #2 bytes32[] storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:58-63"]
+	storage_var_33 [label="storage variable\nBeeeefRegistry.entries\nstruct BeeeefRegistry.Data storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-57"]
+	variable_34 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:64-65"]
+	expr_35 [label="expression\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-40"]
+	assign_36 [label="assign\naddress\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-40"]
+	subscript_37 [label="subscript address[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-24"]
+	variable_38 [label="variable: accounts\naddress[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-21"]
+	variable_39 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:22-23"]
+	load [label="load address\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:27-40"]
+	structmember_41 [label="struct member #2 address\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:33-40"]
+	variable_42 [label="variable: entry\nstruct BeeeefRegistry.Entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:27-32"]
+	diagnostic [label="found contract 'BeeeefRegistry'\nlevel Debug\ntests/contract_testcases/substrate/storage/double_index_storage.sol:2:1-28:2"]
+	diagnostic_45 [label="conversion truncates uint256 to uint32, as memory size is type uint32 on target substrate\nlevel Warning\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:34-40"]
+	structs -> Entry
+	structs -> Data
+	contracts -> contract
+	contract -> var [label="variable"]
+	contract -> getEntries [label="function"]
+	getEntries -> returns [label="returns"]
+	getEntries -> var_decl [label="body"]
+	var_decl -> number_literal [label="init"]
+	var_decl -> expr [label="next"]
+	expr -> assign [label="expr"]
+	assign -> variable [label="left"]
+	assign -> alloc_array [label="right"]
+	alloc_array -> trunc [label="length"]
+	trunc -> variable_15 [label="expr"]
+	expr -> for [label="next"]
+	for -> var_decl_17 [label="init"]
+	var_decl_17 -> number_literal_18 [label="init"]
+	for -> less [label="cond"]
+	less -> variable_20 [label="left"]
+	less -> variable_21 [label="right"]
+	for -> expr_22 [label="next"]
+	expr_22 -> post_increment [label="expr"]
+	post_increment -> variable_24 [label="expr"]
+	for -> var_decl_25 [label="body"]
+	var_decl_25 -> storage_load [label="init"]
+	storage_load -> subscript [label="expr"]
+	subscript -> structmember [label="array"]
+	structmember -> storage_var [label="var"]
+	subscript -> storage_load_30 [label="index"]
+	storage_load_30 -> subscript_31 [label="expr"]
+	subscript_31 -> structmember_32 [label="array"]
+	structmember_32 -> storage_var_33 [label="var"]
+	subscript_31 -> variable_34 [label="index"]
+	var_decl_25 -> expr_35 [label="next"]
+	expr_35 -> assign_36 [label="expr"]
+	assign_36 -> subscript_37 [label="left"]
+	subscript_37 -> variable_38 [label="array"]
+	subscript_37 -> variable_39 [label="index"]
+	assign_36 -> load [label="right"]
+	load -> structmember_41 [label="expr"]
+	structmember_41 -> variable_42 [label="var"]
+	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_45 [label="Warning"]
+}

+ 28 - 0
tests/contract_testcases/substrate/storage/double_index_storage.sol

@@ -0,0 +1,28 @@
+
+contract BeeeefRegistry {
+
+    struct Entry {
+        uint index;
+        uint64 timestamp;
+        address account;
+        address token;
+    }
+
+    struct Data {
+        bool initialised;
+        mapping(bytes32 => Entry) entries;
+        bytes32[] index;
+    }
+
+    Data private entries;
+
+
+    function getEntries() public view returns (address[] memory accounts) {
+        uint length = 23;
+        accounts = new address[](length);
+        for (uint i = 0; i < length; i++) {
+            Entry memory entry = entries.entries[entries.index[i]];
+            accounts[i] = entry.account;
+        }
+    }
+}