func (_Haave *HaaveTransactor) FlashLoan(opts *bind.TransactOpts, _reserve common.Address, _amount *big.Int, _params []byte) (*types.Transaction, error) {
	return _Haave.contract.Transact(opts, "flashLoan", _reserve, _amount, _params)
}
FlashLoan is a paid mutator transaction binding the contract method 0xe0232b42.

Solidity: function flashLoan(address _reserve, uint256 _amount, bytes _params) payable returns()
package haave
import (
	"math/big"
	"strings"
	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)
var (
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
)
const HaaveABI = "[{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_reserve\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_reserve\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_params\",\"type\":\"bytes\"}],\"name\":\"executeOperation\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_reserve\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_params\",\"type\":\"bytes\"}],\"name\":\"flashLoan\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_aToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"
type Haave struct {
	HaaveCaller      
	HaaveTransactor  
	HaaveFilterer    
}
type HaaveCaller struct {
	contract *bind.BoundContract  
}
type HaaveTransactor struct {
	contract *bind.BoundContract  
}
type HaaveFilterer struct {
	contract *bind.BoundContract  
}
type HaaveSession struct {
	Contract     *Haave             
	CallOpts     bind.CallOpts      
	TransactOpts bind.TransactOpts  
}
type HaaveCallerSession struct {
	Contract *HaaveCaller   
	CallOpts bind.CallOpts  
}
type HaaveTransactorSession struct {
	Contract     *HaaveTransactor   
	TransactOpts bind.TransactOpts  
}
type HaaveRaw struct {
	Contract *Haave  
}
type HaaveCallerRaw struct {
	Contract *HaaveCaller  
}
type HaaveTransactorRaw struct {
	Contract *HaaveTransactor  
}
func NewHaave(address common.Address, backend bind.ContractBackend) (*Haave, error) {
	contract, err := bindHaave(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &Haave{HaaveCaller: HaaveCaller{contract: contract}, HaaveTransactor: HaaveTransactor{contract: contract}, HaaveFilterer: HaaveFilterer{contract: contract}}, nil
}
func NewHaaveCaller(address common.Address, caller bind.ContractCaller) (*HaaveCaller, error) {
	contract, err := bindHaave(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &HaaveCaller{contract: contract}, nil
}
func NewHaaveTransactor(address common.Address, transactor bind.ContractTransactor) (*HaaveTransactor, error) {
	contract, err := bindHaave(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &HaaveTransactor{contract: contract}, nil
}
func NewHaaveFilterer(address common.Address, filterer bind.ContractFilterer) (*HaaveFilterer, error) {
	contract, err := bindHaave(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &HaaveFilterer{contract: contract}, nil
}
func bindHaave(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(HaaveABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}
func (_Haave *HaaveRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Haave.Contract.HaaveCaller.contract.Call(opts, result, method, params...)
}
func (_Haave *HaaveRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Haave.Contract.HaaveTransactor.contract.Transfer(opts)
}
func (_Haave *HaaveRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Haave.Contract.HaaveTransactor.contract.Transact(opts, method, params...)
}
func (_Haave *HaaveCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Haave.Contract.contract.Call(opts, result, method, params...)
}
func (_Haave *HaaveTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Haave.Contract.contract.Transfer(opts)
}
func (_Haave *HaaveTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Haave.Contract.contract.Transact(opts, method, params...)
}
func (_Haave *HaaveCaller) Tokens(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
	var out []interface{}
	err := _Haave.contract.Call(opts, &out, "tokens", arg0)
	if err != nil {
		return *new(common.Address), err
	}
	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
	return out0, err
}
func (_Haave *HaaveSession) Tokens(arg0 *big.Int) (common.Address, error) {
	return _Haave.Contract.Tokens(&_Haave.CallOpts, arg0)
}
func (_Haave *HaaveCallerSession) Tokens(arg0 *big.Int) (common.Address, error) {
	return _Haave.Contract.Tokens(&_Haave.CallOpts, arg0)
}
func (_Haave *HaaveTransactor) Deposit(opts *bind.TransactOpts, _reserve common.Address, _amount *big.Int) (*types.Transaction, error) {
	return _Haave.contract.Transact(opts, "deposit", _reserve, _amount)
}
func (_Haave *HaaveSession) Deposit(_reserve common.Address, _amount *big.Int) (*types.Transaction, error) {
	return _Haave.Contract.Deposit(&_Haave.TransactOpts, _reserve, _amount)
}
func (_Haave *HaaveTransactorSession) Deposit(_reserve common.Address, _amount *big.Int) (*types.Transaction, error) {
	return _Haave.Contract.Deposit(&_Haave.TransactOpts, _reserve, _amount)
}
func (_Haave *HaaveTransactor) ExecuteOperation(opts *bind.TransactOpts, _reserve common.Address, _amount *big.Int, _fee *big.Int, _params []byte) (*types.Transaction, error) {
	return _Haave.contract.Transact(opts, "executeOperation", _reserve, _amount, _fee, _params)
}
func (_Haave *HaaveSession) ExecuteOperation(_reserve common.Address, _amount *big.Int, _fee *big.Int, _params []byte) (*types.Transaction, error) {
	return _Haave.Contract.ExecuteOperation(&_Haave.TransactOpts, _reserve, _amount, _fee, _params)
}
func (_Haave *HaaveTransactorSession) ExecuteOperation(_reserve common.Address, _amount *big.Int, _fee *big.Int, _params []byte) (*types.Transaction, error) {
	return _Haave.Contract.ExecuteOperation(&_Haave.TransactOpts, _reserve, _amount, _fee, _params)
}