{
  "_format": "hh-sol-artifact-1",
  "contractName": "ERC20WithSnapshot",
  "sourceName": "contracts/lib/ERC20WithSnapshot.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "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": false,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "oldValue",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "newValue",
          "type": "uint128"
        }
      ],
      "name": "SnapshotDone",
      "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": [],
      "name": "_aaveGovernance",
      "outputs": [
        {
          "internalType": "contract ITransferHook",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "_countsSnapshots",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "_snapshots",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "blockNumber",
          "type": "uint128"
        },
        {
          "internalType": "uint128",
          "name": "value",
          "type": "uint128"
        }
      ],
      "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": [
        {
          "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": "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": "amount",
          "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": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x6080604052348015600f57600080fd5b50610b668061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a457c2d711610066578063a457c2d714610227578063a9059cbb1461023a578063c3863ada1461024d578063dd62ed3e1461027857600080fd5b806370a08231146101d65780638779588c146101ff57806395d89b411461021f57600080fd5b806323b872dd116100c857806323b872dd146101425780632acbf82314610155578063313ce567146101b457806339509351146101c357600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f761028b565b6040516101049190610994565b60405180910390f35b61012061011b3660046109fe565b61031d565b6040519015158152602001610104565b6002545b604051908152602001610104565b610120610150366004610a28565b610337565b6101946101633660046109fe565b60066020908152600092835260408084209091529082529020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610104565b60405160128152602001610104565b6101206101d13660046109fe565b61035b565b6101346101e4366004610a65565b6001600160a01b031660009081526020819052604090205490565b61013461020d366004610a65565b60076020526000908152604090205481565b6100f761037d565b6101206102353660046109fe565b61038c565b6101206102483660046109fe565b61040c565b600854610260906001600160a01b031681565b6040516001600160a01b039091168152602001610104565b610134610286366004610a87565b61041a565b60606003805461029a90610aba565b80601f01602080910402602001604051908101604052809291908181526020018280546102c690610aba565b80156103135780601f106102e857610100808354040283529160200191610313565b820191906000526020600020905b8154815290600101906020018083116102f657829003601f168201915b5050505050905090565b60003361032b818585610445565b60019150505b92915050565b600033610345858285610569565b6103508585856105e3565b506001949350505050565b60003361032b81858561036e838361041a565b6103789190610b0a565b610445565b60606004805461029a90610aba565b6000338161039a828661041a565b9050838110156103ff5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103508286868403610445565b60003361032b8185856105e3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104a75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103f6565b6001600160a01b0382166105085760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103f6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610575848461041a565b905060001981146105dd57818110156105d05760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103f6565b6105dd8484848403610445565b50505050565b6001600160a01b0383166106475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103f6565b6001600160a01b0382166106a95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103f6565b6106b4838383610792565b6001600160a01b0383166000908152602081905260409020548181101561072c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103f6565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105dd565b816001600160a01b0316836001600160a01b0316036107b057505050565b6001600160a01b038316156107ee576001600160a01b0383166000908152602081905260409020546107ec84826107e78582610b1d565b61082a565b505b6001600160a01b03821615610825576001600160a01b0382166000908152602081905260409020546105dd83826107e78582610b0a565b505050565b6001600160a01b0383166000908152600760209081526040808320546006909252909120439190811580159061088f57506001600160801b038316816000610873600186610b1d565b81526020810191909152604001600020546001600160801b0316145b156108d357838160006108a3600186610b1d565b8152602081019190915260400160002080546001600160801b03928316600160801b02921691909117905561093a565b6040805180820182526001600160801b038086168252868116602080840191825260008781529086905293909320915192518116600160801b029216919091179055610920826001610b0a565b6001600160a01b0387166000908152600760205260409020555b604080516001600160a01b03881681526001600160801b03878116602083015286168183015290517f2cd3c83ddac2953ee75f53265d9ea4463eaf05030e5459a1b7e63819b7ce88f79181900360600190a1505050505050565b602081526000825180602084015260005b818110156109c257602081860181015160408684010152016109a5565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146109f957600080fd5b919050565b60008060408385031215610a1157600080fd5b610a1a836109e2565b946020939093013593505050565b600080600060608486031215610a3d57600080fd5b610a46846109e2565b9250610a54602085016109e2565b929592945050506040919091013590565b600060208284031215610a7757600080fd5b610a80826109e2565b9392505050565b60008060408385031215610a9a57600080fd5b610aa3836109e2565b9150610ab1602084016109e2565b90509250929050565b600181811c90821680610ace57607f821691505b602082108103610aee57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561033157610331610af4565b8181038181111561033157610331610af456fea2646970667358221220da3aa43891af77c6d2c819d734e07aa43ccca666884491fe43f7394191f933da64736f6c634300081b0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a457c2d711610066578063a457c2d714610227578063a9059cbb1461023a578063c3863ada1461024d578063dd62ed3e1461027857600080fd5b806370a08231146101d65780638779588c146101ff57806395d89b411461021f57600080fd5b806323b872dd116100c857806323b872dd146101425780632acbf82314610155578063313ce567146101b457806339509351146101c357600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f761028b565b6040516101049190610994565b60405180910390f35b61012061011b3660046109fe565b61031d565b6040519015158152602001610104565b6002545b604051908152602001610104565b610120610150366004610a28565b610337565b6101946101633660046109fe565b60066020908152600092835260408084209091529082529020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610104565b60405160128152602001610104565b6101206101d13660046109fe565b61035b565b6101346101e4366004610a65565b6001600160a01b031660009081526020819052604090205490565b61013461020d366004610a65565b60076020526000908152604090205481565b6100f761037d565b6101206102353660046109fe565b61038c565b6101206102483660046109fe565b61040c565b600854610260906001600160a01b031681565b6040516001600160a01b039091168152602001610104565b610134610286366004610a87565b61041a565b60606003805461029a90610aba565b80601f01602080910402602001604051908101604052809291908181526020018280546102c690610aba565b80156103135780601f106102e857610100808354040283529160200191610313565b820191906000526020600020905b8154815290600101906020018083116102f657829003601f168201915b5050505050905090565b60003361032b818585610445565b60019150505b92915050565b600033610345858285610569565b6103508585856105e3565b506001949350505050565b60003361032b81858561036e838361041a565b6103789190610b0a565b610445565b60606004805461029a90610aba565b6000338161039a828661041a565b9050838110156103ff5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6103508286868403610445565b60003361032b8185856105e3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104a75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103f6565b6001600160a01b0382166105085760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103f6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610575848461041a565b905060001981146105dd57818110156105d05760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103f6565b6105dd8484848403610445565b50505050565b6001600160a01b0383166106475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103f6565b6001600160a01b0382166106a95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103f6565b6106b4838383610792565b6001600160a01b0383166000908152602081905260409020548181101561072c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103f6565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36105dd565b816001600160a01b0316836001600160a01b0316036107b057505050565b6001600160a01b038316156107ee576001600160a01b0383166000908152602081905260409020546107ec84826107e78582610b1d565b61082a565b505b6001600160a01b03821615610825576001600160a01b0382166000908152602081905260409020546105dd83826107e78582610b0a565b505050565b6001600160a01b0383166000908152600760209081526040808320546006909252909120439190811580159061088f57506001600160801b038316816000610873600186610b1d565b81526020810191909152604001600020546001600160801b0316145b156108d357838160006108a3600186610b1d565b8152602081019190915260400160002080546001600160801b03928316600160801b02921691909117905561093a565b6040805180820182526001600160801b038086168252868116602080840191825260008781529086905293909320915192518116600160801b029216919091179055610920826001610b0a565b6001600160a01b0387166000908152600760205260409020555b604080516001600160a01b03881681526001600160801b03878116602083015286168183015290517f2cd3c83ddac2953ee75f53265d9ea4463eaf05030e5459a1b7e63819b7ce88f79181900360600190a1505050505050565b602081526000825180602084015260005b818110156109c257602081860181015160408684010152016109a5565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146109f957600080fd5b919050565b60008060408385031215610a1157600080fd5b610a1a836109e2565b946020939093013593505050565b600080600060608486031215610a3d57600080fd5b610a46846109e2565b9250610a54602085016109e2565b929592945050506040919091013590565b600060208284031215610a7757600080fd5b610a80826109e2565b9392505050565b60008060408385031215610a9a57600080fd5b610aa3836109e2565b9150610ab1602084016109e2565b90509250929050565b600181811c90821680610ace57607f821691505b602082108103610aee57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561033157610331610af4565b8181038181111561033157610331610af456fea2646970667358221220da3aa43891af77c6d2c819d734e07aa43ccca666884491fe43f7394191f933da64736f6c634300081b0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
