Explorar o código

Fix recursion bug (#1113)

Signed-off-by: Lucas Steuernagel <lucas.tnagel@gmail.com>
Lucas Steuernagel %!s(int64=2) %!d(string=hai) anos
pai
achega
6565f64781

+ 5 - 4
src/sema/ast.rs

@@ -866,16 +866,16 @@ impl Recurse for CallArgs {
     type ArgType = Expression;
     fn recurse<T>(&self, cx: &mut T, f: fn(expr: &Expression, ctx: &mut T) -> bool) {
         if let Some(gas) = &self.gas {
-            f(gas, cx);
+            gas.recurse(cx, f);
         }
         if let Some(salt) = &self.salt {
-            f(salt, cx);
+            salt.recurse(cx, f);
         }
         if let Some(value) = &self.value {
-            f(value, cx);
+            value.recurse(cx, f);
         }
         if let Some(accounts) = &self.accounts {
-            f(accounts, cx);
+            accounts.recurse(cx, f);
         }
     }
 }
@@ -911,6 +911,7 @@ impl Recurse for Expression {
                 | Expression::ZeroExt { expr, .. }
                 | Expression::SignExt { expr, .. }
                 | Expression::Trunc { expr, .. }
+                | Expression::CheckingTrunc { expr, .. }
                 | Expression::Cast { expr, .. }
                 | Expression::BytesCast { expr, .. }
                 | Expression::PreIncrement(_, _, _, expr)

+ 228 - 0
tests/contract_testcases/substrate/functions/external_call_args.dot

@@ -0,0 +1,228 @@
+strict digraph "tests/contract_testcases/substrate/functions/external_call_args.sol" {
+	contract [label="contract IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:2:1-18:2"]
+	WETH [label="function WETH\ncontract: IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:3:5-52\nsignature WETH()\nvisibility external\nmutability pure\nvirtual"]
+	returns [label="returns\naddress "]
+	swapExactETHForTokens [label="function swapExactETHForTokens\ncontract: IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:4:5-7:40\nsignature swapExactETHForTokens(uint256,address[],address,uint256)\nvisibility external\nmutability payable\nvirtual"]
+	parameters [label="parameters\nuint256 amountOutMin\naddress[] path\naddress to\nuint256 deadline"]
+	returns_6 [label="returns\nuint256[] amounts"]
+	swapTokensForExactETH [label="function swapTokensForExactETH\ncontract: IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:8:5-10:40\nsignature swapTokensForExactETH(uint256,uint256,address[],address,uint256)\nvisibility external\nmutability nonpayable\nvirtual"]
+	parameters_8 [label="parameters\nuint256 amountOut\nuint256 amountInMax\naddress[] path\naddress to\nuint256 deadline"]
+	returns_9 [label="returns\nuint256[] amounts"]
+	swapExactTokensForETH [label="function swapExactTokensForETH\ncontract: IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:11:5-13:40\nsignature swapExactTokensForETH(uint256,uint256,address[],address,uint256)\nvisibility external\nmutability nonpayable\nvirtual"]
+	parameters_11 [label="parameters\nuint256 amountIn\nuint256 amountOutMin\naddress[] path\naddress to\nuint256 deadline"]
+	returns_12 [label="returns\nuint256[] amounts"]
+	swapETHForExactTokens [label="function swapETHForExactTokens\ncontract: IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:14:5-17:40\nsignature swapETHForExactTokens(uint256,address[],address,uint256)\nvisibility external\nmutability payable\nvirtual"]
+	parameters_14 [label="parameters\nuint256 amountOut\naddress[] path\naddress to\nuint256 deadline"]
+	returns_15 [label="returns\nuint256[] amounts"]
+	contract_16 [label="contract SafeMath\ntests/contract_testcases/substrate/functions/external_call_args.sol:20:1-32:2"]
+	mul [label="function mul\ncontract: SafeMath\ntests/contract_testcases/substrate/functions/external_call_args.sol:21:5-71\nsignature mul(uint256,uint256)\nvisibility internal\nmutability pure"]
+	parameters_18 [label="parameters\nuint256 a\nuint256 b"]
+	returns_19 [label="returns\nuint256 "]
+	if [label="if\ntests/contract_testcases/substrate/functions/external_call_args.sol:22:9-30"]
+	equal [label="equal\ntests/contract_testcases/substrate/functions/external_call_args.sol:22:13-19"]
+	variable [label="variable: a\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:22:13-14"]
+	number_literal [label="uint256 literal: 0\ntests/contract_testcases/substrate/functions/external_call_args.sol:22:18-19"]
+	return [label="return\ntests/contract_testcases/substrate/functions/external_call_args.sol:22:21-29"]
+	number_literal_25 [label="uint256 literal: 0\ntests/contract_testcases/substrate/functions/external_call_args.sol:22:28-29"]
+	var_decl [label="variable decl uint256 c\ntests/contract_testcases/substrate/functions/external_call_args.sol:23:9-26"]
+	multiply [label="multiply\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:23:21-26"]
+	variable_28 [label="variable: a\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:23:21-22"]
+	variable_29 [label="variable: b\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:23:25-26"]
+	expr [label="expression\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:9-65"]
+	builtins [label="builtin Require\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:9-16"]
+	equal_32 [label="equal\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:17-27"]
+	divide [label="divide\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:17-22"]
+	variable_34 [label="variable: c\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:17-18"]
+	variable_35 [label="variable: a\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:21-22"]
+	variable_36 [label="variable: b\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:26-27"]
+	alloc_array [label="alloc array string\ninitializer: 536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:29-64"]
+	number_literal_38 [label="uint32 literal: 33\ntests/contract_testcases/substrate/functions/external_call_args.sol:24:29-64"]
+	return_39 [label="return\ntests/contract_testcases/substrate/functions/external_call_args.sol:25:9-17"]
+	variable_40 [label="variable: c\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:25:16-17"]
+	div [label="function div\ncontract: SafeMath\ntests/contract_testcases/substrate/functions/external_call_args.sol:27:5-71\nsignature div(uint256,uint256)\nvisibility internal\nmutability pure"]
+	parameters_42 [label="parameters\nuint256 a\nuint256 b"]
+	returns_43 [label="returns\nuint256 "]
+	expr_44 [label="expression\ntests/contract_testcases/substrate/functions/external_call_args.sol:28:9-53"]
+	builtins_45 [label="builtin Require\ntests/contract_testcases/substrate/functions/external_call_args.sol:28:9-16"]
+	more [label="more\ntests/contract_testcases/substrate/functions/external_call_args.sol:28:17-22"]
+	variable_47 [label="variable: b\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:28:17-18"]
+	number_literal_48 [label="uint256 literal: 0\ntests/contract_testcases/substrate/functions/external_call_args.sol:28:21-22"]
+	alloc_array_49 [label="alloc array string\ninitializer: 536166654d6174683a206469766973696f6e206279207a65726f\ntests/contract_testcases/substrate/functions/external_call_args.sol:28:24-52"]
+	number_literal_50 [label="uint32 literal: 26\ntests/contract_testcases/substrate/functions/external_call_args.sol:28:24-52"]
+	return_51 [label="return\ntests/contract_testcases/substrate/functions/external_call_args.sol:29:9-21"]
+	divide_52 [label="divide\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:29:16-21"]
+	variable_53 [label="variable: a\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:29:16-17"]
+	variable_54 [label="variable: b\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:29:20-21"]
+	contract_55 [label="contract Swap_ETH_TO_USDX\ntests/contract_testcases/substrate/functions/external_call_args.sol:34:1-50:2"]
+	var [label="variable distTokens\nvisibility internal\ntests/contract_testcases/substrate/functions/external_call_args.sol:37:3-21"]
+	var_57 [label="variable deadline\nvisibility internal\ntests/contract_testcases/substrate/functions/external_call_args.sol:38:3-16"]
+	var_58 [label="variable feerate\nvisibility internal\ntests/contract_testcases/substrate/functions/external_call_args.sol:39:3-15"]
+	var_59 [label="variable uniswapRouter\nvisibility public\ntests/contract_testcases/substrate/functions/external_call_args.sol:40:3-42"]
+	using [label="using for uint256\nlibrary SafeMath"]
+	uniswapRouter [label="function uniswapRouter\ncontract: Swap_ETH_TO_USDX\ntests/contract_testcases/substrate/functions/external_call_args.sol:40:29-42\nsignature uniswapRouter()\nvisibility public\nmutability view"]
+	returns_62 [label="returns\ncontract IUniswapV2Router01 "]
+	return_63 [label="return\nimplicit"]
+	storage_load [label="storage load contract IUniswapV2Router01\nimplicit"]
+	storage_var [label="storage variable\nSwap_ETH_TO_USDX.uniswapRouter\ncontract IUniswapV2Router01 storage\nimplicit"]
+	node_66 [label="receive \ncontract: Swap_ETH_TO_USDX\ntests/contract_testcases/substrate/functions/external_call_args.sol:42:4-31\nmutability payable"]
+	var_decl_67 [label="variable decl address[] paths\ntests/contract_testcases/substrate/functions/external_call_args.sol:43:9-50"]
+	alloc_array_68 [label="alloc array address[]\ntests/contract_testcases/substrate/functions/external_call_args.sol:43:34-50"]
+	number_literal_69 [label="uint32 literal: 2\ntests/contract_testcases/substrate/functions/external_call_args.sol:43:48-49"]
+	expr_70 [label="expression\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:9-40"]
+	assign [label="assign\naddress\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:9-40"]
+	subscript [label="subscript address[]\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:9-17"]
+	variable_73 [label="variable: paths\naddress[]\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:9-14"]
+	number_literal_74 [label="uint32 literal: 0\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:15-16"]
+	call_external_function [label="call external function\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:20-40"]
+	external_function [label="function() external pure returns (address)\nIUniswapV2Router01.WETH\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:20-40"]
+	storage_load_77 [label="storage load contract IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:20-33"]
+	storage_var_78 [label="storage variable\nSwap_ETH_TO_USDX.uniswapRouter\ncontract IUniswapV2Router01 storage\ntests/contract_testcases/substrate/functions/external_call_args.sol:44:20-33"]
+	expr_79 [label="expression\ntests/contract_testcases/substrate/functions/external_call_args.sol:45:9-30"]
+	assign_80 [label="assign\naddress\ntests/contract_testcases/substrate/functions/external_call_args.sol:45:9-30"]
+	subscript_81 [label="subscript address[]\ntests/contract_testcases/substrate/functions/external_call_args.sol:45:9-17"]
+	variable_82 [label="variable: paths\naddress[]\ntests/contract_testcases/substrate/functions/external_call_args.sol:45:9-14"]
+	number_literal_83 [label="uint32 literal: 1\ntests/contract_testcases/substrate/functions/external_call_args.sol:45:15-16"]
+	storage_load_84 [label="storage load address\ntests/contract_testcases/substrate/functions/external_call_args.sol:45:20-30"]
+	storage_var_85 [label="storage variable\nSwap_ETH_TO_USDX.distTokens\naddress storage\ntests/contract_testcases/substrate/functions/external_call_args.sol:45:20-30"]
+	var_decl_86 [label="variable decl uint256[] amounts\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:9-196"]
+	call_external_function_87 [label="call external function\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:31-196"]
+	external_function_88 [label="function(uint256,address[],address,uint256) external payable returns (uint256[])\nIUniswapV2Router01.swapExactETHForTokens\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:31-196"]
+	storage_load_89 [label="storage load contract IUniswapV2Router01\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:31-44"]
+	storage_var_90 [label="storage variable\nSwap_ETH_TO_USDX.uniswapRouter\ncontract IUniswapV2Router01 storage\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:31-44"]
+	number_literal_91 [label="uint256 literal: 0\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:125-126"]
+	variable_92 [label="variable: paths\naddress[]\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:134-139"]
+	cast [label="cast address\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:145-158"]
+	builtins_94 [label="builtin GetAddress\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:153-157"]
+	add [label="add\nuint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:170-194"]
+	zero_ext [label="zero extend uint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:170-185"]
+	builtins_97 [label="builtin Timestamp\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:170-185"]
+	storage_load_98 [label="storage load uint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:186-194"]
+	storage_var_99 [label="storage variable\nSwap_ETH_TO_USDX.deadline\nuint256 storage\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:186-194"]
+	trunc [label="checking truncate uint128\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-108"]
+	call_internal_function [label="call internal function\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-108"]
+	internal_function [label="function(uint256,uint256) internal pure returns (uint256)\nSafeMath.div\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-108"]
+	call_internal_function_103 [label="call internal function\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-97"]
+	internal_function_104 [label="function(uint256,uint256) internal pure returns (uint256)\nSafeMath.mul\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-97"]
+	sign_ext [label="sign extend uint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-84"]
+	builtins_106 [label="builtin Value\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-84"]
+	storage_load_107 [label="storage load uint256\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:89-96"]
+	storage_var_108 [label="storage variable\nSwap_ETH_TO_USDX.feerate\nuint256 storage\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:89-96"]
+	number_literal_109 [label="uint256 literal: 10000\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:102-107"]
+	diagnostic [label="found interface 'IUniswapV2Router01'\nlevel Debug\ntests/contract_testcases/substrate/functions/external_call_args.sol:2:1-18:2"]
+	diagnostic_112 [label="found library 'SafeMath'\nlevel Debug\ntests/contract_testcases/substrate/functions/external_call_args.sol:20:1-32:2"]
+	diagnostic_113 [label="found contract 'Swap_ETH_TO_USDX'\nlevel Debug\ntests/contract_testcases/substrate/functions/external_call_args.sol:34:1-50:2"]
+	diagnostic_114 [label="conversion truncates uint256 to uint128, as value is type uint128 on target substrate\nlevel Warning\ntests/contract_testcases/substrate/functions/external_call_args.sol:46:75-108"]
+	contracts -> contract
+	contract -> WETH [label="function"]
+	WETH -> returns [label="returns"]
+	contract -> swapExactETHForTokens [label="function"]
+	swapExactETHForTokens -> parameters [label="parameters"]
+	swapExactETHForTokens -> returns_6 [label="returns"]
+	contract -> swapTokensForExactETH [label="function"]
+	swapTokensForExactETH -> parameters_8 [label="parameters"]
+	swapTokensForExactETH -> returns_9 [label="returns"]
+	contract -> swapExactTokensForETH [label="function"]
+	swapExactTokensForETH -> parameters_11 [label="parameters"]
+	swapExactTokensForETH -> returns_12 [label="returns"]
+	contract -> swapETHForExactTokens [label="function"]
+	swapETHForExactTokens -> parameters_14 [label="parameters"]
+	swapETHForExactTokens -> returns_15 [label="returns"]
+	contracts -> contract_16
+	contract_16 -> mul [label="function"]
+	mul -> parameters_18 [label="parameters"]
+	mul -> returns_19 [label="returns"]
+	mul -> if [label="body"]
+	if -> equal [label="cond"]
+	equal -> variable [label="left"]
+	equal -> number_literal [label="right"]
+	if -> return [label="then"]
+	return -> number_literal_25 [label="expr"]
+	if -> var_decl [label="next"]
+	var_decl -> multiply [label="init"]
+	multiply -> variable_28 [label="left"]
+	multiply -> variable_29 [label="right"]
+	var_decl -> expr [label="next"]
+	expr -> builtins [label="expr"]
+	builtins -> equal_32 [label="arg #0"]
+	equal_32 -> divide [label="left"]
+	divide -> variable_34 [label="left"]
+	divide -> variable_35 [label="right"]
+	equal_32 -> variable_36 [label="right"]
+	builtins -> alloc_array [label="arg #1"]
+	alloc_array -> number_literal_38 [label="length"]
+	expr -> return_39 [label="next"]
+	return_39 -> variable_40 [label="expr"]
+	contract_16 -> div [label="function"]
+	div -> parameters_42 [label="parameters"]
+	div -> returns_43 [label="returns"]
+	div -> expr_44 [label="body"]
+	expr_44 -> builtins_45 [label="expr"]
+	builtins_45 -> more [label="arg #0"]
+	more -> variable_47 [label="left"]
+	more -> number_literal_48 [label="right"]
+	builtins_45 -> alloc_array_49 [label="arg #1"]
+	alloc_array_49 -> number_literal_50 [label="length"]
+	expr_44 -> return_51 [label="next"]
+	return_51 -> divide_52 [label="expr"]
+	divide_52 -> variable_53 [label="left"]
+	divide_52 -> variable_54 [label="right"]
+	contracts -> contract_55
+	contract_55 -> var [label="variable"]
+	contract_55 -> var_57 [label="variable"]
+	contract_55 -> var_58 [label="variable"]
+	contract_55 -> var_59 [label="variable"]
+	contract_55 -> using [label="base"]
+	contract_55 -> uniswapRouter [label="function"]
+	uniswapRouter -> returns_62 [label="returns"]
+	uniswapRouter -> return_63 [label="body"]
+	return_63 -> storage_load [label="expr"]
+	storage_load -> storage_var [label="expr"]
+	contract_55 -> node_66 [label="receive"]
+	node_66 -> var_decl_67 [label="body"]
+	var_decl_67 -> alloc_array_68 [label="init"]
+	alloc_array_68 -> number_literal_69 [label="length"]
+	var_decl_67 -> expr_70 [label="next"]
+	expr_70 -> assign [label="expr"]
+	assign -> subscript [label="left"]
+	subscript -> variable_73 [label="array"]
+	subscript -> number_literal_74 [label="index"]
+	assign -> call_external_function [label="right"]
+	call_external_function -> external_function [label="function"]
+	external_function -> storage_load_77 [label="address"]
+	storage_load_77 -> storage_var_78 [label="expr"]
+	expr_70 -> expr_79 [label="next"]
+	expr_79 -> assign_80 [label="expr"]
+	assign_80 -> subscript_81 [label="left"]
+	subscript_81 -> variable_82 [label="array"]
+	subscript_81 -> number_literal_83 [label="index"]
+	assign_80 -> storage_load_84 [label="right"]
+	storage_load_84 -> storage_var_85 [label="expr"]
+	expr_79 -> var_decl_86 [label="next"]
+	var_decl_86 -> call_external_function_87 [label="init"]
+	call_external_function_87 -> external_function_88 [label="function"]
+	external_function_88 -> storage_load_89 [label="address"]
+	storage_load_89 -> storage_var_90 [label="expr"]
+	call_external_function_87 -> number_literal_91 [label="arg #0"]
+	call_external_function_87 -> variable_92 [label="arg #1"]
+	call_external_function_87 -> cast [label="arg #2"]
+	cast -> builtins_94 [label="expr"]
+	call_external_function_87 -> add [label="arg #3"]
+	add -> zero_ext [label="left"]
+	zero_ext -> builtins_97 [label="expr"]
+	add -> storage_load_98 [label="right"]
+	storage_load_98 -> storage_var_99 [label="expr"]
+	call_external_function_87 -> trunc [label="value"]
+	trunc -> call_internal_function [label="expr"]
+	call_internal_function -> internal_function [label="function"]
+	call_internal_function -> call_internal_function_103 [label="arg #0"]
+	call_internal_function_103 -> internal_function_104 [label="function"]
+	call_internal_function_103 -> sign_ext [label="arg #0"]
+	sign_ext -> builtins_106 [label="expr"]
+	call_internal_function_103 -> storage_load_107 [label="arg #1"]
+	storage_load_107 -> storage_var_108 [label="expr"]
+	call_internal_function -> number_literal_109 [label="arg #1"]
+	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_112 [label="Debug"]
+	diagnostics -> diagnostic_113 [label="Debug"]
+	diagnostics -> diagnostic_114 [label="Warning"]
+}

+ 50 - 0
tests/contract_testcases/substrate/functions/external_call_args.sol

@@ -0,0 +1,50 @@
+
+interface IUniswapV2Router01 {
+    function WETH() external pure returns (address);
+    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
+        external
+        payable
+        returns (uint[] memory amounts);
+    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
+        external
+        returns (uint[] memory amounts);
+    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
+        external
+        returns (uint[] memory amounts);
+    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
+        external
+        payable
+        returns (uint[] memory amounts);
+}
+
+library SafeMath {
+    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
+        if (a == 0) return 0;
+        uint256 c = a * b;
+        require(c / a == b, "SafeMath: multiplication overflow");
+        return c;
+    }
+    function div(uint256 a, uint256 b) internal pure returns (uint256) {
+        require(b > 0, "SafeMath: division by zero");
+        return a / b;
+    }
+    
+}
+
+contract Swap_ETH_TO_USDX{
+    
+  using SafeMath for uint;
+  address distTokens;
+  uint deadline;
+  uint feerate;
+  IUniswapV2Router01 public uniswapRouter;
+   
+   receive () external payable {
+        address[] memory paths = new address[](2);
+        paths[0] = uniswapRouter.WETH();
+        paths[1] = distTokens;
+        uint[] memory amounts=uniswapRouter.swapExactETHForTokens {value: msg.value.mul(feerate).div(10000)}({amountOutMin: 0, path: paths, to: address(this), deadline: block.timestamp+deadline});
+   }
+  
+ 
+}