UNPKG

hardlydifficult-eth

Version:

A collection of reusable contracts and Javascript helpers for Ethereum.

1,080 lines (1,079 loc) 67.3 kB
{ "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",