hardlydifficult-eth
Version:
A collection of reusable contracts and Javascript helpers for Ethereum.
1,080 lines (1,079 loc) • 67.3 kB
JSON
{
"contractName": "Clone2Factory",
"abi": [],
"metadata": "{\"compiler\":{\"version\":\"0.6.10+commit.00c0fcaf\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"project:/contracts/proxies/Clone2Factory.sol\":\"Clone2Factory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":2000000},\"remappings\":[]},\"sources\":{\"project:/contracts/proxies/Clone2Factory.sol\":{\"keccak256\":\"0x5eabefb0d942322d2fecf4f9060b53c6b54a22c741a3ec1e93ffcbbcedf6093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5075ba4f6f5a099b78d30145db7fe66e02357ec76e1d6efe1d85f0ebc595837d\",\"dweb:/ipfs/QmcZdGyizUDKN9t4t1FDvN7ic6G59FXiFiC5tHK7rKpst8\"]}},\"version\":1}",
"bytecode": "0x60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220fda9a22100b340bda592880008bc14aa8388b60b6f1052c707d85820980964a064736f6c634300060a0033",
"deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220fda9a22100b340bda592880008bc14aa8388b60b6f1052c707d85820980964a064736f6c634300060a0033",
"immutableReferences": {},
"sourceMap": "223:2394:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;",
"deployedSourceMap": "223:2394:18:-:0;;;;;;;;",
"source": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.0;\n\n\n// From https://github.com/optionality/clone-factory/blob/master/contracts/CloneFactory.sol\n// Updated to support Solidity 5, switch to `create2` and revert on fail\nlibrary Clone2Factory\n{\n /**\n * @notice Uses create2 to deploy a clone to a pre-determined address.\n * @param target the address of the template contract, containing the logic for this contract.\n * @param salt a salt used to determine the contract address before the transaction is mined,\n * may be random or sequential.\n * The salt to use with the create2 call can be `msg.sender+salt` in order to\n * prevent an attacker from front-running another user's deployment.\n * @return proxyAddress the address of the newly deployed contract.\n * @dev Using `bytes12` for the salt saves 6 gas over using `uint96` (requires another shift).\n * Will revert on fail.\n */\n function createClone2(\n address target,\n bytes32 salt\n ) internal\n returns (address proxyAddress)\n {\n // solium-disable-next-line\n assembly\n {\n let pointer := mload(0x40)\n\n // Create the bytecode for deployment based on the Minimal Proxy Standard (EIP-1167)\n // bytecode: 0x0\n mstore(pointer, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n mstore(add(pointer, 0x14), shl(96, target))\n mstore(add(pointer, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n\n // `create2` consumes all available gas if called with a salt that's already been consumed\n // we check if the address is available first so that doesn't happen\n // Costs ~958 gas\n\n // Calculate the hash\n let contractCodeHash := keccak256(pointer, 0x37)\n\n // salt: 0x100\n mstore(add(pointer, 0x100), salt)\n\n // addressSeed: 0x40\n // 0xff\n mstore(add(pointer, 0x40), 0xff00000000000000000000000000000000000000000000000000000000000000)\n // this\n mstore(add(pointer, 0x41), shl(96, address()))\n // salt\n mstore(add(pointer, 0x55), mload(add(pointer, 0x100)))\n // hash\n mstore(add(pointer, 0x75), contractCodeHash)\n\n proxyAddress := keccak256(add(pointer, 0x40), 0x55)\n\n switch extcodesize(proxyAddress)\n case 0 {\n // Deploy the contract, returning the address or 0 on fail\n proxyAddress := create2(0, pointer, 0x37, mload(add(pointer, 0x100)))\n }\n default {\n proxyAddress := 0\n }\n }\n\n // Revert if the deployment fails (possible if salt was already used)\n require(proxyAddress != address(0), 'PROXY_DEPLOY_FAILED');\n }\n}\n",
"sourcePath": "/home/circleci/repo/contracts/proxies/Clone2Factory.sol",
"ast": {
"absolutePath": "project:/contracts/proxies/Clone2Factory.sol",
"exportedSymbols": {
"Clone2Factory": [
3755
]
},
"id": 3756,
"license": "MIT",
"nodeType": "SourceUnit",
"nodes": [
{
"id": 3732,
"literals": [
"solidity",
"^",
"0.6",
".0"
],
"nodeType": "PragmaDirective",
"src": "32:23:18"
},
{
"abstract": false,
"baseContracts": [],
"contractDependencies": [],
"contractKind": "library",
"documentation": null,
"fullyImplemented": true,
"id": 3755,
"linearizedBaseContracts": [
3755
],
"name": "Clone2Factory",
"nodeType": "ContractDefinition",
"nodes": [
{
"body": {
"id": 3753,
"nodeType": "Block",
"src": "1015:1600:18",
"statements": [
{
"AST": {
"nodeType": "YulBlock",
"src": "1066:1406:18",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "1074:26:18",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1095:4:18",
"type": "",
"value": "0x40"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "1089:5:18"
},
"nodeType": "YulFunctionCall",
"src": "1089:11:18"
},
"variables": [
{
"name": "pointer",
"nodeType": "YulTypedName",
"src": "1078:7:18",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "1229:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1238:66:18",
"type": "",
"value": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1222:6:18"
},
"nodeType": "YulFunctionCall",
"src": "1222:83:18"
},
"nodeType": "YulExpressionStatement",
"src": "1222:83:18"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "1323:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1332:4:18",
"type": "",
"value": "0x14"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1319:3:18"
},
"nodeType": "YulFunctionCall",
"src": "1319:18:18"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1343:2:18",
"type": "",
"value": "96"
},
{
"name": "target",
"nodeType": "YulIdentifier",
"src": "1347:6:18"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "1339:3:18"
},
"nodeType": "YulFunctionCall",
"src": "1339:15:18"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1312:6:18"
},
"nodeType": "YulFunctionCall",
"src": "1312:43:18"
},
"nodeType": "YulExpressionStatement",
"src": "1312:43:18"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "1373:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1382:4:18",
"type": "",
"value": "0x28"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1369:3:18"
},
"nodeType": "YulFunctionCall",
"src": "1369:18:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1389:66:18",
"type": "",
"value": "0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1362:6:18"
},
"nodeType": "YulFunctionCall",
"src": "1362:94:18"
},
"nodeType": "YulExpressionStatement",
"src": "1362:94:18"
},
{
"nodeType": "YulVariableDeclaration",
"src": "1689:48:18",
"value": {
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "1723:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1732:4:18",
"type": "",
"value": "0x37"
}
],
"functionName": {
"name": "keccak256",
"nodeType": "YulIdentifier",
"src": "1713:9:18"
},
"nodeType": "YulFunctionCall",
"src": "1713:24:18"
},
"variables": [
{
"name": "contractCodeHash",
"nodeType": "YulTypedName",
"src": "1693:16:18",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "1777:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1786:5:18",
"type": "",
"value": "0x100"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1773:3:18"
},
"nodeType": "YulFunctionCall",
"src": "1773:19:18"
},
{
"name": "salt",
"nodeType": "YulIdentifier",
"src": "1794:4:18"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1766:6:18"
},
"nodeType": "YulFunctionCall",
"src": "1766:33:18"
},
"nodeType": "YulExpressionStatement",
"src": "1766:33:18"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "1859:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1868:4:18",
"type": "",
"value": "0x40"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1855:3:18"
},
"nodeType": "YulFunctionCall",
"src": "1855:18:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1875:66:18",
"type": "",
"value": "0xff00000000000000000000000000000000000000000000000000000000000000"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1848:6:18"
},
"nodeType": "YulFunctionCall",
"src": "1848:94:18"
},
"nodeType": "YulExpressionStatement",
"src": "1848:94:18"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "1974:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1983:4:18",
"type": "",
"value": "0x41"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1970:3:18"
},
"nodeType": "YulFunctionCall",
"src": "1970:18:18"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1994:2:18",
"type": "",
"value": "96"
},
{
"arguments": [],
"functionName": {
"name": "address",
"nodeType": "YulIdentifier",
"src": "1998:7:18"
},
"nodeType": "YulFunctionCall",
"src": "1998:9:18"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "1990:3:18"
},
"nodeType": "YulFunctionCall",
"src": "1990:18:18"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1963:6:18"
},
"nodeType": "YulFunctionCall",
"src": "1963:46:18"
},
"nodeType": "YulExpressionStatement",
"src": "1963:46:18"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "2041:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2050:4:18",
"type": "",
"value": "0x55"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2037:3:18"
},
"nodeType": "YulFunctionCall",
"src": "2037:18:18"
},
{
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "2067:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2076:5:18",
"type": "",
"value": "0x100"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2063:3:18"
},
"nodeType": "YulFunctionCall",
"src": "2063:19:18"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "2057:5:18"
},
"nodeType": "YulFunctionCall",
"src": "2057:26:18"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2030:6:18"
},
"nodeType": "YulFunctionCall",
"src": "2030:54:18"
},
"nodeType": "YulExpressionStatement",
"src": "2030:54:18"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "2116:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2125:4:18",
"type": "",
"value": "0x75"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2112:3:18"
},
"nodeType": "YulFunctionCall",
"src": "2112:18:18"
},
{
"name": "contractCodeHash",
"nodeType": "YulIdentifier",
"src": "2132:16:18"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2105:6:18"
},
"nodeType": "YulFunctionCall",
"src": "2105:44:18"
},
"nodeType": "YulExpressionStatement",
"src": "2105:44:18"
},
{
"nodeType": "YulAssignment",
"src": "2157:51:18",
"value": {
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "2187:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2196:4:18",
"type": "",
"value": "0x40"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2183:3:18"
},
"nodeType": "YulFunctionCall",
"src": "2183:18:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2203:4:18",
"type": "",
"value": "0x55"
}
],
"functionName": {
"name": "keccak256",
"nodeType": "YulIdentifier",
"src": "2173:9:18"
},
"nodeType": "YulFunctionCall",
"src": "2173:35:18"
},
"variableNames": [
{
"name": "proxyAddress",
"nodeType": "YulIdentifier",
"src": "2157:12:18"
}
]
},
{
"cases": [
{
"body": {
"nodeType": "YulBlock",
"src": "2262:154:18",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2339:69:18",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2363:1:18",
"type": "",
"value": "0"
},
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "2366:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2375:4:18",
"type": "",
"value": "0x37"
},
{
"arguments": [
{
"arguments": [
{
"name": "pointer",
"nodeType": "YulIdentifier",
"src": "2391:7:18"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2400:5:18",
"type": "",
"value": "0x100"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2387:3:18"
},
"nodeType": "YulFunctionCall",
"src": "2387:19:18"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "2381:5:18"
},
"nodeType": "YulFunctionCall",
"src": "2381:26:18"
}
],
"functionName": {
"name": "create2",
"nodeType": "YulIdentifier",
"src": "2355:7:18"
},
"nodeType": "YulFunctionCall",
"src": "2355:53:18"
},
"variableNames": [
{
"name": "proxyAddress",
"nodeType": "YulIdentifier",
"src": "2339:12:18"
}
]
}
]
},
"nodeType": "YulCase",
"src": "2255:161:18",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "2260:1:18",
"type": "",
"value": "0"
}
},
{
"body": {
"nodeType": "YulBlock",
"src": "2431:35:18",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2441:17:18",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "2457:1:18",
"type": "",
"value": "0"
},
"variableNames": [
{
"name": "proxyAddress",
"nodeType": "YulIdentifier",
"src": "2441:12:18"
}
]
}
]
},
"nodeType": "YulCase",
"src": "2423:43:18",
"value": "default"
}
],
"expression": {
"arguments": [
{
"name": "proxyAddress",
"nodeType": "YulIdentifier",
"src": "2235:12:18"
}
],
"functionName": {
"name": "extcodesize",
"nodeType": "YulIdentifier",
"src": "2223:11:18"
},
"nodeType": "YulFunctionCall",
"src": "2223:25:18"
},
"nodeType": "YulSwitch",
"src": "2216:250:18"
}
]
},
"evmVersion": "istanbul",
"externalReferences": [
{
"declaration": 3740,
"isOffset": false,
"isSlot": false,
"src": "2157:12:18",
"valueSize": 1
},
{
"declaration": 3740,
"isOffset": false,
"isSlot": false,
"src": "2235:12:18",
"valueSize": 1
},
{
"declaration": 3740,
"isOffset": false,
"isSlot": false,
"src": "2339:12:18",
"valueSize": 1
},
{
"declaration": 3740,
"isOffset": false,
"isSlot": false,
"src": "2441:12:18",
"valueSize": 1
},
{
"declaration": 3737,
"isOffset": false,
"isSlot": false,
"src": "1794:4:18",
"valueSize": 1
},
{
"declaration": 3735,
"isOffset": false,
"isSlot": false,
"src": "1347:6:18",
"valueSize": 1
}
],
"id": 3742,
"nodeType": "InlineAssembly",
"src": "1053:1419:18"
},
{
"expression": {
"argumentTypes": null,
"arguments": [
{
"argumentTypes": null,
"commonType": {
"typeIdentifier": "t_address",
"typeString": "address"
},
"id": 3749,
"isConstant": false,
"isLValue": false,
"isPure": false,
"lValueRequested": false,
"leftExpression": {
"argumentTypes": null,
"id": 3744,
"name": "proxyAddress",
"nodeType": "Identifier",
"overloadedDeclarations": [],
"referencedDeclaration": 3740,
"src": "2560:12:18",
"typeDescriptions": {
"typeIdentifier": "t_address",
"typeString": "address"
}
},
"nodeType": "BinaryOperation",
"operator": "!=",
"rightExpression": {
"argumentTypes": null,
"arguments": [
{
"argumentTypes": null,
"hexValue": "30",
"id": 3747,
"isConstant": false,
"isLValue": false,
"isPure": true,
"kind": "number",
"lValueRequested": false,
"nodeType": "Literal",
"src": "2584:1:18",
"subdenomination": null,
"typeDescriptions": {
"typeIdentifier": "t_rational_0_by_1",
"typeString": "int_const 0"
},
"value": "0"
}
],
"expression": {
"argumentTypes": [
{
"typeIdentifier": "t_rational_0_by_1",
"typeString": "int_const 0"
}
],
"id": 3746,
"isConstant": false,
"isLValue": false,
"isPure": true,
"lValueRequested": false,
"nodeType": "ElementaryTypeNameExpression",
"src": "2576:7:18",
"typeDescriptions": {
"typeIdentifier": "t_type$_t_address_$",
"typeString": "type(address)"
},
"typeName": {
"id": 3745,
"name": "address",
"nodeType": "ElementaryTypeName",
"src": "2576:7:18",
"typeDescriptions": {
"typeIdentifier": null,
"typeString": null
}
}
},
"id": 3748,
"isConstant": false,
"isLValue": false,
"isPure": true,
"kind": "typeConversion",
"lValueRequested": false,
"names": [],
"nodeType": "FunctionCall",
"src": "2576:10:18",
"tryCall": false,
"typeDescriptions": {
"typeIdentifier": "t_address_payable",
"typeString": "address payable"
}
},
"src": "2560:26:18",
"typeDescriptions": {
"typeIdentifier": "t_bool",
"typeString": "bool"
}
},
{
"argumentTypes": null,
"hexValue": "50524f58595f4445504c4f595f4641494c4544",
"id": 3750,
"isConstant": false,
"isLValue": false,
"isPure": true,
"kind": "string",
"lValueRequested": false,
"nodeType": "Literal",
"src": "2588:21:18",
"subdenomination": null,
"typeDescriptions": {
"typeIdentifier": "t_stringliteral_76ce64557a80c95a1320c50cbae5822a174534010f3ef3154270eeca62982be7",
"typeString": "literal_string \"PROXY_DEPLOY_FAILED\""
},
"value": "PROXY_DEPLOY_FAILED"
}
],
"expression": {
"argumentTypes": [
{
"typeIdentifier": "t_bool",
"typeString": "bool"
},
{
"typeIdentifier": "t_stringliteral_76ce64557a80c95a1320c50cbae5822a174534010f3ef3154270eeca62982be7",
"typeString": "literal_string \"PROXY_DEPLOY_FAILED\""
}
],
"id": 3743,
"name": "require",
"nodeType": "Identifier",
"overloadedDeclarations": [
-18,
-18
],
"referencedDeclaration": -18,
"src": "2552:7:18",
"typeDescriptions": {
"typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
"typeString": "function (bool,string memory) pure"
}
},
"id": 3751,
"isConstant": false,
"isLValue": false,
"isPure": false,
"kind": "functionCall",
"lValueRequested": false,
"names": [],
"nodeType": "FunctionCall",
"src": "2552:58:18",
"tryCall": false,
"typeDescriptions": {
"typeIdentifier": "t_tuple$__$",
"typeString": "tuple()"
}
},
"id": 3752,
"nodeType": "ExpressionStatement",
"src": "2552:58:18"
}
]
},
"documentation": {
"id": 3733,
"nodeType": "StructuredDocumentation",
"src": "249:653:18",
"text": " @notice Uses create2 to deploy a clone to a pre-determined address.\n @param target the address of the template contract, containing the logic for this contract.\n @param salt a salt used to determine the contract address before the transaction is mined,\n may be random or sequential.\n The salt to use with the create2 call can be `msg.sender+salt` in order to\n prevent an attacker from front-running another user's deployment.\n @return proxyAddress the address of the newly deployed contract.\n @dev Using `bytes12` for the salt saves 6 gas over using `uint96` (requires another shift).\n Will revert on fail."
},
"id": 3754,
"implemented": true,
"kind": "function",
"modifiers": [],
"name": "createClone2",
"nodeType": "FunctionDefinition",
"overrides": null,
"parameters": {
"id": 3738,
"nodeType": "ParameterList",
"parameters": [
{
"constant": false,
"id": 3735,
"mutability": "mutable",
"name": "target",
"nodeType": "VariableDeclaration",
"overrides": null,
"scope": 3754,
"src": "932:14:18",
"stateVariable": false,
"storageLocation": "default",
"typeDescriptions": {
"typeIdentifier": "t_address",
"typeString": "address"
},
"typeName": {
"id": 3734,
"name": "address",
"nodeType": "ElementaryTypeName",
"src": "932:7:18",
"stateMutability": "nonpayable",
"typeDescriptions": {
"typeIdentifier": "t_address",
"typeString": "address"
}
},
"value": null,
"visibility": "internal"
},
{
"constant": false,
"id": 3737,
"mutability": "mutable",
"name": "salt",
"nodeType": "VariableDeclaration",
"overrides": null,
"scope": 3754,
"src": "952:12:18",
"stateVariable": false,
"storageLocation": "default",
"typeDescriptions": {
"typeIdentifier": "t_bytes32",
"typeString": "bytes32"
},
"typeName": {
"id": 3736,
"name": "bytes32",
"nodeType": "ElementaryTypeName",
"src": "952:7:18",
"typeDescriptions": {
"typeIdentifier": "t_bytes32",
"typeString": "bytes32"
}
},
"value": null,
"visibility": "internal"
}
],
"src": "926:42:18"
},
"returnParameters": {
"id": 3741,
"nodeType": "ParameterList",
"parameters": [
{
"constant": false,
"id": 3740,
"mutability": "mutable",
"name": "proxyAddress",
"nodeType": "VariableDeclaration",
"overrides": null,
"scope": 3754,
"src": "991:20:18",
"stateVariable": false,
"storageLocation": "default",
"typeDescriptions": {
"typeIdentifier": "t_address",
"typeString": "address"
},
"typeName": {
"id": 3739,
"name": "address",
"nodeType": "ElementaryTypeName",
"src": "991:7:18",
"stateMutability": "nonpayable",
"typeDescriptions": {
"typeIdentifier": "t_address",
"typeString": "address"
}
},
"value": null,
"visibility": "internal"
}
],
"src": "990:22:18"
},
"scope": 3755,
"src": "905:1710:18",
"stateMutability": "nonpayable",
"virtual": false,
"visibility": "internal"
}
],
"scope": 3756,
"src": "223:2394:18"
}
],
"src": "32:2586:18"
},
"legacyAST": {
"attributes": {
"absolutePath": "project:/contracts/proxies/Clone2Factory.sol",
"exportedSymbols": {
"Clone2Factory": [
3755
]
},
"license": "MIT"
},
"children": [
{
"attributes": {
"literals": [
"solidity",