{
  "fileName": "PullPayment.sol",
  "contractName": "PullPayment",
  "source": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\nimport \"./escrow/Escrow.sol\";\n\n/**\n * @dev Simple implementation of a\n * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment]\n * strategy, where the paying contract doesn't interact directly with the\n * receiver account, which must withdraw its payments itself.\n *\n * Pull-payments are often considered the best practice when it comes to sending\n * Ether, security-wise. It prevents recipients from blocking execution, and\n * eliminates reentrancy concerns.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n *\n * To use, derive from the `PullPayment` contract, and use {_asyncTransfer}\n * instead of Solidity's `transfer` function. Payees can query their due\n * payments with {payments}, and retrieve them with {withdrawPayments}.\n */\ncontract PullPayment {\n    Escrow private _escrow;\n\n    constructor () {\n        _escrow = new Escrow();\n    }\n\n    /**\n     * @dev Withdraw accumulated payments, forwarding all gas to the recipient.\n     *\n     * Note that _any_ account can call this function, not just the `payee`.\n     * This means that contracts unaware of the `PullPayment` protocol can still\n     * receive funds this way, by having a separate account call\n     * {withdrawPayments}.\n     *\n     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.\n     * Make sure you trust the recipient, or are either following the\n     * checks-effects-interactions pattern or using {ReentrancyGuard}.\n     *\n     * @param payee Whose payments will be withdrawn.\n     */\n    function withdrawPayments(address payable payee) public virtual {\n        _escrow.withdraw(payee);\n    }\n\n    /**\n     * @dev Returns the payments owed to an address.\n     * @param dest The creditor's address.\n     */\n    function payments(address dest) public view returns (uint256) {\n        return _escrow.depositsOf(dest);\n    }\n\n    /**\n     * @dev Called by the payer to store the sent amount as credit to be pulled.\n     * Funds sent in this way are stored in an intermediate {Escrow} contract, so\n     * there is no danger of them being spent before withdrawal.\n     *\n     * @param dest The destination address of the funds.\n     * @param amount The amount to transfer.\n     */\n    function _asyncTransfer(address dest, uint256 amount) internal virtual {\n        _escrow.deposit{ value: amount }(dest);\n    }\n}\n",
  "sourcePath": "contracts/payment/PullPayment.sol",
  "sourceMap": "1039:1578:69:-:0;;;1095:54;;;;;;;;;;1130:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;1120:7;;:22;;;;;;;;;;;;;;;;;;1039:1578;;;;;;;;;;:::o;:::-;;;;;;;",
  "deployedSourceMap": "1039:1578:69:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1798:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2020:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1798:104;1872:7;;;;;;;;;;:16;;;1889:5;1872:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1798:104;:::o;2020:110::-;2073:7;2099;;;;;;;;;;;:18;;;2118:4;2099:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2092:31;;2020:110;;;:::o",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "dest",
          "type": "address"
        }
      ],
      "name": "payments",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "payee",
          "type": "address"
        }
      ],
      "name": "withdrawPayments",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/payment/PullPayment.sol",
    "exportedSymbols": {
      "PullPayment": [
        6513
      ]
    },
    "id": 6514,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 6454,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "33:23:69"
      },
      {
        "absolutePath": "contracts/payment/escrow/Escrow.sol",
        "file": "./escrow/Escrow.sol",
        "id": 6455,
        "nodeType": "ImportDirective",
        "scope": 6514,
        "sourceUnit": 6654,
        "src": "58:29:69",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [
          6653
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 6456,
          "nodeType": "StructuredDocumentation",
          "src": "89:949:69",
          "text": " @dev Simple implementation of a\n https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment]\n strategy, where the paying contract doesn't interact directly with the\n receiver account, which must withdraw its payments itself.\n Pull-payments are often considered the best practice when it comes to sending\n Ether, security-wise. It prevents recipients from blocking execution, and\n eliminates reentrancy concerns.\n TIP: If you would like to learn more about reentrancy and alternative ways\n to protect against it, check out our blog post\n https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n To use, derive from the `PullPayment` contract, and use {_asyncTransfer}\n instead of Solidity's `transfer` function. Payees can query their due\n payments with {payments}, and retrieve them with {withdrawPayments}."
        },
        "fullyImplemented": true,
        "id": 6513,
        "linearizedBaseContracts": [
          6513
        ],
        "name": "PullPayment",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 6458,
            "mutability": "mutable",
            "name": "_escrow",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 6513,
            "src": "1066:22:69",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_Escrow_$6653",
              "typeString": "contract Escrow"
            },
            "typeName": {
              "contractScope": null,
              "id": 6457,
              "name": "Escrow",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 6653,
              "src": "1066:6:69",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Escrow_$6653",
                "typeString": "contract Escrow"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 6467,
              "nodeType": "Block",
              "src": "1110:39:69",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 6465,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 6461,
                      "name": "_escrow",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6458,
                      "src": "1120:7:69",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Escrow_$6653",
                        "typeString": "contract Escrow"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 6463,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "NewExpression",
                        "src": "1130:10:69",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_Escrow_$6653_$",
                          "typeString": "function () returns (contract Escrow)"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6462,
                          "name": "Escrow",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 6653,
                          "src": "1134:6:69",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Escrow_$6653",
                            "typeString": "contract Escrow"
                          }
                        }
                      },
                      "id": 6464,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1130:12:69",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Escrow_$6653",
                        "typeString": "contract Escrow"
                      }
                    },
                    "src": "1120:22:69",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Escrow_$6653",
                      "typeString": "contract Escrow"
                    }
                  },
                  "id": 6466,
                  "nodeType": "ExpressionStatement",
                  "src": "1120:22:69"
                }
              ]
            },
            "documentation": null,
            "id": 6468,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 6459,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1107:2:69"
            },
            "returnParameters": {
              "id": 6460,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1110:0:69"
            },
            "scope": 6513,
            "src": "1095:54:69",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 6480,
              "nodeType": "Block",
              "src": "1862:40:69",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6477,
                        "name": "payee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6471,
                        "src": "1889:5:69",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6474,
                        "name": "_escrow",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6458,
                        "src": "1872:7:69",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Escrow_$6653",
                          "typeString": "contract Escrow"
                        }
                      },
                      "id": 6476,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "withdraw",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 6652,
                      "src": "1872:16:69",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_payable_$returns$__$",
                        "typeString": "function (address payable) external"
                      }
                    },
                    "id": 6478,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1872:23:69",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6479,
                  "nodeType": "ExpressionStatement",
                  "src": "1872:23:69"
                }
              ]
            },
            "documentation": {
              "id": 6469,
              "nodeType": "StructuredDocumentation",
              "src": "1155:638:69",
              "text": " @dev Withdraw accumulated payments, forwarding all gas to the recipient.\n Note that _any_ account can call this function, not just the `payee`.\n This means that contracts unaware of the `PullPayment` protocol can still\n receive funds this way, by having a separate account call\n {withdrawPayments}.\n WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.\n Make sure you trust the recipient, or are either following the\n checks-effects-interactions pattern or using {ReentrancyGuard}.\n @param payee Whose payments will be withdrawn."
            },
            "functionSelector": "31b3eb94",
            "id": 6481,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawPayments",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 6472,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6471,
                  "mutability": "mutable",
                  "name": "payee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6481,
                  "src": "1824:21:69",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address_payable",
                    "typeString": "address payable"
                  },
                  "typeName": {
                    "id": 6470,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1824:15:69",
                    "stateMutability": "payable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1823:23:69"
            },
            "returnParameters": {
              "id": 6473,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1862:0:69"
            },
            "scope": 6513,
            "src": "1798:104:69",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": {
              "id": 6494,
              "nodeType": "Block",
              "src": "2082:48:69",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6491,
                        "name": "dest",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6484,
                        "src": "2118:4:69",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 6489,
                        "name": "_escrow",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6458,
                        "src": "2099:7:69",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Escrow_$6653",
                          "typeString": "contract Escrow"
                        }
                      },
                      "id": 6490,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "depositsOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 6590,
                      "src": "2099:18:69",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 6492,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2099:24:69",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 6488,
                  "id": 6493,
                  "nodeType": "Return",
                  "src": "2092:31:69"
                }
              ]
            },
            "documentation": {
              "id": 6482,
              "nodeType": "StructuredDocumentation",
              "src": "1908:107:69",
              "text": " @dev Returns the payments owed to an address.\n @param dest The creditor's address."
            },
            "functionSelector": "e2982c21",
            "id": 6495,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "payments",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 6485,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6484,
                  "mutability": "mutable",
                  "name": "dest",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6495,
                  "src": "2038:12:69",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6483,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2038:7:69",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2037:14:69"
            },
            "returnParameters": {
              "id": 6488,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6487,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6495,
                  "src": "2073:7:69",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6486,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2073:7:69",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2072:9:69"
            },
            "scope": 6513,
            "src": "2020:110:69",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 6511,
              "nodeType": "Block",
              "src": "2560:55:69",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 6508,
                        "name": "dest",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6498,
                        "src": "2603:4:69",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 6503,
                          "name": "_escrow",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6458,
                          "src": "2570:7:69",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Escrow_$6653",
                            "typeString": "contract Escrow"
                          }
                        },
                        "id": 6505,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "deposit",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 6620,
                        "src": "2570:15:69",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$",
                          "typeString": "function (address) payable external"
                        }
                      },
                      "id": 6507,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "names": [
                        "value"
                      ],
                      "nodeType": "FunctionCallOptions",
                      "options": [
                        {
                          "argumentTypes": null,
                          "id": 6506,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6500,
                          "src": "2594:6:69",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "src": "2570:32:69",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_payable$_t_address_$returns$__$value",
                        "typeString": "function (address) payable external"
                      }
                    },
                    "id": 6509,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2570:38:69",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6510,
                  "nodeType": "ExpressionStatement",
                  "src": "2570:38:69"
                }
              ]
            },
            "documentation": {
              "id": 6496,
              "nodeType": "StructuredDocumentation",
              "src": "2136:348:69",
              "text": " @dev Called by the payer to store the sent amount as credit to be pulled.\n Funds sent in this way are stored in an intermediate {Escrow} contract, so\n there is no danger of them being spent before withdrawal.\n @param dest The destination address of the funds.\n @param amount The amount to transfer."
            },
            "id": 6512,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_asyncTransfer",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 6501,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6498,
                  "mutability": "mutable",
                  "name": "dest",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6512,
                  "src": "2513:12:69",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6497,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2513:7:69",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6500,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6512,
                  "src": "2527:14:69",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6499,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2527:7:69",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2512:30:69"
            },
            "returnParameters": {
              "id": 6502,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2560:0:69"
            },
            "scope": 6513,
            "src": "2489:126:69",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          }
        ],
        "scope": 6514,
        "src": "1039:1578:69"
      }
    ],
    "src": "33:2585:69"
  },
  "bytecode": "0x608060405234801561001057600080fd5b5060405161001d9061007e565b604051809103906000f080158015610039573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061008b565b610cd28061031783390190565b61027d8061009a6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806331b3eb941461003b578063e2982c211461007f575b600080fd5b61007d6004803603602081101561005157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100d7565b005b6100c16004803603602081101561009557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061017b565b6040518082815260200191505060405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351cff8d9826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561016057600080fd5b505af1158015610174573d6000803e3d6000fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3a9db1a836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561020557600080fd5b505afa158015610219573d6000803e3d6000fd5b505050506040513d602081101561022f57600080fd5b8101908080519060200190929190505050905091905056fea26469706673582212205c43462701491f8bf20d0bb7f9a9085f35b572796779c951f66e8d4cd666bdbe64736f6c63430007000033608060405234801561001057600080fd5b5060006100216100c460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506100cc565b600033905090565b610bf7806100db6000396000f3fe6080604052600436106100555760003560e01c806351cff8d91461005a578063715018a6146100ab5780638da5cb5b146100c2578063e3a9db1a14610103578063f2fde38b14610168578063f340fa01146101b9575b600080fd5b34801561006657600080fd5b506100a96004803603602081101561007d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506101fd565b005b3480156100b757600080fd5b506100c06103c9565b005b3480156100ce57600080fd5b506100d761054f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561010f57600080fd5b506101526004803603602081101561012657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610578565b6040518082815260200191505060405180910390f35b34801561017457600080fd5b506101b76004803603602081101561018b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506105c1565b005b6101fb600480360360208110156101cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107cc565b005b610205610980565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610377818373ffffffffffffffffffffffffffffffffffffffff1661098890919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040518082815260200191505060405180910390a25050565b6103d1610980565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610491576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6105c9610980565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610689576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561070f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180610b626026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6107d4610980565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610894576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60003490506108eb81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ad990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4826040518082815260200191505060405180910390a25050565b600033905090565b803073ffffffffffffffffffffffffffffffffffffffff16311015610a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114610a75576040519150601f19603f3d011682016040523d82523d6000602084013e610a7a565b606091505b5050905080610ad4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180610b88603a913960400191505060405180910390fd5b505050565b600080828401905083811015610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b809150509291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564a2646970667358221220cf17d4ba8d5bbb811632cc4362423cc620a701a6e6291150f063ab53ae79c74364736f6c63430007000033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c806331b3eb941461003b578063e2982c211461007f575b600080fd5b61007d6004803603602081101561005157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100d7565b005b6100c16004803603602081101561009557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061017b565b6040518082815260200191505060405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351cff8d9826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561016057600080fd5b505af1158015610174573d6000803e3d6000fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3a9db1a836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561020557600080fd5b505afa158015610219573d6000803e3d6000fd5b505050506040513d602081101561022f57600080fd5b8101908080519060200190929190505050905091905056fea26469706673582212205c43462701491f8bf20d0bb7f9a9085f35b572796779c951f66e8d4cd666bdbe64736f6c63430007000033",
  "compiler": {
    "name": "solc",
    "version": "0.7.0+commit.9e61f92b.Emscripten.clang",
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
