Contract 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75

Txn Hash Method
Block
From
To
Value
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3My Flash Loan Ca...249069472021-05-18 5:58:2813 hrs 25 mins ago0x8e4cf799b68f01f3a54c7154eeb1d94cc26fbce9 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.004156233753.75
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355My Flash Loan Ca...247946422021-05-12 6:38:126 days 12 hrs ago0x42138576848e839827585a3539305774d36b9602 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0099283579828.957952
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6My Flash Loan Ca...247329312021-05-08 12:11:1210 days 7 hrs ago0xd77e5da097c02f43accb8dd0608850244dbb227f IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0342638730
0x7b0fd817afe68a0fad88cc749d319143dcec5da569169fc7c3ac8d07136ebbbdMy Flash Loan Ca...247329212021-05-08 12:10:2010 days 7 hrs ago0xd77e5da097c02f43accb8dd0608850244dbb227f IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0045685164
0x315af7abb8c766a94203d6de3ae4ad9c74d6be8d6ae30f5de271850477dde313My Flash Loan Ca...247328692021-05-08 12:06:2010 days 7 hrs ago0xd77e5da097c02f43accb8dd0608850244dbb227f IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0034263873
0xfc7e342da21684a46f3ea0a71bf255d1cecc94644ccbbd559bfa983df5571714My Flash Loan Ca...243337732021-04-19 16:08:5629 days 3 hrs ago0x27f76aacf0f79dc01ea487c9d75ba81496ca5cf6 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0022842582
0x1fb0e71e878940989173e83415ad9a73171740c108d26f79242aa1f9b815f1c8My Flash Loan Ca...243336942021-04-19 16:03:3629 days 3 hrs ago0x27f76aacf0f79dc01ea487c9d75ba81496ca5cf6 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0022842582
0x9a670fcb7ca2ea3b5b05f0e4b53b3cdcab3a7df5cb8556a8eab1fc7ae301004cMy Flash Loan Ca...241443822021-04-03 14:08:2845 days 5 hrs ago0x61b08923e75ae9d8dfcc1fe6c75bddad1bcaf697 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.2284258200
0xbdf1391544ca7c16397e8b35bf4fa9a4e2ee76cba956291c0443ba62080916e3My Flash Loan Ca...241228032021-04-01 10:33:1647 days 8 hrs ago0x0a37ea07534c1fd46f8cf84ec6acc8412d649828 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0228425820
0xb9b0470e1847d850f818b633ceb43208f2aa960f288093f2c1d7a68dc0d51805My Flash Loan Ca...241227732021-04-01 10:29:1647 days 8 hrs ago0x0a37ea07534c1fd46f8cf84ec6acc8412d649828 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0004420
0x63085f552085cec72c3c5be7b64898f463066b2ef61b240efe9723af0a20724cMy Flash Loan Ca...238383682021-03-09 17:28:3270 days 1 hr ago0x7c2aee482f91666dee083bd426e97f7f6f0d9309 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0114212910
0xf7e81ee89a8a556676f06f6422c85d0db84003645da340e3ebaa8ecfb53846c8My Flash Loan Ca...237968632021-03-07 3:05:5272 days 16 hrs ago0x7ed8f8573bb809d3738709aec888782dd5c2490d IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0342638730
0xf7e9e66532797a46374de743d0be412f0c5fc8b5dfd7f43607e8b5e8a1bb61ecMy Flash Loan Ca...237867792021-03-06 12:03:0873 days 7 hrs ago0x7ed8f8573bb809d3738709aec888782dd5c2490d IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.015251364714.3
0xa0a78573029ce10c5f4e43e6333f32060c1fe4e864c475cbecad920e1b571801Execute Operatio...237867722021-03-06 12:02:2873 days 7 hrs ago0x7ed8f8573bb809d3738709aec888782dd5c2490d IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.001076518314.3
0xdebd92fb9af4dab8d9ef163802c562cdfe5d33513d07568cac901cea322ffbcdExecute Operatio...237867652021-03-06 12:01:5273 days 7 hrs ago0x7ed8f8573bb809d3738709aec888782dd5c2490d IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.002998438314.3
0x3fe8366a8f7fd8c648eb3d286e5482af73f5c2a317108c97f96fcc651fe002ccMy Flash Loan Ca...237849512021-03-06 9:18:5273 days 10 hrs ago0x7ed8f8573bb809d3738709aec888782dd5c2490d IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0114212910
0x1e886b39b053f8942ceae675a74d921d19d515f0ee6ab210ac9cc5947385b4e5My Flash Loan Ca...237844412021-03-06 8:33:1673 days 10 hrs ago0x7ed8f8573bb809d3738709aec888782dd5c2490d IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0114212910
0xb59c76d44ced40ded1b862617145b1ddc22699b8c9f1aa441ff5dd5f0c2c2e9bMy Flash Loan Ca...237844382021-03-06 8:33:0073 days 10 hrs ago0x7ed8f8573bb809d3738709aec888782dd5c2490d IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0114212910
0xba480f58a373d4772b251e3fded7fa6b5a608b3c35580090619b54dc74ac87eaMy Flash Loan Ca...236961592021-02-28 20:21:3278 days 23 hrs ago0x3ab2a9a790477a8673bbcf973f428e7c7d7388dd IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0091370328
0x691582f6424bcaf0aa942b3c777e1558e1a1d8e7ad1b0073639c56574537115eMy Flash Loan Ca...236961432021-02-28 20:20:0078 days 23 hrs ago0x3ab2a9a790477a8673bbcf973f428e7c7d7388dd IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0091370328
0xdba4883c0bfeeb3f6ff219f7d8693a83f493cda3c0367936dbf7dd72fbb704ebMy Flash Loan Ca...236961122021-02-28 20:17:1678 days 23 hrs ago0x3ab2a9a790477a8673bbcf973f428e7c7d7388dd IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0571064550
0x00822fae967517444287bf567ab72b0c6cb3617ef6bd64408dd441a861db8f05My Flash Loan Ca...236960472021-02-28 20:11:2478 days 23 hrs ago0x3ab2a9a790477a8673bbcf973f428e7c7d7388dd IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.01085022559.5
0xcd0dcc8f8d16b62e250c83fb80d60731545e3ce5c45e612d2a74e699b3483782My Flash Loan Ca...236437682021-02-25 9:37:4882 days 9 hrs ago0x7bfee0f7c69436af529990edfd0ff5b4f8746693 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0228425820
0xb8f394fbaf7f8ae160b272694b584f27d7914668cc14d10f50f35bba1495ab95My Flash Loan Ca...233391062021-02-06 12:07:12101 days 7 hrs ago0x68a478dc0bd92a918660d8f3d4b96380d9938b3c IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.0456851640
0xf41fecbc791abf3fafa6fd534b10dcfc0791e77a8d7035174f8141ed56f9c508My Flash Loan Ca...233359852021-02-06 7:28:44101 days 11 hrs ago0x90309140fe9b02d20bc2601960dfa837d6e06d19 IN  0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether0.00513958054.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x7fdb81b0b8a010dd4ffc57c3fecbf145ba8bd9470 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xad5ce863ae3e4e9394ab43d4ba0d80f419f617890 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xb7c325266ec274feb1354021d27fa3e3379d840d0 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x075a36ba8846c6b6f53644fdd3bf17e5151789dc0 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xff795577d9ac8bd7d90ee22b6c1703490b6512fd0 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x2d12186fbb9f9a8c28b3ffdd4c42920f8539d7380 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xb597cd8d3217ea6477232f9217fa70837ff667af0 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x9fe532197ad76c5a68961439604c037eb79681f0 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether
0x24cf077f5934d53b3c82defd0c74dec42ec7f5a627494a6d0c7589387454c2c3249069472021-05-18 5:58:2813 hrs 25 mins ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x9fe532197ad76c5a68961439604c037eb79681f00 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x7fdb81b0b8a010dd4ffc57c3fecbf145ba8bd9470 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xad5ce863ae3e4e9394ab43d4ba0d80f419f617890 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xb7c325266ec274feb1354021d27fa3e3379d840d0 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x075a36ba8846c6b6f53644fdd3bf17e5151789dc0 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xff795577d9ac8bd7d90ee22b6c1703490b6512fd0 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x2d12186fbb9f9a8c28b3ffdd4c42920f8539d7380 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xb597cd8d3217ea6477232f9217fa70837ff667af0 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x9fe532197ad76c5a68961439604c037eb79681f0 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e750 Ether
0xd63c4efa101f858d628c60598a4b94b307937a2cca25cd6a786a5ff85c1cc355247946422021-05-12 6:38:126 days 12 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x9fe532197ad76c5a68961439604c037eb79681f00 Ether
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6247329312021-05-08 12:11:1210 days 7 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x7fdb81b0b8a010dd4ffc57c3fecbf145ba8bd9470 Ether
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6247329312021-05-08 12:11:1210 days 7 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xad5ce863ae3e4e9394ab43d4ba0d80f419f617890 Ether
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6247329312021-05-08 12:11:1210 days 7 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xb7c325266ec274feb1354021d27fa3e3379d840d0 Ether
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6247329312021-05-08 12:11:1210 days 7 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x075a36ba8846c6b6f53644fdd3bf17e5151789dc0 Ether
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6247329312021-05-08 12:11:1210 days 7 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xff795577d9ac8bd7d90ee22b6c1703490b6512fd0 Ether
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6247329312021-05-08 12:11:1210 days 7 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0x2d12186fbb9f9a8c28b3ffdd4c42920f8539d7380 Ether
0x96dbf9b74d75ed649a152460e4419885117baeb941872d22cb48e76c2f608af6247329312021-05-08 12:11:1210 days 7 hrs ago 0x6d3ff1dc2f50456a83105ccf9ccd70e960de5e75 0xb597cd8d3217ea6477232f9217fa70837ff667af0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MyV2FlashLoan

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity Multiple files format)

File 4 of 4: MyV2FlashLoan.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;

import { FlashLoanReceiverBase } from "FlashLoanReceiverBase.sol";
import { ILendingPool, ILendingPoolAddressesProvider, IERC20 } from "Interfaces.sol";
import { SafeMath } from "Libraries.sol";

// get the relevant lendingPool address for _addressProvider
// pass in the tokens to borrow

contract MyV2FlashLoan is FlashLoanReceiverBase {
    using SafeMath for uint256;

    constructor(ILendingPoolAddressesProvider _addressProvider) FlashLoanReceiverBase(_addressProvider) public {}

    /**
        This function is called after your contract has received the flash loaned amount
     */
    function executeOperation(
        address[] calldata assets,
        uint256[] calldata amounts,
        uint256[] calldata premiums,
        address initiator,
        bytes calldata params
    )
        external
        override
        returns (bool)
    {

        //
        // This contract now has the funds requested.
        // Your logic goes here.
        //

        // At the end of your logic above, this contract owes
        // the flashloaned amounts + premiums.
        // Therefore ensure your contract has enough to repay
        // these amounts.

        // Approve the LendingPool contract allowance to *pull* the owed amount
        for (uint i = 0; i < assets.length; i++) {
            uint amountOwing = amounts[i].add(premiums[i]);
            IERC20(assets[i]).approve(address(_lendingPool), amountOwing);
        }

        return true;
    }

    function myFlashLoanCall() public {
        address receiverAddress = address(this);

        address[] memory assets = new address[](7);
        assets[0] = address(0xB597cd8D3217ea6477232F9217fa70837ff667Af); // Kovan AAVE
        assets[1] = address(0x2d12186Fbb9f9a8C28B3FfdD4c42920f8539D738); // Kovan BAT
        assets[2] = address(0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD); // Kovan DAI
        assets[3] = address(0x075A36BA8846C6B6F53644fDd3bf17E5151789DC); // Kovan UNI
        assets[4] = address(0xb7c325266ec274fEb1354021D27FA3E3379D840d); // Kovan YFI
        assets[5] = address(0xAD5ce863aE3E4E9394Ab43d4ba0D80f419F61789); // Kovan LINK
        assets[6] = address(0x7FDb81B0b8a010dd4FFc57C3fecbf145BA8Bd947); // Kovan SNX

        uint256[] memory amounts = new uint256[](7);
        amounts[0] = 1 ether;
        amounts[1] = 1 ether;
        amounts[2] = 1 ether;
        amounts[3] = 1 ether;
        amounts[4] = 1 ether;
        amounts[5] = 1 ether;
        amounts[6] = 1 ether;

        // 0 = no debt, 1 = stable, 2 = variable
        uint256[] memory modes = new uint256[](7);
        modes[0] = 0;
        modes[1] = 0;
        modes[2] = 0;
        modes[3] = 0;
        modes[4] = 0;
        modes[5] = 0;
        modes[6] = 0;

        address onBehalfOf = address(this);
        bytes memory params = "";
        uint16 referralCode = 0;

        _lendingPool.flashLoan(
            receiverAddress,
            assets,
            amounts,
            modes,
            onBehalfOf,
            params,
            referralCode
        );
    }
}

File 1 of 4: FlashLoanReceiverBase.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;

import {IFlashLoanReceiver, ILendingPoolAddressesProvider, ILendingPool, IERC20  } from "Interfaces.sol";
import { SafeERC20, SafeMath } from "Libraries.sol";

abstract contract FlashLoanReceiverBase is IFlashLoanReceiver {
  using SafeERC20 for IERC20;
  using SafeMath for uint256;

  ILendingPoolAddressesProvider internal _addressesProvider;
  ILendingPool internal _lendingPool;

  constructor(ILendingPoolAddressesProvider provider) public {
    _addressesProvider = provider;
    _lendingPool = ILendingPool(ILendingPoolAddressesProvider(provider).getLendingPool());
  }

  receive() external payable {}
}

File 2 of 4: Interfaces.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import { DataTypes } from "Libraries.sol";

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IFlashLoanReceiver {
  function executeOperation(
    address[] calldata assets,
    uint256[] calldata amounts,
    uint256[] calldata premiums,
    address initiator,
    bytes calldata params
  ) external returns (bool);
}

/**
 * @title LendingPoolAddressesProvider contract
 * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles
 * - Acting also as factory of proxies and admin of those, so with right to change its implementations
 * - Owned by the Aave Governance
 * @author Aave
 **/
interface ILendingPoolAddressesProvider {
  event LendingPoolUpdated(address indexed newAddress);
  event ConfigurationAdminUpdated(address indexed newAddress);
  event EmergencyAdminUpdated(address indexed newAddress);
  event LendingPoolConfiguratorUpdated(address indexed newAddress);
  event LendingPoolCollateralManagerUpdated(address indexed newAddress);
  event PriceOracleUpdated(address indexed newAddress);
  event LendingRateOracleUpdated(address indexed newAddress);
  event ProxyCreated(bytes32 id, address indexed newAddress);
  event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy);

  function setAddress(bytes32 id, address newAddress) external;

  function setAddressAsProxy(bytes32 id, address impl) external;

  function getAddress(bytes32 id) external view returns (address);

  function getLendingPool() external view returns (address);

  function setLendingPoolImpl(address pool) external;

  function getLendingPoolConfigurator() external view returns (address);

  function setLendingPoolConfiguratorImpl(address configurator) external;

  function getLendingPoolCollateralManager() external view returns (address);

  function setLendingPoolCollateralManager(address manager) external;

  function getPoolAdmin() external view returns (address);

  function setPoolAdmin(address admin) external;

  function getEmergencyAdmin() external view returns (address);

  function setEmergencyAdmin(address admin) external;

  function getPriceOracle() external view returns (address);

  function setPriceOracle(address priceOracle) external;

  function getLendingRateOracle() external view returns (address);

  function setLendingRateOracle(address lendingRateOracle) external;
}

interface ILendingPool {
  /**
   * @dev Emitted on deposit()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address initiating the deposit
   * @param onBehalfOf The beneficiary of the deposit, receiving the aTokens
   * @param amount The amount deposited
   * @param referral The referral code used
   **/
  event Deposit(
    address indexed reserve,
    address user,
    address indexed onBehalfOf,
    uint256 amount,
    uint16 indexed referral
  );

  /**
   * @dev Emitted on withdraw()
   * @param reserve The address of the underlyng asset being withdrawn
   * @param user The address initiating the withdrawal, owner of aTokens
   * @param to Address that will receive the underlying
   * @param amount The amount to be withdrawn
   **/
  event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount);

  /**
   * @dev Emitted on borrow() and flashLoan() when debt needs to be opened
   * @param reserve The address of the underlying asset being borrowed
   * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just
   * initiator of the transaction on flashLoan()
   * @param onBehalfOf The address that will be getting the debt
   * @param amount The amount borrowed out
   * @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable
   * @param borrowRate The numeric rate at which the user has borrowed
   * @param referral The referral code used
   **/
  event Borrow(
    address indexed reserve,
    address user,
    address indexed onBehalfOf,
    uint256 amount,
    uint256 borrowRateMode,
    uint256 borrowRate,
    uint16 indexed referral
  );

  /**
   * @dev Emitted on repay()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The beneficiary of the repayment, getting his debt reduced
   * @param repayer The address of the user initiating the repay(), providing the funds
   * @param amount The amount repaid
   **/
  event Repay(
    address indexed reserve,
    address indexed user,
    address indexed repayer,
    uint256 amount
  );

  /**
   * @dev Emitted on swapBorrowRateMode()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user swapping his rate mode
   * @param rateMode The rate mode that the user wants to swap to
   **/
  event Swap(address indexed reserve, address indexed user, uint256 rateMode);

  /**
   * @dev Emitted on setUserUseReserveAsCollateral()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user enabling the usage as collateral
   **/
  event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user);

  /**
   * @dev Emitted on setUserUseReserveAsCollateral()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user enabling the usage as collateral
   **/
  event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user);

  /**
   * @dev Emitted on rebalanceStableBorrowRate()
   * @param reserve The address of the underlying asset of the reserve
   * @param user The address of the user for which the rebalance has been executed
   **/
  event RebalanceStableBorrowRate(address indexed reserve, address indexed user);

  /**
   * @dev Emitted on flashLoan()
   * @param target The address of the flash loan receiver contract
   * @param initiator The address initiating the flash loan
   * @param asset The address of the asset being flash borrowed
   * @param amount The amount flash borrowed
   * @param premium The fee flash borrowed
   * @param referralCode The referral code used
   **/
  event FlashLoan(
    address indexed target,
    address indexed initiator,
    address indexed asset,
    uint256 amount,
    uint256 premium,
    uint16 referralCode
  );

  /**
   * @dev Emitted when the pause is triggered.
   */
  event Paused();

  /**
   * @dev Emitted when the pause is lifted.
   */
  event Unpaused();

  /**
   * @dev Emitted when a borrower is liquidated. This event is emitted by the LendingPool via
   * LendingPoolCollateral manager using a DELEGATECALL
   * This allows to have the events in the generated ABI for LendingPool.
   * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation
   * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation
   * @param user The address of the borrower getting liquidated
   * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover
   * @param liquidatedCollateralAmount The amount of collateral received by the liiquidator
   * @param liquidator The address of the liquidator
   * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants
   * to receive the underlying collateral asset directly
   **/
  event LiquidationCall(
    address indexed collateralAsset,
    address indexed debtAsset,
    address indexed user,
    uint256 debtToCover,
    uint256 liquidatedCollateralAmount,
    address liquidator,
    bool receiveAToken
  );

  /**
   * @dev Emitted when the state of a reserve is updated. NOTE: This event is actually declared
   * in the ReserveLogic library and emitted in the updateInterestRates() function. Since the function is internal,
   * the event will actually be fired by the LendingPool contract. The event is therefore replicated here so it
   * gets added to the LendingPool ABI
   * @param reserve The address of the underlying asset of the reserve
   * @param liquidityRate The new liquidity rate
   * @param stableBorrowRate The new stable borrow rate
   * @param variableBorrowRate The new variable borrow rate
   * @param liquidityIndex The new liquidity index
   * @param variableBorrowIndex The new variable borrow index
   **/
  event ReserveDataUpdated(
    address indexed reserve,
    uint256 liquidityRate,
    uint256 stableBorrowRate,
    uint256 variableBorrowRate,
    uint256 liquidityIndex,
    uint256 variableBorrowIndex
  );

  /**
   * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.
   * - E.g. User deposits 100 USDC and gets in return 100 aUSDC
   * @param asset The address of the underlying asset to deposit
   * @param amount The amount to be deposited
   * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user
   *   wants to receive them on his own wallet, or a different address if the beneficiary of aTokens
   *   is a different wallet
   * @param 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
   **/
  function deposit(
    address asset,
    uint256 amount,
    address onBehalfOf,
    uint16 referralCode
  ) external;

  /**
   * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned
   * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC
   * @param asset The address of the underlying asset to withdraw
   * @param amount The underlying amount to be withdrawn
   *   - Send the value type(uint256).max in order to withdraw the whole aToken balance
   * @param to Address that will receive the underlying, same as msg.sender if the user
   *   wants to receive it on his own wallet, or a different address if the beneficiary is a
   *   different wallet
   **/
  function withdraw(
    address asset,
    uint256 amount,
    address to
  ) external;

  /**
   * @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower
   * already deposited enough collateral, or he was given enough allowance by a credit delegator on the
   * corresponding debt token (StableDebtToken or VariableDebtToken)
   * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet
   *   and 100 stable/variable debt tokens, depending on the `interestRateMode`
   * @param asset The address of the underlying asset to borrow
   * @param amount The amount to be borrowed
   * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable
   * @param 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
   * @param onBehalfOf Address of the user who will receive the debt. Should be the address of the borrower itself
   * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator
   * if he has been given credit delegation allowance
   **/
  function borrow(
    address asset,
    uint256 amount,
    uint256 interestRateMode,
    uint16 referralCode,
    address onBehalfOf
  ) external;

  /**
   * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned
   * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address
   * @param asset The address of the borrowed underlying asset previously borrowed
   * @param amount The amount to repay
   * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode`
   * @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable
   * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the
   * user calling the function if he wants to reduce/remove his own debt, or the address of any other
   * other borrower whose debt should be removed
   **/
  function repay(
    address asset,
    uint256 amount,
    uint256 rateMode,
    address onBehalfOf
  ) external;

  /**
   * @dev Allows a borrower to swap his debt between stable and variable mode, or viceversa
   * @param asset The address of the underlying asset borrowed
   * @param rateMode The rate mode that the user wants to swap to
   **/
  function swapBorrowRateMode(address asset, uint256 rateMode) external;

  /**
   * @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve.
   * - Users can be rebalanced if the following conditions are satisfied:
   *     1. Usage ratio is above 95%
   *     2. the current deposit APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too much has been
   *        borrowed at a stable rate and depositors are not earning enough
   * @param asset The address of the underlying asset borrowed
   * @param user The address of the user to be rebalanced
   **/
  function rebalanceStableBorrowRate(address asset, address user) external;

  /**
   * @dev Allows depositors to enable/disable a specific deposited asset as collateral
   * @param asset The address of the underlying asset deposited
   * @param useAsCollateral `true` if the user wants to use the deposit as collateral, `false` otherwise
   **/
  function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external;

  /**
   * @dev Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1
   * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives
   *   a proportionally amount of the `collateralAsset` plus a bonus to cover market risk
   * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation
   * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation
   * @param user The address of the borrower getting liquidated
   * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover
   * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants
   * to receive the underlying collateral asset directly
   **/
  function liquidationCall(
    address collateralAsset,
    address debtAsset,
    address user,
    uint256 debtToCover,
    bool receiveAToken
  ) external;

  /**
   * @dev Allows smartcontracts to access the liquidity of the pool within one transaction,
   * as long as the amount taken plus a fee is returned.
   * IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration.
   * For further details please visit https://developers.aave.com
   * @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver interface
   * @param assets The addresses of the assets being flash-borrowed
   * @param amounts The amounts amounts being flash-borrowed
   * @param modes Types of the debt to open if the flash loan is not returned:
   *   0 -> Don't open any debt, just revert if funds can't be transferred from the receiver
   *   1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address
   *   2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address
   * @param onBehalfOf The address  that will receive the debt in the case of using on `modes` 1 or 2
   * @param params Variadic packed params to pass to the receiver as extra information
   * @param 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
   **/
  function flashLoan(
    address receiverAddress,
    address[] calldata assets,
    uint256[] calldata amounts,
    uint256[] calldata modes,
    address onBehalfOf,
    bytes calldata params,
    uint16 referralCode
  ) external;

  /**
   * @dev Returns the user account data across all the reserves
   * @param user The address of the user
   * @return totalCollateralETH the total collateral in ETH of the user
   * @return totalDebtETH the total debt in ETH of the user
   * @return availableBorrowsETH the borrowing power left of the user
   * @return currentLiquidationThreshold the liquidation threshold of the user
   * @return ltv the loan to value of the user
   * @return healthFactor the current health factor of the user
   **/
  function getUserAccountData(address user)
    external
    view
    returns (
      uint256 totalCollateralETH,
      uint256 totalDebtETH,
      uint256 availableBorrowsETH,
      uint256 currentLiquidationThreshold,
      uint256 ltv,
      uint256 healthFactor
    );

  function initReserve(
    address reserve,
    address aTokenAddress,
    address stableDebtAddress,
    address variableDebtAddress,
    address interestRateStrategyAddress
  ) external;

  function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress)
    external;

  function setConfiguration(address reserve, uint256 configuration) external;

  /**
   * @dev Returns the configuration of the reserve
   * @param asset The address of the underlying asset of the reserve
   * @return The configuration of the reserve
   **/
  function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory);

  /**
   * @dev Returns the configuration of the user across all the reserves
   * @param user The user address
   * @return The configuration of the user
   **/
  function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory);

  /**
   * @dev Returns the normalized income normalized income of the reserve
   * @param asset The address of the underlying asset of the reserve
   * @return The reserve's normalized income
   */
  function getReserveNormalizedIncome(address asset) external view returns (uint256);

  /**
   * @dev Returns the normalized variable debt per unit of asset
   * @param asset The address of the underlying asset of the reserve
   * @return The reserve normalized variable debt
   */
  function getReserveNormalizedVariableDebt(address asset) external view returns (uint256);

  /**
   * @dev Returns the state and configuration of the reserve
   * @param asset The address of the underlying asset of the reserve
   * @return The state of the reserve
   **/
  function getReserveData(address asset) external view returns (DataTypes.ReserveData memory);

  function finalizeTransfer(
    address asset,
    address from,
    address to,
    uint256 amount,
    uint256 balanceFromAfter,
    uint256 balanceToBefore
  ) external;

  function getReservesList() external view returns (address[] memory);

  function getAddressesProvider() external view returns (ILendingPoolAddressesProvider);

  function setPause(bool val) external;

  function paused() external view returns (bool);
}

File 3 of 4: Libraries.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import { IERC20 } from "Interfaces.sol";

library SafeMath {
  /**
   * @dev Returns the addition of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, 'SafeMath: addition overflow');

    return c;
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return sub(a, b, 'SafeMath: subtraction overflow');
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, 'SafeMath: multiplication overflow');

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, 'SafeMath: division by zero');
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return mod(a, b, 'SafeMath: modulo by zero');
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message when dividing by zero.
   *
   * Counterpart to Solidity's `%` operator. This function uses a `revert`
   * opcode (which leaves remaining gas untouched) while Solidity uses an
   * invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

library Address {
  /**
   * @dev Returns true if `account` is a contract.
   *
   * [IMPORTANT]
   * ====
   * It is unsafe to assume that an address for which this function returns
   * false is an externally-owned account (EOA) and not a contract.
   *
   * Among others, `isContract` will return false for the following
   * types of addresses:
   *
   *  - an externally-owned account
   *  - a contract in construction
   *  - an address where a contract will be created
   *  - an address where a contract lived, but was destroyed
   * ====
   */
  function isContract(address account) internal view returns (bool) {
    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      codehash := extcodehash(account)
    }
    return (codehash != accountHash && codehash != 0x0);
  }

  /**
   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
   * `recipient`, forwarding all available gas and reverting on errors.
   *
   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
   * of certain opcodes, possibly making contracts go over the 2300 gas limit
   * imposed by `transfer`, making them unable to receive funds via
   * `transfer`. {sendValue} removes this limitation.
   *
   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
   *
   * IMPORTANT: because control is transferred to `recipient`, care must be
   * taken to not create reentrancy vulnerabilities. Consider using
   * {ReentrancyGuard} or the
   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
   */
  function sendValue(address payable recipient, uint256 amount) internal {
    require(address(this).balance >= amount, 'Address: insufficient balance');

    // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
    (bool success, ) = recipient.call{value: amount}('');
    require(success, 'Address: unable to send value, recipient may have reverted');
  }
}



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  using SafeMath for uint256;
  using Address for address;

  function safeTransfer(
    IERC20 token,
    address to,
    uint256 value
  ) internal {
    callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
  }

  function safeTransferFrom(
    IERC20 token,
    address from,
    address to,
    uint256 value
  ) internal {
    callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
  }

  function safeApprove(
    IERC20 token,
    address spender,
    uint256 value
  ) internal {
    require(
      (value == 0) || (token.allowance(address(this), spender) == 0),
      'SafeERC20: approve from non-zero to non-zero allowance'
    );
    callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
  }

  function callOptionalReturn(IERC20 token, bytes memory data) private {
    require(address(token).isContract(), 'SafeERC20: call to non-contract');

    // solhint-disable-next-line avoid-low-level-calls
    (bool success, bytes memory returndata) = address(token).call(data);
    require(success, 'SafeERC20: low-level call failed');

    if (returndata.length > 0) {
      // Return data is optional
      // solhint-disable-next-line max-line-length
      require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed');
    }
  }
}

library DataTypes {
  // refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.
  struct ReserveData {
    //stores the reserve configuration
    ReserveConfigurationMap configuration;
    //the liquidity index. Expressed in ray
    uint128 liquidityIndex;
    //variable borrow index. Expressed in ray
    uint128 variableBorrowIndex;
    //the current supply rate. Expressed in ray
    uint128 currentLiquidityRate;
    //the current variable borrow rate. Expressed in ray
    uint128 currentVariableBorrowRate;
    //the current stable borrow rate. Expressed in ray
    uint128 currentStableBorrowRate;
    uint40 lastUpdateTimestamp;
    //tokens addresses
    address aTokenAddress;
    address stableDebtTokenAddress;
    address variableDebtTokenAddress;
    //address of the interest rate strategy
    address interestRateStrategyAddress;
    //the id of the reserve. Represents the position in the list of the active reserves
    uint8 id;
  }

  struct ReserveConfigurationMap {
    //bit 0-15: LTV
    //bit 16-31: Liq. threshold
    //bit 32-47: Liq. bonus
    //bit 48-55: Decimals
    //bit 56: Reserve is active
    //bit 57: reserve is frozen
    //bit 58: borrowing is enabled
    //bit 59: stable rate borrowing enabled
    //bit 60-63: reserved
    //bit 64-79: reserve factor
    uint256 data;
  }

  struct UserConfigurationMap {
    uint256 data;
  }

  enum InterestRateMode {NONE, STABLE, VARIABLE}
}

Contract ABI

[{"inputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"_addressProvider","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"myFlashLoanCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50604051610cd6380380610cd68339818101604052602081101561003357600080fd5b810190808051906020019092919050505080806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100cb57600080fd5b505afa1580156100df573d6000803e3d6000fd5b505050506040513d60208110156100f557600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610b7f806101576000396000f3fe60806040526004361061002d5760003560e01c8063920f5c8414610039578063f03b5329146101f457610034565b3661003457005b600080fd5b34801561004557600080fd5b506101dc600480360360a081101561005c57600080fd5b810190808035906020019064010000000081111561007957600080fd5b82018360208201111561008b57600080fd5b803590602001918460208302840111640100000000831117156100ad57600080fd5b9091929391929390803590602001906401000000008111156100ce57600080fd5b8201836020820111156100e057600080fd5b8035906020019184602083028401116401000000008311171561010257600080fd5b90919293919293908035906020019064010000000081111561012357600080fd5b82018360208201111561013557600080fd5b8035906020019184602083028401116401000000008311171561015757600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561019857600080fd5b8201836020820111156101aa57600080fd5b803590602001918460018302840111640100000000831117156101cc57600080fd5b909192939192939050505061020b565b60405180821515815260200191505060405180910390f35b34801561020057600080fd5b50610209610370565b005b600080600090505b8a8a905081101561035e57600061025788888481811061022f57fe5b905060200201358b8b8581811061024257fe5b90506020020135610ac190919063ffffffff16565b90508b8b8381811061026557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561031457600080fd5b505af1158015610328573d6000803e3d6000fd5b505050506040513d602081101561033e57600080fd5b810190808051906020019092919050505050508080600101915050610213565b50600190509998505050505050505050565b60003090506060600767ffffffffffffffff8111801561038f57600080fd5b506040519080825280602002602001820160405280156103be5781602001602082028036833780820191505090505b50905073b597cd8d3217ea6477232f9217fa70837ff667af816000815181106103e357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050732d12186fbb9f9a8c28b3ffdd4c42920f8539d7388160018151811061043f57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073ff795577d9ac8bd7d90ee22b6c1703490b6512fd8160028151811061049b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073075a36ba8846c6b6f53644fdd3bf17e5151789dc816003815181106104f757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073b7c325266ec274feb1354021d27fa3e3379d840d8160048151811061055357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073ad5ce863ae3e4e9394ab43d4ba0d80f419f61789816005815181106105af57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737fdb81b0b8a010dd4ffc57c3fecbf145ba8bd9478160068151811061060b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506060600767ffffffffffffffff8111801561065f57600080fd5b5060405190808252806020026020018201604052801561068e5781602001602082028036833780820191505090505b509050670de0b6b3a7640000816000815181106106a757fe5b602002602001018181525050670de0b6b3a7640000816001815181106106c957fe5b602002602001018181525050670de0b6b3a7640000816002815181106106eb57fe5b602002602001018181525050670de0b6b3a76400008160038151811061070d57fe5b602002602001018181525050670de0b6b3a76400008160048151811061072f57fe5b602002602001018181525050670de0b6b3a76400008160058151811061075157fe5b602002602001018181525050670de0b6b3a76400008160068151811061077357fe5b6020026020010181815250506060600767ffffffffffffffff8111801561079957600080fd5b506040519080825280602002602001820160405280156107c85781602001602082028036833780820191505090505b5090506000816000815181106107da57fe5b6020026020010181815250506000816001815181106107f557fe5b60200260200101818152505060008160028151811061081057fe5b60200260200101818152505060008160038151811061082b57fe5b60200260200101818152505060008160048151811061084657fe5b60200260200101818152505060008160058151811061086157fe5b60200260200101818152505060008160068151811061087c57fe5b602002602001018181525050600030905060606040518060200160405280600081525090506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ab9c4b5d888888888888886040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001806020018773ffffffffffffffffffffffffffffffffffffffff168152602001806020018661ffff16815260200185810385528b818151815260200191508051906020019060200280838360005b8381101561098857808201518184015260208101905061096d565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b838110156109ca5780820151818401526020810190506109af565b50505050905001858103835289818151815260200191508051906020019060200280838360005b83811015610a0c5780820151818401526020810190506109f1565b50505050905001858103825287818151815260200191508051906020019080838360005b83811015610a4b578082015181840152602081019050610a30565b50505050905090810190601f168015610a785780820380516001836020036101000a031916815260200191505b509b505050505050505050505050600060405180830381600087803b158015610aa057600080fd5b505af1158015610ab4573d6000803e3d6000fd5b5050505050505050505050565b600080828401905083811015610b3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b809150509291505056fea2646970667358221220a867f9c53b914179a6249424fb4b8629d9f513d60ce3b5175705ccc47d6a3a1b64736f6c634300060c0033000000000000000000000000652b2937efd0b5bea1c8d54293fc1289672afc6b

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000652b2937efd0b5bea1c8d54293fc1289672afc6b

-----Decoded View---------------
Arg [0] : _addressProvider (address): 0x652b2937efd0b5bea1c8d54293fc1289672afc6b

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000652b2937efd0b5bea1c8d54293fc1289672afc6b


Deployed ByteCode Sourcemap

352:2768:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;659:873;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1538:1580;;;;;;;;;;;;;:::i;:::-;;659:873;908:4;1322:6;1331:1;1322:10;;1317:187;1338:6;;:13;;1334:1;:17;1317:187;;;1372:16;1391:27;1406:8;;1415:1;1406:11;;;;;;;;;;;;;1391:7;;1399:1;1391:10;;;;;;;;;;;;;:14;;:27;;;;:::i;:::-;1372:46;;1439:6;;1446:1;1439:9;;;;;;;;;;;;;;;1432:25;;;1466:12;;;;;;;;;;;1481:11;1432:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1317:187;1353:3;;;;;;;1317:187;;;;1521:4;1514:11;;659:873;;;;;;;;;;;:::o;1538:1580::-;1582:23;1616:4;1582:39;;1632:23;1672:1;1658:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:42;;1704;1684:6;1691:1;1684:9;;;;;;;;;;;;;:63;;;;;;;;;;;1791:42;1771:6;1778:1;1771:9;;;;;;;;;;;;;:63;;;;;;;;;;;1877:42;1857:6;1864:1;1857:9;;;;;;;;;;;;;:63;;;;;;;;;;;1963:42;1943:6;1950:1;1943:9;;;;;;;;;;;;;:63;;;;;;;;;;;2049:42;2029:6;2036:1;2029:9;;;;;;;;;;;;;:63;;;;;;;;;;;2135:42;2115:6;2122:1;2115:9;;;;;;;;;;;;;:63;;;;;;;;;;;2222:42;2202:6;2209:1;2202:9;;;;;;;;;;;;;:63;;;;;;;;;;;2289:24;2330:1;2316:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2289:43;;2355:7;2342;2350:1;2342:10;;;;;;;;;;;;;:20;;;;;2385:7;2372;2380:1;2372:10;;;;;;;;;;;;;:20;;;;;2415:7;2402;2410:1;2402:10;;;;;;;;;;;;;:20;;;;;2445:7;2432;2440:1;2432:10;;;;;;;;;;;;;:20;;;;;2475:7;2462;2470:1;2462:10;;;;;;;;;;;;;:20;;;;;2505:7;2492;2500:1;2492:10;;;;;;;;;;;;;:20;;;;;2535:7;2522;2530:1;2522:10;;;;;;;;;;;;;:20;;;;;2602:22;2641:1;2627:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2602:41;;2664:1;2653:5;2659:1;2653:8;;;;;;;;;;;;;:12;;;;;2686:1;2675:5;2681:1;2675:8;;;;;;;;;;;;;:12;;;;;2708:1;2697:5;2703:1;2697:8;;;;;;;;;;;;;:12;;;;;2730:1;2719:5;2725:1;2719:8;;;;;;;;;;;;;:12;;;;;2752:1;2741:5;2747:1;2741:8;;;;;;;;;;;;;:12;;;;;2774:1;2763:5;2769:1;2763:8;;;;;;;;;;;;;:12;;;;;2796:1;2785:5;2791:1;2785:8;;;;;;;;;;;;;:12;;;;;2808:18;2837:4;2808:34;;2852:19;:24;;;;;;;;;;;;;;2886:19;2920:12;;;;;;;;;;;:22;;;2956:15;2985:6;3005:7;3026:5;3045:10;3069:6;3089:12;2920:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:1580;;;;;;;:::o;363:162:2:-;421:7;436:9;452:1;448;:5;436:17;;472:1;467;:6;;459:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;519:1;512:8;;;363:162;;;;:::o

Swarm Source

ipfs://a867f9c53b914179a6249424fb4b8629d9f513d60ce3b5175705ccc47d6a3a1b
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading