{
  "contractName": "ProxySafeVanillaFDT",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fundsDistributed",
          "type": "uint256"
        }
      ],
      "name": "FundsDistributed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "by",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fundsWithdrawn",
          "type": "uint256"
        }
      ],
      "name": "FundsWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "accumulativeFundsOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fundsToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fundsTokenBalance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "withdrawableFundsOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "withdrawnFundsOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "withdrawFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateFundsReceived",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        },
        {
          "internalType": "contract IERC20",
          "name": "_fundsToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "initialAmount",
          "type": "uint256"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "owners",
          "type": "address[]"
        }
      ],
      "name": "pushFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "burn",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.11+commit.5ef660b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fundsDistributed\",\"type\":\"uint256\"}],\"name\":\"FundsDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"by\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fundsWithdrawn\",\"type\":\"uint256\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"accumulativeFundsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fundsToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fundsTokenBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"contract IERC20\",\"name\":\"_fundsToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"initialAmount\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"owners\",\"type\":\"address[]\"}],\"name\":\"pushFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateFundsReceived\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"withdrawableFundsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"withdrawnFundsOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accumulativeFundsOf(address)\":{\"details\":\"accumulativeFundsOf(_owner) = withdrawableFundsOf(_owner) + withdrawnFundsOf(_owner) = (pointsPerShare * balanceOf(_owner) + pointsCorrection[_owner]) / pointsMultiplier\",\"params\":{\"_owner\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount of funds that `_owner` has earned in total.\"}},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(string,string,address,address,uint256)\":{\"details\":\"\\\"constructor\\\" to be called on deployment\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateFundsReceived()\":{\"details\":\"Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()\"},\"withdrawableFundsOf(address)\":{\"params\":{\"_owner\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount funds that `_owner` can withdraw.\"}},\"withdrawnFundsOf(address)\":{\"params\":{\"_owner\":\"The address of a token holder.\"},\"returns\":{\"_0\":\"The amount of funds that `_owner` has withdrawn.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"accumulativeFundsOf(address)\":{\"notice\":\"prev. accumulativeDividendOfView the amount of funds that an address has earned in total.\"},\"burn(address,uint256)\":{\"notice\":\"Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT.\"},\"initialize(string,string,address,address,uint256)\":{\"notice\":\"Initialize a new instance storage\"},\"mint(address,uint256)\":{\"notice\":\"Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT.\"},\"pushFunds(address[])\":{\"notice\":\"Withdraws funds for a set of token holders\"},\"transfer(address,uint256)\":{\"notice\":\"Overrides the parent class token transfer function to enforce restrictions.\"},\"transferFrom(address,address,uint256)\":{\"notice\":\"Overrides the parent class token transferFrom function to enforce restrictions.\"},\"updateFundsReceived()\":{\"notice\":\"Register a payment of funds in tokens. May be called directly after a deposit is made.\"},\"withdrawFunds()\":{\"notice\":\"Withdraws all available funds for a token holder\"},\"withdrawableFundsOf(address)\":{\"notice\":\"prev. withdrawableDividendOfView the amount of funds that an address can withdraw.\"},\"withdrawnFundsOf(address)\":{\"notice\":\"prev. withdrawnDividendOfView the amount of funds that an address has withdrawn.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeVanillaFDT.sol\":\"ProxySafeVanillaFDT\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol\":{\"keccak256\":\"0x91b13e01fdef718f2d5a64d9d4051dd8495913ac78c2309342e6af7656d1ee21\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d9a17efea849552722739b1ffb0878a80da99072e6af5d8c2bd563dce00ebc29\",\"dweb:/ipfs/QmamL6A7LoLuqwNngKY3NPzZgpihiBPERFCbVB5G5wuPT5\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol\":{\"keccak256\":\"0x357c01314146027ec6d250d5b29824bd795e00578b0b888b8c8063d1f49bfec8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4ba4486b5f8d60500cc1f8af3c9859c4bd0ee07a279f94b67ba1393391e54154\",\"dweb:/ipfs/QmNxYYnyPLh2vNJLzoPAVhHBxvuczBo24GDmRS61nD4ABv\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol\":{\"keccak256\":\"0x367de24e2fcd7cd02aabe65af0afc0c5184781135bb826835a82d406f33c93b5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f08d02e99e8daf2be5f2067c12f2c81aff1983fa49eebbe9cf5bea75ae4f308c\",\"dweb:/ipfs/QmX1xtraEs8QwFF9tBTBPnuoU5mP3k9X9U1Y9eMoEjNyB7\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeVanillaFDT.sol\":{\"keccak256\":\"0xf69b0544f6af67822b688e362b7df0b9a5ebe8b3720f4b134b991a8c3d62784f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b877d66e6021fea995db36629f26e9c9826cc9e79ed91b69a90dbb8d289fdc0c\",\"dweb:/ipfs/QmdB6kHkvA6ADTaWUYNjQDsFuCVJ7wRtbPxyK7cSucZMQK\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/math/SafeMathInt.sol\":{\"keccak256\":\"0xc53b786fe1e9a4a207e503272ca7bf485f4872a196fcdf9b209ff18a025857ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://99aef73723a7dac14a7a407036d85fe6070ea280e8509f214bf709321c1b7d68\",\"dweb:/ipfs/QmQW5ygUX2EJMQkUmNt3q18VrtrCEiNeape7JaUh19p1tF\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/math/SafeMathUint.sol\":{\"keccak256\":\"0xdba5f11842c7ef0d82b4fdccf5430ae81d677c426a8bbe1c5dd4df62ab9e43d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://216bba31081f8f7bae15fbd79648300a04740c472f23957963354497d82d86b2\",\"dweb:/ipfs/QmXMnSfoSKbobfQkcRExx8RC5ZSPCCiNdcb1xy3v3vGgWV\"]},\"@openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol\":{\"keccak256\":\"0xe81686511d62f18b2d9c693c2c94c0a789c690de63aa90e15451ebf65c5bfd3e\",\"urls\":[\"bzz-raw://1332ee1d2b096456bf2e5795b5871d0fed47be6a31c9a2f2cef9206a299565ea\",\"dweb:/ipfs/Qmdu1847Y4UL3gTjbLUManMGfxYEoyGPSodM3Br89SKzwx\"]},\"@openzeppelin/contracts-ethereum-package/contracts/Initializable.sol\":{\"keccak256\":\"0x9bfec92e36234ecc99b5d37230acb6cd1f99560233753162204104a4897e8721\",\"urls\":[\"bzz-raw://5cf7c208583d4d046d75bd99f5507412ab01cce9dd9f802ce9768a416d93ea2f\",\"dweb:/ipfs/QmcQS1BBMPpVEkXP3qzwSjxHNrqDek8YeR7xbVWDC9ApC7\"]},\"@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol\":{\"keccak256\":\"0x04a69a78363214b4e3055db8e620bed222349f0c81e9d1cbe769eb849b69b73f\",\"urls\":[\"bzz-raw://b3115459376196d6c2c3817439c169d9b052b27b70e8ee2e28963cda760736da\",\"dweb:/ipfs/QmXaNF5rmcDSAzBiFMQjf979qb9xNXqD9eZtgo4uM9VEis\"]},\"@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x04d34b3cd5677bea25f8dfceb6dec0eaa071d4d4b789a43f13fe0c415ba4c296\",\"urls\":[\"bzz-raw://e7e8b526a6839e5ba14f0d23a830387fec47f7043ce01d42c9f285b709a9d080\",\"dweb:/ipfs/QmXmhhFmX5gcAvVzNiDPAGA35iHMPNaYtQkACswRHBVTNw\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x9c2d859bc9de93ced0875d226598e56067fe4d6b2dde0e1fd53ca60fa9603db0\",\"urls\":[\"bzz-raw://5df1baba4ea42a94d0e0aed4a87271369ef2cd54d86e89cab7ef1428ff387210\",\"dweb:/ipfs/QmV5ErriAFQWqEPAfWhJ6DxmujH6vBPB3F5Breaq9vUWGu\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x6cc1cb934a3ac2137a7dcaed018af9e235392236ceecfd3687259702b9c767ad\",\"urls\":[\"bzz-raw://0055fa88138cd1c3c6440370f8580f85857f8fe9dec41c99af9eafbeb8d9c3ce\",\"dweb:/ipfs/QmX1xDh8vwGLLCH8ti45eXjQ7Wcxv1FEGTR3jkFnd5Nv6F\"]},\"@openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol\":{\"keccak256\":\"0x5f7da58ee3d9faa9b8999a93d49c8ff978f1afc88ae9bcfc6f9cbb44da011c2b\",\"urls\":[\"bzz-raw://4f089d954b3ecaa26949412fe63e9a184b056562c6c13dd4a0529a5d9a2e685a\",\"dweb:/ipfs/QmVK5iCNAMcEJQxT59bsC5E53JQASDQPU6khHox3d5ZXCn\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b50612003806100206000396000f3fe608060405234801561001057600080fd5b50600436106101725760003560e01c80634e97415f116100de5780639dc29fac11610097578063a9691f3f11610071578063a9691f3f14610507578063c9aba0aa1461050f578063dd62ed3e14610654578063f2fde38b1461068257610172565b80639dc29fac14610483578063a457c2d7146104af578063a9059cbb146104db57610172565b80634e97415f146103fb57806363f04b151461042157806370a0823114610445578063715018a61461046b5780638da5cb5b1461047357806395d89b411461047b57610172565b8063313ce56711610130578063313ce567146102b457806339509351146102d257806340c10f19146102fe578063443bb2931461032a57806345f634f21461035057806346c162de146103f357610172565b806241c52c1461017757806306fdde03146101af578063095ea7b31461022c57806318160ddd1461026c57806323b872dd1461027457806324600fc3146102aa575b600080fd5b61019d6004803603602081101561018d57600080fd5b50356001600160a01b03166106a8565b60408051918252519081900360200190f35b6101b76106c3565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102586004803603604081101561024257600080fd5b506001600160a01b03813516906020013561075a565b604080519115158252519081900360200190f35b61019d610778565b6102586004803603606081101561028a57600080fd5b506001600160a01b0381358116916020810135909116906040013561077e565b6102b2610793565b005b6102bc61079e565b6040805160ff9092168252519081900360200190f35b610258600480360360408110156102e857600080fd5b506001600160a01b0381351690602001356107a7565b6102586004803603604081101561031457600080fd5b506001600160a01b038135169060200135610800565b61019d6004803603602081101561034057600080fd5b50356001600160a01b0316610864565b6102b26004803603602081101561036657600080fd5b81019060208101813564010000000081111561038157600080fd5b82018360208201111561039357600080fd5b803590602001918460208302840111640100000000831117156103b557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610896945050505050565b6102b26108ca565b61019d6004803603602081101561041157600080fd5b50356001600160a01b03166108f3565b61042961095c565b604080516001600160a01b039092168252519081900360200190f35b61019d6004803603602081101561045b57600080fd5b50356001600160a01b031661096b565b6102b2610986565b610429610a28565b6101b7610a37565b6102586004803603604081101561049957600080fd5b506001600160a01b038135169060200135610a98565b610258600480360360408110156104c557600080fd5b506001600160a01b038135169060200135610afc565b610258600480360360408110156104f157600080fd5b506001600160a01b038135169060200135610b6a565b61019d610b7d565b6102b2600480360360a081101561052557600080fd5b81019060208101813564010000000081111561054057600080fd5b82018360208201111561055257600080fd5b8035906020019184600183028401116401000000008311171561057457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105c757600080fd5b8201836020820111156105d957600080fd5b803590602001918460018302840111640100000000831117156105fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383358116945060208401351692604001359150610b839050565b61019d6004803603604081101561066a57600080fd5b506001600160a01b0381358116916020013516610caf565b6102b26004803603602081101561069857600080fd5b50356001600160a01b0316610cda565b6001600160a01b031660009081526099602052604090205490565b60688054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b505050505090505b90565b600061076e610767610dd3565b8484610dd7565b5060015b92915050565b60675490565b600061078b848484610ec3565b949350505050565b61079c33610f4b565b565b606a5460ff1690565b600061076e6107b4610dd3565b846107fb85606660006107c5610dd3565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61102216565b610dd7565b600061080a610dd3565b609a546001600160a01b0390811691161461085a576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b61076e838361107c565b6001600160a01b0381166000908152609960205260408120546107729061088a846108f3565b9063ffffffff6110e616565b60005b81518110156108c6576108be8282815181106108b157fe5b6020026020010151610f4b565b600101610899565b5050565b60006108d4611128565b905060008113156108f0576108f06108eb826111be565b6111d1565b50565b6001600160a01b038116600090815260986020526040812054600160801b9061094e906109499061093d6109386109298861096b565b6097549063ffffffff61129016565b6112e9565b9063ffffffff6112f916565b6111be565b8161095557fe5b0492915050565b60cc546001600160a01b031681565b6001600160a01b031660009081526065602052604090205490565b61098e610dd3565b609a546001600160a01b039081169116146109de576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b609a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609a80546001600160a01b0319169055565b609a546001600160a01b031690565b60698054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561074f5780601f106107245761010080835404028352916020019161074f565b6000610aa2610dd3565b609a546001600160a01b03908116911614610af2576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b61076e838361132c565b600061076e610b09610dd3565b846107fb85604051806060016040528060258152602001611fa96025913960666000610b33610dd3565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61137616565b6000610b76838361140d565b9392505050565b60cd5481565b600054610100900460ff1680610b9c5750610b9c611421565b80610baa575060005460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015610c10576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038416610c555760405162461bcd60e51b8152600401808060200182810382526027815260200180611f826027913960400191505060405180910390fd5b610c5f8686611427565b610c676114dc565b60cc80546001600160a01b0319166001600160a01b038616179055610c8b83610cda565b610c95838361107c565b8015610ca7576000805461ff00191690555b505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610ce2610dd3565b609a546001600160a01b03908116911614610d32576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b6001600160a01b038116610d775760405162461bcd60e51b8152600401808060200182810382526026815260200180611db36026913960400191505060405180910390fd5b609a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609a80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316610e1c5760405162461bcd60e51b8152600401808060200182810382526024815260200180611f356024913960400191505060405180910390fd5b6001600160a01b038216610e615760405162461bcd60e51b8152600401808060200182810382526022815260200180611dd96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000610ed084848461158d565b610f4184610edc610dd3565b6107fb85604051806060016040528060288152602001611e79602891396001600160a01b038a16600090815260666020526040812090610f1a610dd3565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61137616565b5060019392505050565b6000610f5682611635565b60cc546040805163a9059cbb60e01b81526001600160a01b03868116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b505050506040513d6020811015610fd857600080fd5b50516110155760405162461bcd60e51b8152600401808060200182810382526029815260200180611f596029913960400191505060405180910390fd5b61101d611128565b505050565b600082820183811015610b76576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61108682826116c5565b6110c66110a16109388360975461129090919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff6117c316565b6001600160a01b0390921660009081526098602052604090209190915550565b6000610b7683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611376565b60cd5460cc54604080516370a0823160e01b81523060048201529051600093926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561117757600080fd5b505afa15801561118b573d6000803e3d6000fd5b505050506040513d60208110156111a157600080fd5b505160cd8190556111b8908263ffffffff6117c316565b91505090565b6000808212156111cd57600080fd5b5090565b60006111db610778565b116112175760405162461bcd60e51b8152600401808060200182810382526037815260200180611e216037913960400191505060405180910390fd5b80156108f057611254611228610778565b61123c83600160801b63ffffffff61129016565b8161124357fe5b60975491900463ffffffff61102216565b60975560408051828152905133917f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd919081900360200190a250565b60008261129f57506000610772565b828202828482816112ac57fe5b0414610b765760405162461bcd60e51b8152600401808060200182810382526021815260200180611e586021913960400191505060405180910390fd5b6000818181121561077257600080fd5b600082820181831280159061130e5750838112155b80611323575060008312801561132357508381125b610b7657600080fd5b61133682826117fd565b6110c66113516109388360975461129090919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff6112f916565b600081848411156114055760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156113ca5781810151838201526020016113b2565b50505050905090810190601f1680156113f75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061076e61141a610dd3565b848461158d565b303b1590565b600054610100900460ff16806114405750611440611421565b8061144e575060005460ff16155b6114895760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff161580156114b4576000805460ff1961ff0019909116610100171660011790555b6114bc611905565b6114c683836119a5565b801561101d576000805461ff0019169055505050565b600054610100900460ff16806114f557506114f5611421565b80611503575060005460ff16155b61153e5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611569576000805460ff1961ff0019909116610100171660011790555b611571611905565b611579611a7d565b80156108f0576000805461ff001916905550565b611598838383611b76565b60006115b26109388360975461129090919063ffffffff16565b6001600160a01b0385166000908152609860205260409020549091506115de908263ffffffff6112f916565b6001600160a01b038086166000908152609860205260408082209390935590851681522054611613908263ffffffff6117c316565b6001600160a01b03909316600090815260986020526040902092909255505050565b60008061164183610864565b6001600160a01b03841660009081526099602052604090205490915061166d908263ffffffff61102216565b6001600160a01b038416600081815260996020908152604091829020939093558051848152905191927feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d92918290030190a292915050565b6001600160a01b038216611720576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61172c6000838361101d565b60675461173f908263ffffffff61102216565b6067556001600160a01b03821660009081526065602052604090205461176b908263ffffffff61102216565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008082121580156117d757508282840313155b806117ee57506000821280156117ee575082828403135b6117f757600080fd5b50900390565b6001600160a01b0382166118425760405162461bcd60e51b8152600401808060200182810382526021815260200180611eef6021913960400191505060405180910390fd5b61184e8260008361101d565b61189181604051806060016040528060228152602001611d91602291396001600160a01b038516600090815260656020526040902054919063ffffffff61137616565b6001600160a01b0383166000908152606560205260409020556067546118bd908263ffffffff6110e616565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600054610100900460ff168061191e575061191e611421565b8061192c575060005460ff16155b6119675760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611579576000805460ff1961ff00199091166101001716600117905580156108f0576000805461ff001916905550565b600054610100900460ff16806119be57506119be611421565b806119cc575060005460ff16155b611a075760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611a32576000805460ff1961ff0019909116610100171660011790555b8251611a45906068906020860190611cdf565b508151611a59906069906020850190611cdf565b50606a805460ff19166012179055801561101d576000805461ff0019169055505050565b600054610100900460ff1680611a965750611a96611421565b80611aa4575060005460ff16155b611adf5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611b0a576000805460ff1961ff0019909116610100171660011790555b6000611b14610dd3565b609a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156108f0576000805461ff001916905550565b6001600160a01b038316611bbb5760405162461bcd60e51b8152600401808060200182810382526025815260200180611f106025913960400191505060405180910390fd5b6001600160a01b038216611c005760405162461bcd60e51b8152600401808060200182810382526023815260200180611d6e6023913960400191505060405180910390fd5b611c0b83838361101d565b611c4e81604051806060016040528060268152602001611dfb602691396001600160a01b038616600090815260656020526040902054919063ffffffff61137616565b6001600160a01b038085166000908152606560205260408082209390935590841681522054611c83908263ffffffff61102216565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d2057805160ff1916838001178555611d4d565b82800160010185558215611d4d579182015b82811115611d4d578251825591602001919060010190611d32565b506111cd926107579250905b808211156111cd5760008155600101611d5956fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6473446973747269627574696f6e546f6b656e2e5f6469737472696275746546756e64733a20535550504c595f49535f5a45524f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737356616e696c6c614644542e776974686472617746756e64733a205452414e534645525f4641494c454456616e696c6c614644543a20494e56414c49445f46554e44535f544f4b454e5f4144445245535345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122036da5fa037177bf17c04457428e9730473780e3af81c64e1855916df7ee968ad64736f6c634300060b0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101725760003560e01c80634e97415f116100de5780639dc29fac11610097578063a9691f3f11610071578063a9691f3f14610507578063c9aba0aa1461050f578063dd62ed3e14610654578063f2fde38b1461068257610172565b80639dc29fac14610483578063a457c2d7146104af578063a9059cbb146104db57610172565b80634e97415f146103fb57806363f04b151461042157806370a0823114610445578063715018a61461046b5780638da5cb5b1461047357806395d89b411461047b57610172565b8063313ce56711610130578063313ce567146102b457806339509351146102d257806340c10f19146102fe578063443bb2931461032a57806345f634f21461035057806346c162de146103f357610172565b806241c52c1461017757806306fdde03146101af578063095ea7b31461022c57806318160ddd1461026c57806323b872dd1461027457806324600fc3146102aa575b600080fd5b61019d6004803603602081101561018d57600080fd5b50356001600160a01b03166106a8565b60408051918252519081900360200190f35b6101b76106c3565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101f15781810151838201526020016101d9565b50505050905090810190601f16801561021e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102586004803603604081101561024257600080fd5b506001600160a01b03813516906020013561075a565b604080519115158252519081900360200190f35b61019d610778565b6102586004803603606081101561028a57600080fd5b506001600160a01b0381358116916020810135909116906040013561077e565b6102b2610793565b005b6102bc61079e565b6040805160ff9092168252519081900360200190f35b610258600480360360408110156102e857600080fd5b506001600160a01b0381351690602001356107a7565b6102586004803603604081101561031457600080fd5b506001600160a01b038135169060200135610800565b61019d6004803603602081101561034057600080fd5b50356001600160a01b0316610864565b6102b26004803603602081101561036657600080fd5b81019060208101813564010000000081111561038157600080fd5b82018360208201111561039357600080fd5b803590602001918460208302840111640100000000831117156103b557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610896945050505050565b6102b26108ca565b61019d6004803603602081101561041157600080fd5b50356001600160a01b03166108f3565b61042961095c565b604080516001600160a01b039092168252519081900360200190f35b61019d6004803603602081101561045b57600080fd5b50356001600160a01b031661096b565b6102b2610986565b610429610a28565b6101b7610a37565b6102586004803603604081101561049957600080fd5b506001600160a01b038135169060200135610a98565b610258600480360360408110156104c557600080fd5b506001600160a01b038135169060200135610afc565b610258600480360360408110156104f157600080fd5b506001600160a01b038135169060200135610b6a565b61019d610b7d565b6102b2600480360360a081101561052557600080fd5b81019060208101813564010000000081111561054057600080fd5b82018360208201111561055257600080fd5b8035906020019184600183028401116401000000008311171561057457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105c757600080fd5b8201836020820111156105d957600080fd5b803590602001918460018302840111640100000000831117156105fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383358116945060208401351692604001359150610b839050565b61019d6004803603604081101561066a57600080fd5b506001600160a01b0381358116916020013516610caf565b6102b26004803603602081101561069857600080fd5b50356001600160a01b0316610cda565b6001600160a01b031660009081526099602052604090205490565b60688054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561074f5780601f106107245761010080835404028352916020019161074f565b820191906000526020600020905b81548152906001019060200180831161073257829003601f168201915b505050505090505b90565b600061076e610767610dd3565b8484610dd7565b5060015b92915050565b60675490565b600061078b848484610ec3565b949350505050565b61079c33610f4b565b565b606a5460ff1690565b600061076e6107b4610dd3565b846107fb85606660006107c5610dd3565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61102216565b610dd7565b600061080a610dd3565b609a546001600160a01b0390811691161461085a576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b61076e838361107c565b6001600160a01b0381166000908152609960205260408120546107729061088a846108f3565b9063ffffffff6110e616565b60005b81518110156108c6576108be8282815181106108b157fe5b6020026020010151610f4b565b600101610899565b5050565b60006108d4611128565b905060008113156108f0576108f06108eb826111be565b6111d1565b50565b6001600160a01b038116600090815260986020526040812054600160801b9061094e906109499061093d6109386109298861096b565b6097549063ffffffff61129016565b6112e9565b9063ffffffff6112f916565b6111be565b8161095557fe5b0492915050565b60cc546001600160a01b031681565b6001600160a01b031660009081526065602052604090205490565b61098e610dd3565b609a546001600160a01b039081169116146109de576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b609a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609a80546001600160a01b0319169055565b609a546001600160a01b031690565b60698054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561074f5780601f106107245761010080835404028352916020019161074f565b6000610aa2610dd3565b609a546001600160a01b03908116911614610af2576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b61076e838361132c565b600061076e610b09610dd3565b846107fb85604051806060016040528060258152602001611fa96025913960666000610b33610dd3565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61137616565b6000610b76838361140d565b9392505050565b60cd5481565b600054610100900460ff1680610b9c5750610b9c611421565b80610baa575060005460ff16155b610be55760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015610c10576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038416610c555760405162461bcd60e51b8152600401808060200182810382526027815260200180611f826027913960400191505060405180910390fd5b610c5f8686611427565b610c676114dc565b60cc80546001600160a01b0319166001600160a01b038616179055610c8b83610cda565b610c95838361107c565b8015610ca7576000805461ff00191690555b505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610ce2610dd3565b609a546001600160a01b03908116911614610d32576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea1833981519152604482015290519081900360640190fd5b6001600160a01b038116610d775760405162461bcd60e51b8152600401808060200182810382526026815260200180611db36026913960400191505060405180910390fd5b609a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609a80546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316610e1c5760405162461bcd60e51b8152600401808060200182810382526024815260200180611f356024913960400191505060405180910390fd5b6001600160a01b038216610e615760405162461bcd60e51b8152600401808060200182810382526022815260200180611dd96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000610ed084848461158d565b610f4184610edc610dd3565b6107fb85604051806060016040528060288152602001611e79602891396001600160a01b038a16600090815260666020526040812090610f1a610dd3565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61137616565b5060019392505050565b6000610f5682611635565b60cc546040805163a9059cbb60e01b81526001600160a01b03868116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b158015610fae57600080fd5b505af1158015610fc2573d6000803e3d6000fd5b505050506040513d6020811015610fd857600080fd5b50516110155760405162461bcd60e51b8152600401808060200182810382526029815260200180611f596029913960400191505060405180910390fd5b61101d611128565b505050565b600082820183811015610b76576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61108682826116c5565b6110c66110a16109388360975461129090919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff6117c316565b6001600160a01b0390921660009081526098602052604090209190915550565b6000610b7683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611376565b60cd5460cc54604080516370a0823160e01b81523060048201529051600093926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561117757600080fd5b505afa15801561118b573d6000803e3d6000fd5b505050506040513d60208110156111a157600080fd5b505160cd8190556111b8908263ffffffff6117c316565b91505090565b6000808212156111cd57600080fd5b5090565b60006111db610778565b116112175760405162461bcd60e51b8152600401808060200182810382526037815260200180611e216037913960400191505060405180910390fd5b80156108f057611254611228610778565b61123c83600160801b63ffffffff61129016565b8161124357fe5b60975491900463ffffffff61102216565b60975560408051828152905133917f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd919081900360200190a250565b60008261129f57506000610772565b828202828482816112ac57fe5b0414610b765760405162461bcd60e51b8152600401808060200182810382526021815260200180611e586021913960400191505060405180910390fd5b6000818181121561077257600080fd5b600082820181831280159061130e5750838112155b80611323575060008312801561132357508381125b610b7657600080fd5b61133682826117fd565b6110c66113516109388360975461129090919063ffffffff16565b6001600160a01b0384166000908152609860205260409020549063ffffffff6112f916565b600081848411156114055760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156113ca5781810151838201526020016113b2565b50505050905090810190601f1680156113f75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061076e61141a610dd3565b848461158d565b303b1590565b600054610100900460ff16806114405750611440611421565b8061144e575060005460ff16155b6114895760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff161580156114b4576000805460ff1961ff0019909116610100171660011790555b6114bc611905565b6114c683836119a5565b801561101d576000805461ff0019169055505050565b600054610100900460ff16806114f557506114f5611421565b80611503575060005460ff16155b61153e5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611569576000805460ff1961ff0019909116610100171660011790555b611571611905565b611579611a7d565b80156108f0576000805461ff001916905550565b611598838383611b76565b60006115b26109388360975461129090919063ffffffff16565b6001600160a01b0385166000908152609860205260409020549091506115de908263ffffffff6112f916565b6001600160a01b038086166000908152609860205260408082209390935590851681522054611613908263ffffffff6117c316565b6001600160a01b03909316600090815260986020526040902092909255505050565b60008061164183610864565b6001600160a01b03841660009081526099602052604090205490915061166d908263ffffffff61102216565b6001600160a01b038416600081815260996020908152604091829020939093558051848152905191927feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d92918290030190a292915050565b6001600160a01b038216611720576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61172c6000838361101d565b60675461173f908263ffffffff61102216565b6067556001600160a01b03821660009081526065602052604090205461176b908263ffffffff61102216565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008082121580156117d757508282840313155b806117ee57506000821280156117ee575082828403135b6117f757600080fd5b50900390565b6001600160a01b0382166118425760405162461bcd60e51b8152600401808060200182810382526021815260200180611eef6021913960400191505060405180910390fd5b61184e8260008361101d565b61189181604051806060016040528060228152602001611d91602291396001600160a01b038516600090815260656020526040902054919063ffffffff61137616565b6001600160a01b0383166000908152606560205260409020556067546118bd908263ffffffff6110e616565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600054610100900460ff168061191e575061191e611421565b8061192c575060005460ff16155b6119675760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611579576000805460ff1961ff00199091166101001716600117905580156108f0576000805461ff001916905550565b600054610100900460ff16806119be57506119be611421565b806119cc575060005460ff16155b611a075760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611a32576000805460ff1961ff0019909116610100171660011790555b8251611a45906068906020860190611cdf565b508151611a59906069906020850190611cdf565b50606a805460ff19166012179055801561101d576000805461ff0019169055505050565b600054610100900460ff1680611a965750611a96611421565b80611aa4575060005460ff16155b611adf5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ec1602e913960400191505060405180910390fd5b600054610100900460ff16158015611b0a576000805460ff1961ff0019909116610100171660011790555b6000611b14610dd3565b609a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156108f0576000805461ff001916905550565b6001600160a01b038316611bbb5760405162461bcd60e51b8152600401808060200182810382526025815260200180611f106025913960400191505060405180910390fd5b6001600160a01b038216611c005760405162461bcd60e51b8152600401808060200182810382526023815260200180611d6e6023913960400191505060405180910390fd5b611c0b83838361101d565b611c4e81604051806060016040528060268152602001611dfb602691396001600160a01b038616600090815260656020526040902054919063ffffffff61137616565b6001600160a01b038085166000908152606560205260408082209390935590841681522054611c83908263ffffffff61102216565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d2057805160ff1916838001178555611d4d565b82800160010185558215611d4d579182015b82811115611d4d578251825591602001919060010190611d32565b506111cd926107579250905b808211156111cd5760008155600101611d5956fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6473446973747269627574696f6e546f6b656e2e5f6469737472696275746546756e64733a20535550504c595f49535f5a45524f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737356616e696c6c614644542e776974686472617746756e64733a205452414e534645525f4641494c454456616e696c6c614644543a20494e56414c49445f46554e44535f544f4b454e5f4144445245535345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122036da5fa037177bf17c04457428e9730473780e3af81c64e1855916df7ee968ad64736f6c634300060b0033",
  "immutableReferences": {},
  "sourceMap": "345:4189:52:-:0;;;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "345:4189:52:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3761:117:48;;;;;;;;;;;;;;;;-1:-1:-1;3761:117:48;-1:-1:-1;;;;;3761:117:48;;:::i;:::-;;;;;;;;;;;;;;;;2469:81:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4505:166;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4505:166:111;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3512:98;;;:::i;2921:153:52:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2921:153:52;;;;;;;;;;;;;;;;;:::i;1046:89::-;;;:::i;:::-;;3371:81:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5843:215;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5843:215:111;;;;;;;;:::i;3208:139:52:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3208:139:52;;;;;;;;:::i;3357:162:48:-;;;;;;;;;;;;;;;;-1:-1:-1;3357:162:48;-1:-1:-1;;;;;3357:162:48;;:::i;2402:164:52:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2402:164:52;;-1:-1:-1;2402:164:52;;-1:-1:-1;;;;;2402:164:52:i;1490:196::-;;;:::i;4324:228:48:-;;;;;;;;;;;;;;;;-1:-1:-1;4324:228:48;-1:-1:-1;;;;;4324:228:48;;:::i;633:24:52:-;;;:::i;:::-;;;;-1:-1:-1;;;;;633:24:52;;;;;;;;;;;;;;3668:117:111;;;;;;;;;;;;;;;;-1:-1:-1;3668:117:111;-1:-1:-1;;;;;3668:117:111;;:::i;1894:145:109:-;;;:::i;1271:77::-;;;:::i;2663:85:111:-;;;:::i;3487:139:52:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3487:139:52;;;;;;;;:::i;6545:266:111:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6545:266:111;;;;;;;;:::i;2679:125:52:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2679:125:52;;;;;;;;:::i;741:32::-;;;:::i;1810:512::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1810:512:52;;;;;;;;-1:-1:-1;1810:512:52;;-1:-1:-1;;1810:512:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1810:512:52;;-1:-1:-1;;;;;;;1810:512:52;;;;;-1:-1:-1;1810:512:52;;;;;;;;;;-1:-1:-1;1810:512:52;;-1:-1:-1;1810:512:52:i;4218:149:111:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4218:149:111;;;;;;;;;;:::i;2188:240:109:-;;;;;;;;;;;;;;;;-1:-1:-1;2188:240:109;-1:-1:-1;;;;;2188:240:109;;:::i;3761:117:48:-;-1:-1:-1;;;;;3849:22:48;3823:7;3849:22;;;:14;:22;;;;;;;3761:117::o;2469:81:111:-;2538:5;2531:12;;;;;;;;-1:-1:-1;;2531:12:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2506:13;;2531:12;;2538:5;;2531:12;;2538:5;2531:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2469:81;;:::o;4505:166::-;4588:4;4604:39;4613:12;:10;:12::i;:::-;4627:7;4636:6;4604:8;:39::i;:::-;-1:-1:-1;4660:4:111;4505:166;;;;;:::o;3512:98::-;3591:12;;3512:98;:::o;2921:153:52:-;3009:4;3032:35;3051:4;3057:2;3061:5;3032:18;:35::i;:::-;3025:42;2921:153;-1:-1:-1;;;;2921:153:52:o;1046:89::-;1099:29;1117:10;1099:17;:29::i;:::-;1046:89::o;3371:81:111:-;3436:9;;;;3371:81;:::o;5843:215::-;5931:4;5947:83;5956:12;:10;:12::i;:::-;5970:7;5979:50;6018:10;5979:11;:25;5991:12;:10;:12::i;:::-;-1:-1:-1;;;;;5979:25:111;;;;;;;;;;;;;;;;;-1:-1:-1;5979:25:111;;;:34;;;;;;;;;;;:50;:38;:50;:::i;:::-;5947:8;:83::i;3208:139:52:-;3281:4;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;3297:22:52::1;3303:7;3312:6;3297:5;:22::i;3357:162:48:-:0;-1:-1:-1;;;;;3489:22:48;;3431:7;3489:22;;;:14;:22;;;;;;3457:55;;:27;3504:6;3457:19;:27::i;:::-;:31;:55;:31;:55;:::i;2402:164:52:-;2468:9;2463:97;2487:6;:13;2483:1;:17;2463:97;;;2521:28;2539:6;2546:1;2539:9;;;;;;;;;;;;;;2521:17;:28::i;:::-;2502:3;;2463:97;;;;2402:164;:::o;1490:196::-;1540:15;1558:26;:24;:26::i;:::-;1540:44;;1610:1;1599:8;:12;1595:85;;;1627:42;1644:24;:8;:22;:24::i;:::-;1627:16;:42::i;:::-;1490:196;:::o;4324:228:48:-;-1:-1:-1;;;;;4485:24:48;;4389:7;4485:24;;;:16;:24;;;;;;-1:-1:-1;;;1282:6:48;4415:111;;:95;;:52;:37;4434:17;4502:6;4434:9;:17::i;:::-;4415:14;;;:37;:18;:37;:::i;:::-;:50;:52::i;:::-;:69;:95;:69;:95;:::i;:::-;:109;:111::i;:::-;:130;;;;;;;4324:228;-1:-1:-1;;4324:228:48:o;633:24:52:-;;;-1:-1:-1;;;;;633:24:52;;:::o;3668:117:111:-;-1:-1:-1;;;;;3760:18:111;3734:7;3760:18;;;:9;:18;;;;;;;3668:117::o;1894:145:109:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;1984:6:::1;::::0;1963:40:::1;::::0;2000:1:::1;::::0;-1:-1:-1;;;;;1984:6:109::1;::::0;1963:40:::1;::::0;2000:1;;1963:40:::1;2013:6;:19:::0;;-1:-1:-1;;;;;;2013:19:109::1;::::0;;1894:145::o;1271:77::-;1335:6;;-1:-1:-1;;;;;1335:6:109;1271:77;:::o;2663:85:111:-;2734:7;2727:14;;;;;;;;-1:-1:-1;;2727:14:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2702:13;;2727:14;;2734:7;;2727:14;;2734:7;2727:14;;;;;;;;;;;;;;;;;;;;;;;;3487:139:52;3560:4;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;3576:22:52::1;3582:7;3591:6;3576:5;:22::i;6545:266:111:-:0;6638:4;6654:129;6663:12;:10;:12::i;:::-;6677:7;6686:96;6725:15;6686:96;;;;;;;;;;;;;;;;;:11;:25;6698:12;:10;:12::i;:::-;-1:-1:-1;;;;;6686:25:111;;;;;;;;;;;;;;;;;-1:-1:-1;6686:25:111;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;2679:125:52:-;2749:4;2772:25;2787:2;2791:5;2772:14;:25::i;:::-;2765:32;2679:125;-1:-1:-1;;;2679:125:52:o;741:32::-;;;;:::o;1810:512::-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;-1:-1:-1;;;;;2035:34:52;::::1;2014:120;;;;-1:-1:-1::0;;;2014:120:52::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2145:32;2164:4;2170:6;2145:18;:32::i;:::-;2187:22;:20;:22::i;:::-;2220:10;:24:::0;;-1:-1:-1;;;;;;2220:24:52::1;-1:-1:-1::0;;;;;2220:24:52;::::1;;::::0;;2254::::1;2272:5:::0;2254:17:::1;:24::i;:::-;2288:27;2294:5;2301:13;2288:5;:27::i;:::-;1268:14:108::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;1264:55;1810:512:52;;;;;;:::o;4218:149:111:-;-1:-1:-1;;;;;4333:18:111;;;4307:7;4333:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4218:149::o;2188:240:109:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1467:67:109;;;;;;;;;;;;;;;-1:-1:-1;;;;;2276:22:109;::::1;2268:73;;;;-1:-1:-1::0;;;2268:73:109::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:6;::::0;2356:38:::1;::::0;-1:-1:-1;;;;;2356:38:109;;::::1;::::0;2377:6:::1;::::0;2356:38:::1;::::0;2377:6:::1;::::0;2356:38:::1;2404:6;:17:::0;;-1:-1:-1;;;;;;2404:17:109::1;-1:-1:-1::0;;;;;2404:17:109;;;::::1;::::0;;;::::1;::::0;;2188:240::o;931:104:107:-;1018:10;931:104;:::o;9609:340:111:-;-1:-1:-1;;;;;9710:19:111;;9702:68;;;;-1:-1:-1;;;9702:68:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9788:21:111;;9780:68;;;;-1:-1:-1;;;9780:68:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9859:18:111;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9910:32;;;;;;;;;;;;;;;;;9609:340;;;:::o;5131:317::-;5237:4;5253:36;5263:6;5271:9;5282:6;5253:9;:36::i;:::-;5299:121;5308:6;5316:12;:10;:12::i;:::-;5330:89;5368:6;5330:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5330:19:111;;;;;;:11;:19;;;;;;5350:12;:10;:12::i;:::-;-1:-1:-1;;;;;5330:33:111;;;;;;;;;;;;-1:-1:-1;5330:33:111;;;:89;;:37;:89;:::i;5299:121::-;-1:-1:-1;5437:4:111;5131:317;;;;;:::o;3712:303:52:-;3773:25;3801:26;3821:5;3801:19;:26::i;:::-;3859:10;;:45;;;-1:-1:-1;;;3859:45:52;;-1:-1:-1;;;;;3859:45:52;;;;;;;;;;;;;;;3773:54;;-1:-1:-1;3859:10:52;;;:19;;:45;;;;;;;;;;;;;;;:10;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3859:45:52;3838:133;;;;-1:-1:-1;;;3838:133:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3982:26;:24;:26::i;:::-;;3712:303;;:::o;834:176:110:-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;938:46:110;;;;;;;;;;;;;;;;;;;;;;;;;;;5472:236:48;5547:27;5559:7;5568:5;5547:11;:27::i;:::-;5613:88;5657:42;5658:25;5677:5;5658:14;;:18;;:25;;;;:::i;5657:42::-;-1:-1:-1;;;;;5613:25:48;;;;;;:16;:25;;;;;;;:88;:42;:88;:::i;:::-;-1:-1:-1;;;;;5585:25:48;;;;;;;:16;:25;;;;;:116;;;;-1:-1:-1;5472:236:48:o;1274:134:110:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;4260:272:52:-;4364:17;;4412:10;;:35;;;-1:-1:-1;;;4412:35:52;;4441:4;4412:35;;;;;;4314:6;;4364:17;-1:-1:-1;;;;;4412:10:52;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4412:35:52;4392:17;:55;;;4465:60;;4502:21;4465:60;:29;:60;:::i;:::-;4458:67;;;4260:272;:::o;1386:124:55:-;1442:7;1474:1;1469;:6;;1461:15;;;;;;-1:-1:-1;1501:1:55;1386:124::o;2227:366:48:-;2311:1;2295:13;:11;:13::i;:::-;:17;2287:85;;;;-1:-1:-1;;;2287:85:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2387:9;;2383:204;;2429:93;2495:13;:11;:13::i;:::-;2465:27;:5;-1:-1:-1;;;2465:27:48;:9;:27;:::i;:::-;:43;;;;;2429:14;;;2465:43;;2429:93;:18;:93;:::i;:::-;2412:14;:110;2541:35;;;;;;;;2558:10;;2541:35;;;;;;;;;;2227:366;:::o;2119:459:110:-;2177:7;2418:6;2414:45;;-1:-1:-1;2447:1:110;2440:8;;2414:45;2481:5;;;2485:1;2481;:5;:1;2504:5;;;;;:10;2496:56;;;;-1:-1:-1;;;2496:56:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;190:146:56;246:6;282:1;303:6;;;;295:15;;;;;1208:172:55;1264:6;1293:5;;;1317:6;;;;;;:16;;;1332:1;1327;:6;;1317:16;1316:38;;;;1343:1;1339;:5;:14;;;;;1352:1;1348;:5;1339:14;1308:47;;;;;5983:236:48;6058:27;6070:7;6079:5;6058:11;:27::i;:::-;6124:88;6168:42;6169:25;6188:5;6169:14;;:18;;:25;;;;:::i;6168:42::-;-1:-1:-1;;;;;6124:25:48;;;;;;:16;:25;;;;;;;:88;:42;:88;:::i;1692:187:110:-;1778:7;1813:12;1805:6;;;;1797:29;;;;-1:-1:-1;;;1797:29:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1848:5:110;;;1692:187::o;3988:172:111:-;4074:4;4090:42;4100:12;:10;:12::i;:::-;4114:9;4125:6;4090:9;:42::i;1409:498:108:-;1820:4;1864:17;1895:7;1409:498;:::o;2046:174:111:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;2141:26:111::1;:24;:26::i;:::-;2177:36;2200:4;2206:6;2177:22;:36::i;:::-;1268:14:108::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;2046:174:111;;;:::o;867:126:109:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;924:26:109::1;:24;:26::i;:::-;960;:24;:26::i;:::-;1268:14:108::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;867:126:109;:::o;4854:352:48:-;4942:32;4958:4;4964:2;4968:5;4942:15;:32::i;:::-;4985:21;5009:40;:25;5028:5;5009:14;;:18;;:25;;;;:::i;:40::-;-1:-1:-1;;;;;5084:22:48;;;;;;:16;:22;;;;;;4985:64;;-1:-1:-1;5084:42:48;;4985:64;5084:42;:26;:42;:::i;:::-;-1:-1:-1;;;;;5059:22:48;;;;;;;:16;:22;;;;;;:67;;;;5159:20;;;;;;;:40;;5184:14;5159:40;:24;:40;:::i;:::-;-1:-1:-1;;;;;5136:20:48;;;;;;;:16;:20;;;;;:63;;;;-1:-1:-1;;;4854:352:48:o;2784:333::-;2847:7;2866:29;2898:27;2918:6;2898:19;:27::i;:::-;-1:-1:-1;;;;;2961:22:48;;;;;;:14;:22;;;;;;2866:59;;-1:-1:-1;2961:49:48;;2866:59;2961:49;:26;:49;:::i;:::-;-1:-1:-1;;;;;2936:22:48;;;;;;:14;:22;;;;;;;;;:74;;;;3026:45;;;;;;;2936:22;;3026:45;;;;;;;;;3089:21;2784:333;-1:-1:-1;;2784:333:48:o;8085:370:111:-;-1:-1:-1;;;;;8168:21:111;;8160:65;;;;;-1:-1:-1;;;8160:65:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;8236:49;8265:1;8269:7;8278:6;8236:20;:49::i;:::-;8311:12;;:24;;8328:6;8311:24;:16;:24;:::i;:::-;8296:12;:39;-1:-1:-1;;;;;8366:18:111;;;;;;:9;:18;;;;;;:30;;8389:6;8366:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;8345:18:111;;;;;;:9;:18;;;;;;;;:51;;;;8411:37;;;;;;;8345:18;;;;8411:37;;;;;;;;;;8085:370;;:::o;1043:159:55:-;1099:6;1131:1;1126;:6;;:20;;;;;1145:1;1140;1136;:5;:10;;1126:20;1125:46;;;;1156:1;1152;:5;:18;;;;;1169:1;1165;1161;:5;:9;1152:18;1117:55;;;;;;-1:-1:-1;1190:5:55;;;1043:159::o;8774:410:111:-;-1:-1:-1;;;;;8857:21:111;;8849:67;;;;-1:-1:-1;;;8849:67:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8927:49;8948:7;8965:1;8969:6;8927:20;:49::i;:::-;9008:68;9031:6;9008:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9008:18:111;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;8987:18:111;;;;;;:9;:18;;;;;:89;9101:12;;:24;;9118:6;9101:24;:16;:24;:::i;:::-;9086:12;:39;9140:37;;;;;;;;9166:1;;-1:-1:-1;;;;;9140:37:111;;;;;;;;;;;;8774:410;;:::o;858:66:107:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1268:14;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;858:66:107;:::o;2226:177:111:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;2333:12:111;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2355:16:111;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2381:9:111::1;:14:::0;;-1:-1:-1;;2381:14:111::1;2393:2;2381:14;::::0;;1264:55:108;;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;2226:177:111;;;:::o;999:195:109:-;1024:12:108;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:108;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:108;;;;;1225:18;1213:4;1225:18;;;1170:80;1068:17:109::1;1088:12;:10;:12::i;:::-;1110:6;:18:::0;;-1:-1:-1;;;;;;1110:18:109::1;-1:-1:-1::0;;;;;1110:18:109;::::1;::::0;;::::1;::::0;;;1143:43:::1;::::0;1110:18;;-1:-1:-1;1110:18:109;-1:-1:-1;;1143:43:109::1;::::0;-1:-1:-1;;1143:43:109::1;1256:1:108;1268:14:::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:108;;;999:195:109;:::o;7285:530:111:-;-1:-1:-1;;;;;7390:20:111;;7382:70;;;;-1:-1:-1;;;7382:70:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7470:23:111;;7462:71;;;;-1:-1:-1;;;7462:71:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7544:47;7565:6;7573:9;7584:6;7544:20;:47::i;:::-;7622:71;7644:6;7622:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7622:17:111;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;7602:17:111;;;;;;;:9;:17;;;;;;:91;;;;7726:20;;;;;;;:32;;7751:6;7726:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;7703:20:111;;;;;;;:9;:20;;;;;;;;;:55;;;;7773:35;;;;;;;7703:20;;7773:35;;;;;;;;;;;;;7285:530;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
  "source": "// \"SPDX-License-Identifier: Apache-2.0\"\npragma solidity ^0.6.10;\n\nimport \"@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol\";\nimport \"./FundsDistributionToken.sol\";\nimport \"./IFundsDistributionToken.sol\";\nimport \"./IInitializableFDT.sol\";\n\ncontract ProxySafeVanillaFDT is\n    IFundsDistributionToken,\n    IInitializableFDT,\n    FundsDistributionToken,\n    OwnableUpgradeSafe\n{\n\n    using SafeMathUint for uint256;\n    using SafeMathInt for int256;\n\n\n    // token in which the funds can be sent to the FundsDistributionToken\n    IERC20 public fundsToken;\n\n    // balance of fundsToken that the FundsDistributionToken currently holds\n    uint256 public fundsTokenBalance;\n\n    modifier onlyFundsToken() {\n        require(\n            msg.sender == address(fundsToken),\n            \"VanillaFDT.onlyFundsToken: UNAUTHORIZED_SENDER\"\n        );\n        _;\n    }\n\n    /**\n     * @notice Withdraws all available funds for a token holder\n     */\n    function withdrawFunds() external override {\n        _withdrawFundsFor(msg.sender);\n    }\n\n    /**\n     * @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n     * @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n     * funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()\n     */\n    function updateFundsReceived() external {\n        int256 newFunds = _updateFundsTokenBalance();\n\n        if (newFunds > 0) {\n            _distributeFunds(newFunds.toUint256Safe());\n        }\n    }\n\n    /**\n     * @notice Initialize a new instance storage\n     * @dev \"constructor\" to be called on deployment\n     */\n    function initialize(\n        string memory name,\n        string memory symbol,\n        IERC20 _fundsToken,\n        address owner,\n        uint256 initialAmount\n    ) public override initializer {\n        require(\n            address(_fundsToken) != address(0),\n            \"VanillaFDT: INVALID_FUNDS_TOKEN_ADDRESS\"\n        );\n\n        super.__ERC20_init(name, symbol);\n        super.__Ownable_init();\n\n        fundsToken = _fundsToken;\n        transferOwnership(owner);\n        _mint(owner, initialAmount);\n    }\n\n    /**\n     * @notice Withdraws funds for a set of token holders\n     */\n    function pushFunds(address[] memory owners) public {\n        for (uint256 i = 0; i < owners.length; i++) {\n            _withdrawFundsFor(owners[i]);\n        }\n    }\n\n    /**\n     * @notice Overrides the parent class token transfer function to enforce restrictions.\n     */\n    function transfer(address to, uint256 value) public override returns (bool) {\n        return super.transfer(to, value);\n    }\n\n    /**\n     * @notice Overrides the parent class token transferFrom function to enforce restrictions.\n     */\n    function transferFrom(address from, address to, uint256 value) public override returns (bool) {\n        return super.transferFrom(from, to, value);\n    }\n\n    /**\n     * @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT.\n     */\n    function mint(address account, uint256 amount) public onlyOwner returns (bool) {\n        _mint(account, amount);\n        return true;\n    }\n\n    /**\n     * @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT.\n     */\n    function burn(address account, uint256 amount) public onlyOwner returns (bool) {\n        _burn(account, amount);\n        return true;\n    }\n\n    /**\n     * @notice Withdraws all available funds for a token holder\n     */\n    function _withdrawFundsFor(address owner) internal {\n        uint256 withdrawableFunds = _prepareWithdrawFor(owner);\n\n        require(\n            fundsToken.transfer(owner, withdrawableFunds),\n            \"VanillaFDT.withdrawFunds: TRANSFER_FAILED\"\n        );\n\n        _updateFundsTokenBalance();\n    }\n\n    /**\n     * @dev Updates the current funds token balance\n     * and returns the difference of new and previous funds token balances\n     * @return A int256 representing the difference of the new and previous funds token balance\n     */\n    function _updateFundsTokenBalance() internal returns (int256) {\n        uint256 prevFundsTokenBalance = fundsTokenBalance;\n\n        fundsTokenBalance = fundsToken.balanceOf(address(this));\n\n        return int256(fundsTokenBalance).sub(int256(prevFundsTokenBalance));\n    }\n}\n",
  "sourcePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeVanillaFDT.sol",
  "ast": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeVanillaFDT.sol",
    "exportedSymbols": {
      "ProxySafeVanillaFDT": [
        19447
      ]
    },
    "id": 19448,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 19157,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:52"
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "id": 19158,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 37428,
        "src": "67:79:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "id": 19159,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 38236,
        "src": "147:83:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol",
        "file": "./FundsDistributionToken.sol",
        "id": 19160,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 18315,
        "src": "231:38:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol",
        "file": "./IFundsDistributionToken.sol",
        "id": 19161,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 18344,
        "src": "270:39:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol",
        "file": "./IInitializableFDT.sol",
        "id": 19162,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 18362,
        "src": "310:33:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19163,
              "name": "IFundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18343,
              "src": "381:23:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IFundsDistributionToken_$18343",
                "typeString": "contract IFundsDistributionToken"
              }
            },
            "id": 19164,
            "nodeType": "InheritanceSpecifier",
            "src": "381:23:52"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19165,
              "name": "IInitializableFDT",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18361,
              "src": "410:17:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IInitializableFDT_$18361",
                "typeString": "contract IInitializableFDT"
              }
            },
            "id": 19166,
            "nodeType": "InheritanceSpecifier",
            "src": "410:17:52"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19167,
              "name": "FundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18314,
              "src": "433:22:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_FundsDistributionToken_$18314",
                "typeString": "contract FundsDistributionToken"
              }
            },
            "id": 19168,
            "nodeType": "InheritanceSpecifier",
            "src": "433:22:52"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19169,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "461:18:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 19170,
            "nodeType": "InheritanceSpecifier",
            "src": "461:18:52"
          }
        ],
        "contractDependencies": [
          18314,
          18343,
          18361,
          37222,
          37297,
          37427,
          38157,
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 19447,
        "linearizedBaseContracts": [
          19447,
          37427,
          18314,
          38157,
          38235,
          37222,
          37297,
          18361,
          18343
        ],
        "name": "ProxySafeVanillaFDT",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 19173,
            "libraryName": {
              "contractScope": null,
              "id": 19171,
              "name": "SafeMathUint",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19732,
              "src": "493:12:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathUint_$19732",
                "typeString": "library SafeMathUint"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "487:31:52",
            "typeName": {
              "id": 19172,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "510:7:52",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 19176,
            "libraryName": {
              "contractScope": null,
              "id": 19174,
              "name": "SafeMathInt",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19705,
              "src": "529:11:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathInt_$19705",
                "typeString": "library SafeMathInt"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "523:29:52",
            "typeName": {
              "id": 19175,
              "name": "int256",
              "nodeType": "ElementaryTypeName",
              "src": "545:6:52",
              "typeDescriptions": {
                "typeIdentifier": "t_int256",
                "typeString": "int256"
              }
            }
          },
          {
            "constant": false,
            "functionSelector": "63f04b15",
            "id": 19178,
            "mutability": "mutable",
            "name": "fundsToken",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19447,
            "src": "633:24:52",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$38235",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 19177,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "633:6:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "a9691f3f",
            "id": 19180,
            "mutability": "mutable",
            "name": "fundsTokenBalance",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19447,
            "src": "741:32:52",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 19179,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "741:7:52",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19194,
              "nodeType": "Block",
              "src": "806:154:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 19189,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 19183,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "837:3:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 19184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "837:10:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19187,
                              "name": "fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19178,
                              "src": "859:10:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 19186,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "851:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19185,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "851:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "851:19:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "837:33:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "56616e696c6c614644542e6f6e6c7946756e6473546f6b656e3a20554e415554484f52495a45445f53454e444552",
                        "id": 19190,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "884:48:52",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f6ea6ffd8ec656b6f929b9393a15a12b16dd3f847334e8c5312a62fcc2e61605",
                          "typeString": "literal_string \"VanillaFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        },
                        "value": "VanillaFDT.onlyFundsToken: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f6ea6ffd8ec656b6f929b9393a15a12b16dd3f847334e8c5312a62fcc2e61605",
                          "typeString": "literal_string \"VanillaFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 19182,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "816:7:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19191,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "816:126:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19192,
                  "nodeType": "ExpressionStatement",
                  "src": "816:126:52"
                },
                {
                  "id": 19193,
                  "nodeType": "PlaceholderStatement",
                  "src": "952:1:52"
                }
              ]
            },
            "documentation": null,
            "id": 19195,
            "name": "onlyFundsToken",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 19181,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "803:2:52"
            },
            "src": "780:180:52",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18328
            ],
            "body": {
              "id": 19205,
              "nodeType": "Block",
              "src": "1089:46:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 19201,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1117:3:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 19202,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1117:10:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 19200,
                      "name": "_withdrawFundsFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19414,
                      "src": "1099:17:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 19203,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1099:29:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19204,
                  "nodeType": "ExpressionStatement",
                  "src": "1099:29:52"
                }
              ]
            },
            "documentation": {
              "id": 19196,
              "nodeType": "StructuredDocumentation",
              "src": "966:75:52",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "functionSelector": "24600fc3",
            "id": 19206,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawFunds",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19198,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1080:8:52"
            },
            "parameters": {
              "id": 19197,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1068:2:52"
            },
            "returnParameters": {
              "id": 19199,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1089:0:52"
            },
            "scope": 19447,
            "src": "1046:89:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 19226,
              "nodeType": "Block",
              "src": "1530:156:52",
              "statements": [
                {
                  "assignments": [
                    19211
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19211,
                      "mutability": "mutable",
                      "name": "newFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19226,
                      "src": "1540:15:52",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      },
                      "typeName": {
                        "id": 19210,
                        "name": "int256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1540:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19214,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19212,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19446,
                      "src": "1558:24:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19213,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1558:26:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1540:44:52"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    },
                    "id": 19217,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19215,
                      "name": "newFunds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19211,
                      "src": "1599:8:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 19216,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1610:1:52",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "1599:12:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19225,
                  "nodeType": "IfStatement",
                  "src": "1595:85:52",
                  "trueBody": {
                    "id": 19224,
                    "nodeType": "Block",
                    "src": "1613:67:52",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19219,
                                  "name": "newFunds",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19211,
                                  "src": "1644:8:52",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "id": 19220,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint256Safe",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 19704,
                                "src": "1644:22:52",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$",
                                  "typeString": "function (int256) pure returns (uint256)"
                                }
                              },
                              "id": 19221,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1644:24:52",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 19218,
                            "name": "_distributeFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18102,
                            "src": "1627:16:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 19222,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1627:42:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19223,
                        "nodeType": "ExpressionStatement",
                        "src": "1627:42:52"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 19207,
              "nodeType": "StructuredDocumentation",
              "src": "1141:344:52",
              "text": " @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
            },
            "functionSelector": "46c162de",
            "id": 19227,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateFundsReceived",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19208,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1518:2:52"
            },
            "returnParameters": {
              "id": 19209,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1530:0:52"
            },
            "scope": 19447,
            "src": "1490:196:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18360
            ],
            "body": {
              "id": 19282,
              "nodeType": "Block",
              "src": "2004:318:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 19253,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19247,
                              "name": "_fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19234,
                              "src": "2043:11:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 19246,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2035:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19245,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2035:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19248,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2035:20:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 19251,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2067:1:52",
                              "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": 19250,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2059:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19249,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2059:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2059:10:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "2035:34:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "56616e696c6c614644543a20494e56414c49445f46554e44535f544f4b454e5f41444452455353",
                        "id": 19254,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2083:41:52",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f888b23c2cfeb62dbbcff228f09ec03cab5f15e1ad1169833f98ae04cad40d03",
                          "typeString": "literal_string \"VanillaFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        },
                        "value": "VanillaFDT: INVALID_FUNDS_TOKEN_ADDRESS"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f888b23c2cfeb62dbbcff228f09ec03cab5f15e1ad1169833f98ae04cad40d03",
                          "typeString": "literal_string \"VanillaFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        }
                      ],
                      "id": 19244,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2014:7:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19255,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2014:120:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19256,
                  "nodeType": "ExpressionStatement",
                  "src": "2014:120:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19260,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19230,
                        "src": "2164:4:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19261,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19232,
                        "src": "2170:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19257,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "2145:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19259,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__ERC20_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37680,
                      "src": "2145:18:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 19262,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2145:32:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19263,
                  "nodeType": "ExpressionStatement",
                  "src": "2145:32:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19264,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "2187:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19266,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__Ownable_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37327,
                      "src": "2187:20:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 19267,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2187:22:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19268,
                  "nodeType": "ExpressionStatement",
                  "src": "2187:22:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19271,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19269,
                      "name": "fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19178,
                      "src": "2220:10:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 19270,
                      "name": "_fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19234,
                      "src": "2233:11:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "2220:24:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 19272,
                  "nodeType": "ExpressionStatement",
                  "src": "2220:24:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19274,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19236,
                        "src": "2272:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19273,
                      "name": "transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37422,
                      "src": "2254:17:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 19275,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2254:24:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19276,
                  "nodeType": "ExpressionStatement",
                  "src": "2254:24:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19278,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19236,
                        "src": "2294:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19279,
                        "name": "initialAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19238,
                        "src": "2301:13:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19277,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "2288:5:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19280,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2288:27:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19281,
                  "nodeType": "ExpressionStatement",
                  "src": "2288:27:52"
                }
              ]
            },
            "documentation": {
              "id": 19228,
              "nodeType": "StructuredDocumentation",
              "src": "1692:113:52",
              "text": " @notice Initialize a new instance storage\n @dev \"constructor\" to be called on deployment"
            },
            "functionSelector": "c9aba0aa",
            "id": 19283,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19242,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19241,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37270,
                  "src": "1992:11:52",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1992:11:52"
              }
            ],
            "name": "initialize",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19240,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1983:8:52"
            },
            "parameters": {
              "id": 19239,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19230,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1839:18:52",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19229,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1839:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19232,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1867:20:52",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19231,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1867:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19234,
                  "mutability": "mutable",
                  "name": "_fundsToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1897:18:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 19233,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 38235,
                    "src": "1897:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19236,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1925:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19235,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1925:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19238,
                  "mutability": "mutable",
                  "name": "initialAmount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1948:21:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19237,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1948:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1829:146:52"
            },
            "returnParameters": {
              "id": 19243,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2004:0:52"
            },
            "scope": 19447,
            "src": "1810:512:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19309,
              "nodeType": "Block",
              "src": "2453:113:52",
              "statements": [
                {
                  "body": {
                    "id": 19307,
                    "nodeType": "Block",
                    "src": "2507:53:52",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 19302,
                                "name": "owners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 19287,
                                "src": "2539:6:52",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                  "typeString": "address[] memory"
                                }
                              },
                              "id": 19304,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 19303,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 19291,
                                "src": "2546:1:52",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "2539:9:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 19301,
                            "name": "_withdrawFundsFor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19414,
                            "src": "2521:17:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 19305,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2521:28:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19306,
                        "nodeType": "ExpressionStatement",
                        "src": "2521:28:52"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 19297,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19294,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19291,
                      "src": "2483:1:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 19295,
                        "name": "owners",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19287,
                        "src": "2487:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 19296,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "2487:13:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2483:17:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 19308,
                  "initializationExpression": {
                    "assignments": [
                      19291
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 19291,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19308,
                        "src": "2468:9:52",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19290,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2468:7:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 19293,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 19292,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2480:1:52",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "2468:13:52"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 19299,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "2502:3:52",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 19298,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19291,
                        "src": "2502:1:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 19300,
                    "nodeType": "ExpressionStatement",
                    "src": "2502:3:52"
                  },
                  "nodeType": "ForStatement",
                  "src": "2463:97:52"
                }
              ]
            },
            "documentation": {
              "id": 19284,
              "nodeType": "StructuredDocumentation",
              "src": "2328:69:52",
              "text": " @notice Withdraws funds for a set of token holders"
            },
            "functionSelector": "45f634f2",
            "id": 19310,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "pushFunds",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19288,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19287,
                  "mutability": "mutable",
                  "name": "owners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19310,
                  "src": "2421:23:52",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 19285,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "2421:7:52",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 19286,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "2421:9:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2420:25:52"
            },
            "returnParameters": {
              "id": 19289,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2453:0:52"
            },
            "scope": 19447,
            "src": "2402:164:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37774
            ],
            "body": {
              "id": 19327,
              "nodeType": "Block",
              "src": "2755:49:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19323,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19313,
                        "src": "2787:2:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19324,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19315,
                        "src": "2791:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19321,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "2772:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19322,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37774,
                      "src": "2772:14:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) returns (bool)"
                      }
                    },
                    "id": 19325,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2772:25:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 19320,
                  "id": 19326,
                  "nodeType": "Return",
                  "src": "2765:32:52"
                }
              ]
            },
            "documentation": {
              "id": 19311,
              "nodeType": "StructuredDocumentation",
              "src": "2572:102:52",
              "text": " @notice Overrides the parent class token transfer function to enforce restrictions."
            },
            "functionSelector": "a9059cbb",
            "id": 19328,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "transfer",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19317,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2731:8:52"
            },
            "parameters": {
              "id": 19316,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19313,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19328,
                  "src": "2697:10:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19312,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2697:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19315,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19328,
                  "src": "2709:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19314,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2709:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2696:27:52"
            },
            "returnParameters": {
              "id": 19320,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19319,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19328,
                  "src": "2749:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19318,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2749:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2748:6:52"
            },
            "scope": 19447,
            "src": "2679:125:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37851
            ],
            "body": {
              "id": 19348,
              "nodeType": "Block",
              "src": "3015:59:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19343,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19331,
                        "src": "3051:4:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19344,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19333,
                        "src": "3057:2:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19345,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19335,
                        "src": "3061:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19341,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "3032:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19342,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37851,
                      "src": "3032:18:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,address,uint256) returns (bool)"
                      }
                    },
                    "id": 19346,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3032:35:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 19340,
                  "id": 19347,
                  "nodeType": "Return",
                  "src": "3025:42:52"
                }
              ]
            },
            "documentation": {
              "id": 19329,
              "nodeType": "StructuredDocumentation",
              "src": "2810:106:52",
              "text": " @notice Overrides the parent class token transferFrom function to enforce restrictions."
            },
            "functionSelector": "23b872dd",
            "id": 19349,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19337,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2991:8:52"
            },
            "parameters": {
              "id": 19336,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19331,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "2943:12:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19330,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2943:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19333,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "2957:10:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19332,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2957:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19335,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "2969:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19334,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2969:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2942:41:52"
            },
            "returnParameters": {
              "id": 19340,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19339,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "3009:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19338,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3009:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3008:6:52"
            },
            "scope": 19447,
            "src": "2921:153:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19368,
              "nodeType": "Block",
              "src": "3287:60:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19362,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19352,
                        "src": "3303:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19363,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19354,
                        "src": "3312:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19361,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "3297:5:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19364,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3297:22:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19365,
                  "nodeType": "ExpressionStatement",
                  "src": "3297:22:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19366,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3336:4:52",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19360,
                  "id": 19367,
                  "nodeType": "Return",
                  "src": "3329:11:52"
                }
              ]
            },
            "documentation": {
              "id": 19350,
              "nodeType": "StructuredDocumentation",
              "src": "3080:123:52",
              "text": " @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "40c10f19",
            "id": 19369,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19357,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19356,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "3262:9:52",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3262:9:52"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19355,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19352,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19369,
                  "src": "3222:15:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19351,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3222:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19354,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19369,
                  "src": "3239:14:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19353,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3239:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3221:33:52"
            },
            "returnParameters": {
              "id": 19360,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19359,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19369,
                  "src": "3281:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19358,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3281:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3280:6:52"
            },
            "scope": 19447,
            "src": "3208:139:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19388,
              "nodeType": "Block",
              "src": "3566:60:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19382,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19372,
                        "src": "3582:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19383,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19374,
                        "src": "3591:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19381,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18313
                      ],
                      "referencedDeclaration": 18313,
                      "src": "3576:5:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19384,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3576:22:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19385,
                  "nodeType": "ExpressionStatement",
                  "src": "3576:22:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19386,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3615:4:52",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19380,
                  "id": 19387,
                  "nodeType": "Return",
                  "src": "3608:11:52"
                }
              ]
            },
            "documentation": {
              "id": 19370,
              "nodeType": "StructuredDocumentation",
              "src": "3353:129:52",
              "text": " @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "9dc29fac",
            "id": 19389,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19377,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19376,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "3541:9:52",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3541:9:52"
              }
            ],
            "name": "burn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19375,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19372,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19389,
                  "src": "3501:15:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19371,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3501:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19374,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19389,
                  "src": "3518:14:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19373,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3518:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3500:33:52"
            },
            "returnParameters": {
              "id": 19380,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19379,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19389,
                  "src": "3560:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19378,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3560:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3559:6:52"
            },
            "scope": 19447,
            "src": "3487:139:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19413,
              "nodeType": "Block",
              "src": "3763:252:52",
              "statements": [
                {
                  "assignments": [
                    19396
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19396,
                      "mutability": "mutable",
                      "name": "withdrawableFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19413,
                      "src": "3773:25:52",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19395,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3773:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19400,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19398,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19392,
                        "src": "3821:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19397,
                      "name": "_prepareWithdrawFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18135,
                      "src": "3801:19:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) returns (uint256)"
                      }
                    },
                    "id": 19399,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3801:26:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3773:54:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19404,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19392,
                            "src": "3879:5:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 19405,
                            "name": "withdrawableFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19396,
                            "src": "3886:17:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 19402,
                            "name": "fundsToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19178,
                            "src": "3859:10:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$38235",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 19403,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transfer",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 38184,
                          "src": "3859:19:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 19406,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3859:45:52",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "56616e696c6c614644542e776974686472617746756e64733a205452414e534645525f4641494c4544",
                        "id": 19407,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3918:43:52",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ec73bd808c325deb17482c3caea616de7e48b5272965877337cb59ad04f923ee",
                          "typeString": "literal_string \"VanillaFDT.withdrawFunds: TRANSFER_FAILED\""
                        },
                        "value": "VanillaFDT.withdrawFunds: TRANSFER_FAILED"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ec73bd808c325deb17482c3caea616de7e48b5272965877337cb59ad04f923ee",
                          "typeString": "literal_string \"VanillaFDT.withdrawFunds: TRANSFER_FAILED\""
                        }
                      ],
                      "id": 19401,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "3838:7:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19408,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3838:133:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19409,
                  "nodeType": "ExpressionStatement",
                  "src": "3838:133:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19410,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19446,
                      "src": "3982:24:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19411,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3982:26:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "id": 19412,
                  "nodeType": "ExpressionStatement",
                  "src": "3982:26:52"
                }
              ]
            },
            "documentation": {
              "id": 19390,
              "nodeType": "StructuredDocumentation",
              "src": "3632:75:52",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "id": 19414,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawFundsFor",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19393,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19392,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19414,
                  "src": "3739:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19391,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3739:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3738:15:52"
            },
            "returnParameters": {
              "id": 19394,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3763:0:52"
            },
            "scope": 19447,
            "src": "3712:303:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19445,
              "nodeType": "Block",
              "src": "4322:210:52",
              "statements": [
                {
                  "assignments": [
                    19421
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19421,
                      "mutability": "mutable",
                      "name": "prevFundsTokenBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19445,
                      "src": "4332:29:52",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19420,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4332:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19423,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 19422,
                    "name": "fundsTokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 19180,
                    "src": "4364:17:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4332:49:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19432,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19424,
                      "name": "fundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19180,
                      "src": "4392:17:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19429,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "4441:4:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ProxySafeVanillaFDT_$19447",
                                "typeString": "contract ProxySafeVanillaFDT"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ProxySafeVanillaFDT_$19447",
                                "typeString": "contract ProxySafeVanillaFDT"
                              }
                            ],
                            "id": 19428,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4433:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19427,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "4433:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19430,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4433:13:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 19425,
                          "name": "fundsToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19178,
                          "src": "4412:10:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$38235",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 19426,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 38174,
                        "src": "4412:20:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 19431,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4412:35:52",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4392:55:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 19433,
                  "nodeType": "ExpressionStatement",
                  "src": "4392:55:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19441,
                            "name": "prevFundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19421,
                            "src": "4502:21:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19440,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4495:6:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19439,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "4495:6:52",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19442,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4495:29:52",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19436,
                            "name": "fundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19180,
                            "src": "4472:17:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19435,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4465:6:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19434,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "4465:6:52",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19437,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4465:25:52",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "id": 19438,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19647,
                      "src": "4465:29:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$",
                        "typeString": "function (int256,int256) pure returns (int256)"
                      }
                    },
                    "id": 19443,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4465:60:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "functionReturnParameters": 19419,
                  "id": 19444,
                  "nodeType": "Return",
                  "src": "4458:67:52"
                }
              ]
            },
            "documentation": {
              "id": 19415,
              "nodeType": "StructuredDocumentation",
              "src": "4021:234:52",
              "text": " @dev Updates the current funds token balance\n and returns the difference of new and previous funds token balances\n @return A int256 representing the difference of the new and previous funds token balance"
            },
            "id": 19446,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateFundsTokenBalance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19416,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4293:2:52"
            },
            "returnParameters": {
              "id": 19419,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19418,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19446,
                  "src": "4314:6:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 19417,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4314:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4313:8:52"
            },
            "scope": 19447,
            "src": "4260:272:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 19448,
        "src": "345:4189:52"
      }
    ],
    "src": "41:4494:52"
  },
  "legacyAST": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeVanillaFDT.sol",
    "exportedSymbols": {
      "ProxySafeVanillaFDT": [
        19447
      ]
    },
    "id": 19448,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 19157,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:52"
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "id": 19158,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 37428,
        "src": "67:79:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "id": 19159,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 38236,
        "src": "147:83:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol",
        "file": "./FundsDistributionToken.sol",
        "id": 19160,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 18315,
        "src": "231:38:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol",
        "file": "./IFundsDistributionToken.sol",
        "id": 19161,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 18344,
        "src": "270:39:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol",
        "file": "./IInitializableFDT.sol",
        "id": 19162,
        "nodeType": "ImportDirective",
        "scope": 19448,
        "sourceUnit": 18362,
        "src": "310:33:52",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19163,
              "name": "IFundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18343,
              "src": "381:23:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IFundsDistributionToken_$18343",
                "typeString": "contract IFundsDistributionToken"
              }
            },
            "id": 19164,
            "nodeType": "InheritanceSpecifier",
            "src": "381:23:52"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19165,
              "name": "IInitializableFDT",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18361,
              "src": "410:17:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IInitializableFDT_$18361",
                "typeString": "contract IInitializableFDT"
              }
            },
            "id": 19166,
            "nodeType": "InheritanceSpecifier",
            "src": "410:17:52"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19167,
              "name": "FundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18314,
              "src": "433:22:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_FundsDistributionToken_$18314",
                "typeString": "contract FundsDistributionToken"
              }
            },
            "id": 19168,
            "nodeType": "InheritanceSpecifier",
            "src": "433:22:52"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 19169,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "461:18:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 19170,
            "nodeType": "InheritanceSpecifier",
            "src": "461:18:52"
          }
        ],
        "contractDependencies": [
          18314,
          18343,
          18361,
          37222,
          37297,
          37427,
          38157,
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 19447,
        "linearizedBaseContracts": [
          19447,
          37427,
          18314,
          38157,
          38235,
          37222,
          37297,
          18361,
          18343
        ],
        "name": "ProxySafeVanillaFDT",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 19173,
            "libraryName": {
              "contractScope": null,
              "id": 19171,
              "name": "SafeMathUint",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19732,
              "src": "493:12:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathUint_$19732",
                "typeString": "library SafeMathUint"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "487:31:52",
            "typeName": {
              "id": 19172,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "510:7:52",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 19176,
            "libraryName": {
              "contractScope": null,
              "id": 19174,
              "name": "SafeMathInt",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19705,
              "src": "529:11:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathInt_$19705",
                "typeString": "library SafeMathInt"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "523:29:52",
            "typeName": {
              "id": 19175,
              "name": "int256",
              "nodeType": "ElementaryTypeName",
              "src": "545:6:52",
              "typeDescriptions": {
                "typeIdentifier": "t_int256",
                "typeString": "int256"
              }
            }
          },
          {
            "constant": false,
            "functionSelector": "63f04b15",
            "id": 19178,
            "mutability": "mutable",
            "name": "fundsToken",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19447,
            "src": "633:24:52",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$38235",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 19177,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "633:6:52",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "a9691f3f",
            "id": 19180,
            "mutability": "mutable",
            "name": "fundsTokenBalance",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19447,
            "src": "741:32:52",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 19179,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "741:7:52",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19194,
              "nodeType": "Block",
              "src": "806:154:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 19189,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 19183,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "837:3:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 19184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "837:10:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19187,
                              "name": "fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19178,
                              "src": "859:10:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 19186,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "851:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19185,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "851:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "851:19:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "837:33:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "56616e696c6c614644542e6f6e6c7946756e6473546f6b656e3a20554e415554484f52495a45445f53454e444552",
                        "id": 19190,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "884:48:52",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f6ea6ffd8ec656b6f929b9393a15a12b16dd3f847334e8c5312a62fcc2e61605",
                          "typeString": "literal_string \"VanillaFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        },
                        "value": "VanillaFDT.onlyFundsToken: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f6ea6ffd8ec656b6f929b9393a15a12b16dd3f847334e8c5312a62fcc2e61605",
                          "typeString": "literal_string \"VanillaFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 19182,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "816:7:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19191,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "816:126:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19192,
                  "nodeType": "ExpressionStatement",
                  "src": "816:126:52"
                },
                {
                  "id": 19193,
                  "nodeType": "PlaceholderStatement",
                  "src": "952:1:52"
                }
              ]
            },
            "documentation": null,
            "id": 19195,
            "name": "onlyFundsToken",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 19181,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "803:2:52"
            },
            "src": "780:180:52",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18328
            ],
            "body": {
              "id": 19205,
              "nodeType": "Block",
              "src": "1089:46:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 19201,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1117:3:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 19202,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1117:10:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 19200,
                      "name": "_withdrawFundsFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19414,
                      "src": "1099:17:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 19203,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1099:29:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19204,
                  "nodeType": "ExpressionStatement",
                  "src": "1099:29:52"
                }
              ]
            },
            "documentation": {
              "id": 19196,
              "nodeType": "StructuredDocumentation",
              "src": "966:75:52",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "functionSelector": "24600fc3",
            "id": 19206,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawFunds",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19198,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1080:8:52"
            },
            "parameters": {
              "id": 19197,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1068:2:52"
            },
            "returnParameters": {
              "id": 19199,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1089:0:52"
            },
            "scope": 19447,
            "src": "1046:89:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 19226,
              "nodeType": "Block",
              "src": "1530:156:52",
              "statements": [
                {
                  "assignments": [
                    19211
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19211,
                      "mutability": "mutable",
                      "name": "newFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19226,
                      "src": "1540:15:52",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      },
                      "typeName": {
                        "id": 19210,
                        "name": "int256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1540:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19214,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19212,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19446,
                      "src": "1558:24:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19213,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1558:26:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1540:44:52"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    },
                    "id": 19217,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19215,
                      "name": "newFunds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19211,
                      "src": "1599:8:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 19216,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1610:1:52",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "1599:12:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19225,
                  "nodeType": "IfStatement",
                  "src": "1595:85:52",
                  "trueBody": {
                    "id": 19224,
                    "nodeType": "Block",
                    "src": "1613:67:52",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19219,
                                  "name": "newFunds",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19211,
                                  "src": "1644:8:52",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "id": 19220,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint256Safe",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 19704,
                                "src": "1644:22:52",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$",
                                  "typeString": "function (int256) pure returns (uint256)"
                                }
                              },
                              "id": 19221,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1644:24:52",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 19218,
                            "name": "_distributeFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18102,
                            "src": "1627:16:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 19222,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1627:42:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19223,
                        "nodeType": "ExpressionStatement",
                        "src": "1627:42:52"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 19207,
              "nodeType": "StructuredDocumentation",
              "src": "1141:344:52",
              "text": " @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
            },
            "functionSelector": "46c162de",
            "id": 19227,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateFundsReceived",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19208,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1518:2:52"
            },
            "returnParameters": {
              "id": 19209,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1530:0:52"
            },
            "scope": 19447,
            "src": "1490:196:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18360
            ],
            "body": {
              "id": 19282,
              "nodeType": "Block",
              "src": "2004:318:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 19253,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19247,
                              "name": "_fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 19234,
                              "src": "2043:11:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 19246,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2035:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19245,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2035:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19248,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2035:20:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 19251,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2067:1:52",
                              "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": 19250,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2059:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19249,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2059:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2059:10:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "2035:34:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "56616e696c6c614644543a20494e56414c49445f46554e44535f544f4b454e5f41444452455353",
                        "id": 19254,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2083:41:52",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f888b23c2cfeb62dbbcff228f09ec03cab5f15e1ad1169833f98ae04cad40d03",
                          "typeString": "literal_string \"VanillaFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        },
                        "value": "VanillaFDT: INVALID_FUNDS_TOKEN_ADDRESS"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f888b23c2cfeb62dbbcff228f09ec03cab5f15e1ad1169833f98ae04cad40d03",
                          "typeString": "literal_string \"VanillaFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        }
                      ],
                      "id": 19244,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2014:7:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19255,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2014:120:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19256,
                  "nodeType": "ExpressionStatement",
                  "src": "2014:120:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19260,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19230,
                        "src": "2164:4:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19261,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19232,
                        "src": "2170:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19257,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "2145:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19259,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__ERC20_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37680,
                      "src": "2145:18:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 19262,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2145:32:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19263,
                  "nodeType": "ExpressionStatement",
                  "src": "2145:32:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19264,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "2187:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19266,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__Ownable_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37327,
                      "src": "2187:20:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 19267,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2187:22:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19268,
                  "nodeType": "ExpressionStatement",
                  "src": "2187:22:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19271,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19269,
                      "name": "fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19178,
                      "src": "2220:10:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 19270,
                      "name": "_fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19234,
                      "src": "2233:11:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "2220:24:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 19272,
                  "nodeType": "ExpressionStatement",
                  "src": "2220:24:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19274,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19236,
                        "src": "2272:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19273,
                      "name": "transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37422,
                      "src": "2254:17:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 19275,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2254:24:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19276,
                  "nodeType": "ExpressionStatement",
                  "src": "2254:24:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19278,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19236,
                        "src": "2294:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19279,
                        "name": "initialAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19238,
                        "src": "2301:13:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19277,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "2288:5:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19280,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2288:27:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19281,
                  "nodeType": "ExpressionStatement",
                  "src": "2288:27:52"
                }
              ]
            },
            "documentation": {
              "id": 19228,
              "nodeType": "StructuredDocumentation",
              "src": "1692:113:52",
              "text": " @notice Initialize a new instance storage\n @dev \"constructor\" to be called on deployment"
            },
            "functionSelector": "c9aba0aa",
            "id": 19283,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19242,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19241,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37270,
                  "src": "1992:11:52",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1992:11:52"
              }
            ],
            "name": "initialize",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19240,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "1983:8:52"
            },
            "parameters": {
              "id": 19239,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19230,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1839:18:52",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19229,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1839:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19232,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1867:20:52",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19231,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1867:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19234,
                  "mutability": "mutable",
                  "name": "_fundsToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1897:18:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 19233,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 38235,
                    "src": "1897:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19236,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1925:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19235,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1925:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19238,
                  "mutability": "mutable",
                  "name": "initialAmount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19283,
                  "src": "1948:21:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19237,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1948:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1829:146:52"
            },
            "returnParameters": {
              "id": 19243,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2004:0:52"
            },
            "scope": 19447,
            "src": "1810:512:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19309,
              "nodeType": "Block",
              "src": "2453:113:52",
              "statements": [
                {
                  "body": {
                    "id": 19307,
                    "nodeType": "Block",
                    "src": "2507:53:52",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 19302,
                                "name": "owners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 19287,
                                "src": "2539:6:52",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                  "typeString": "address[] memory"
                                }
                              },
                              "id": 19304,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 19303,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 19291,
                                "src": "2546:1:52",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "2539:9:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 19301,
                            "name": "_withdrawFundsFor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19414,
                            "src": "2521:17:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 19305,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2521:28:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19306,
                        "nodeType": "ExpressionStatement",
                        "src": "2521:28:52"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 19297,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19294,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19291,
                      "src": "2483:1:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 19295,
                        "name": "owners",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19287,
                        "src": "2487:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 19296,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "2487:13:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2483:17:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 19308,
                  "initializationExpression": {
                    "assignments": [
                      19291
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 19291,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19308,
                        "src": "2468:9:52",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19290,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2468:7:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 19293,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 19292,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2480:1:52",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "2468:13:52"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 19299,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "2502:3:52",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 19298,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19291,
                        "src": "2502:1:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 19300,
                    "nodeType": "ExpressionStatement",
                    "src": "2502:3:52"
                  },
                  "nodeType": "ForStatement",
                  "src": "2463:97:52"
                }
              ]
            },
            "documentation": {
              "id": 19284,
              "nodeType": "StructuredDocumentation",
              "src": "2328:69:52",
              "text": " @notice Withdraws funds for a set of token holders"
            },
            "functionSelector": "45f634f2",
            "id": 19310,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "pushFunds",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19288,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19287,
                  "mutability": "mutable",
                  "name": "owners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19310,
                  "src": "2421:23:52",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 19285,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "2421:7:52",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 19286,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "2421:9:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2420:25:52"
            },
            "returnParameters": {
              "id": 19289,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2453:0:52"
            },
            "scope": 19447,
            "src": "2402:164:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37774
            ],
            "body": {
              "id": 19327,
              "nodeType": "Block",
              "src": "2755:49:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19323,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19313,
                        "src": "2787:2:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19324,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19315,
                        "src": "2791:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19321,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "2772:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19322,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37774,
                      "src": "2772:14:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) returns (bool)"
                      }
                    },
                    "id": 19325,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2772:25:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 19320,
                  "id": 19326,
                  "nodeType": "Return",
                  "src": "2765:32:52"
                }
              ]
            },
            "documentation": {
              "id": 19311,
              "nodeType": "StructuredDocumentation",
              "src": "2572:102:52",
              "text": " @notice Overrides the parent class token transfer function to enforce restrictions."
            },
            "functionSelector": "a9059cbb",
            "id": 19328,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "transfer",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19317,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2731:8:52"
            },
            "parameters": {
              "id": 19316,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19313,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19328,
                  "src": "2697:10:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19312,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2697:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19315,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19328,
                  "src": "2709:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19314,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2709:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2696:27:52"
            },
            "returnParameters": {
              "id": 19320,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19319,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19328,
                  "src": "2749:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19318,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2749:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2748:6:52"
            },
            "scope": 19447,
            "src": "2679:125:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37851
            ],
            "body": {
              "id": 19348,
              "nodeType": "Block",
              "src": "3015:59:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19343,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19331,
                        "src": "3051:4:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19344,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19333,
                        "src": "3057:2:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19345,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19335,
                        "src": "3061:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 19341,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "3032:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeVanillaFDT_$19447",
                          "typeString": "contract super ProxySafeVanillaFDT"
                        }
                      },
                      "id": 19342,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "transferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37851,
                      "src": "3032:18:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,address,uint256) returns (bool)"
                      }
                    },
                    "id": 19346,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3032:35:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 19340,
                  "id": 19347,
                  "nodeType": "Return",
                  "src": "3025:42:52"
                }
              ]
            },
            "documentation": {
              "id": 19329,
              "nodeType": "StructuredDocumentation",
              "src": "2810:106:52",
              "text": " @notice Overrides the parent class token transferFrom function to enforce restrictions."
            },
            "functionSelector": "23b872dd",
            "id": 19349,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19337,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2991:8:52"
            },
            "parameters": {
              "id": 19336,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19331,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "2943:12:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19330,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2943:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19333,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "2957:10:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19332,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2957:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19335,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "2969:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19334,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2969:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2942:41:52"
            },
            "returnParameters": {
              "id": 19340,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19339,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19349,
                  "src": "3009:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19338,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3009:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3008:6:52"
            },
            "scope": 19447,
            "src": "2921:153:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19368,
              "nodeType": "Block",
              "src": "3287:60:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19362,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19352,
                        "src": "3303:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19363,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19354,
                        "src": "3312:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19361,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "3297:5:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19364,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3297:22:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19365,
                  "nodeType": "ExpressionStatement",
                  "src": "3297:22:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19366,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3336:4:52",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19360,
                  "id": 19367,
                  "nodeType": "Return",
                  "src": "3329:11:52"
                }
              ]
            },
            "documentation": {
              "id": 19350,
              "nodeType": "StructuredDocumentation",
              "src": "3080:123:52",
              "text": " @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "40c10f19",
            "id": 19369,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19357,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19356,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "3262:9:52",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3262:9:52"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19355,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19352,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19369,
                  "src": "3222:15:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19351,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3222:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19354,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19369,
                  "src": "3239:14:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19353,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3239:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3221:33:52"
            },
            "returnParameters": {
              "id": 19360,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19359,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19369,
                  "src": "3281:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19358,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3281:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3280:6:52"
            },
            "scope": 19447,
            "src": "3208:139:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19388,
              "nodeType": "Block",
              "src": "3566:60:52",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19382,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19372,
                        "src": "3582:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19383,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19374,
                        "src": "3591:6:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19381,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18313
                      ],
                      "referencedDeclaration": 18313,
                      "src": "3576:5:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19384,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3576:22:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19385,
                  "nodeType": "ExpressionStatement",
                  "src": "3576:22:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19386,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3615:4:52",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19380,
                  "id": 19387,
                  "nodeType": "Return",
                  "src": "3608:11:52"
                }
              ]
            },
            "documentation": {
              "id": 19370,
              "nodeType": "StructuredDocumentation",
              "src": "3353:129:52",
              "text": " @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "9dc29fac",
            "id": 19389,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19377,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19376,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "3541:9:52",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "3541:9:52"
              }
            ],
            "name": "burn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19375,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19372,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19389,
                  "src": "3501:15:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19371,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3501:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19374,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19389,
                  "src": "3518:14:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19373,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3518:7:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3500:33:52"
            },
            "returnParameters": {
              "id": 19380,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19379,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19389,
                  "src": "3560:4:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19378,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3560:4:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3559:6:52"
            },
            "scope": 19447,
            "src": "3487:139:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19413,
              "nodeType": "Block",
              "src": "3763:252:52",
              "statements": [
                {
                  "assignments": [
                    19396
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19396,
                      "mutability": "mutable",
                      "name": "withdrawableFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19413,
                      "src": "3773:25:52",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19395,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3773:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19400,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19398,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19392,
                        "src": "3821:5:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19397,
                      "name": "_prepareWithdrawFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18135,
                      "src": "3801:19:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) returns (uint256)"
                      }
                    },
                    "id": 19399,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3801:26:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3773:54:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19404,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19392,
                            "src": "3879:5:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 19405,
                            "name": "withdrawableFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19396,
                            "src": "3886:17:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 19402,
                            "name": "fundsToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19178,
                            "src": "3859:10:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$38235",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 19403,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transfer",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 38184,
                          "src": "3859:19:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 19406,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3859:45:52",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "56616e696c6c614644542e776974686472617746756e64733a205452414e534645525f4641494c4544",
                        "id": 19407,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3918:43:52",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ec73bd808c325deb17482c3caea616de7e48b5272965877337cb59ad04f923ee",
                          "typeString": "literal_string \"VanillaFDT.withdrawFunds: TRANSFER_FAILED\""
                        },
                        "value": "VanillaFDT.withdrawFunds: TRANSFER_FAILED"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ec73bd808c325deb17482c3caea616de7e48b5272965877337cb59ad04f923ee",
                          "typeString": "literal_string \"VanillaFDT.withdrawFunds: TRANSFER_FAILED\""
                        }
                      ],
                      "id": 19401,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "3838:7:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19408,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3838:133:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19409,
                  "nodeType": "ExpressionStatement",
                  "src": "3838:133:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19410,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19446,
                      "src": "3982:24:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19411,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3982:26:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "id": 19412,
                  "nodeType": "ExpressionStatement",
                  "src": "3982:26:52"
                }
              ]
            },
            "documentation": {
              "id": 19390,
              "nodeType": "StructuredDocumentation",
              "src": "3632:75:52",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "id": 19414,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawFundsFor",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19393,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19392,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19414,
                  "src": "3739:13:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19391,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3739:7:52",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3738:15:52"
            },
            "returnParameters": {
              "id": 19394,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3763:0:52"
            },
            "scope": 19447,
            "src": "3712:303:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19445,
              "nodeType": "Block",
              "src": "4322:210:52",
              "statements": [
                {
                  "assignments": [
                    19421
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19421,
                      "mutability": "mutable",
                      "name": "prevFundsTokenBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19445,
                      "src": "4332:29:52",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19420,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4332:7:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19423,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 19422,
                    "name": "fundsTokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 19180,
                    "src": "4364:17:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4332:49:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19432,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19424,
                      "name": "fundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19180,
                      "src": "4392:17:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19429,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "4441:4:52",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ProxySafeVanillaFDT_$19447",
                                "typeString": "contract ProxySafeVanillaFDT"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ProxySafeVanillaFDT_$19447",
                                "typeString": "contract ProxySafeVanillaFDT"
                              }
                            ],
                            "id": 19428,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4433:7:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19427,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "4433:7:52",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19430,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4433:13:52",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 19425,
                          "name": "fundsToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19178,
                          "src": "4412:10:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$38235",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 19426,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 38174,
                        "src": "4412:20:52",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 19431,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4412:35:52",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4392:55:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 19433,
                  "nodeType": "ExpressionStatement",
                  "src": "4392:55:52"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19441,
                            "name": "prevFundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19421,
                            "src": "4502:21:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19440,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4495:6:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19439,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "4495:6:52",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19442,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4495:29:52",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19436,
                            "name": "fundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19180,
                            "src": "4472:17:52",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19435,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4465:6:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19434,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "4465:6:52",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19437,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4465:25:52",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "id": 19438,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19647,
                      "src": "4465:29:52",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$",
                        "typeString": "function (int256,int256) pure returns (int256)"
                      }
                    },
                    "id": 19443,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4465:60:52",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "functionReturnParameters": 19419,
                  "id": 19444,
                  "nodeType": "Return",
                  "src": "4458:67:52"
                }
              ]
            },
            "documentation": {
              "id": 19415,
              "nodeType": "StructuredDocumentation",
              "src": "4021:234:52",
              "text": " @dev Updates the current funds token balance\n and returns the difference of new and previous funds token balances\n @return A int256 representing the difference of the new and previous funds token balance"
            },
            "id": 19446,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateFundsTokenBalance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19416,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4293:2:52"
            },
            "returnParameters": {
              "id": 19419,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19418,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19446,
                  "src": "4314:6:52",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 19417,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4314:6:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4313:8:52"
            },
            "scope": 19447,
            "src": "4260:272:52",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 19448,
        "src": "345:4189:52"
      }
    ],
    "src": "41:4494:52"
  },
  "compiler": {
    "name": "solc",
    "version": "0.6.11+commit.5ef660b1.Emscripten.clang"
  },
  "networks": {
    "1994": {
      "events": {
        "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "owner",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "spender",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "Approval",
          "type": "event"
        },
        "0x26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "by",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "fundsDistributed",
              "type": "uint256"
            }
          ],
          "name": "FundsDistributed",
          "type": "event"
        },
        "0xeaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "by",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "fundsWithdrawn",
              "type": "uint256"
            }
          ],
          "name": "FundsWithdrawn",
          "type": "event"
        },
        "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "previousOwner",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "newOwner",
              "type": "address"
            }
          ],
          "name": "OwnershipTransferred",
          "type": "event"
        },
        "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef": {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "from",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "to",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            }
          ],
          "name": "Transfer",
          "type": "event"
        }
      },
      "links": {},
      "address": "0xEf68CD3581E6984Ce2A78e07560B1636Fb76A5F3",
      "transactionHash": "0x26110fb90213ac547727975b7a2693d731423760c23964ae0635746f8e710ea6"
    }
  },
  "schemaVersion": "3.2.0",
  "updatedAt": "2020-08-12T09:47:18.158Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "accumulativeFundsOf(address)": {
        "details": "accumulativeFundsOf(_owner) = withdrawableFundsOf(_owner) + withdrawnFundsOf(_owner) = (pointsPerShare * balanceOf(_owner) + pointsCorrection[_owner]) / pointsMultiplier",
        "params": {
          "_owner": "The address of a token holder."
        },
        "returns": {
          "_0": "The amount of funds that `_owner` has earned in total."
        }
      },
      "allowance(address,address)": {
        "details": "See {IERC20-allowance}."
      },
      "approve(address,uint256)": {
        "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
      },
      "balanceOf(address)": {
        "details": "See {IERC20-balanceOf}."
      },
      "decimals()": {
        "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
      },
      "decreaseAllowance(address,uint256)": {
        "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
      },
      "increaseAllowance(address,uint256)": {
        "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
      },
      "initialize(string,string,address,address,uint256)": {
        "details": "\"constructor\" to be called on deployment"
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "symbol()": {
        "details": "Returns the symbol of the token, usually a shorter version of the name."
      },
      "totalSupply()": {
        "details": "See {IERC20-totalSupply}."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "updateFundsReceived()": {
        "details": "Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
      },
      "withdrawableFundsOf(address)": {
        "params": {
          "_owner": "The address of a token holder."
        },
        "returns": {
          "_0": "The amount funds that `_owner` can withdraw."
        }
      },
      "withdrawnFundsOf(address)": {
        "params": {
          "_owner": "The address of a token holder."
        },
        "returns": {
          "_0": "The amount of funds that `_owner` has withdrawn."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "accumulativeFundsOf(address)": {
        "notice": "prev. accumulativeDividendOfView the amount of funds that an address has earned in total."
      },
      "burn(address,uint256)": {
        "notice": "Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
      },
      "initialize(string,string,address,address,uint256)": {
        "notice": "Initialize a new instance storage"
      },
      "mint(address,uint256)": {
        "notice": "Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
      },
      "pushFunds(address[])": {
        "notice": "Withdraws funds for a set of token holders"
      },
      "transfer(address,uint256)": {
        "notice": "Overrides the parent class token transfer function to enforce restrictions."
      },
      "transferFrom(address,address,uint256)": {
        "notice": "Overrides the parent class token transferFrom function to enforce restrictions."
      },
      "updateFundsReceived()": {
        "notice": "Register a payment of funds in tokens. May be called directly after a deposit is made."
      },
      "withdrawFunds()": {
        "notice": "Withdraws all available funds for a token holder"
      },
      "withdrawableFundsOf(address)": {
        "notice": "prev. withdrawableDividendOfView the amount of funds that an address can withdraw."
      },
      "withdrawnFundsOf(address)": {
        "notice": "prev. withdrawnDividendOfView the amount of funds that an address has withdrawn."
      }
    },
    "version": 1
  }
}