1const e="0x61134511187a9a2DF38D10DBe07Ba2e8E5563967",n=[{inputs:[{internalType:"contract ILendingPool",name:"lendingPool",type:"address"},{internalType:"address",name:"aToken",type:"address"},{internalType:"string",name:"wrappedTokenName",type:"string"},{internalType:"string",name:"wrappedTokenSymbol",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[{internalType:"address",name:"target",type:"address"},{internalType:"bool",name:"success",type:"bool"},{internalType:"bytes",name:"data",type:"bytes"}],name:"ERC20CallFailed",type:"error"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{inputs:[],name:"ASSET",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"ATOKEN",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"EIP712_REVISION",outputs:[{internalType:"bytes",name:"",type:"bytes"}],stateMutability:"view",type:"function"},{inputs:[],name:"LENDING_POOL",outputs:[{internalType:"contract ILendingPool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"METADEPOSIT_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"METAWITHDRAWAL_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"PERMIT_TYPEHASH",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"_nonces",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:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"bool",name:"fromUnderlying",type:"bool"}],name:"deposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"dynamicBalanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"dynamicToStaticAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getDomainSeparator",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],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:"address",name:"depositor",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"value",type:"uint256"},{internalType:"uint16",name:"referralCode",type:"uint16"},{internalType:"bool",name:"fromUnderlying",type:"bool"},{internalType:"uint256",name:"deadline",type:"uint256"},{components:[{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}
1],internalType:"struct StaticAToken.SignatureParams",name:"sigParams",type:"tuple"},{internalType:"uint256",name:"chainId",type:"uint256"}],name:"metaDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"staticAmount",type:"uint256"},{internalType:"uint256",name:"dynamicAmount",type:"uint256"},{internalType:"bool",name:"toUnderlying",type:"bool"},{internalType:"uint256",name:"deadline",type:"uint256"},{components:[{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"}],internalType:"struct StaticAToken.SignatureParams",name:"sigParams",type:"tuple"},{internalType:"uint256",name:"chainId",type:"uint256"}],name:"metaWithdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"value",type:"uint256"},{internalType:"uint256",name:"deadline",type:"uint256"},{internalType:"uint8",name:"v",type:"uint8"},{internalType:"bytes32",name:"r",type:"bytes32"},{internalType:"bytes32",name:"s",type:"bytes32"},{internalType:"uint256",name:"chainId",type:"uint256"}],name:"permit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"rate",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"staticToDynamicAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],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"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bool",name:"toUnderlying",type:"bool"}],name:"withdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bool",name:"toUnderlying",type:"bool"}],name:"withdrawDynamicAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"},{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"}],t="0xe6e9585eb75d135acfcd71ee319816f5779bd0b806bad16395e8a1d15c3f64c3",a={to:null,from:"0x526D542FFBAe26D510cD610b8050438586fd203C",contractAddress:"0x61134511187a9a2DF38D10DBe07Ba2e8E5563967",transactionIndex:24,gasUsed:"2122808",logsBloom:"0x00000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000002000000080000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000020000000200000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000010200000000000000000000000000000000000000000000000000000020000",blockHash:"0x430c6955f33a810ed55fd5f76b22ab5b54bfe0335058b04166d69e9bdc223170",transactionHash:"0xe6e9585eb75d135acfcd71ee319816f5779bd0b806bad16395e8a1d15c3f64c3",logs:[{transactionIndex:24,blockNumber:15151520,transactionHash:"0xe6e9585eb75d135acfcd71ee319816f5779bd0b806bad16395e8a1d15c3f64c3",address:"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",topics:["0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x00000000000000000000000061134511187a9a2df38d10dbe07ba2e8e5563967","0x0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9"],data:"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",logIndex:153,blockHash:"0x430c6955f33a810ed55fd5f76b22ab5b54bfe0335058b04166d69e9bdc223170"}],blockNumber:15151520,cumulativeGasUsed:"6620865",status:1,byzantium:!0},r=["0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9","0x030bA81f1c18d280636F32af80b9AAd02Cf0854e","Static Aave WETH","s_aWETH"],s="f644976d12a037ef3d1ff000e5989323",i='{"compiler":{"version":"0.8.13+commit.abaa5c0e"}
1,"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract ILendingPool","name":"lendingPool","type":"address"},{"internalType":"address","name":"aToken","type":"address"},{"internalType":"string","name":"wrappedTokenName","type":"string"},{"internalType":"string","name":"wrappedTokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"ERC20CallFailed","type":"error"},{"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":"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":"ASSET","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ATOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_REVISION","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LENDING_POOL","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADEPOSIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METAWITHDRAWAL_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_nonces","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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint16","name":"referralCode","type":"uint16"},{"internalType":"bool","name":"fromUnderlying","type":"bool"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dynamicBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}
1,{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"dynamicToStaticAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"getDomainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"address","name":"depositor","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint16","name":"referralCode","type":"uint16"},{"internalType":"bool","name":"fromUnderlying","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct StaticAToken.SignatureParams","name":"sigParams","type":"tuple"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"metaDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"staticAmount","type":"uint256"},{"internalType":"uint256","name":"dynamicAmount","type":"uint256"},{"internalType":"bool","name":"toUnderlying","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct StaticAToken.SignatureParams","name":"sigParams","type":"tuple"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"metaWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"staticToDynamicAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}
1,{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"toUnderlying","type":"bool"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"toUnderlying","type":"bool"}],"name":"withdrawDynamicAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"author":"Aave*","details":"Wrapper token that allows to deposit tokens on the Aave protocol and receive a token which balance doesn\'t increase automatically, but uses an ever-increasing exchange rate - Only supporting deposits and withdrawals","errors":{"ERC20CallFailed(address,bool,bytes)":[{"params":{"data":"The resulting data from the call. This is error data when the call was not a success. Otherwise, this is malformed data when the call was a success.","success":"If the call to the token was a success.","target":"The target address."}}]},"kind":"dev","methods":{"allowance(address,address)":{"details":"See {IERC20-allowance}."},"approve(address,uint256)":{"details":"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. 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 this function is overridden; 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`."},"deposit(address,uint256,uint16,bool)":{"details":"Deposits `ASSET` in the Aave protocol and mints static aTokens to msg.sender","params":{"amount":"The amount of underlying `ASSET` to deposit (e.g. deposit of 100 USDC)","fromUnderlying":"bool - `true` if the msg.sender comes with underlying tokens (e.g. USDC) - `false` if the msg.sender comes already with aTokens (e.g. aUSDC)","recipient":"The address that will receive the static aTokens","referralCode":"Code used to register the integrator originating the operation, for potential rewards. 0 if the action is executed directly by the user, without any middle-man"},"returns":{"_0":"uint256 The amount of StaticAToken minted, static balance*"}},"dynamicBalanceOf(address)":{"details":"Utility method to get the current aToken balance of an user, from his staticAToken balance","params":{"account":"The address of the user"},"returns":{"_0":"uint256 The aToken balance*"}},"dynamicToStaticAmount(uint256)":{"details":"Converts an aToken or underlying amount to the what it is denominated on the aToken as scaled balance, function of the principal and the liquidity index","params":{"amount":"The amount to convert from"},"returns":{"_0":"uint256 The static (scaled) amount*"}},"getDomainSeparator(uint256)":{"details":"Function to return a dynamic domain separator, in order to be compatible with forks changing chainId","params":{"chainId":"The chain id"},"returns":{"_0":"bytes32 The domain separator*"}},"increaseAllowance(address,uint256)":{"details":"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve}
1 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."},"metaDeposit(address,address,uint256,uint16,bool,uint256,(uint8,bytes32,bytes32),uint256)":{"details":"Allows to deposit on Aave via meta-transaction https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md","params":{"chainId":"Passing the chainId in order to be fork-compatible","deadline":"The deadline timestamp, type(uint256).max for max deadline","depositor":"Address from which the funds to deposit are going to be pulled","fromUnderlying":"bool - `true` if the msg.sender comes with underlying tokens (e.g. USDC) - `false` if the msg.sender comes already with aTokens (e.g. aUSDC)","recipient":"Address that will receive the staticATokens, in the average case, same as the `depositor`","referralCode":"Code used to register the integrator originating the operation, for potential rewards. 0 if the action is executed directly by the user, without any middle-man","sigParams":"Signature params: v,r,s","value":"The amount to deposit"},"returns":{"_0":"uint256 The amount of StaticAToken minted, static balance"}},"metaWithdraw(address,address,uint256,uint256,bool,uint256,(uint8,bytes32,bytes32),uint256)":{"details":"Allows to withdraw from Aave via meta-transaction https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md","params":{"chainId":"Passing the chainId in order to be fork-compatible","deadline":"The deadline timestamp, type(uint256).max for max deadline","dynamicAmount":"The amount of underlying/aToken to withdraw. If > 0, `staticAmount` needs to be 0","owner":"Address owning the staticATokens","recipient":"Address that will receive the underlying withdrawn from Aave","sigParams":"Signature params: v,r,s","staticAmount":"The amount of staticAToken to withdraw. If > 0, `dynamicAmount` needs to be 0","toUnderlying":"bool - `true` for the recipient to get underlying tokens (e.g. USDC) - `false` for the recipient to get aTokens (e.g. aUSDC)"},"returns":{"_0":"amountToBurn: StaticATokens burnt, static balance","_1":"amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance"}},"name()":{"details":"Returns the name of the token."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32,uint256)":{"details":"Implements the permit function as for https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md","params":{"chainId":"Passing the chainId in order to be fork-compatible","deadline":"The deadline timestamp, type(uint256).max for max deadline","owner":"The owner of the funds","r":"Signature param","s":"Signature param","spender":"The spender","v":"Signature param","value":"The amount"}},"rate()":{"details":"Returns the Aave liquidity index of the underlying aToken, denominated rate here as it can be considered as an ever-increasing exchange rate","returns":{"_0":"bytes32 The domain separator*"}},"staticToDynamicAmount(uint256)":{"details":"Converts a static amount (scaled balance on aToken) to the aToken/underlying value, using the current liquidity index on Aave","params":{"amount":"The amount to convert from"},"returns":{"_0":"uint256 The dynamic amount*"}},"symbol()":{"details":"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{"details":"See {IERC20-totalSupply}."},"transfer(address,uint256)":{"details":"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{"details":"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``\'s tokens of at least `amount`."},"withdraw(address,uint256,bool)":{"details":"Burns `amount` of static aToken, with recipient receiving the corresponding amount of `ASSET`","params":{"amount":"The amount to withdraw, in static balance of StaticAToken","recipient":"The address that will receive the amount of `ASSET` withdrawn from the Aave protocol","toUnderlying":"bool - `true` for the recipient to get underlying tokens (e.g. USDC) - `false` for the recipient to get aTokens (e.g. aUSDC)"},"returns":{"_0":"amountToBurn: StaticATokens burnt, static balance","_1":"amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance*"}},"withdrawDynamicAmount(address,uint256,bool)":{"details":"Burns `amount` of static aToken, with recipient receiving the corresponding amount of `ASSET`","params":{"amount":"The amount to withdraw, in dynamic balance of aToken/underlying asset","recipient":"The address that will receive the amount of `ASSET` withdrawn from the Aave protocol","toUnderlying":"bool - `true` for the recipient to get underlying tokens (e.g. USDC) - `false` for the recipient to get aTokens (e.g. aUSDC)"},"returns":{"_0":"amountToBurn: StaticATokens burnt, static balance","_1":"amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance*"}}},"stateVariables":{"_nonces":{"details":"owner => next valid nonce to submit with permit(), metaDeposit() and metaWithdraw() We choose to have sequentiality on them for each user to avoid potentially dangerous/bad UX cases"}},"title":"StaticAToken","version":1},"userdoc":{"errors":{"ERC20CallFailed(address,bool,bytes)":[{"notice":"An error used to indicate that a call to an ERC20 contract failed."}]},"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"submodules/v2-foundry/src/external/aave/StaticAToken.sol":"StaticAToken"},"evmVersion":"london","libraries":{},"metadata":{"bytecodeHash":"ipfs","useLiteralContent":true},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"sources":{"submodules/v2-foundry/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol":{"content":"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0-rc.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\"./IERC20.sol\\";\\nimport \\"./extensions/IERC20Metadata.sol\\";\\nimport \\"../../utils/Context.sol\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn\'t required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``\'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described
1in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\"ERC20: decreased allowance below zero\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\"ERC20: transfer from the zero address\\");\\n require(to != address(0), \\"ERC20: transfer to the zero address\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\"ERC20: transfer amount exceeds balance\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\"ERC20: mint to the zero address\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\"ERC20: burn from the zero address\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\"ERC20: burn amount exceeds balance\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\"ERC20: approve from the zero address\\");\\n require(spender != address(0), \\"ERC20: approve to the zero address\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\"ERC20: insufficient allowance\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``\'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``\'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n}\\n","keccak256":"0xad7be30d5f44247ec2d5da59ad1487061f77b50b976ed0242eafa04b94c6627e","license":"MIT"},"submodules/v2-foundry/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0-rc.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;
1\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller\'s account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller\'s tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender\'s allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller\'s\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n","keccak256":"0x9933eb67311e9b552e97c8f6efba871271e0b16387248ddf634796d4614653c9","license":"MIT"},"submodules/v2-foundry/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\"../IERC20.sol\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n","keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","license":"MIT"},"submodules/v2-foundry/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\"../IERC20.sol\\";\\nimport \\"../../../utils/Address.sol\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n using Address for address;\\n\\n function safeTransfer(\\n IERC20 token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20 token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // \'safeIncreaseAllowance\' and \'safeDecreaseAllowance\'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\"SafeERC20: approve from non-zero to non-zero allowance\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20 token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\"SafeERC20: decreased allowance below zero\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity\'s return data size checking mechanism, since\\n // we\'re implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\"SafeERC20: low-level call failed\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\"SafeERC20:
1ERC20 operation did not succeed\\");\\n }\\n }\\n}\\n","keccak256":"0xc3d946432c0ddbb1f846a0d3985be71299df331b91d06732152117f62f0be2b5","license":"MIT"},"submodules/v2-foundry/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn\'t rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity\'s `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\"Address: insufficient balance\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\"\\");\\n require(success, \\"Address: unable to send value, recipient may have reverted\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\"Address: low-level call failed\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n str
1ing memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\"Address: low-level call with value failed\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\"Address: insufficient balance for call\\");\\n require(isContract(target), \\"Address: call to non-contract\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\"Address: low-level static call failed\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\"Address: static call to non-contract\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\"Address: low-level delegate call failed\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\"Address: delegate call to non-contract\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn\'t, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n","keccak256":"0x2ccf9d2313a313d41a791505f2b5abfdc62191b5d4334f7f7a82691c088a1c87","license":"MIT"},"submodules/v2-foundry/lib/openzeppelin-contracts/contracts/utils/Context.sol":{"content":"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;
1\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n","keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","license":"MIT"},"submodules/v2-foundry/src/external/aave/Errors.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\n/**\\n * @title Errors library\\n * @author Aave\\n * @notice Defines the error messages emitted by the different contracts of the Aave protocol\\n * @dev Error messages prefix glossary:\\n * - VL = ValidationLogic\\n * - MATH = Math libraries\\n * - CT = Common errors between tokens (AToken, VariableDebtToken and StableDebtToken)\\n * - AT = AToken\\n * - SDT = StableDebtToken\\n * - VDT = VariableDebtToken\\n * - LP = LendingPool\\n * - LPAPR = LendingPoolAddressesProviderRegistry\\n * - LPC = LendingPoolConfiguration\\n * - RL = ReserveLogic\\n * - LPCM = LendingPoolCollateralManager\\n * - P = Pausable\\n */\\nlibrary Errors {\\n //common errors\\n string public constant CALLER_NOT_POOL_ADMIN = \'33\'; // \'The caller must be the pool admin\'\\n string public constant BORROW_ALLOWANCE_NOT_ENOUGH = \'59\'; // User borrows on behalf, but allowance are too small\\n\\n //contract specific errors\\n string public constant VL_INVALID_AMOUNT = \'1\'; // \'Amount must be greater than 0\'\\n string public constant VL_NO_ACTIVE_RESERVE = \'2\'; // \'Action requires an active reserve\'\\n string public constant VL_RESERVE_FROZEN = \'3\'; // \'Action cannot be performed because the reserve is frozen\'\\n string public constant VL_CURRENT_AVAILABLE_LIQUIDITY_NOT_ENOUGH = \'4\'; // \'The current liquidity is not enough\'\\n string public constant VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE = \'5\'; // \'User cannot withdraw more than the available balance\'\\n string public constant VL_TRANSFER_NOT_ALLOWED = \'6\'; // \'Transfer cannot be allowed.\'\\n string public constant VL_BORROWING_NOT_ENABLED = \'7\'; // \'Borrowing is not enabled\'\\n string public constant VL_INVALID_INTEREST_RATE_MODE_SELECTED = \'8\'; // \'Invalid interest rate mode selected\'\\n string public constant VL_COLLATERAL_BALANCE_IS_0 = \'9\'; // \'The collateral balance is 0\'\\n string public constant VL_HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = \'10\'; // \'Health factor is lesser than the liquidation threshold\'\\n string public constant VL_COLLATERAL_CANNOT_COVER_NEW_BORROW = \'11\'; // \'There is not enough collateral to cover a new borrow\'\\n string public constant VL_STABLE_BORROWING_NOT_ENABLED = \'12\'; // stable borrowing not enabled\\n string public constant VL_COLLATERAL_SAME_AS_BORROWING_CURRENCY = \'13\'; // collateral is (mostly) the same currency that is being borrowed\\n string public constant VL_AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = \'14\'; // \'The requested amount is greater than the max loan size in stable rate mode\\n string public constant VL_NO_DEBT_OF_SELECTED_TYPE = \'15\'; // \'for repayment of stable debt, the user needs to have stable debt, otherwise, he needs to have variable debt\'\\n string public constant VL_NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = \'16\'; // \'To repay on behalf of an user an explicit amount to repay is needed\'\\n string public constant VL_NO_STABLE_RATE_LOAN_IN_RESERVE = \'17\'; // \'User does not have a stable rate loan in progress on this reserve\'\\n string public constant VL_NO_VARIABLE_RATE_LOAN_IN_RESERVE = \'18\'; // \'User does not have a variable rate loan in progress on this reserve\'\\n string public constant VL_UNDERLYING_BALANCE_NOT_GREATER_THAN_0 = \'19\'; // \'The underlying balance needs to be greater than 0\'\\n string public constant VL_DEPOSIT_ALREADY_IN_USE = \'20\'; // \'User deposit is already being used as collateral\'\\n string public constant LP_NOT_ENOUGH_STABLE_BORROW_BALANCE = \'21\'; // \'User does not have any stable rate loan for this reserve\'\\n string public constant LP_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = \'22\'; // \'Interest rate rebalance conditions were not met\'\\n string public constant LP_LIQUIDATION_CALL_FAILED = \'23\'; // \'Liquidation call failed\'\\n string public constant LP_NOT_ENOUGH_LIQUIDITY_TO_BORROW = \'24\'; // \'There is not enough liquidity available to borrow\'\\n string public constant LP_REQUESTED_AMOUNT_TOO_SMALL = \'25\'; // \'The requested amount is too small for a FlashLoan.\'\\n string public constant LP_INCONSISTENT_PROTOCOL_ACTUAL_BALANCE = \'26\'; // \'The actual balance of the protocol is inconsistent\'\\n string public constant LP_CALLER_NOT_LENDING_POOL_CONFIGURATOR = \'27\'; // \'The caller of the function is not the lending pool configurator\'\\n string public constant LP_INCONSISTENT_FLASHLOAN_PARAMS = \'28\';\\n string public constant CT_CALLER_MUST_BE_LENDING_POOL = \'29\'; // \'The caller of this function must be a lending pool\'\\n string public constant CT_CANNOT_GIVE_ALLOWANCE_TO_HIMSELF = \'30\'; // \'User cannot give allowance to himself\'\\n string public constant CT_TRANSFER_AMOUNT_NOT_GT_0 = \'31\'; // \'Transferred amount needs to be greater than zero\'\\n string public constant RL_RESERVE_ALREADY_INITIALIZED = \'32\'; // \'Reserve has already been initialized\'\\n string public constant LPC_RESERVE_
1LIQUIDITY_NOT_0 = \'34\'; // \'The liquidity of the reserve needs to be 0\'\\n string public constant LPC_INVALID_ATOKEN_POOL_ADDRESS = \'35\'; // \'The liquidity of the reserve needs to be 0\'\\n string public constant LPC_INVALID_STABLE_DEBT_TOKEN_POOL_ADDRESS = \'36\'; // \'The liquidity of the reserve needs to be 0\'\\n string public constant LPC_INVALID_VARIABLE_DEBT_TOKEN_POOL_ADDRESS = \'37\'; // \'The liquidity of the reserve needs to be 0\'\\n string public constant LPC_INVALID_STABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = \'38\'; // \'The liquidity of the reserve needs to be 0\'\\n string public constant LPC_INVALID_VARIABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = \'39\'; // \'The liquidity of the reserve needs to be 0\'\\n string public constant LPC_INVALID_ADDRESSES_PROVIDER_ID = \'40\'; // \'The liquidity of the reserve needs to be 0\'\\n string public constant LPC_INVALID_CONFIGURATION = \'75\'; // \'Invalid risk parameters for the reserve\'\\n string public constant LPC_CALLER_NOT_EMERGENCY_ADMIN = \'76\'; // \'The caller must be the emergency admin\'\\n string public constant LPAPR_PROVIDER_NOT_REGISTERED = \'41\'; // \'Provider is not registered\'\\n string public constant LPCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD = \'42\'; // \'Health factor is not below the threshold\'\\n string public constant LPCM_COLLATERAL_CANNOT_BE_LIQUIDATED = \'43\'; // \'The collateral chosen cannot be liquidated\'\\n string public constant LPCM_SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = \'44\'; // \'User did not borrow the specified currency\'\\n string public constant LPCM_NOT_ENOUGH_LIQUIDITY_TO_LIQUIDATE = \'45\'; // \\"There isn\'t enough liquidity available to liquidate\\"\\n string public constant LPCM_NO_ERRORS = \'46\'; // \'No errors\'\\n string public constant LP_INVALID_FLASHLOAN_MODE = \'47\'; //Invalid flashloan mode selected\\n string public constant MATH_MULTIPLICATION_OVERFLOW = \'48\';\\n string public constant MATH_ADDITION_OVERFLOW = \'49\';\\n string public constant MATH_DIVISION_BY_ZERO = \'50\';\\n string public constant RL_LIQUIDITY_INDEX_OVERFLOW = \'51\'; // Liquidity index overflows uint128\\n string public constant RL_VARIABLE_BORROW_INDEX_OVERFLOW = \'52\'; // Variable borrow index overflows uint128\\n string public constant RL_LIQUIDITY_RATE_OVERFLOW = \'53\'; // Liquidity rate overflows uint128\\n string public constant RL_VARIABLE_BORROW_RATE_OVERFLOW = \'54\'; // Variable borrow rate overflows uint128\\n string public constant RL_STABLE_BORROW_RATE_OVERFLOW = \'55\'; // Stable borrow rate overflows uint128\\n string public constant CT_INVALID_MINT_AMOUNT = \'56\'; //invalid amount to mint\\n string public constant LP_FAILED_REPAY_WITH_COLLATERAL = \'57\';\\n string public constant CT_INVALID_BURN_AMOUNT = \'58\'; //invalid amount to burn\\n string public constant LP_FAILED_COLLATERAL_SWAP = \'60\';\\n string public constant LP_INVALID_EQUAL_ASSETS_TO_SWAP = \'61\';\\n string public constant LP_REENTRANCY_NOT_ALLOWED = \'62\';\\n string public constant LP_CALLER_MUST_BE_AN_ATOKEN = \'63\';\\n string public constant LP_IS_PAUSED = \'64\'; // \'Pool is paused\'\\n string public constant LP_NO_MORE_RESERVES_ALLOWED = \'65\';\\n string public constant LP_INVALID_FLASH_LOAN_EXECUTOR_RETURN = \'66\';\\n string public constant RC_INVALID_LTV = \'67\';\\n string public constant RC_INVALID_LIQ_THRESHOLD = \'68\';\\n string public constant RC_INVALID_LIQ_BONUS = \'69\';\\n string public constant RC_INVALID_DECIMALS = \'70\';\\n string public constant RC_INVALID_RESERVE_FACTOR = \'71\';\\n string public constant LPAPR_INVALID_ADDRESSES_PROVIDER_ID = \'72\';\\n string public constant VL_INCONSISTENT_FLASHLOAN_PARAMS = \'73\';\\n string public constant LP_INCONSISTENT_PARAMS_LENGTH = \'74\';\\n string public constant UL_INVALID_INDEX = \'77\';\\n string public constant LP_NOT_CONTRACT = \'78\';\\n string public constant SDT_STABLE_DEBT_OVERFLOW = \'79\';\\n string public constant SDT_BURN_EXCEEDS_BALANCE = \'80\';\\n\\n enum CollateralManagerErrors {\\n NO_ERROR,\\n NO_COLLATERAL_AVAILABLE,\\n COLLATERAL_CANNOT_BE_LIQUIDATED,\\n CURRRENCY_NOT_BORROWED,\\n HEALTH_FACTOR_ABOVE_THRESHOLD,\\n NOT_ENOUGH_LIQUIDITY,\\n NO_ACTIVE_RESERVE,\\n HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD,\\n INVALID_EQUAL_ASSETS_TO_SWAP,\\n FROZEN_RESERVE\\n }\\n}","keccak256":"0x20ab183e690d6241d308a749c516d26ca1262c2b27833dcbf2b8d88315d51c2e","license":"agpl-3.0"},"submodules/v2-foundry/src/external/aave/StaticAToken.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\npragma experimental ABIEncoderV2;\\n\\nimport {ILendingPool} from \'../../interfaces/external/aave/ILendingPool.sol\';\\nimport {IERC20} from \\"../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\\";\\nimport {IERC20Metadata} from \\"../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\\";\\nimport {IAToken} from \'../../interfaces/external/aave/IAToken.sol\';\\nimport {ERC20} from \\"../../../lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol\\";\\nimport {SafeERC20} from \\"../../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\\";\\nimport {WadRayMath} from \'./WadRayMath.sol\';\\nimport {TokenUtils} from \\"../../libraries/TokenUtils.sol\\";\\n\\n/**\\n * @title StaticAToken\\n * @dev Wrapper token that allows to deposit tokens on the Aave protocol and receive\\n * a token which balance doesn\'t increase automatically, but uses an ever-increasing exchange rate\\n * - Only supporting deposits and withdrawals\\n * @author Aave\\n **/\\ncontract StaticAToken is ERC20 {\\n using SafeERC20 for IERC20;\\n using WadRayMath for uint256;
1\\n\\n struct SignatureParams {\\n uint8 v;\\n bytes32 r;\\n bytes32 s;\\n }\\n\\n bytes public constant EIP712_REVISION = bytes(\'1\');\\n bytes32 internal constant EIP712_DOMAIN =\\n keccak256(\'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\');\\n bytes32 public constant PERMIT_TYPEHASH =\\n keccak256(\'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\');\\n bytes32 public constant METADEPOSIT_TYPEHASH =\\n keccak256(\\n \'Deposit(address depositor,address recipient,uint256 value,uint16 referralCode,bool fromUnderlying,uint256 nonce,uint256 deadline)\'\\n );\\n bytes32 public constant METAWITHDRAWAL_TYPEHASH =\\n keccak256(\\n \'Withdraw(address owner,address recipient,uint256 staticAmount, uint256 dynamicAmount, bool toUnderlying, uint256 nonce,uint256 deadline)\'\\n );\\n\\n ILendingPool public immutable LENDING_POOL;\\n IERC20 public immutable ATOKEN;\\n IERC20 public immutable ASSET;\\n\\n /// @dev owner => next valid nonce to submit with permit(), metaDeposit() and metaWithdraw()\\n /// We choose to have sequentiality on them for each user to avoid potentially dangerous/bad UX cases\\n mapping(address => uint256) public _nonces;\\n\\n uint8 private _decimals;\\n\\n constructor(\\n ILendingPool lendingPool,\\n address aToken,\\n string memory wrappedTokenName,\\n string memory wrappedTokenSymbol\\n ) public ERC20(wrappedTokenName, wrappedTokenSymbol) {\\n LENDING_POOL = lendingPool;\\n ATOKEN = IERC20(aToken);\\n\\n IERC20 underlyingAsset = IERC20(IAToken(aToken).UNDERLYING_ASSET_ADDRESS());\\n ASSET = underlyingAsset;\\n TokenUtils.safeApprove(address(underlyingAsset), address(lendingPool), type(uint256).max);\\n _decimals = IERC20Metadata(aToken).decimals();\\n }\\n\\n function decimals() public view override returns (uint8) {\\n return _decimals;\\n }\\n\\n /**\\n * @dev Deposits `ASSET` in the Aave protocol and mints static aTokens to msg.sender\\n * @param recipient The address that will receive the static aTokens\\n * @param amount The amount of underlying `ASSET` to deposit (e.g. deposit of 100 USDC)\\n * @param referralCode Code used to register the integrator originating the operation, for potential rewards.\\n * 0 if the action is executed directly by the user, without any middle-man\\n * @param fromUnderlying bool\\n * - `true` if the msg.sender comes with underlying tokens (e.g. USDC)\\n * - `false` if the msg.sender comes already with aTokens (e.g. aUSDC)\\n * @return uint256 The amount of StaticAToken minted, static balance\\n **/\\n function deposit(\\n address recipient,\\n uint256 amount,\\n uint16 referralCode,\\n bool fromUnderlying\\n ) external returns (uint256) {\\n return _deposit(msg.sender, recipient, amount, referralCode, fromUnderlying);\\n }\\n\\n /**\\n * @dev Burns `amount` of static aToken, with recipient receiving the corresponding amount of `ASSET`\\n * @param recipient The address that will receive the amount of `ASSET` withdrawn from the Aave protocol\\n * @param amount The amount to withdraw, in static balance of StaticAToken\\n * @param toUnderlying bool\\n * - `true` for the recipient to get underlying tokens (e.g. USDC)\\n * - `false` for the recipient to get aTokens (e.g. aUSDC)\\n * @return amountToBurn: StaticATokens burnt, static balance\\n * @return amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance\\n **/\\n function withdraw(\\n address recipient,\\n uint256 amount,\\n bool toUnderlying\\n ) external returns (uint256, uint256) {\\n return _withdraw(msg.sender, recipient, amount, 0, toUnderlying);\\n }\\n\\n /**\\n * @dev Burns `amount` of static aToken, with recipient receiving the corresponding amount of `ASSET`\\n * @param recipient The address that will receive the amount of `ASSET` withdrawn from the Aave protocol\\n * @param amount The amount to withdraw, in dynamic balance of aToken/underlying asset\\n * @param toUnderlying bool\\n * - `true` for the recipient to get underlying tokens (e.g. USDC)\\n * - `false` for the recipient to get aTokens (e.g. aUSDC)\\n * @return amountToBurn: StaticATokens burnt, static balance\\n * @return amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance\\n **/\\n function withdrawDynamicAmount(\\n address recipient,\\n uint256 amount,\\n bool toUnderlying\\n ) external returns (uint256, uint256) {\\n return _withdraw(msg.sender, recipient, 0, amount, toUnderlying);\\n }\\n\\n /**\\n * @dev Implements the permit function as for\\n * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md\\n * @param owner The owner of the funds\\n * @param spender The spender\\n * @param value The amount\\n * @param deadline The deadline timestamp, type(uint256).max for max deadline\\n * @param v Signature param\\n * @param s Signature param\\n * @param r Signature param\\n * @param chainId Passing the chainId in order to be fork-compatible\\n */\\n function permit(\\n address owner,\\n address spender,\\n uint256 value,\\n uint256 deadline,\\n uint8 v,\\n bytes32 r,\\n bytes32 s,\\n uint256 chainId\\n ) external {\\n require(owner != address(0), \'INVALID_OWNER\');\\n //solium-disable-next-line\\n require(block.timestamp <= deadline, \'INVALID_EXPIRATION\');\\n uint256 currentValidNonce = _nonces[owner];\\n bytes32 digest =\\n keccak256(\\n abi.encodePacked(\\n \'\\\\x19\\\\x01\',\\n getDomainSeparator(chainId),\\n keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline))\\n )\\n );\\n require(owner == ecrecover(digest, v, r, s), \'INVALID_SIGNATURE\');\\n _nonces[owner] = currentValidNonce + 1;\\n _approve(owner, spender, value);\\n }\\n\\n /**\\n * @dev Allows to deposit on Aave via meta-transaction\\n * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md\\n * @param depositor Address from which the funds to deposit are going to be pulled\\n * @param recipient Address that will receive the staticATokens, in the average case, same as the `depositor`\\n * @param value The amount to deposit\\n * @param referralCode Code used to register the integrator originating the operation, for potential rewards.\\n * 0 if the action is executed directly by the user, without any middle-man\\n * @param fromUnderlying bool\\n * - `true` if the msg.sender comes with underlying tokens (e.g. USDC)\\n * - `false` if the msg.sender comes already with aTokens (e.g. aUSDC)\\n * @param deadline The deadline timestamp, type(uint256).max for max deadline\\n * @param sigParams Signature params: v,r,s\\n * @param chainId Passing the chainId in order to be fork-compatible\\n * @return uint256 The amount of StaticAToken minted, static balance\\n */\\n function metaDeposit(\\n address depositor,\\n address recipient,\\n uint256 value,\\n uint16 referralCode,\\n bool fromUnderlying,\\n uint256 deadline,\\n SignatureParam
1s calldata sigParams,\\n uint256 chainId\\n ) external returns (uint256) {\\n require(depositor != address(0), \'INVALID_DEPOSITOR\');\\n //solium-disable-next-line\\n require(block.timestamp <= deadline, \'INVALID_EXPIRATION\');\\n uint256 currentValidNonce = _nonces[depositor];\\n bytes32 digest =\\n keccak256(\\n abi.encodePacked(\\n \'\\\\x19\\\\x01\',\\n getDomainSeparator(chainId),\\n keccak256(\\n abi.encode(\\n METADEPOSIT_TYPEHASH,\\n depositor,\\n recipient,\\n value,\\n referralCode,\\n fromUnderlying,\\n currentValidNonce,\\n deadline\\n )\\n )\\n )\\n );\\n require(\\n depositor == ecrecover(digest, sigParams.v, sigParams.r, sigParams.s),\\n \'INVALID_SIGNATURE\'\\n );\\n _nonces[depositor] = currentValidNonce + 1;\\n _deposit(depositor, recipient, value, referralCode, fromUnderlying);\\n }\\n\\n /**\\n * @dev Allows to withdraw from Aave via meta-transaction\\n * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md\\n * @param owner Address owning the staticATokens\\n * @param recipient Address that will receive the underlying withdrawn from Aave\\n * @param staticAmount The amount of staticAToken to withdraw. If > 0, `dynamicAmount` needs to be 0\\n * @param dynamicAmount The amount of underlying/aToken to withdraw. If > 0, `staticAmount` needs to be 0\\n * @param toUnderlying bool\\n * - `true` for the recipient to get underlying tokens (e.g. USDC)\\n * - `false` for the recipient to get aTokens (e.g. aUSDC)\\n * @param deadline The deadline timestamp, type(uint256).max for max deadline\\n * @param sigParams Signature params: v,r,s\\n * @param chainId Passing the chainId in order to be fork-compatible\\n * @return amountToBurn: StaticATokens burnt, static balance\\n * @return amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance\\n */\\n function metaWithdraw(\\n address owner,\\n address recipient,\\n uint256 staticAmount,\\n uint256 dynamicAmount,\\n bool toUnderlying,\\n uint256 deadline,\\n SignatureParams calldata sigParams,\\n uint256 chainId\\n ) external returns (uint256, uint256) {\\n require(owner != address(0), \'INVALID_DEPOSITOR\');\\n //solium-disable-next-line\\n require(block.timestamp <= deadline, \'INVALID_EXPIRATION\');\\n uint256 currentValidNonce = _nonces[owner];\\n bytes32 digest =\\n keccak256(\\n abi.encodePacked(\\n \'\\\\x19\\\\x01\',\\n getDomainSeparator(chainId),\\n keccak256(\\n abi.encode(\\n METAWITHDRAWAL_TYPEHASH,\\n owner,\\n recipient,\\n staticAmount,\\n dynamicAmount,\\n toUnderlying,\\n currentValidNonce,\\n deadline\\n )\\n )\\n )\\n );\\n require(owner == ecrecover(digest, sigParams.v, sigParams.r, sigParams.s), \'INVALID_SIGNATURE\');\\n _nonces[owner] = currentValidNonce + 1;\\n return _withdraw(owner, recipient, staticAmount, dynamicAmount, toUnderlying);\\n }\\n\\n /**\\n * @dev Utility method to get the current aToken balance of an user, from his staticAToken balance\\n * @param account The address of the user\\n * @return uint256 The aToken balance\\n **/\\n function dynamicBalanceOf(address account) external view returns (uint256) {\\n return staticToDynamicAmount(balanceOf(account));\\n }\\n\\n /**\\n * @dev Converts a static amount (scaled balance on aToken) to the aToken/underlying value,\\n * using the current liquidity index on Aave\\n * @param amount The amount to convert from\\n * @return uint256 The dynamic amount\\n **/\\n function staticToDynamicAmount(uint256 amount) public view returns (uint256) {\\n return amount.rayMul(rate());\\n }\\n\\n /**\\n * @dev Converts an aToken or underlying amount to the what it is denominated on the aToken as\\n * scaled balance, function of the principal and the liquidity index\\n * @param amount The amount to convert from\\n * @return uint256 The static (scaled) amount\\n **/\\n function dynamicToStaticAmount(uint256 amount) public view returns (uint256) {\\n return amount.rayDiv(rate());\\n }\\n\\n /**\\n * @dev Returns the Aave liquidity index of the underlying aToken, denominated rate here\\n * as it can be considered as an ever-increasing exchange rate\\n * @return bytes32 The domain separator\\n **/\\n function rate() public view returns (uint256) {\\n return LENDING_POOL.getReserveNormalizedIncome(a
1ddress(ASSET));\\n }\\n\\n /**\\n * @dev Function to return a dynamic domain separator, in order to be compatible with forks changing chainId\\n * @param chainId The chain id\\n * @return bytes32 The domain separator\\n **/\\n function getDomainSeparator(uint256 chainId) public view returns (bytes32) {\\n return\\n keccak256(\\n abi.encode(\\n EIP712_DOMAIN,\\n keccak256(bytes(name())),\\n keccak256(EIP712_REVISION),\\n chainId,\\n address(this)\\n )\\n );\\n }\\n\\n function _deposit(\\n address depositor,\\n address recipient,\\n uint256 amount,\\n uint16 referralCode,\\n bool fromUnderlying\\n ) internal returns (uint256) {\\n require(recipient != address(0), \'INVALID_RECIPIENT\');\\n\\n if (fromUnderlying) {\\n ASSET.safeTransferFrom(depositor, address(this), amount);\\n LENDING_POOL.deposit(address(ASSET), amount, address(this), referralCode);\\n } else {\\n ATOKEN.safeTransferFrom(depositor, address(this), amount);\\n }\\n\\n uint256 amountToMint = dynamicToStaticAmount(amount);\\n _mint(recipient, amountToMint);\\n return amountToMint;\\n }\\n\\n function _withdraw(\\n address owner,\\n address recipient,\\n uint256 staticAmount,\\n uint256 dynamicAmount,\\n bool toUnderlying\\n ) internal returns (uint256, uint256) {\\n require(recipient != address(0), \'INVALID_RECIPIENT\');\\n require(staticAmount == 0 || dynamicAmount == 0, \'ONLY_ONE_AMOUNT_FORMAT_ALLOWED\');\\n\\n uint256 userBalance = balanceOf(owner);\\n\\n uint256 amountToWithdraw;\\n uint256 amountToBurn;\\n\\n uint256 currentRate = rate();\\n if (staticAmount > 0) {\\n amountToBurn = (staticAmount > userBalance) ? userBalance : staticAmount;\\n amountToWithdraw = (staticAmount > userBalance)\\n ? _staticToDynamicAmount(userBalance, currentRate)\\n : _staticToDynamicAmount(staticAmount, currentRate);\\n } else {\\n uint256 dynamicUserBalance = _staticToDynamicAmount(userBalance, currentRate);\\n amountToWithdraw = (dynamicAmount > dynamicUserBalance) ? dynamicUserBalance : dynamicAmount;\\n amountToBurn = _dynamicToStaticAmount(amountToWithdraw, currentRate);\\n }\\n\\n _burn(owner, amountToBurn);\\n\\n if (toUnderlying) {\\n LENDING_POOL.withdraw(address(ASSET), amountToWithdraw, recipient);\\n } else {\\n ATOKEN.safeTransfer(recipient, amountToWithdraw);\\n }\\n\\n return (amountToBurn, amountToWithdraw);\\n }\\n\\n function _dynamicToStaticAmount(uint256 amount, uint256 rate) internal pure returns (uint256) {\\n return amount.rayDiv(rate);\\n }\\n\\n function _staticToDynamicAmount(uint256 amount, uint256 rate) internal pure returns (uint256) {\\n return amount.rayMul(rate);\\n }\\n}","keccak256":"0xd5ff5905c5b976b1e08c8c1088b632e3ce1e04f178f4d1361964d9429a593c7b","license":"agpl-3.0"},"submodules/v2-foundry/src/external/aave/WadRayMath.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\nimport {Errors} from \'./Errors.sol\';\\n\\n/**\\n * @title WadRayMath library\\n * @author Aave\\n * @dev Provides mul and div function for wads (decimal numbers with 18 digits precision) and rays (decimals with 27 digits)\\n **/\\n\\nlibrary WadRayMath {\\n uint256 internal constant WAD = 1e18;\\n uint256 internal constant halfWAD = WAD / 2;\\n\\n uint256 internal constant RAY = 1e27;\\n uint256 internal constant halfRAY = RAY / 2;\\n\\n uint256 internal constant WAD_RAY_RATIO = 1e9;\\n\\n /**\\n * @return One ray, 1e27\\n **/\\n function ray() internal pure returns (uint256) {\\n return RAY;\\n }\\n\\n /**\\n * @return One wad, 1e18\\n **/\\n\\n function wad() internal pure returns (uint256) {\\n return WAD;\\n }\\n\\n /**\\n * @return Half ray, 1e27/2\\n **/\\n function halfRay() internal pure returns (uint256) {\\n return halfRAY;\\n }\\n\\n /**\\n * @return Half ray, 1e18/2\\n **/\\n function halfWad() internal pure returns (uint256) {\\n return halfWAD;\\n }\\n\\n /**\\n * @dev Multiplies two wad, rounding half up to the nearest wad\\n * @param a Wad\\n * @param b Wad\\n * @return The result of a*b, in wad\\
1n **/\\n function wadMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0 || b == 0) {\\n return 0;\\n }\\n\\n require(a <= (type(uint256).max - halfWAD) / b, Errors.MATH_MULTIPLICATION_OVERFLOW);\\n\\n return (a * b + halfWAD) / WAD;\\n }\\n\\n /**\\n * @dev Divides two wad, rounding half up to the nearest wad\\n * @param a Wad\\n * @param b Wad\\n * @return The result of a/b, in wad\\n **/\\n function wadDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b != 0, Errors.MATH_DIVISION_BY_ZERO);\\n uint256 halfB = b / 2;\\n\\n require(a <= (type(uint256).max - halfB) / WAD, Errors.MATH_MULTIPLICATION_OVERFLOW);\\n\\n return (a * WAD + halfB) / b;\\n }\\n\\n /**\\n * @dev Multiplies two ray, rounding half up to the nearest ray\\n * @param a Ray\\n * @param b Ray\\n * @return The result of a*b, in ray\\n **/\\n function rayMul(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (a == 0 || b == 0) {\\n return 0;\\n }\\n\\n require(a <= (type(uint256).max - halfRAY) / b, Errors.MATH_MULTIPLICATION_OVERFLOW);\\n\\n return (a * b + halfRAY) / RAY;\\n }
1\\n\\n /**\\n * @dev Divides two ray, rounding half up to the nearest ray\\n * @param a Ray\\n * @param b Ray\\n * @return The result of a/b, in ray\\n **/\\n function rayDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n require(b != 0, Errors.MATH_DIVISION_BY_ZERO);\\n uint256 halfB = b / 2;\\n\\n require(a <= (type(uint256).max - halfB) / RAY, Errors.MATH_MULTIPLICATION_OVERFLOW);\\n\\n return (a * RAY + halfB) / b;\\n }\\n\\n /**\\n * @dev Casts ray down to wad\\n * @param a Ray\\n * @return a casted to wad, rounded half up to the nearest wad\\n **/\\n function rayToWad(uint256 a) internal pure returns (uint256) {\\n uint256 halfRatio = WAD_RAY_RATIO / 2;\\n uint256 result = halfRatio + a;\\n require(result >= halfRatio, Errors.MATH_ADDITION_OVERFLOW);\\n\\n return result / WAD_RAY_RATIO;\\n }\\n\\n /**\\n * @dev Converts wad up to ray\\n * @param a Wad\\n * @return a converted in ray\\n **/\\n function wadToRay(uint256 a) internal pure returns (uint256) {\\n uint256 result = a * WAD_RAY_RATIO;\\n require(result / WAD_RAY_RATIO == a, Errors.MATH_MULTIPLICATION_OVERFLOW);\\n return result;\\n }\\n}","keccak256":"0xce3a040a3f13338a61a9e63faaa461ddf2895d24ac66d76f2a5216b46804038b","license":"agpl-3.0"},"submodules/v2-foundry/src/interfaces/IERC20Burnable.sol":{"content":"pragma solidity >=0.5.0;\\n\\nimport \\"../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\\";\\n\\n/// @title IERC20Burnable\\n/// @author Alchemix Finance\\ninterface IERC20Burnable is IERC20 {\\n /// @notice Burns `amount` tokens from the balance of `msg.sender`.\\n ///\\n /// @param amount The amount of tokens to burn.\\n ///\\n /// @return If burning the tokens was successful.\\n function burn(uint256 amount) external returns (bool);\\n\\n /// @notice Burns `amount` tokens from `owner`\'s balance.\\n ///\\n /// @param owner The address to burn tokens from.\\n /// @param amount The amount of tokens to burn.\\n ///\\n /// @return If burning the tokens was successful.\\n function burnFrom(address owner, uint256 amount) external returns (bool);\\n}","keccak256":"0x1ef68b8211ae0387d53a98d9ed818fed3991c029f58a4730467baa1cf6b22e58"},"submodules/v2-foundry/src/interfaces/IERC20Mintable.sol":{"content":"pragma solidity >=0.5.0;\\n\\nimport \\"../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\\";\\n\\n/// @title IERC20Mintable\\n/// @author Alchemix Finance\\ninterface IERC20Mintable is IERC20 {\\n /// @notice Mints `amount` tokens to `recipient`.\\n ///\\n /// @param recipient The address which will receive the minted tokens.\\n /// @param amount The amount of tokens to mint.\\n function mint(address recipient, uint256 amount) external;\\n}","keccak256":"0x072e557e7eff54ba828d410d96e7782931a634813bccc817dc8988979a435aeb"},"submodules/v2-foundry/src/interfaces/external/aave/DataTypes.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\n// @dev Refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.\\nstruct ReserveData {\\n // Stores the reserve configuration.\\n ReserveConfigurationMap configuration;\\n // The liquidity index. Expressed in ray.\\n uint128 liquidityIndex;\\n // Variable borrow index. Expressed in ray.\\n uint128 variableBorrowIndex;\\n // The current supply rate. Expressed in ray.\\n uint128 currentLiquidityRate;\\n // The current variable borrow rate. Expressed in ray.\\n uint128 currentVariableBorrowRate;\\n // The current stable borrow rate. Expressed in ray.\\n uint128 currentStableBorrowRate;\\n uint40 lastUpdateTimestamp;\\n // Tokens addresses.\\n address aTokenAddress;\\n address stableDebtTokenAddress;\\n address variableDebtTokenAddress;\\n // Address of the interest rate strategy.\\n address interestRateStrategyAddress;\\n // The id of the reserve. Represents the position in the list of the active reserves.\\n uint8 id;\\n}\\n\\nstruct ReserveConfigurationMap {\\n //bit 0-15: LTV\\n //bit 16-31: Liq. threshold\\n //bit 32-47: Liq. bonus\\n //bit 48-55: Decimals\\n //bit 56: Reserve is active\\n //bit 57: reserve is frozen\\n //bit 58: borrowing is enabled\\n //bit 59: stable rate borrowing enabled\\n //bit 60-63: reserved\\n //bit 64-79: reserve factor\\n uint256 data;\\n}\\n\\nstruct UserConfigurationMap {\\n uint256 data;\\n}\\n\\nenum InterestRateMode {\\n NONE,\\n STABLE,\\n VARIABLE\\n}","keccak256":"0x63e3c6a3663d616b5cbb9d6a0b9d5f10465bc39715ff88d29cb57275bfb651b1","license":"agpl-3.0"},"submodules/v2-foundry/src/interfaces/external/aave/IAToken.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\nimport {IERC20} from \\"../../../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\\";\\nimport {IScaledBalanceToken} from \'./IScaledBalanceToken.sol\';\\nimport {IInitializableAToken} from \'./IInitializableAToken.sol\';\\nimport {IAaveIncentivesController} from \'./IAaveIncentivesController.sol\';\\n\\ninterface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken {\\n /**\\n * @dev Emitted after the mint action\\n * @param from The address performing the mint\\n * @param value The amount being\\n * @param index The new liquidity index of the reserve\\n **/\\n event Mint(address indexed from, uint256 value, uint256 index);\\n\\n /**\\n * @dev Mints `amount` aTokens to `user`\\n * @param user The address receiving the minted tokens\\n * @param amount The amount of tokens getting minted\\n * @param index The new liquidity index of the reserve\\n * @return `true` if the the previous balance of the user was 0\\n */\\n function mint(\\n address user,\\n uint256 amount,\\n uint256 index\\n ) external returns (bool);\\n\\n /**\\n * @dev Emitted after aTokens are burned\\n * @param from The owner of the aTokens, getting them burned\\n * @param target The address that will receive the underlying\\n * @param value The amount being burned\\n * @param index The new liquidity index of the reserve\\n **/\\n event Burn(address indexed from, address indexed target, uint256 value, uint256 index);\\n\\n /**\\n * @dev Emitted during the transfer action\\n * @param from The user whose tokens are being transferred\\n * @param to The recipient\\n * @param value The amount being transferred\\n * @param index The new liquidity index of the reserve\\n **/\\n event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index);\\n\\n /**\\n * @dev Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying`\\n * @param user The owner of the aTokens, getting them burned\\n * @param receiverOfUnderlying The address that will receive the underlying\\n * @param amount The amount being burned\\n * @param index The new liquidity index of the reserve\\n **/\\n function burn(\\n address user,\\n address receiverOfUnderlying,\\n uint256 amount,\\n uint256 index\\n ) external;\\n\\n /**\\n * @dev Mints aTokens to the reserve treasury\\n * @param amount The amount of tokens getting minted\\n * @param index The new liquidity index of the reserve\\n */\\n function mintToTreasury(uint256 amount, uint256 index) external;\\n\\n /**\\n * @dev Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken\\n * @param from The address getting liquidated, current owner of the aTokens\\n * @param to The recipient\\n * @param value The amount of tokens getting transferred\\n **/\\n function transferOnLiquidation(\\n address from,\\n address to,\\n uint256 value\\n ) external;\\n\\n /**\\n * @dev Transfers the underlying asset to `target`. Used by the LendingPool to transfer\\n * assets in borrow(), withdraw() and flashLoan()\\n * @param user The recipient of the underlying\\n * @param amount The amount getting transferred\\n * @return The amount transferred\\n **/\\n function transferUnderlyingTo(address user, uint256 amount) external returns (uint256);\\n\\n /**\\n * @dev Invoked to execute actions on the aToken side after a repayment.\\n * @param user The user executing the repayment\\n * @param amount The amount getting repaid\\n **/\\n function handleRepayment(address user, uint256 amount) external;\\n\\n /**\\n * @dev Returns the address of the incentives controller contract\\n **/\\n function getIncentivesController() external view returns (IAaveIncentivesController);\\n\\n /**\\n * @dev Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH)\\n **/\\n function UNDERLYING_ASSET_ADDRESS() external view returns (address);\\n}","keccak256":"0x6241a8de6ea9ca116842a8e54b525f3372beb60ff0e8a066d2406f9e5a91848e","license":"agpl-3.0"},"submodules/v2-foundry/src/interfaces/external/aave/IAaveIncentivesController.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\npragma experimental ABIEncoderV2;\\n\\ninterface IAaveIncentivesController {\\n event RewardsAccrued(address indexed user, uint256 amount);\\n\\n event RewardsClaimed(address indexed user, address indexed to, uint256 amount);\\n\\n event RewardsClaimed(\\n address indexed user,\\n address indexed to,\\n address indexed claimer,\\n uint256 amount\\n );\\n\\n event ClaimerSet(address indexed user, address indexed claimer);\\n\\n /*\\n * @dev Returns the configuration of the distribution for a certain asset\\n * @param asset The address of the reference asset of the distribution\\n * @return The asset index, the emission per second and the last updated timestamp\\n **/\\n function getAssetData(address asset)\\n external\\n view\\n returns (\\n uint256,\\n uint256,\\n uint256\\n );\\n\\n /**\\n * @dev Whitelists an address to claim the rewards on behalf of another address\\n * @param user The address of the user\\n * @param claimer The address of the claimer\\n */\\n function setClaimer(address user, address claimer) external;\\n\\n /**\\n * @dev Returns the whitelisted claimer for a certain address (0x0 if not set)\\n * @param user The address of the user\\n * @return The claimer address\\n */\\n function getClaimer(address user) external view returns (address);\\n\\n /**\\n * @dev Configure assets for a certain rewards emission\\n * @param assets The assets to incentivize\\n * @param emissionsPerSecond The emission for each asset\\n */\\n function configureAssets(address[] calldata assets, uint256[] calldata emissionsPerSecond)\\n external;\\n\\n /**\\n * @dev Called by the corresponding asset on any update that affects the rewards distribution\\n * @param asset The address of the user\\n * @param userBalance The balance of the user of the asset in the lending pool\\n * @param totalSupply The total supply of the asset in the lending pool\\n **/\\n function handleAction(\\n address asset,\\n uint256 userBalance,\\n uint256 totalSupply\\n ) external;\\n\\n /**\\n * @dev Returns the total of rewards of an user, already accrued + not yet accrued\\n * @param user The address of the user\\n * @return The rewards\\n **/\\n function getRewardsBalance(address[] calldata assets, address user)\\n external\\n view\\n returns (uint256);\\n\\n /**\\n * @dev Claims reward for an user, on all the assets of the lending pool, accumulating the pending rewards\\n * @param amount Amount of rewards to claim\\n * @param to Address that will be receiving the rewards\\n * @return Rewards claimed\\n **/\\n function claimRewards(\\n address[] calldata assets,\\n uint256 amount,\\n address to\\n ) external returns (uint256);\\n\\n /**\\n * @dev Claims reward for an user on behalf, on all the assets of the lending pool, accumulating the pending rewards. The caller must\\n * be whitelisted via \\"allowClaimOnBehalf\\" function by the RewardsAdmin role manager\\n * @param amount Amount of rewards to claim\\n * @param user Address to check and claim rewards\\n * @param to Address that will be receiving the rewards\\n * @return Rewards claimed\\n **/\\n function claimRewardsOnBehalf(\\n address[] calldata assets,\\n uint256 amount,\\n address user,\\n address to\\n ) external returns (uint256);\\n\\n /**\\n * @dev returns the unclaimed rewards of the user\\n * @param user the address of the user\\n * @return the unclaimed user rewards\\n */\\n function getUserUnclaimedRewards(address user) external view returns (uint256);\\n\\n /**\\n * @dev returns the unclaimed rewards of the user\\n * @param user the address of the user\\n * @param asset The asset to incentivize\\n * @return the user index for the asset\\n */\\n function getUserAssetData(address user, address asset) external view returns (uint256);\\n\\n /**\\n * @dev for backward compatibility with previous implementation of the Incentives controller\\n */\\n function REWARD_TOKEN() external view returns (address);\\n\\n /**\\n * @dev for backward compatibility with previous implementation of the Incentives controller\\n */\\n function PRECISION() external view returns (uint8);\\n}","keccak256":"0x36f7001948d174c5c6546737ca44c1b99f93162d47e8b146b769483de0e3db91","license":"agpl-3.0"},"submodules/v2-foundry/src/interfaces/external/aave/IInitializableAToken.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\nimport {ILendingPool} from \'./ILendingPool.sol\';\\nimport {IAaveIncentivesController} from \'./IAaveIncentivesController.sol\';\\n\\n/**\\n * @title IInitializableAToken\\n * @notice Interface for the initialize function on AToken\\n * @author Aave\\n **/\\ninterface IInitializableAToken {\\n /**\\n * @dev Emitted when an aToken is initialized\\n * @param underlyingAsset The address of the underlying asset\\n * @param pool The address of the associated lending pool\\n * @param treasury The address of the treasury\\n * @param incentivesController The address of the incentives controller for this aToken\\n * @param aTokenDecimals the decimals of the underlying\\n * @param aTokenName the name of the aToken\\n * @param aTokenSymbol the symbol of the aToken\\n * @param params A set of encoded parameters for additional initialization\\n **/\\n event Initialized(\\n address indexed underlyingAsset,\\n address indexed pool,\\n address treasury,\\n address incentivesController,\\n uint8 aTokenDecimals,\\n string aTokenName,\\n string aTokenSymbol,\\n bytes params\\n );\\n\\n /**\\n * @dev Initializes the aToken\\n * @param pool The address of the lending pool where this aToken will be used\\n * @param treasury The address of the Aave treasury, receiving the fees on this aToken\\n * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH)\\n * @param incentivesController The smart contract managing potential incentives distribution\\n * @param aTokenDecimals The decimals of the aToken, same as the underlying asset\'s\\
1n * @param aTokenName The name of the aToken\\n * @param aTokenSymbol The symbol of the aToken\\n */\\n function initialize(\\n ILendingPool pool,\\n address treasury,\\n address underlyingAsset,\\n IAaveIncentivesController incentivesController,\\n uint8 aTokenDecimals,\\n string calldata aTokenName,\\n string calldata aTokenSymbol,\\n bytes calldata params\\n ) external;\\n}","keccak256":"0xab946c6d2e403d07ab0caa699f0861ac74561d3c5f8ee101448e6c2a9ea12c35","license":"agpl-3.0"},"submodules/v2-foundry/src/interfaces/external/aave/ILendingPool.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\nimport * as DataTypes from \\"./DataTypes.sol\\";\\n\\nimport {ILendingPoolAddressesProvider} from \\"./ILendingPoolAddressesProvider.sol\\";\\n\\ninterface ILendingPool {\\n /// @dev Emitted on `deposit`.\\n ///\\n /// @param reserve The address of the underlying asset of the reserve.\\n /// @param user The address initiating the deposit.\\n /// @param onBehalfOf The beneficiary of the deposit, receiving the aTokens.\\n /// @param amount The amount deposited.\\n /// @param referral The referral code used.\\n event Deposit(\\n address indexed reserve,\\n address user,\\n address indexed onBehalfOf,\\n uint256 amount,\\n uint16 indexed referral\\n );\\n\\n /// @dev Emitted on `withdraw`.\\n ///\\n /// @param reserve The address of the underlying asset being withdrawn.\\n /// @param user The address initiating the withdrawal, owner of aTokens.\\n /// @param to Address that will receive the underlying.\\n /// @param amount The amount to be withdrawn.\\n event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount);\\n \\n /// @dev Emitted on `borrow` and `flashLoan` when debt needs to be opened.\\n ///\\n /// @param reserve The address of the underlying asset being borrowed.\\n /// @param user The address of the user initiating the `borrow`, receiving the funds on `borrow` or just\\n /// initiator of the transaction on `flashLoan`.\\n /// @param onBehalfOf The address that will be getting the debt.\\n /// @param amount The amount borrowed out.\\n /// @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable.\\n /// @param borrowRate The numeric rate at which the user has borrowed.\\n /// @param referral The referral code used.\\n event Borrow(\\n address indexed reserve,\\n address user,\\n address indexed onBehalfOf,\\n uint256 amount,\\n uint256 borrowRateMode,\\n uint256 borrowRate,\\n uint16 indexed referral\\n );\\n\\n /// @dev Emitted on `repay`.\\n ///\\n /// @param reserve The address of the underlying asset of the reserve.\\n /// @param user The beneficiary of the repayment, getting his debt reduced.\\n /// @param repayer The address of the user initiating the `repay`, providing the funds.\\n /// @param amount The amount repaid.\\n event Repay(address indexed reserve, address indexed user, address indexed repayer, uint256 amount);\\n \\n /// @dev Emitted on `swapBorrowRateMode`.\\n ///\\n /// @param reserve The address of the underlying asset of the reserve\\n /// @param user The address of the user swapping his rate mode\\n /// @param rateMode The rate mode that the user wants to swap to\\n event Swap(address indexed reserve, address indexed user, uint256 rateMode);\\n \\n /// @dev Emitted on `setUserUseReserveAsCollateral`.\\n ///\\n /// @param reserve The address of the underlying asset of the reserve\\n /// @param user The address of the user enabling the usage as collateral\\n event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user);\\n\\n /// @dev Emitted on `setUserUseReserveAsCollateral`.\\n ///\\n /// @param reserve The address of the underlying asset of the reserve\\n /// @param user The address of the user enabling the usage as collateral\\n event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user);\\n \\n /// @dev Emitted on `rebalanceStableBorrowRate`.\\n ///\\n /// @param reserve The address of the underlying asset of the reserve\\n /// @param user The address of the user for which the rebalance has been executed\\n event RebalanceStableBorrowRate(address indexed reserve, address indexed user);\\n\\n /// @dev Emitted on `flashLoan`.\\n ///\\n /// @param target The address of the flash loan receiver contract.\\n /// @param initiator The address initiating the flash loan.\\n /// @param asset The address of the asset being flash borrowed.\\n /// @param amount The amount flash borrowed.\\n /// @param premium The fee flash borrowed.\\n /// @param referralCode The referral code used.\\n event FlashLoan(\\n address indexed target,\\n address indexed initiator,\\n address indexed asset,\\n uint256 amount,\\n uint256 premium,\\n uint16 referralCode\\n );\\n\\n /// @dev Emitted when the pause is triggered.\\n event Paused();\\n\\n /// @dev Emitted when the pause is lifted.\\n event Unpaused();\\n\\n /// @dev Emitted when a borrower is liquidated. This event is emitted by the LendingPool via LendingPoolCollateral\\n /// manager using a DELEGATECALL.\\n ///\\n /// This allows to have the events in the generated ABI for LendingPool.\\n ///\\n /// @param collateralAsset The address of the underlying asset used as collateral, to receive as result of\\n /// the liquidation.\\n /// @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation.\\n /// @param user The address of the borrower getting liquidated.\\n /// @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover.\\n /// @param liquidatedCollateralAmount The amount of collateral received by the liquidator.\\n /// @param liquidator The address of the liquidator\\n /// @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if\\n /// he wants to receive the underlying collateral asset directly.\\n event LiquidationCall(\\n address indexed collateralAsset,\\n address indexed debtAsset,\\n address indexed user,\\n uint256 debtToCover,\\n uint256 liquidatedCollateralAmount,\\n address liquidator,\\n bool receiveAToken\\n );\\n\\n /// @dev Emitted when the state of a reserve is updated.\\n ///\\n /// NOTE: This event is actually declared in the ReserveLogic library and emitted in the `updateInterestRates`\\n /// function. Since the function is internal, the event will actually be fired by the LendingPool contract. The event\\n /// is therefore replicated here so it gets added to the LendingPool ABI.\\n ///\\n /// @param reserve The address of the underlying asset of the reserve.\\n /// @param liquidityR
1ate The new liquidity rate.\\n /// @param stableBorrowRate The new stable borrow rate.\\n /// @param variableBorrowRate The new variable borrow rate.\\n /// @param liquidityIndex The new liquidity index\\n /// @param variableBorrowIndex The new variable borrow index\\n event ReserveDataUpdated(\\n address indexed reserve,\\n uint256 liquidityRate,\\n uint256 stableBorrowRate,\\n uint256 variableBorrowRate,\\n uint256 liquidityIndex,\\n uint256 variableBorrowIndex\\n );\\n\\n /// @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.\\n ///\\n /// - E.g. User deposits 100 USDC and gets in return 100 aUSDC.\\n ///\\n /// @param asset The address of the underlying asset to deposit.\\n /// @param amount The amount to be deposited.\\n /// @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user wants to receive\\n /// them on his own wallet, or a different address if the beneficiary of aTokens is a different\\n /// wallet.\\n /// @param referralCode Code used to register the integrator originating the operation, for potential rewards.0 if the\\n /// action is executed directly by the user, without any middle-man\\n function deposit(\\n address asset,\\n uint256 amount,\\n address onBehalfOf,\\n uint16 referralCode\\n ) external;\\n\\n /// @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned.\\n ///\\n /// E.g. User has 100 aUSDC, calls `withdraw` and receives 100 USDC, burning the 100 aUSDC.\\n ///\\n /// @param asset The address of the underlying asset to withdraw\\n /// @param amount The underlying amount to be withdrawn.\\n /// @param to Address that will receive the underlying, same as msg.sender if the user wants to receive it on his\\n /// own wallet, or a different address if the beneficiary is a different wallet.\\n ///\\n /// @return amountWithdrawn The final amount withdrawn\\n function withdraw(\\n address asset,\\n uint256 amount,\\n address to\\n ) external returns (uint256 amountWithdrawn);\\n\\n /// @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower\\n /// already deposited enough collateral, or he was given enough allowance by a credit delegator on the\\n /// corresponding debt token (StableDebtToken or VariableDebtToken).\\n ///\\n /// - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet and\\n /// 100 stable/variable debt tokens, depending on the `interestRateMode`.\\n ///\\n /// @param asset The address of the underlying asset to borrow.\\n /// @param amount The amount to be borrowed.\\n /// @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable\\n /// @param referralCode Code used to register the integrator originating the operation, for potential rewards.\\n /// 0 if the action is executed directly by the user, without any middle-man\\n /// @param onBehalfOf Address of the user who will receive the debt. Should be the address of the borrower\\n /// itself calling the function if he wants to borrow against his own collateral, or the\\n /// address of the credit delegator if he has been given credit delegation allowance\\n function borrow(\\n address asset,\\n uint256 amount,\\n uint256 interestRateMode,\\n uint16 referralCode,\\n address onBehalfOf\\n ) external;\\n\\n /// @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned.\\n ///\\n /// - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address.\\n ///\\n /// @param asset The address of the borrowed underlying asset previously borrowed.\\n /// @param amount The amount to repay.\\n /// @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable\\n /// @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the user\\n /// calling the function if he wants to reduce/remove his own debt, or the address of any other\\n /// other borrower whose debt should be removed.\\n ///\\n /// @return amountRepaid The final amount repaid.\\n function repay(\\n address asset,\\n uint256 amount,\\n uint256 rateMode,\\n address onBehalfOf\\n ) external returns (uint256 amountRepaid);\\n\\n /// @dev Allows a borrower to swap his debt between stable and variable mode, or vice versa.\\n ///\\n /// @param asset The address of the underlying asset borrowed.\\n /// @param rateMode The rate mode that the user wants to swap to.\\n function swapBorrowRateMode(address asset, uint256 rateMode) external;\\n\\n /// @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve.\\n ///\\n /// - Users can be rebalanced if the following conditions are satisfied:\\n /// 1. Usage ratio is above 95%\\n /// 2. the current deposit APY is below REBALANCE_UP_THRESHOLD maxVariableBorrowRate, which means that too much\\n /// has been borrowed at a stable rate and depositors are not earning enough.\\n ///\\n /// @param asset The address of the underlying asset borrowed.\\n /// @param user The address of the user to be rebalanced.\\n function rebalanceStableBorrowRate(address asset, address user) external;\\n\\n /// @dev Allows depositors to enable/disable a specific deposited asset as collateral.\\n ///\\n /// @param asset The address of the underlying asset deposited.\\n /// @param useAsCollateral `true` if the user wants to use the deposit as collateral, `false` otherwise.\\n function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external;\\n \\n /// @dev Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1.\\n ///\\n /// - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives a\\n /// proportionally amount of the `collateralAsset` plus a bonus to cover market r
1isk.\\n ///\\n /// @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the\\n /// liquidation.\\n /// @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation.\\n /// @param user The address of the borrower getting liquidated.\\n /// @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover.\\n /// @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants to\\n /// receive the underlying collateral asset directly\\n function liquidationCall(\\n address collateralAsset,\\n address debtAsset,\\n address user,\\n uint256 debtToCover,\\n bool receiveAToken\\n ) external;\\n\\n /// @dev Allows smart contracts to access the liquidity of the pool within one transaction, as long as the amount\\n /// taken plus a fee is returned.\\n ///\\n /// IMPORTANT There are security concerns for developers of flash loan receiver contracts that must be kept into\\n /// consideration.\\n ///\\n /// For further details please visit https://developers.aave.com.\\n ///\\n /// @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver\\n /// interface.\\n /// @param assets The addresses of the assets being flash-borrowed.\\n /// @param amounts The amounts amounts being flash-borrowed.\\n /// @param modes Types of the debt to open if the flash loan is not returned.\\n /// @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2.\\n /// @param params Variadic packed params to pass to the receiver as extra information.\\n /// @param referralCode Code used to register the integrator originating the operation, for potential rewards. 0\\n /// if the action is executed directly by the user, without any middle-man\\n function flashLoan(\\n address receiverAddress,\\n address[] calldata assets,\\n uint256[] calldata amounts,\\n uint256[] calldata modes,\\n address onBehalfOf,\\n bytes calldata params,\\n uint16 referralCode\\n ) external;\\n\\n /// @dev Returns the user account data across all the reserves.\\n ///\\n /// @param user The address of the user.\\n ///\\n /// @return totalCollateralETH The total collateral in ETH of the user.\\n /// @return totalDebtETH The total debt in ETH of the user.\\n /// @return availableBorrowsETH The borrowing power left of the user.\\n /// @return currentLiquidationThreshold The liquidation threshold of the user.\\n /// @return ltv The loan to value of the user.\\n /// @return healthFactor The current health factor of the user.\\n function getUserAccountData(address user)\\n external\\n view\\n returns (\\n uint256 totalCollateralETH,\\n uint256 totalDebtETH,\\n uint256 availableBorrowsETH,\\n uint256 currentLiquidationThreshold,\\n uint256 ltv,\\n uint256 healthFactor\\n );\\n\\n function initReserve(\\n address reserve,\\n address aTokenAddress,\\n address stableDebtAddress,\\n address variableDebtAddress,\\n address interestRateStrategyAddress\\n ) external;\\n\\n function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress) external;\\n\\n function setConfiguration(address reserve, uint256 configuration) external;\\n\\n /// @dev Returns the configuration of the reserve.\\n ///\\n /// @param asset The address of the underlying asset of the reserve.\\n ///\\n /// @return The configuration of the reserve.\\n function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory);\\n\\n /// @dev Returns the configuration of the user across all the reserves.\\n ///\\n /// @param user The user address.\\n ///\\n /// @return The configuration of the user.\\n function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory);\\n \\n /// @dev Returns the normalized income normalized income of the reserve.\\n ///\\n /// @param asset The address of the underlying asset of the reserve.\\n ///\\n /// @return The reserve\'s normalized income.\\n function getReserveNormalizedIncome(a
1ddress asset) external view returns (uint256);\\n\\n /// @dev Returns the normalized variable debt per unit of asset.`\\n ///\\n /// @param asset The address of the underlying asset of the reserve.\\n ///\\n /// @return The reserve normalized variable debt.\\n function getReserveNormalizedVariableDebt(address asset) external view returns (uint256);\\n\\n /// @dev Returns the state and configuration of the reserve.\\n ///\\n /// @param asset The address of the underlying asset of the reserve.\\n ///\\n /// @return The state of the reserve.\\n function getReserveData(address asset) external view returns (DataTypes.ReserveData memory);\\n\\n function finalizeTransfer(\\n address asset,\\n address from,\\n address to,\\n uint256 amount,\\n uint256 balanceFromAfter,\\n uint256 balanceToBefore\\n ) external;\\n\\n function getReservesList() external view returns (address[] memory);\\n\\n function getAddressesProvider() external view returns (ILendingPoolAddressesProvider);\\n\\n function setPause(bool val) external;\\n\\n function paused() external view returns (bool);\\n}\\n","keccak256":"0x3ba3e6be29f45db50776edf90fcc78187bcaa85284160fbb9558477ca641a1de","license":"agpl-3.0"},"submodules/v2-foundry/src/interfaces/external/aave/ILendingPoolAddressesProvider.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\n/// @title ILendingPoolAddressesProvider\\n/// @author Aave\\n///\\n/// @dev Main registry of addresses part of or connected to the protocol, including permissioned roles.\\n///\\
1n/// - Acting also as factory of proxies and admin of those, so with right to change its implementations.\\n/// - Owned by the Aave Governance.\\ninterface ILendingPoolAddressesProvider {\\n event MarketIdSet(string newMarketId);\\n event LendingPoolUpdated(address indexed newAddress);\\n event ConfigurationAdminUpdated(address indexed newAddress);\\n event EmergencyAdminUpdated(address indexed newAddress);\\n event LendingPoolConfiguratorUpdated(address indexed newAddress);\\n event LendingPoolCollateralManagerUpdated(address indexed newAddress);\\n event PriceOracleUpdated(address indexed newAddress);\\n event LendingRateOracleUpdated(address indexed newAddress);\\n event ProxyCreated(bytes32 id, address indexed newAddress);\\n event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy);\\n\\n function getMarketId() external view returns (string memory);\\n\\n function setMarketId(string calldata marketId) external;\\n\\n function setAddress(bytes32 id, address newAddress) external;\\n\\n function setAddressAsProxy(bytes32 id, address impl) external;\\n\\n function getAddress(bytes32 id) external view returns (address);\\n\\n function getLendingPool() external view returns (address);\\n\\n function setLendingPoolImpl(address pool) external;\\n\\n function getLendingPoolConfigurator() external view returns (address);\\n\\n function setLendingPoolConfiguratorImpl(address configurator) external;\\n\\n function getLendingPoolCollateralManager() external view returns (address);\\n\\n function setLendingPoolCollateralManager(address manager) external;\\n\\n function getPoolAdmin() external view returns (address);\\n\\n function setPoolAdmin(address admin) external;\\n\\n function getEmergencyAdmin() external view returns (address);\\n\\n function setEmergencyAdmin(address admin) external;\\n\\n function getPriceOracle() external view returns (address);\\n\\n function setPriceOracle(address priceOracle) external;\\n\\n function getLendingRateOracle() external view returns (address);\\n\\n function setLendingRateOracle(address lendingRateOracle) external;\\n}\\n","keccak256":"0x1506d7df79f8019ecdccfd2338d3e98fd7936c5a3bd9aface67b020a4080b9d6","license":"agpl-3.0"},"submodules/v2-foundry/src/interfaces/external/aave/IScaledBalanceToken.sol":{"content":"// SPDX-License-Identifier: agpl-3.0\\npragma solidity >=0.5.0;\\n\\ninterface IScaledBalanceToken {\\n /// @dev Returns the scaled balance of the user. The scaled balance is the sum of all the updated stored balance\\n /// divided by the reserve\'s liquidity index at the moment of the update.\\n ///\\n /// @param user The user whose balance is calculated.\\n ///\\n /// @return The scaled balance of the user.\\n function scaledBalanceOf(address user) external view returns (uint256);\\n\\n /// @dev Returns the scaled balance of the user and the scaled total supply.\\n ///\\n /// @param user The address of the user.\\n ///\\n /// @return scaledBalance The scaled balance of the user.\\n /// @return scaledTotalSupply The scaled balance and the scaled total supply.\\n function getScaledUserBalanceAndSupply(address user)\\n external view\\n returns (\\n uint256 scaledBalance,\\n uint256 scaledTotalSupply\\n );\\n\\n /// @dev Returns the scaled total supply of the variable debt token. Represents sum(debt/index).\\n ///\\n /// @return The scaled total supply.\\n function scaledTotalSupply() external view returns (uint256);\\n}\\n","keccak256":"0x0bb73533d797247abd3022eb3d7641f030b05afb76bff4ad1a8da1daf9f6599c","license":"agpl-3.0"},"submodules/v2-foundry/src/libraries/TokenUtils.sol":{"content":"pragma solidity ^0.8.13;\\n\\nimport \\"../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\\";\\nimport \\"../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\\";\\nimport \\"../interfaces/IERC20Burnable.sol\\";\\nimport \\"../interfaces/IERC20Mintable.sol\\";\\n\\n/// @title TokenUtils\\n/// @author Alchemix Finance\\nlibrary TokenUtils {\\n /// @notice An error used to indicate that a call to an ERC20 contract failed.\\n ///\\n /// @param target The target address.\\n /// @param success If the call to the token was a success.\\n /// @param data The resulting data from the call. This is error data when the call was not a success. Otherwise,\\n /// this is malformed data when the call was a success.\\n error ERC20CallFailed(address target, bool success, bytes data);\\n\\n /// @dev A safe function to get the decimals of an ERC20 token.\\n ///\\n /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value.\\n ///\\n /// @param token The target token.\\n ///\\n /// @return The amount of decimals of the token.\\n function expectDecimals(address token) internal view returns (uint8) {\\n (bool success, bytes memory data) = token.staticcall(\\n abi.encodeWithSelector(IERC20Metadata.decimals.selector)\\n );\\n\\n if (token.code.length == 0 || !success || data.length < 32) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n\\n return abi.decode(data, (uint8));\\n }\\n\\n /// @dev Gets the balance of tokens held by an account.\\n ///\\n /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value.\\n ///\\n /// @param token The token to check the balance of.\\n /// @param account The address of the token holder.\\n ///\\n /// @return The balance of the tokens held by an account.\\n function safeBalanceOf(address token, address account) internal view returns (uint256) {\\n (bool success, bytes memory data) = token.staticcall(\\n abi.encodeWithSelector(IERC20.balanceOf.selector, account)\\n );\\n\\n if (token.code.length == 0 || !success || data.length < 32) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n\\n return abi.decode(data, (uint256));\\n }\\n\\n /// @dev Transfers tokens to another address.\\n ///\\n /// @dev Reverts with a {CallFailed} error if execution of the transfer failed or returns an unexpected value.\\n ///\\n /// @param token The token to transfer.\\n /// @param recipient The address of the recipient.\\n /// @param amount The amount of tokens to transfer.\\n function safeTransfer(address token, address recipient, uint256 amount) internal {\\n (bool success, bytes memory data) = token.call(\\n abi.encodeWithSelector(IERC20.transfer.selector, recipient, amount)\\n );\\n\\n if (token.code.length == 0 || !success || (data.length != 0 && !abi.decode(data, (bool)))) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n }\\n\\n /// @dev Approves tokens for the smart contract.\\n ///\\n /// @dev Reverts with a {CallFailed} error if execution of the approval fails or returns an unexpected value.\\n ///\\n /// @param token The token to approve.\\n /// @param spender The contract to spend the tokens.\\n /// @param value The amount of tokens to approve.\\n function safeApprove(address token, address spender, uint256 value) internal {\\n (bool success, bytes memory data) = token.call(\\n abi.encodeWithSelector(IERC20.approve.selector, spender, value)\\n );\\n\\n if (token.code.length == 0 || !success || (data.length != 0 && !abi.decode(data, (bool)))) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n }\\n\\n /// @dev Transfer tokens from one address to another address.\\n ///\\n /// @dev Reverts with a {CallFailed} error if execution of the transfer fails or returns an unexpected value.\\n ///\\n /// @param token The token to transfer.\\n /// @param owner The address of the owner.\\n /// @param recipient The address of the recipient.\\n /// @param amount The amount of tokens to transfer.\\n function safeTransferFrom(address token, address owner, address recipient, uint256 amount) internal {\\n (bool success, bytes memory data) = token.call(\\n abi.encodeWithSelector(IERC20.transferFrom.selector, owner, recipient, amount)\\n );\\n\\n if (token.code.length == 0 || !success || (data.length != 0 && !abi.decode(data, (bool)))) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n }\\n\\n /// @dev Mints tokens to an address.\\n ///\\n /// @dev Reverts with a {CallFailed} error if execution of the mint fails or returns an unexpected value.\\n ///\\n /// @param token The token to mint.\\n /// @param recipient The address of the recipient.\\n /// @param amount The amount of tokens to mint.\\n function safeMint(address token, address recipient, uint256 amount) internal {\\n (bool success, bytes memory data) = token.call(\\n abi.encodeWithSelector(IERC20Mintable.mint.selector, recipient, amount)\\n );\\n\\n if (token.code.length == 0 || !success || (data.length != 0 && !abi.decode(data, (bool)))) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n }\\n\\n /// @dev Burns tokens.\\n ///\\n /// Reverts with a `CallFailed` error if execution of the burn fails or returns an unexpected value.\\n ///\\n /// @param token The token to burn.\\n /// @param amount The amount of tokens to burn.\\n function safeBurn(address token, uint256 amount) internal {\\n (bool success, bytes memory data) = token.call(\\n abi.encodeWithSelector(IERC20Burnable.burn.selector, amount)\\n );\\n\\n if (token.code.length == 0 || !success || (data.length != 0 && !abi.decode(data, (bool)))) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n }\\n\\n /// @dev Burns tokens from its total supply.\\n ///\\n /// @dev Reverts with a {CallFailed} error if execution of the burn fails or returns an unexpected value.\\n ///\\n /// @param token The token to burn.\\n /// @param owner The owner of the tokens.\\n /// @param amount The amount of tokens to burn.\\n function safeBurnFrom(address token, address owner, uint256 amount) internal {\\n (bool success, bytes memory data) = token.call(\\n abi.encodeWithSelector(IERC20Burnable.burnFrom.selector, owner, amount)\\n );\\n\\n if (token.code.length == 0 || !success || (data.length != 0 && !abi.decode(data, (bool)))) {\\n revert ERC20CallFailed(token, success, data);\\n }\\n }\\n}","keccak256":"0xc5baa0feb362479be13700eafb1bc8eee1ab10cac51bc9b317b721b5d2dd228c"}},"version":1}',o="0x60e06040523480156200001157600080fd5b506040516200297838038062002978833981016040819052620000349162000449565b8151829082906200004d906003906020850190620002b0565b50805162000063906004906020840190620002b0565b5050506001600160a01b03808516608052831660a0819052604080516358b50cef60e11b815290516000929163b16a19de9160048083019260209291908290030181865afa158015620000ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e09190620004de565b6001600160a01b03811660c05290506200010a81866000196200018f602090811b62000ee717901c565b836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000149573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016f919062000505565b6006805460ff191660ff9290921691909117905550620005f59350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691620001ed91906200052a565b6000604051808303816000865af19150503d80600081146200022c576040519150601f19603f3d011682016040523d82523d6000602084013e62000231565b606091505b5091509150846001600160a01b03163b600014806200024e575081155b806200027957508051158015906200027957508080602001905181019062000277919062000548565b155b15620002a95784828260405163e7e40b5b60e01b8152600401620002a0939291906200056c565b60405180910390fd5b5050505050565b828054620002be90620005b9565b90600052602060002090601f016020900481019282620002e257600085556200032d565b82601f10620002fd57805160ff19168380011785556200032d565b828001600101855582156200032d579182015b828111156200032d57825182559160200191906001019062000310565b506200033b9291506200033f565b5090565b5b8082111
156200033b576000815560010162000340565b6001600160a01b03811681146200036c57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620003a257818101518382015260200162000388565b83811115620003b2576000848401525b50505050565b600082601f830112620003ca57600080fd5b81516001600160401b0380821115620003e757620003e76200036f565b604051601f8301601f19908116603f011681019082821181831017156200041257620004126200036f565b816040528381528660208588010111156200042c57600080fd5b6200043f84602083016020890162000385565b9695505050505050565b600080600080608085870312156200046057600080fd5b84516200046d8162000356565b6020860151909450620004808162000356565b60408601519093506001600160401b03808211156200049e57600080fd5b620004ac88838901620003b8565b93506060870151915080821115620004c357600080fd5b50620004d287828801620003b8565b91505092959194509250565b600060208284031215620004f157600080fd5b8151620004fe8162000356565b9392505050565b6000602082840312156200051857600080fd5b815160ff81168114620004fe57600080fd5b600082516200053e81846020870162000385565b9190910192915050565b6000602082840312156200055b57600080fd5b81518015158114620004fe57600080fd5b60018060a01b038416815282151560208201526060604082015260008251806060840152620005a381608085016020870162000385565b601f01601f191691909101608001949350505050565b600181811c90821680620005ce57607f821691505b602082108103620005ef57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c0516123146200066460003960008181610302015281816105fc015281816114bb0152818161160701526116460152600081816103410152818161157201526116f301526000818161047b01528181610627015281816114f2015261168501526123146000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806369af0ddb1161010457806395d89b41116100a2578063b9844d8d11610071578063b9844d8d1461049d578063dd62ed3e146104bd578063ead5d359146104d0578063f57d0b40146104e357600080fd5b806395d89b4114610448578063a457c2d714610450578063a9059cbb14610463578063b4dcfc771461047657600080fd5b806381abdab3116100de57806381abdab3146103e65780638a127bfd146103f95780638a3b3d6f1461040e5780638d9484151461042157600080fd5b806369af0ddb1461038a57806370a082311461039d57806378160376146103c657600080fd5b806330adf81f1161017c57806344b68c3f1161014b57806344b68c3f146102ea5780634800d97f146102fd57806351c0e0611461033c578063632105371461036357600080fd5b806330adf81f14610288578063313ce567146102af57806336a5a6d6146102c457806339509351146102d757600080fd5b806323b872dd116101b857806323b872dd14610232578063288587ce146102455780632c4e722e1461026d5780632f2cab871461027557600080fd5b806306fdde03146101df578063095ea7b3146101fd57806318160ddd14610220575b600080fd5b6101e76104f6565b6040516101f49190611df8565b60405180910390f35b61021061020b366004611e27565b610588565b60405190151581526020016101f4565b6002545b6040519081526020016101f4565b610210610240366004611e51565b6105a2565b610258610253366004611e9e565b6105c8565b604080519283526020830191909152016101f4565b6102246105e5565b610224610283366004611ef0565b
1610699565b6102247f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460405160ff90911681526020016101f4565b6102246102d2366004611f3f565b6106b1565b6102106102e5366004611e27565b6106c5565b6102246102f8366004611f58565b6106e7565b6103247f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101f4565b6103247f000000000000000000000000000000000000000000000000000000000000000081565b6102247f4dab0a5e832f103ac80c9c3e51e5742f8a24aa0a3d941fe91c64e1e3db50c74381565b610258610398366004611f8b565b610709565b6102246103ab366004611f58565b6001600160a01b031660009081526020819052604090205490565b6101e7604051806040016040528060018152602001603160f81b81525081565b6102246103f436600461200a565b610940565b61040c610407366004612074565b610b5f565b005b61022461041c366004611f3f565b610d48565b6102247f10ab8743506cfd76acaa406d0788f01934bd03f14eadabf392640e43b01f976c81565b6101e7610df4565b61021061045e366004611e27565b610e03565b610210610471366004611e27565b610e89565b6103247f000000000000000000000000000000000000000000000000000000000000000081565b6102246104ab366004611f58565b60056020526000908152604090205481565b6102246104cb3660046120e6565b610e97565b6102586104de366004611e9e565b610ec2565b6102246104f1366004611f3f565b610ed3565b60606003805461050590612119565b80601f016020809104026020016040519081016040528092919081815260200182805461053190612119565b801561057e5780601f106105535761010080835404028352916020019161057e565b820191906000526020600020905b81548152906001019060200180831161056157829003601f168201915b5050505050905090565b600033610596818585610ff3565b60019150505b92915050565b6000336105b0858285611117565b6105bb858585611191565b60019150505b9392505050565b6000806105d933866000878761135f565b91509150935093915050565b60405163d15e005360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063d15e005390602401602060405180830381865afa158015610670573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610694919061214d565b905090565b60006106a833868686866115a8565b95945050505050565b600061059c6106be6105e5565b839061173c565b6000336105968185856106d88383610e97565b6106e2919061217c565b610ff3565b6001600160a01b03811660009081526020819052604081205461059c90610ed3565b6000806001600160a01b038a1661075b5760405162461bcd60e51b815260206004820152601160248201527024a72b20a624a22fa222a827a9a4aa27a960791b60448201526064015b60405180910390fd5b8442111561077b5760405162461bcd60e51b815260040161075290612194565b6001600160a01b038a166000908152600560205260408120549061079e85610d48565b7f10ab8743506cfd76acaa406d0788f01934bd03f14eadabf392640e43b01f976c8d8d8d8d8d888e60405160200161081c9897969594939291909788526001600160a01b03968716602089015294909516604087015260608601929092526080850152151560a084015260c083019190915260e08201526101000190565b604051602081830303815290604052805190602001206040516020016108439291906121c0565b60408051601f1981840301815291905280516020918201209150600190829061086e908901896121db565b604080516000815260208181018084529490945260ff9092168282015291890135606082015290880135608082015260a0016020604051602081039080840390855afa1580156108c2573d6000803e3d6000fd5b505050602060405103516001600160a01b03168c6001600160a01b0316146108fc5760405162461bcd60e51b8152600401610752906121f6565b61090782600161217c565b6001600160a01b038d1660009081526005602052604090205561092d8c8c8c8c8c61135f565b9350935050509850989650505050505050565b60006001600160a01b03891661098c5760405162461bcd60e51b815260206004820152601160248201527024a72b20a624a22fa222a827a9a4aa27a960791b6044820152606401610752565b834211156109ac5760405162461bcd60e51b815260040161075290612194565b6001600160a01b038916600090815260056020526040812054906109cf84610d48565b604080517f4dab0a5e832f103ac80c9c3e51e5742f8a24aa0a3d941fe91c64e1e3db50c74360208201526001600160a01b03808f1692820192909252908c166060820152608081018b905261ffff8a1660a082015288151560c082015260e0810184905261010081018890526101200160405160208183030381529060405280519060200120604051602001610a669291906121c0565b60408051601f19818403018152919052805160209182012091506001908290610a91908801886121db565b604080516000815260208181018084529490945260ff9092168282015291880135606082015290870135608082015260a0016020604051602081039080840390855afa158015610ae5573d6000803e3d6000fd5b505050602060405103516001600160a01b03168b6001600160a01b031614610b1f5760405162461bcd60e51b8152
1600401610752906121f6565b610b2a82600161217c565b6001600160a01b038c16600090815260056020526040902055610b508b8b8b8b8b6115a8565b50505098975050505050505050565b6001600160a01b038816610ba55760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b6044820152606401610752565b84421115610bc55760405162461bcd60e51b815260040161075290612194565b6001600160a01b03881660009081526005602052604081205490610be883610d48565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808e1692820192909252908b166060820152608081018a905260a0810184905260c0810189905260e00160405160208183030381529060405280519060200120604051602001610c6b9291906121c0565b60408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa158015610cd3573d6000803e3d6000fd5b505050602060405103516001600160a01b03168a6001600160a01b031614610d0d5760405162461bcd60e51b8152600401610752906121f6565b610d1882600161217c565b6001600160a01b038b16600090815260056020526040902055610d3c8a8a8a610ff3565b50505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610d736104f6565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b60606004805461050590612119565b60003381610e118286610e97565b905083811015610e715760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610752565b610e7e8286868403610ff3565b506001949350505050565b600033610596818585611191565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000806105d933868660008761135f565b600061059c610ee06105e5565b839061181a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691610f439190612221565b
16000604051808303816000865af19150503d8060008114610f80576040519150601f19603f3d011682016040523d82523d6000602084013e610f85565b606091505b5091509150846001600160a01b03163b60001480610fa1575081155b80610fc85750805115801590610fc8575080806020019051810190610fc6919061223d565b155b15610fec5784828260405163e7e40b5b60e01b81526004016107529392919061225a565b5050505050565b6001600160a01b0383166110555760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610752565b6001600160a01b0382166110b65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610752565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006111238484610e97565b9050600019811461118b578181101561117e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610752565b61118b8484848403610ff3565b50505050565b6001600160a01b0383166111f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610752565b6001600160a01b0382166112575760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610752565b6001600160a01b038316600090815260208190526040902054818110156112cf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610752565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061130690849061217c565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161135291815260200190565b60405180910390a361118b565b6000806001600160a01b0386166113ac5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610752565b8415806113b7575083155b6114035760405162461bcd60e51b815260206004820152601e60248201527f4f4e4c595f4f4e455f414d4f554e545f464f524d41545f414c4c4f57454400006044820152606401610752565b6001600160a01b0387166000908152602081905260408120549080806114276105e5565b905088156114675783891161143c578861143e565b835b91508389116114565761145189826118da565b611460565b61146084826118da565b9250611494565b600061147385836118da565b90508089116114825788611484565b805b935061149084836118e6565b9250505b61149e8b836118f2565b861561156557604051631a4ca37b60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590528b811660448301527f000000000000000000000000000000000000000000000000000000000000000016906369328dec906064016020604051808303816000875af115801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f919061214d565b50611599565b6115996001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168b85611a40565b50999098509650505050505050565b60006001600160a01b0385166115f45760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610752565b81156116e65761162f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016873087611aa3565b60405163e8eda9df60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820186905230604483015261ffff851660648301527f0000000000000000000000000000000000000000000000000000000000000000169063e8eda9df90608401600060405180830381600087803b1580156116c957600080fd5b505af11580156116dd573d6000803e3d6000fd5b5050505061171b565b61171b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016873087611aa3565b6000611726856106b1565b90506117328682611adb565b9695505050505050565b604080518082019091526002815261035360f41b6020820152600090826117765760405162461bcd60e51b8152
16004016107529190611df8565b506000611784600284612286565b90506b033b2e3c9fd0803ce800000061179f826000196122a8565b6117a99190612286565b84111560405180604001604052806002815260200161068760f31b815250906117e55760405162461bcd60e51b81526004016107529190611df8565b5082816117fe6b033b2e3c9fd0803ce8000000876122bf565b611808919061217c565b6118129190612286565b949350505050565b6000821580611827575081155b156118345750600061059c565b8161184c60026b033b2e3c9fd0803ce8000000612286565b611858906000196122a8565b6118629190612286565b83111560405180604001604052806002815260200161068760f31b8152509061189e5760405162461bcd60e51b81526004016107529190611df8565b506b033b2e3c9fd0803ce80000006118b7600282612286565b6118c184866122bf565b6118cb919061217c565b6105c19190612286565b505050565b60006105c1838361181a565b60006105c1838361173c565b6001600160a01b0382166119525760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610752565b6001600160a01b038216600090815260208190526040902054818110156119c65760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610752565b6001600160a01b03831660009081526020819052604081208383039055600280548492906119f59084906122a8565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b0383166024820152604481018290526118d590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611bba565b6040516001600160a01b038085166024830152831660448201526064810182905261118b9085906323b872dd60e01b90608401611a6c565b6001600160a01b038216611b315760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610752565b8060026000828254611b43919061217c565b90915550506001600160a01b03821660009081526020819052604081208054839290611b7090849061217c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611c0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c8c9092919063ffffffff16565b8051909150156118d55780806020019051810190611c2d919061223d565b6118d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610752565b60606118128484600085856001600160a01b0385163b611cee5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610752565b600080866001600160a01b03168587604051611d0a9190612221565b
160006040518083038185875af1925050503d8060008114611d47576040519150601f19603f3d011682016040523d82523d6000602084013e611d4c565b606091505b5091509150611d5c828286611d67565b979650505050505050565b60608315611d765750816105c1565b825115611d865782518084602001fd5b8160405162461bcd60e51b81526004016107529190611df8565b60005b83811015611dbb578181015183820152602001611da3565b8381111561118b5750506000910152565b60008151808452611de4816020860160208601611da0565b601f01601f19169290920160200192915050565b6020815260006105c16020830184611dcc565b80356001600160a01b0381168114611e2257600080fd5b919050565b60008060408385031215611e3a57600080fd5b611e4383611e0b565b946020939093013593505050565b600080600060608486031215611e6657600080fd5b611e6f84611e0b565b9250611e7d60208501611e0b565b9150604084013590509250925092565b8015158114611e9b57600080fd5b50565b600080600060608486031215611eb357600080fd5b611ebc84611e0b565b9250602084013591506040840135611ed381611e8d565b809150509250925092565b803561ffff81168114611e2257600080fd5b60008060008060808587031215611f0657600080fd5b611f0f85611e0b565b935060208501359250611f2460408601611ede565b91506060850135611f3481611e8d565b939692955090935050565b600060208284031215611f5157600080fd5b5035919050565b600060208284031215611f6a57600080fd5b6105c182611e0b565b600060608284031215611f8557600080fd5b50919050565b600080600080600080600080610140898b031215611fa857600080fd5b611fb189611e0b565b9750611fbf60208a01611e0b565b965060408901359550606089013594506080890135611fdd81611e8d565b935060a08901359250611ff38a60c08b01611f73565b915061012089013590509295985092959890939650565b600080600080600080600080610140898b03121561202757600080fd5b61203089611e0b565b975061203e60208a01611e0b565b96506040890135955061205360608a01611ede565b94506080890135611fdd81611e8d565b803560ff81168114611e2257600080fd5b600080600080600080600080610100898b03121561209157600080fd5b61209a89611e0b565b97506120a860208a01611e0b565b965060408901359550606089013594506120c460808a01612063565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600080604083850312156120f957600080fd5b61210283611e0b565b915061211060208401611e0b565b90509250929050565b600181811c9082168061212d57607f821691505b602082108103611f8557634e487b7160e01b600052602260045260246000fd5b60006020828403121561215f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561218f5761218f612166565b500190565b60208082526012908201527124a72b20a624a22fa2ac2824a920aa24a7a760711b604082015260600190565b61190160f01b81526002810192909252602282015260420190565b6000602082840312156121ed57600080fd5b6105c182612063565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b60008251612233818460208701611da0565b9190910192915050565b60006020828403121561224f57600080fd5b81516105c181611e8d565b6001600160a01b038416815282151560208201526060604082018190526000906106a890830184611dcc565b6000826122a357634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156122ba576122ba612166565b500390565b60008160001904831182151516156122d9576122d9612166565b50029056fea2646970667358221220f82673b01c705c83f0892d0edfc2d413139313e08ed9a084bbb07a48325aca3e64736f6c634300080d0033",d="0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806369af0ddb1161010457806395d89b41116100a2578063b9844d8d11610071578063b9844d8d1461049d578063dd62ed3e146104bd578063ead5d359146104d0578063f57d0b40146104e357600080fd5b806395d89b4114610448578063a457c2d714610450578063a9059cbb14610463578063b4dcfc771461047657600080fd5b806381abdab3116100de57806381abdab3146103e65780638a127bfd146103f95780638a3b3d6f1461040e5780638d9484151461042157600080fd5b806369af0ddb1461038a57806370a082311461039d57806378160376146103c657600080fd5b806330adf81f1161017c57806344b68c3f1161014b57806344b68c3f146102ea5780634800d97f146102fd57806351c0e0611461033c578063632105371461036357600080fd5b806330adf81f14610288578063313ce567146102af57806336a5a6d6146102c457806339509351146102d757600080fd5b806323b872dd116101b857806323b872dd14610232578063288587ce146102455780632c4e722e1461026d5780632f2cab871461027557600080fd5b806306fdde03146101df578063095ea7b3146101fd57806318160ddd14610220575b600080fd5b6101e76104f6565b6040516101f49190611df8565b60405180910390f35b61021061020b366004611e27565b610588565b60405190151581526020016101f4565b6002545b6040519081526020016101f4565b610210610240366004611e51565b6105a2565b610258610253366004611e9e565b6105c8565b604080519283526020830191909152016101f4565b6102246105e5565b610224610283366004611ef0565b
1610699565b6102247f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60065460405160ff90911681526020016101f4565b6102246102d2366004611f3f565b6106b1565b6102106102e5366004611e27565b6106c5565b6102246102f8366004611f58565b6106e7565b6103247f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101f4565b6103247f000000000000000000000000000000000000000000000000000000000000000081565b6102247f4dab0a5e832f103ac80c9c3e51e5742f8a24aa0a3d941fe91c64e1e3db50c74381565b610258610398366004611f8b565b610709565b6102246103ab366004611f58565b6001600160a01b031660009081526020819052604090205490565b6101e7604051806040016040528060018152602001603160f81b81525081565b6102246103f436600461200a565b610940565b61040c610407366004612074565b610b5f565b005b61022461041c366004611f3f565b610d48565b6102247f10ab8743506cfd76acaa406d0788f01934bd03f14eadabf392640e43b01f976c81565b6101e7610df4565b61021061045e366004611e27565b610e03565b610210610471366004611e27565b610e89565b6103247f000000000000000000000000000000000000000000000000000000000000000081565b6102246104ab366004611f58565b60056020526000908152604090205481565b6102246104cb3660046120e6565b610e97565b6102586104de366004611e9e565b610ec2565b6102246104f1366004611f3f565b610ed3565b60606003805461050590612119565b80601f016020809104026020016040519081016040528092919081815260200182805461053190612119565b801561057e5780601f106105535761010080835404028352916020019161057e565b820191906000526020600020905b81548152906001019060200180831161056157829003601f168201915b5050505050905090565b600033610596818585610ff3565b60019150505b92915050565b6000336105b0858285611117565b6105bb858585611191565b60019150505b9392505050565b6000806105d933866000878761135f565b91509150935093915050565b60405163d15e005360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063d15e005390602401602060405180830381865afa158015610670573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610694919061214d565b905090565b60006106a833868686866115a8565b95945050505050565b600061059c6106be6105e5565b839061173c565b6000336105968185856106d88383610e97565b6106e2919061217c565b610ff3565b6001600160a01b03811660009081526020819052604081205461059c90610ed3565b6000806001600160a01b038a1661075b5760405162461bcd60e51b815260206004820152601160248201527024a72b20a624a22fa222a827a9a4aa27a960791b60448201526064015b60405180910390fd5b8442111561077b5760405162461bcd60e51b815260040161075290612194565b6001600160a01b038a166000908152600560205260408120549061079e85610d48565b7f10ab8743506cfd76acaa406d0788f01934bd03f14eadabf392640e43b01f976c8d8d8d8d8d888e60405160200161081c9897969594939291909788526001600160a01b03968716602089015294909516604087015260608601929092526080850152151560a084015260c083019190915260e08201526101000190565b604051602081830303815290604052805190602001206040516020016108439291906121c0565b60408051601f1981840301815291905280516020918201209150600190829061086e908901896121db565b604080516000815260208181018084529490945260ff9092168282015291890135606082015290880135608082015260a0016020604051602081039080840390855afa1580156108c2573d6000803e3d6000fd5b505050602060405103516001600160a01b03168c6001600160a01b0316146108fc5760405162461bcd60e51b8152600401610752906121f6565b61090782600161217c565b6001600160a01b038d1660009081526005602052604090205561092d8c8c8c8c8c61135f565b9350935050509850989650505050505050565b60006001600160a01b03891661098c5760405162461bcd60e51b815260206004820152601160248201527024a72b20a624a22fa222a827a9a4aa27a960791b6044820152606401610752565b834211156109ac5760405162461bcd60e51b815260040161075290612194565b6001600160a01b038916600090815260056020526040812054906109cf84610d48565b604080517f4dab0a5e832f103ac80c9c3e51e5742f8a24aa0a3d941fe91c64e1e3db50c74360208201526001600160a01b03808f1692820192909252908c166060820152608081018b905261ffff8a1660a082015288151560c082015260e0810184905261010081018890526101200160405160208183030381529060405280519060200120604051602001610a669291906121c0565b60408051601f19818403018152919052805160209182012091506001908290610a91908801886121db565b604080516000815260208181018084529490945260ff9092168282015291880135606082015290870135608082015260a0016020604051602081039080840390855afa158015610ae5573d6000803e3d6000fd5b505050602060405103516001600160a01b03168b6001600160a01b031614610b1f5760405162461bcd60e51b8152
1600401610752906121f6565b610b2a82600161217c565b6001600160a01b038c16600090815260056020526040902055610b508b8b8b8b8b6115a8565b50505098975050505050505050565b6001600160a01b038816610ba55760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b6044820152606401610752565b84421115610bc55760405162461bcd60e51b815260040161075290612194565b6001600160a01b03881660009081526005602052604081205490610be883610d48565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808e1692820192909252908b166060820152608081018a905260a0810184905260c0810189905260e00160405160208183030381529060405280519060200120604051602001610c6b9291906121c0565b60408051601f1981840301815282825280516020918201206000845290830180835281905260ff8916918301919091526060820187905260808201869052915060019060a0016020604051602081039080840390855afa158015610cd3573d6000803e3d6000fd5b505050602060405103516001600160a01b03168a6001600160a01b031614610d0d5760405162461bcd60e51b8152600401610752906121f6565b610d1882600161217c565b6001600160a01b038b16600090815260056020526040902055610d3c8a8a8a610ff3565b50505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f610d736104f6565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b60606004805461050590612119565b60003381610e118286610e97565b905083811015610e715760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610752565b610e7e8286868403610ff3565b506001949350505050565b600033610596818585611191565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000806105d933868660008761135f565b600061059c610ee06105e5565b839061181a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b1790529151600092839290871691610f439190612221565b
16000604051808303816000865af19150503d8060008114610f80576040519150601f19603f3d011682016040523d82523d6000602084013e610f85565b606091505b5091509150846001600160a01b03163b60001480610fa1575081155b80610fc85750805115801590610fc8575080806020019051810190610fc6919061223d565b155b15610fec5784828260405163e7e40b5b60e01b81526004016107529392919061225a565b5050505050565b6001600160a01b0383166110555760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610752565b6001600160a01b0382166110b65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610752565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006111238484610e97565b9050600019811461118b578181101561117e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610752565b61118b8484848403610ff3565b50505050565b6001600160a01b0383166111f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610752565b6001600160a01b0382166112575760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610752565b6001600160a01b038316600090815260208190526040902054818110156112cf5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610752565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061130690849061217c565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161135291815260200190565b60405180910390a361118b565b6000806001600160a01b0386166113ac5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610752565b8415806113b7575083155b6114035760405162461bcd60e51b815260206004820152601e60248201527f4f4e4c595f4f4e455f414d4f554e545f464f524d41545f414c4c4f57454400006044820152606401610752565b6001600160a01b0387166000908152602081905260408120549080806114276105e5565b905088156114675783891161143c578861143e565b835b91508389116114565761145189826118da565b611460565b61146084826118da565b9250611494565b600061147385836118da565b90508089116114825788611484565b805b935061149084836118e6565b9250505b61149e8b836118f2565b861561156557604051631a4ca37b60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018590528b811660448301527f000000000000000000000000000000000000000000000000000000000000000016906369328dec906064016020604051808303816000875af115801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f919061214d565b50611599565b6115996001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168b85611a40565b50999098509650505050505050565b60006001600160a01b0385166115f45760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610752565b81156116e65761162f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016873087611aa3565b60405163e8eda9df60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820186905230604483015261ffff851660648301527f0000000000000000000000000000000000000000000000000000000000000000169063e8eda9df90608401600060405180830381600087803b1580156116c957600080fd5b505af11580156116dd573d6000803e3d6000fd5b5050505061171b565b61171b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016873087611aa3565b6000611726856106b1565b90506117328682611adb565b9695505050505050565b604080518082019091526002815261035360f41b6020820152600090826117765760405162461bcd60e51b8152
16004016107529190611df8565b506000611784600284612286565b90506b033b2e3c9fd0803ce800000061179f826000196122a8565b6117a99190612286565b84111560405180604001604052806002815260200161068760f31b815250906117e55760405162461bcd60e51b81526004016107529190611df8565b5082816117fe6b033b2e3c9fd0803ce8000000876122bf565b611808919061217c565b6118129190612286565b949350505050565b6000821580611827575081155b156118345750600061059c565b8161184c60026b033b2e3c9fd0803ce8000000612286565b611858906000196122a8565b6118629190612286565b83111560405180604001604052806002815260200161068760f31b8152509061189e5760405162461bcd60e51b81526004016107529190611df8565b506b033b2e3c9fd0803ce80000006118b7600282612286565b6118c184866122bf565b6118cb919061217c565b6105c19190612286565b505050565b60006105c1838361181a565b60006105c1838361173c565b6001600160a01b0382166119525760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610752565b6001600160a01b038216600090815260208190526040902054818110156119c65760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610752565b6001600160a01b03831660009081526020819052604081208383039055600280548492906119f59084906122a8565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b0383166024820152604481018290526118d590849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611bba565b6040516001600160a01b038085166024830152831660448201526064810182905261118b9085906323b872dd60e01b90608401611a6c565b6001600160a01b038216611b315760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610752565b8060026000828254611b43919061217c565b90915550506001600160a01b03821660009081526020819052604081208054839290611b7090849061217c565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000611c0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c8c9092919063ffffffff16565b8051909150156118d55780806020019051810190611c2d919061223d565b6118d55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610752565b60606118128484600085856001600160a01b0385163b611cee5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610752565b600080866001600160a01b03168587604051611d0a9190612221565b
160006040518083038185875af1925050503d8060008114611d47576040519150601f19603f3d011682016040523d82523d6000602084013e611d4c565b606091505b5091509150611d5c828286611d67565b979650505050505050565b60608315611d765750816105c1565b825115611d865782518084602001fd5b8160405162461bcd60e51b81526004016107529190611df8565b60005b83811015611dbb578181015183820152602001611da3565b8381111561118b5750506000910152565b60008151808452611de4816020860160208601611da0565b601f01601f19169290920160200192915050565b6020815260006105c16020830184611dcc565b80356001600160a01b0381168114611e2257600080fd5b919050565b60008060408385031215611e3a57600080fd5b611e4383611e0b565b946020939093013593505050565b600080600060608486031215611e6657600080fd5b611e6f84611e0b565b9250611e7d60208501611e0b565b9150604084013590509250925092565b8015158114611e9b57600080fd5b50565b600080600060608486031215611eb357600080fd5b611ebc84611e0b565b9250602084013591506040840135611ed381611e8d565b809150509250925092565b803561ffff81168114611e2257600080fd5b60008060008060808587031215611f0657600080fd5b611f0f85611e0b565b935060208501359250611f2460408601611ede565b91506060850135611f3481611e8d565b939692955090935050565b600060208284031215611f5157600080fd5b5035919050565b600060208284031215611f6a57600080fd5b6105c182611e0b565b600060608284031215611f8557600080fd5b50919050565b600080600080600080600080610140898b031215611fa857600080fd5b611fb189611e0b565b9750611fbf60208a01611e0b565b965060408901359550606089013594506080890135611fdd81611e8d565b935060a08901359250611ff38a60c08b01611f73565b915061012089013590509295985092959890939650565b600080600080600080600080610140898b03121561202757600080fd5b61203089611e0b565b975061203e60208a01611e0b565b96506040890135955061205360608a01611ede565b94506080890135611fdd81611e8d565b803560ff81168114611e2257600080fd5b600080600080600080600080610100898b03121561209157600080fd5b61209a89611e0b565b97506120a860208a01611e0b565b965060408901359550606089013594506120c460808a01612063565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600080604083850312156120f957600080fd5b61210283611e0b565b915061211060208401611e0b565b90509250929050565b600181811c9082168061212d57607f821691505b602082108103611f8557634e487b7160e01b600052602260045260246000fd5b60006020828403121561215f57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561218f5761218f612166565b500190565b60208082526012908201527124a72b20a624a22fa2ac2824a920aa24a7a760711b604082015260600190565b61190160f01b81526002810192909252602282015260420190565b6000602082840312156121ed57600080fd5b6105c182612063565b602080825260119082015270494e56414c49445f5349474e415455524560781b604082015260600190565b60008251612233818460208701611da0565b9190910192915050565b60006020828403121561224f57600080fd5b81516105c181611e8d565b6001600160a01b038416815282151560208201526060604082018190526000906106a890830184611dcc565b6000826122a357634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156122ba576122ba612166565b500390565b60008160001904831182151516156122d9576122d9612166565b50029056fea2646970667358221220f82673b01c705c83f0892d0edfc2d413139313e08ed9a084bbb07a48325aca3e64736f6c634300080d0033",l={author:"Aave*",details:"Wrapper token that allows to deposit tokens on the Aave protocol and receive a token which balance doesn't increase automatically, but uses an ever-increasing exchange rate - Only supporting deposits and withdrawals",errors:{"ERC20CallFailed(address,bool,bytes)":[{params:{data:"The resulting data from the call. This is error data when the call was not a success. Otherwise, this is malformed data when the call was a success.",success:"If the call to the token was a success.",target:"The target address."}}]},kind:"dev",methods:{"allowance(address,address)":{details:"See {IERC20-allowance}."},"approve(address,uint256)":{details:"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. 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 this function is overridden; 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}
1 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`."},"deposit(address,uint256,uint16,bool)":{details:"Deposits `ASSET` in the Aave protocol and mints static aTokens to msg.sender",params:{amount:"The amount of underlying `ASSET` to deposit (e.g. deposit of 100 USDC)",fromUnderlying:"bool - `true` if the msg.sender comes with underlying tokens (e.g. USDC) - `false` if the msg.sender comes already with aTokens (e.g. aUSDC)",recipient:"The address that will receive the static aTokens",referralCode:"Code used to register the integrator originating the operation, for potential rewards. 0 if the action is executed directly by the user, without any middle-man"},returns:{_0:"uint256 The amount of StaticAToken minted, static balance*"}},"dynamicBalanceOf(address)":{details:"Utility method to get the current aToken balance of an user, from his staticAToken balance",params:{account:"The address of the user"},returns:{_0:"uint256 The aToken balance*"}},"dynamicToStaticAmount(uint256)":{details:"Converts an aToken or underlying amount to the what it is denominated on the aToken as scaled balance, function of the principal and the liquidity index",params:{amount:"The amount to convert from"},returns:{_0:"uint256 The static (scaled) amount*"}},"getDomainSeparator(uint256)":{details:"Function to return a dynamic domain separator, in order to be compatible with forks changing chainId",params:{chainId:"The chain id"},returns:{_0:"bytes32 The domain separator*"}},"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."},"metaDeposit(address,address,uint256,uint16,bool,uint256,(uint8,bytes32,bytes32),uint256)":{details:"Allows to deposit on Aave via meta-transaction https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md",params:{chainId:"Passing the chainId in order to be fork-compatible",deadline:"The deadline timestamp, type(uint256).max for max deadline",depositor:"Address from which the funds to deposit are going to be pulled",fromUnderlying:"bool - `true` if the msg.sender comes with underlying tokens (e.g. USDC) - `false` if the msg.sender comes already with aTokens (e.g. aUSDC)",recipient:"Address that will receive the staticATokens, in the average case, same as the `depositor`",referralCode:"Code used to register the integrator originating the operation, for potential rewards. 0 if the action is executed directly by the user, without any middle-man",sigParams:"Signature params: v,r,s",value:"The amount to deposit"},returns:{_0:"uint256 The amount of StaticAToken minted, static balance"}},"metaWithdraw(address,address,uint256,uint256,bool,uint256,(uint8,bytes32,bytes32),uint256)":{details:"Allows to withdraw from Aave via meta-transaction https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md",params:{chainId:"Passing the chainId in order to be fork-compatible",deadline:"The deadline timestamp, type(uint256).max for max deadline",dynamicAmount:"The amount of underlying/aToken to withdraw. If > 0, `staticAmount` needs to be 0",owner:"Address owning the staticATokens",recipient:"Address that will receive the underlying withdrawn from Aave",sigParams:"Signature params: v,r,s",staticAmount:"The amount of staticAToken to withdraw. If > 0, `dynamicAmount` needs to be 0",toUnderlying:"bool - `true` for the recipient to get underlying tokens (e.g. USDC) - `false` for the recipient to get aTokens (e.g. aUSDC)"},returns:{_0:"amountToBurn: StaticATokens burnt, static balance",_1:"amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance"}},"name()":{details:"Returns the name of the token."},"permit(address,address,uint256,uint256,uint8,bytes32,bytes32,uint256)":{details:"Implements the permit function as for https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md",params:{chainId:"Passing the chainId in order to be fork-compatible",deadline:"The deadline timestamp, type(uint256).max for max deadline",owner:"The owner of the funds",r:"Signature param",s:"Signature param",spender:"The spender",v:"Signature param",value:"The amount"}},"rate()":{details:"Returns the Aave liquidity index of the underlying aToken, denominated rate here as it can be considered as an ever-increasing exchange rate",returns:{_0:"bytes32 The domain separator*"}},"staticToDynamicAmount(uint256)":{details:"Converts a static amount (scaled balance on aToken) to the aToken/underlying value, using the current liquidity index on Aave",params:{amount:"The amount to convert from"},returns:{_0:"uint256 The dynamic amount*"}},"symbol()":{details:"Returns the symbol of the token, usually a shorter version of the name."},"totalSupply()":{details:"See {IERC20-totalSupply}."},"transfer(address,uint256)":{details:"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`."},"transferFrom(address,address,uint256)":{details:"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`."},"withdraw(address,uint256,bool)":{details:"Burns `amount` of static aToken, with recipient receiving the corresponding amount of `ASSET`",params:{amount:"The amount to withdraw, in static balance of StaticAToken",recipient:"The address that will receive the amount of `ASSET` withdrawn from the Aave protocol",toUnderlying:"bool - `true` for the recipient to get underlying tokens (e.g. USDC) - `false` for the recipient to get aTokens (e.g. aUSDC)"},returns:{_0:"amountToBurn: StaticATokens burnt, static balance",_1:"amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance*"}},"withdrawDynamicAmount(address,uint256,bool)":{details:"Burns `amount` of static aToken, with recipient receiving the corresponding amount of `ASSET`",params:{amount:"The amount to withdraw, in dynamic balance of aToken/underlying asset",recipient:"The address that will receive the amount of `ASSET` withdrawn from the Aave protocol",toUnderlying:"bool - `true` for the recipient to get underlying tokens (e.g. USDC) - `false` for the recipient to get aTokens (e.g. aUSDC)"},returns:{_0:"amountToBurn: StaticATokens burnt, static balance",_1:"amountToWithdraw: underlying/aToken send to `recipient`, dynamic balance*"}}},stateVariables:{_nonces:{details:"owner => next valid nonce to submit with permit(), metaDeposit() and metaWithdraw() We choose to have sequentiality on them for each user to avoid potentially dangerous/bad UX cases"}},title:"StaticAToken",version:1},u={errors:{"ERC20CallFailed(address,bool,bytes)":[{notice:"An error used to indicate that a call to an ERC20 contract failed."}]},kind:"user",methods:{},version:1},c={storage:[{astId:15582,contract:"submodules/v2-foundry/src/external/aave/StaticAToken.sol:StaticAToken",label:"_balances",offset:0,slot:"0",type:"t_mapping(t_address,t_uint256)"},{astId:15588,contract:"submodules/v2-foundry/src/external/aave/StaticAToken.sol:StaticAToken",label:"_allowances",offset:0,slot:"1",type:"t_mapping(t_address,t_mapping(t_address,t_uint256))"},{astId:15590,contract:"submodules/v2-foundry/src/external/aave/StaticAToken.sol:StaticAToken",label:"_totalSupply",offset:0,slot:"2",type:"t_uint256"},{astId:15592,contract:"submodules/v2-foundry/src/external/aave/StaticAToken.sol:StaticAToken",label:"_name",offset:0,slot:"3",type:"t_string_storage"},{astId:15594,contract:"submodules/v2-foundry/src/external/aave/StaticAToken.sol:StaticAToken",label:"_symbol",offset:0,slot:"4",type:"t_string_storage"},{astId:36383,contract:"submodules/v2-foundry/src/external/aave/StaticAToken.sol:StaticAToken",label:"_nonces",offset:0,slot:"5",type:"t_mapping(t_address,t_uint256)"},{astId:36385,contract:"submodules/v2-foundry/src/external/aave/StaticAToken.sol:StaticAToken",label:"_decimals",offset:0,slot:"6",type:"t_uint8"}],types:{t_address:{encoding:"inplace",label:"address",numberOfBytes:"20"},"t_mapping(t_address,t_mapping(t_address,t_uint256))":{encoding:"mapping",key:"t_address",label:"mapping(address => mapping(address => uint256))",numberOfBytes:"32",value:"t_mapping(t_address,t_uint256)"},"t_mapping(t_address,t_uint256)":{encoding:"mapping",key:"t_address",label:"mapping(address => uint256)",numberOfBytes:"32",value:"t_uint256"},t_string_storage:{encoding:"bytes",label:"string",numberOfBytes:"32"},t_uint256:{encoding:"inplace",label:"uint256",numberOfBytes:"32"},t_uint8:{encoding:"inplace",label:"uint8",numberOfBytes:"1"}}}
1,b={address:e,abi:n,transactionHash:t,receipt:a,args:r,solcInputHash:s,metadata:i,bytecode:o,deployedBytecode:d,devdoc:l,userdoc:u,storageLayout:c};export{n as abi,e as address,r as args,o as bytecode,b as default,d as deployedBytecode,l as devdoc,i as metadata,a as receipt,s as solcInputHash,c as storageLayout,t as transactionHash,u as userdoc};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.