PageSourceSearch

https://mellow-finance-frontend.vercel.app/assets/StaticAToken_WETH.c1b88240.js

js mellow-finance-frontend.vercel.app collected 2026-10-03 05:49:19 UTC 185,961 bytes, 1 lines download raw bytes

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.