StellaSwap
  • 🖐️Intro
  • DEX CORE
    • StellaSwap V4
      • ⚡Concentrated Liquidity
      • Automated Earnings
      • Telegram Position Tracker
    • Cool Tools
    • 🌊Liquid Staking
      • Contracts
      • Audit
  • Tokenomics
    • STELLA Token
  • ❓How-To Guides
    • Liquidity Staking
      • Add Liquidity (Manual)
      • Add Liquidity (Auto)
      • Create Limit Orders
      • Create Community Pool
      • Migrate Liquidity From V2 to Pulsar
      • Manage Out of Range Position
    • Cross-Chain Swap
    • Wallet & Network
      • Create and Fund Polkadot .js Wallet
      • Create Metamask Wallet
      • Connect Metamask to Moonbeam
      • Token Address List for Manual Import
      • Moonbeam Block Explorer List
    • Native Transfer (XCM)
      • How to Get Phala (PHA.xc) Token On Moonbeam
      • How to Get Pendulum (xcPEN) Token On Moonbeam
      • How to Get ZTG Token On Moonbeam (xcZTG)
      • How to Get Bifrost (BNC) Token On Moonbeam
      • How to Get Bifrost Voucher FileCoin (xcvFIL) Token On Moonbeam
      • How to Send Polkadot (DOT) to Moonbeam
      • How to Get INTR & iBTC On Moonbeam
      • How to Get Centrifuge (CFG) Token On Moonbeam
      • How to Get Acala Dot (xcLDOT) Token on Moonbeam
      • How to Get Astar Token on Moonbeam
      • How to Get Native USDT (xcUSDT) On Moonbeam
      • How to Send USDT From Binance To Moonbeam
      • How to Send INTR & iBTC to Moonbeam (XCM)
  • Resources
    • Contract Addresses
    • General FAQ
    • Security
      • Audit
      • Bug Bounty
    • Team
  • Developers
    • Smart Contracts
    • Swap SDK
  • Dev Resource
    • API Reference
    • Pulsar V3 Contracts
    • Flashloan (V3)
  • 🌎Community
    • Blog
    • Discord
    • Github
    • Twitter
    • Reddit
Powered by GitBook
On this page
  • Flow
  • Implementation for Flashing Contract (Solidity)
  • More Optimal Implementation for Flashing Contract (Javascript)
  1. Dev Resource

Flashloan (V3)

PreviousPulsar V3 Contracts

Last updated 1 year ago

Pulsar pools provide flash method to flashloan.

Flow

Implementation for Flashing Contract (Solidity)

import '@cryptoalgebra/core/contracts/interfaces/IAlgebraPool.sol';
import '@cryptoalgebra/core/contracts/interfaces/callback/IAlgebraFlashCallback.sol';

import '@cryptoalgebra/periphery/contracts/libraries/TransferHelper.sol';

contract SimpleFlasher {
	// Variables so we can verify callback
	address poolCalled;
	uint256 amount0;
	uint256 amount1;
	
	function flash(
	    address pool,
	    address recipient,
	    uint256 _amount0,
	    uint256 _amount1
	  ) external {
			// setting the variables
			poolCalled = pool;
			amount0 = _amount0;
			amount1 = _amount1;
	
			// requesting flash loan to `recipient` address
	    IAlgebraPool(pool).flash(recipient, amount0, amount1, bytes(''));
			
			// cleaning up
			poolCalled = address(0);
			amount0 = 0;
			amount1 = 0;
	  }
	
	  function algebraFlashCallback(
	    uint256 fee0,
	    uint256 fee1,
	    bytes calldata data
	  ) external override {
			require(msg.sender == poolCalled, "only pool can call");
	
			// do the magic here ...
	
			// repay to pool
			TransferHelper.safeTransfer(IAlgebraPool(msg.sender).token0(), msg.sender, amount0 + fee0);
			TransferHelper.safeTransfer(IAlgebraPool(msg.sender).token1(), msg.sender, amount1 + fee1);
	  }
}

More Optimal Implementation for Flashing Contract (Javascript)

import '@cryptoalgebra/core/contracts/interfaces/IAlgebraPool.sol';
import '@cryptoalgebra/core/contracts/interfaces/callback/IAlgebraFlashCallback.sol';

import '@cryptoalgebra/periphery/contracts/libraries/CallbackValidation.sol';
import '@cryptoalgebra/periphery/contracts/libraries/TransferHelper.sol';

contract MoreOptimalFlasher {
  address immutable poolDeployer; // address of AlgebraPoolDeployer contract

	constructor(_poolDeployer) {
		poolDeployer = _poolDeployer;
	}

	function flash(
	    address pool,
	    address recipient,
	    uint256 amount0,
	    uint256 amount1
	  ) external {
			address token0 = IAlgebraPool(pool).token0();
			address token1 = IAlgebraPool(pool).token1();
			
			// requesting flash loan to `recipient` address
	    IAlgebraPool(pool).flash(recipient, amount0, amount1, abi.encode(token0, token1, amount0, amount1));
	  }
	
	  function algebraFlashCallback(
	    uint256 fee0,
	    uint256 fee1,
	    bytes calldata data
	  ) external override {
			(address token0, address token1, uint256 amount0, uint256 amount1) = abi.decode(data, (address, adrress, uint256, uint256));
			CallbackValidation.verifyCallback(poolDeployer, token0, token1) // check if method is called by algebra pool, revert otherwise
	
			// do the magic here ...
	
			// repay to pool
			TransferHelper.safeTransfer(token0, msg.sender, amount0 + fee0);
			TransferHelper.safeTransfer(token1, msg.sender, amount1 + fee1);
	  }
}