UNPKG

@andrekorol/kollateral

Version:

Typescript library for Kollateral, the flash loan building block

826 lines 259 kB
{ "contractName": "KollateralInvokable", "abi": [ { "stateMutability": "payable", "type": "fallback" }, { "inputs": [ { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "execute", "outputs": [], "stateMutability": "payable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "metadata": "{\"compiler\":{\"version\":\"0.7.3+commit.9bfce1f6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/KollateralInvokable.sol\":\"KollateralInvokable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvocationHook.sol\":{\"keccak256\":\"0x36fb31db8a8e7eed7038b37554582655826969a556005d8ee3ab5070fe034860\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e0dde70be03ea1e086a5bce0d3a7bb1ac65549eab7ea2618343255332edddca7\",\"dweb:/ipfs/QmVaQG686g3tbgM3L3mtw4ei1WxzcDRcS9UxipSt4KCYs1\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvokable.sol\":{\"keccak256\":\"0x372bca80a3e9d20439e9bf88cc026d6d1ec01556463e902511c67b6fc92e12d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a5e6b5ef4246d03871bbd44b34e1212a9567d963f1b1e8e58e6273709442d4fb\",\"dweb:/ipfs/Qmb5Es45FLS4hhNGb9md3KU7L7hyMW7HHzumrVfsZZgxgC\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/KollateralInvokable.sol\":{\"keccak256\":\"0x4b02498b78045bba86ea077b47f9fc10714e0a8f17a9bca0498dac1b7b7dadac\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://beb241b55d91c474fb08119c4f4ddf92fa2fffb2a3f811d76511341880b70e8c\",\"dweb:/ipfs/QmdxtYC83A8Axn2XuJZcmE3RzEFxKXu7SSbvVoqCMydgYA\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/BalanceCarrier.sol\":{\"keccak256\":\"0x69e63e482d839c831c8c32f002e6454f6a8d9e602b39e9cdc1c0649451df3337\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0a40661372b8f95cbed7714a16323b435ccbe85205178d32bc6012e47bfc0640\",\"dweb:/ipfs/QmTyHr1Ag4AkcyazzTT5GDcWabAMHPTrELoGhL85ZWDgBy\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/ExternalCaller.sol\":{\"keccak256\":\"0x54f88a1f0ac5dd7ab99a0519124cb09f1e19b4efb9baf240bc2500f8caa0b4ff\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3170671378d20b47498224d065e33fccc223ae772d7f0af2c5ef314f94b75c98\",\"dweb:/ipfs/Qme8ZEEBnBG5Vvj8uyJCD2YVPcLx6funKsSSCpGkTyn1zi\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0xba96bc371ba999f452985a98717cca1e4c4abb598dc038a9a9c3db08129b1ba4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26e50e3f7b6482fb6f598f2e006994a74aa492687daa4b3eee7fd4fb5398ce7f\",\"dweb:/ipfs/QmZudqoPSkA4USLMFsBBmt19dDPZFS8aaAmL5R7pECXu6t\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xbd74f587ab9b9711801baf667db1426e4a03fd2d7f15af33e0e0d0394e7cef76\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2d0913dfbfce90d170df0d496ad7596c0778518e5fa7aba6c32562522546f66b\",\"dweb:/ipfs/QmR6B8nLj2PJf5e1JWD9Nk7ErkAwkqUwadCnvE82FJr1RU\"]}},\"version\":1}", "bytecode": "0x", "deployedBytecode": "0x", "immutableReferences": {}, "generatedSources": [], "deployedGeneratedSources": [], "sourceMap": "", "deployedSourceMap": "", "source": "/*\n\n Copyright 2020 Kollateral LLC.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\n// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.7.0;\n\nimport \"../utils/BalanceCarrier.sol\";\nimport \"./IInvocationHook.sol\";\nimport \"./IInvokable.sol\";\nimport \"@openzeppelin/contracts/math/SafeMath.sol\";\n\nabstract contract KollateralInvokable is IInvokable, BalanceCarrier {\n using SafeMath for uint256;\n\n uint256 internal MAX_REWARD_BIPS = 100;\n\n constructor() BalanceCarrier(address(1)) {}\n\n receive() external payable {}\n\n fallback() external payable {}\n\n function repay() internal repaymentSafeguard {\n require(\n transfer(\n currentTokenAddress(),\n msg.sender,\n currentRepaymentAmount()\n ),\n \"KollateralInvokable: failed to repay\"\n );\n }\n\n function currentSender() internal view returns (address) {\n return IInvocationHook(msg.sender).currentSender();\n }\n\n function currentTokenAddress() internal view returns (address) {\n return IInvocationHook(msg.sender).currentTokenAddress();\n }\n\n function currentTokenAmount() internal view returns (uint256) {\n return IInvocationHook(msg.sender).currentTokenAmount();\n }\n\n function currentRepaymentAmount() internal view returns (uint256) {\n return IInvocationHook(msg.sender).currentRepaymentAmount();\n }\n\n function isCurrentTokenEther() internal view returns (bool) {\n return currentTokenAddress() == address(1);\n }\n\n modifier repaymentSafeguard() {\n uint256 effectiveReward = currentRepaymentAmount()\n .sub(currentTokenAmount())\n .mul(10000)\n .div(currentTokenAmount());\n\n require(\n effectiveReward <= MAX_REWARD_BIPS,\n \"KollateralInvokable: repayment reward too high\"\n );\n\n _;\n }\n}\n", "sourcePath": "/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/KollateralInvokable.sol", "ast": { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/KollateralInvokable.sol", "exportedSymbols": { "BalanceCarrier": [ 1464 ], "ExternalCaller": [ 1563 ], "IERC20": [ 6165 ], "IInvocationHook": [ 1170 ], "IInvokable": [ 1178 ], "KollateralInvokable": [ 1380 ], "SafeMath": [ 5584 ] }, "id": 1381, "license": "Apache-2.0", "nodeType": "SourceUnit", "nodes": [ { "id": 1236, "literals": [ "solidity", "^", "0.7", ".0" ], "nodeType": "PragmaDirective", "src": "640:23:5" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/BalanceCarrier.sol", "file": "../utils/BalanceCarrier.sol", "id": 1237, "nodeType": "ImportDirective", "scope": 1381, "sourceUnit": 1465, "src": "665:37:5", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvocationHook.sol", "file": "./IInvocationHook.sol", "id": 1238, "nodeType": "ImportDirective", "scope": 1381, "sourceUnit": 1171, "src": "703:31:5", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvokable.sol", "file": "./IInvokable.sol", "id": 1239, "nodeType": "ImportDirective", "scope": 1381, "sourceUnit": 1179, "src": "735:26:5", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "@openzeppelin/contracts/math/SafeMath.sol", "file": "@openzeppelin/contracts/math/SafeMath.sol", "id": 1240, "nodeType": "ImportDirective", "scope": 1381, "sourceUnit": 5585, "src": "762:51:5", "symbolAliases": [], "unitAlias": "" }, { "abstract": true, "baseContracts": [ { "baseName": { "id": 1241, "name": "IInvokable", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 1178, "src": "856:10:5", "typeDescriptions": { "typeIdentifier": "t_contract$_IInvokable_$1178", "typeString": "contract IInvokable" } }, "id": 1242, "nodeType": "InheritanceSpecifier", "src": "856:10:5" }, { "baseName": { "id": 1243, "name": "BalanceCarrier", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 1464, "src": "868:14:5", "typeDescriptions": { "typeIdentifier": "t_contract$_BalanceCarrier_$1464", "typeString": "contract BalanceCarrier" } }, "id": 1244, "nodeType": "InheritanceSpecifier", "src": "868:14:5" } ], "contractDependencies": [ 1178, 1464, 1563 ], "contractKind": "contract", "fullyImplemented": false, "id": 1380, "linearizedBaseContracts": [ 1380, 1464, 1563, 1178 ], "name": "KollateralInvokable", "nodeType": "ContractDefinition", "nodes": [ { "id": 1247, "libraryName": { "id": 1245, "name": "SafeMath", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 5584, "src": "895:8:5", "typeDescriptions": { "typeIdentifier": "t_contract$_SafeMath_$5584", "typeString": "library SafeMath" } }, "nodeType": "UsingForDirective", "src": "889:27:5", "typeName": { "id": 1246, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "908:7:5", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } } }, { "constant": false, "id": 1250, "mutability": "mutable", "name": "MAX_REWARD_BIPS", "nodeType": "VariableDeclaration", "scope": 1380, "src": "922:38:5", "stateVariable": true, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" }, "typeName": { "id": 1248, "name": "uint256", "nodeType": "ElementaryTypeName", "src": "922:7:5", "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } }, "value": { "hexValue": "313030", "id": 1249, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "957:3:5", "typeDescriptions": { "typeIdentifier": "t_rational_100_by_1", "typeString": "int_const 100" }, "value": "100" }, "visibility": "internal" }, { "body": { "id": 1259, "nodeType": "Block", "src": "1008:2:5", "statements": [] }, "id": 1260, "implemented": true, "kind": "constructor", "modifiers": [ { "arguments": [ { "arguments": [ { "hexValue": "31", "id": 1255, "isConstant": false, "isLValue": false, "isPure": true, "kind": "number", "lValueRequested": false, "nodeType": "Literal", "src": "1004:1:5", "typeDescriptions": { "typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1" }, "value": "1" } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_rational_1_by_1", "typeString": "int_const 1" } ], "id": 1254, "isConstant": false, "isLValue": false, "isPure": true, "lValueRequested": false, "nodeType": "ElementaryTypeNameExpression", "src": "996:7:5", "typeDescriptions": { "typeIdentifier": "t_type$_t_address_$", "typeString": "type(address)" }, "typeName": { "id": 1253, "name": "address", "nodeType": "ElementaryTypeName", "src": "996:7:5", "typeDescriptions": {} } }, "id": 1256, "isConstant": false, "isLValue": false, "isPure": true, "kind": "typeConversion", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "996:10:5", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_address_payable", "typeString": "address payable" } } ], "id": 1257, "modifierName": { "id": 1252, "name": "BalanceCarrier", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1464, "src": "981:14:5", "typeDescriptions": { "typeIdentifier": "t_type$_t_contract$_BalanceCarrier_$1464_$", "typeString": "type(contract BalanceCarrier)" } }, "nodeType": "ModifierInvocation", "src": "981:26:5" } ], "name": "", "nodeType": "FunctionDefinition", "parameters": { "id": 1251, "nodeType": "ParameterList", "parameters": [], "src": "978:2:5" }, "returnParameters": { "id": 1258, "nodeType": "ParameterList", "parameters": [], "src": "1008:0:5" }, "scope": 1380, "src": "967:43:5", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" }, { "body": { "id": 1263, "nodeType": "Block", "src": "1043:2:5", "statements": [] }, "id": 1264, "implemented": true, "kind": "receive", "modifiers": [], "name": "", "nodeType": "FunctionDefinition", "parameters": { "id": 1261, "nodeType": "ParameterList", "parameters": [], "src": "1023:2:5" }, "returnParameters": { "id": 1262, "nodeType": "ParameterList", "parameters": [], "src": "1043:0:5" }, "scope": 1380, "src": "1016:29:5", "stateMutability": "payable", "virtual": false, "visibility": "external" }, { "body": { "id": 1267, "nodeType": "Block", "src": "1079:2:5", "statements": [] }, "id": 1268, "implemented": true, "kind": "fallback", "modifiers": [], "name": "", "nodeType": "FunctionDefinition", "parameters": { "id": 1265, "nodeType": "ParameterList", "parameters": [], "src": "1059:2:5" }, "returnParameters": { "id": 1266, "nodeType": "ParameterList", "parameters": [], "src": "1079:0:5" }, "scope": 1380, "src": "1051:30:5", "stateMutability": "payable", "virtual": false, "visibility": "external" }, { "body": { "id": 1285, "nodeType": "Block", "src": "1132:231:5", "statements": [ { "expression": { "arguments": [ { "arguments": [ { "arguments": [], "expression": { "argumentTypes": [], "id": 1275, "name": "currentTokenAddress", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1312, "src": "1189:19:5", "typeDescriptions": { "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$", "typeString": "function () view returns (address)" } }, "id": 1276, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1189:21:5", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, { "expression": { "id": 1277, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1228:3:5", "typeDescriptions": { "typeIdentifier": "t_magic_message", "typeString": "msg" } }, "id": 1278, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "sender", "nodeType": "MemberAccess", "src": "1228:10:5", "typeDescriptions": { "typeIdentifier": "t_address_payable", "typeString": "address payable" } }, { "arguments": [], "expression": { "argumentTypes": [], "id": 1279, "name": "currentRepaymentAmount", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1338, "src": "1256:22:5", "typeDescriptions": { "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", "typeString": "function () view returns (uint256)" } }, "id": 1280, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1256:24:5", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_uint256", "typeString": "uint256" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_address", "typeString": "address" }, { "typeIdentifier": "t_address_payable", "typeString": "address payable" }, { "typeIdentifier": "t_uint256", "typeString": "uint256" } ], "id": 1274, "name": "transfer", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1433, "src": "1163:8:5", "typeDescriptions": { "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$", "typeString": "function (address,address,uint256) returns (bool)" } }, "id": 1281, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1163:131:5", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_bool", "typeString": "bool" } }, { "hexValue": "4b6f6c6c61746572616c496e766f6b61626c653a206661696c656420746f207265706179", "id": 1282, "isConstant": false, "isLValue": false, "isPure": true, "kind": "string", "lValueRequested": false, "nodeType": "Literal", "src": "1308:38:5", "typeDescriptions": { "typeIdentifier": "t_stringliteral_25039293441dc3e8232a383779798de2494653a268629a0301d0a232553a467e", "typeString": "literal_string \"KollateralInvokable: failed to repay\"" }, "value": "KollateralInvokable: failed to repay" } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_bool", "typeString": "bool" }, { "typeIdentifier": "t_stringliteral_25039293441dc3e8232a383779798de2494653a268629a0301d0a232553a467e", "typeString": "literal_string \"KollateralInvokable: failed to repay\"" } ], "id": 1273, "name": "require", "nodeType": "Identifier", "overloadedDeclarations": [ -18, -18 ], "referencedDeclaration": -18, "src": "1142:7:5", "typeDescriptions": { "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", "typeString": "function (bool,string memory) pure" } }, "id": 1283, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1142:214:5", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_tuple$__$", "typeString": "tuple()" } }, "id": 1284, "nodeType": "ExpressionStatement", "src": "1142:214:5" } ] }, "id": 1286, "implemented": true, "kind": "function", "modifiers": [ { "id": 1271, "modifierName": { "id": 1270, "name": "repaymentSafeguard", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1379, "src": "1113:18:5", "typeDescriptions": { "typeIdentifier": "t_modifier$__$", "typeString": "modifier ()" } }, "nodeType": "ModifierInvocation", "src": "1113:18:5" } ], "name": "repay", "nodeType": "FunctionDefinition", "parameters": { "id": 1269, "nodeType": "ParameterList", "parameters": [], "src": "1101:2:5" }, "returnParameters": { "id": 1272, "nodeType": "ParameterList", "parameters": [], "src": "1132:0:5" }, "scope": 1380, "src": "1087:276:5", "stateMutability": "nonpayable", "virtual": false, "visibility": "internal" }, { "body": { "id": 1298, "nodeType": "Block", "src": "1426:67:5", "statements": [ { "expression": { "arguments": [], "expression": { "argumentTypes": [], "expression": { "arguments": [ { "expression": { "id": 1292, "name": "msg", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": -15, "src": "1459:3:5", "typeDescriptions": { "typeIdentifier": "t_magic_message", "typeString": "msg" } }, "id": 1293, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "sender", "nodeType": "MemberAccess", "src": "1459:10:5", "typeDescriptions": { "typeIdentifier": "t_address_payable", "typeString": "address payable" } } ], "expression": { "argumentTypes": [ { "typeIdentifier": "t_address_payable", "typeString": "address payable" } ], "id": 1291, "name": "IInvocationHook", "nodeType": "Identifier", "overloadedDeclarations": [], "referencedDeclaration": 1170, "src": "1443:15:5", "typeDescriptions": { "typeIdentifier": "t_type$_t_contract$_IInvocationHook_$1170_$", "typeString": "type(contract IInvocationHook)" } }, "id": 1294, "isConstant": false, "isLValue": false, "isPure": false, "kind": "typeConversion", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1443:27:5", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_contract$_IInvocationHook_$1170", "typeString": "contract IInvocationHook" } }, "id": 1295, "isConstant": false, "isLValue": false, "isPure": false, "lValueRequested": false, "memberName": "currentSender", "nodeType": "MemberAccess", "referencedDeclaration": 1154, "src": "1443:41:5", "typeDescriptions": { "typeIdentifier": "t_function_external_view$__$returns$_t_address_$", "typeString": "function () view external returns (address)" } }, "id": 1296, "isConstant": false, "isLValue": false, "isPure": false, "kind": "functionCall", "lValueRequested": false, "names": [], "nodeType": "FunctionCall", "src": "1443:43:5", "tryCall": false, "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "functionReturnParameters": 1290, "id": 1297, "nodeType": "Return", "src": "1436:50:5" } ] }, "id": 1299, "implemented": true, "kind": "function", "modifiers": [], "name": "currentSender", "nodeType": "FunctionDefinition", "parameters": { "id": 1287, "nodeType": "ParameterList", "parameters": [], "src": "1391:2:5" }, "returnParameters": { "id": 1290, "nodeType": "ParameterList", "parameters": [ { "constant": false, "id": 1289, "mutability": "mutable", "name": "", "nodeType": "VariableDeclaration", "scope": 1299, "src": "1417:7:5", "stateVariable": false, "storageLocation": "default", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" }, "typeName": { "id": 1288, "name": "address", "nodeType": "ElementaryTypeName", "src": "1417:7:5", "stateMutability": "nonpayable", "typeDescriptions": { "typeIdentifier": "t_address", "typeString": "address" } }, "visibility": "internal" } ], "src": "1416:9:5" }, "scope": 1380, "src": "1369:124:5", "stateMutability": "view", "virtual": false, "visibility": "internal" }, { "body": { "id": 1311, "nodeType": "Block", "src": "1562:73:5", "statements": [ { "e