Consensys / defi-fuzzing-toolbox

Small TypeScript library allowing easy local deployment of some common defi components

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Overview

Small TypeScript library allowing easy local deployment of some common defi components. Currently the library supports:

  • WETH
  • DAI
  • USDC (currently mocked with an ERC20)
  • Uniswap V2

For all components (except for USDC) the code was taken directly from etherscan.

Installation

Run:

npm install <TODO AFTER RELEASING PACKAGE>

Usage

Say you want to get a local deployment with WETH, DAI and UniswapV2 and swap 10 WETH for DAI. You can do this as follows:

  1. Fire up ganache. Note that the --chain.allowUnlimitedContractSize is needed tor the deployment of UniswapV2 (runs out of gas with the default ganache config).
ganache -p 8545 --chain.allowUnlimitedContractSize

And from another terminal fire up Node and try the following:

// Get an instance of the DefiToolbox. The toolbox is connected to the local ganache instance.
const { DefiToolbox } = require(".");
const tb = new DefiToolbox("http://localhost:8545");

// Get an instance of WETH. Note that this automatically deploys the contract to the local
// ganache instance on the first invocation. 
const weth = await tb.weth();
// weth is an instance of TruffleContract.

// Use the first account from web3.eth.getAccounts() as sender
const sender = await tb.firstAccount();

// Deposit some ETH in WETH
await weth.deposit({value: 1000000, from: sender });


// Get an instance of DAI. Note that we pass sender to the DAI constructor, so that sender
// is authorized to mint
const dai = await tb.dai(sender);

// Mint some dai to sender
await dai.mint(sender, 100000, { from: sender })

// Now get the UniswapV2 router. Note all deployment helpers have an implicit "sender"
// argument, that is the first account by default.
const router = await tb.uniswapV2Router();

// Now give the WETH/DAI pair some initial liquidity.
// The "2000000000" is some arbitrary deadline the future.
await dai.approve(router.address, 10000, { from: sender });
await weth.approve(router.address, 10000, { from: sender });
await router.addLiquidity(weth.address, dai.address, 10000, 10000, 0, 0, sender, 2000000000, { from: sender })

// Get WETH/DAI balances before the swap
const wethBefore = (await weth.balanceOf(sender)).toNumber();
const daiBefore = (await dai.balanceOf(sender)).toNumber();

console.error(`Before swap balance of ${sender}: WETH: ${wethBefore} DAI: ${daiBefore}`);

// Allow the router to spend 10 wei
await weth.approve(router.address, 10, { from: sender });

// Swap weth for dai
await router.swapExactTokensForTokens(
    10,
    0,
    [weth.address, dai.address],
    sender,
    2000000000,
    {
	from: sender
    }
);


// Get WETH/DAI balances after the swap
const wethAfter = (await weth.balanceOf(sender)).toNumber();
const daiAfter = (await dai.balanceOf(sender)).toNumber();

console.error(`After swap balance of ${sender}: WETH: ${wethAfter} DAI: ${daiAfter}`);
// Should print something like
// After swap balance of <sender>: WETH: 989990 DAI: 90009

About

Small TypeScript library allowing easy local deployment of some common defi components

License:Apache License 2.0


Languages

Language:Solidity 88.6%Language:TypeScript 10.2%Language:Shell 1.2%