Flashzero
Documentation
FlashZero is a zero-fee ERC-3156 flash loan provider on Avalanche C-Chain. This page is focused on integration details for builders shipping smart contract workflows.
Overview
- FlashZero implements the ERC-3156 flash lender interface.
- Loans are borrowed and repaid within the same transaction.
- The protocol fee is always zero.
- Only supported tokens can be borrowed.
- Available liquidity is dynamic and should be queried on-chain.
Deployment / Network
Supported Tokens
Available balances are dynamic. Query getAvailableTokens() on-chain for current liquidity.
TokenAddress
USDC—
BTC.b—
WAVAX—
How It Works
- Borrower implements
IERC3156FlashBorrower. - Caller invokes
flashLoan(...)on FlashZero. - Lender transfers tokens and calls
onFlashLoan(...). - Borrower executes its custom logic.
- Borrower approves repayment to the lender.
- Lender pulls funds back within the same transaction.
Quickstart / Minimal Solidity Example
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IERC20 {
function approve(address spender, uint256 amount) external returns (bool);
}
interface IERC3156FlashBorrower {
function onFlashLoan(
address initiator,
address token,
uint256 amount,
uint256 fee,
bytes calldata data
) external returns (bytes32);
}
interface IERC3156FlashLender {
function flashLoan(
IERC3156FlashBorrower receiver,
address token,
uint256 amount,
bytes calldata data
) external returns (bool);
}
contract ExampleBorrower is IERC3156FlashBorrower {
IERC3156FlashLender public immutable lender;
bytes32 public constant CALLBACK_SUCCESS =
keccak256("ERC3156FlashBorrower.onFlashLoan");
constructor(address lender_) {
lender = IERC3156FlashLender(lender_);
}
function executeFlashLoan(address token, uint256 amount, bytes calldata data) external {
lender.flashLoan(this, token, amount, data);
}
function onFlashLoan(
address initiator,
address token,
uint256 amount,
uint256 fee,
bytes calldata /* data */
) external override returns (bytes32) {
require(msg.sender == address(lender), "invalid lender");
require(initiator == address(this), "invalid initiator");
// your custom logic here (arbitrage, liquidation, refinancing, etc.)
IERC20(token).approve(address(lender), amount + fee);
return CALLBACK_SUCCESS;
}
}Read-only Integration Example
maxFlashLoan(token): max borrowable amount (returns 0 if unsupported).flashFee(token, amount): fee quote (reverts if unsupported).getAvailableTokens(): list of supported tokens with balances.isTokenSupported(token): quick support check.
Public Interface Reference
maxFlashLoan(address token)
Returns max borrowable amount, or 0 for unsupported tokens.
flashFee(address token, uint256 amount)
Returns 0 (zero fee). Reverts if token is unsupported.
flashLoan(IERC3156FlashBorrower receiver, address token, uint256 amount, bytes data)
Transfers tokens, calls borrower, and pulls repayment in the same tx.
isTokenSupported(address token)
Returns true if token is whitelisted.
getAvailableTokens()
Returns arrays of supported tokens and balances held by the lender.
tokenCount()
Returns number of supported tokens.
Events
FlashLoanExecutedFlashLoanRepaidTokenAddedTokenRemovedPausedUnpausedWithdrawal
Notes / Gotchas
- Unsupported tokens revert in
flashFeeandflashLoan. maxFlashLoanreturns 0 for unsupported tokens.- Amount must be > 0.
- Liquidity must be available at execution time.
- Borrower must return the correct callback hash.
- Borrower must approve repayment for
amount. - Repayment must restore lender balance.
- Fee-on-transfer / non-standard tokens may fail.
- Contract can be paused.
Learn More
New to flash loans? Read more about ERC-3156.