/mammoth_pool

Starknet pool to provide non-custodial liquidity to central limit order book market makers

Primary LanguagePythonApache License 2.0Apache-2.0

mammoth_pool

Starknet pool similar to balancer v1 AMM

This repo uses cairo-nile https://github.com/OpenZeppelin/nile

Goals:

  • Users can deposit and withdraw any ERC-20 token into the contract any time they want
  • Users get credited their yield when they withdraw from the contract
  • The pool earns fees off swaps and some LP tokens may have additional staking rewards.

CONTRACTS:

ROUTER CONTRACT

External

  • mammoth_deposit_single_asset - deposit a single approved ERC20 to receive LP tokens (input Uint256)
  • mammoth_proportional_deposit - deposit in proportion to current pool weights
  • mammoth_withdraw_single_asset - withdraw a single ERC20 in exchange for LP tokens (input Uint256)
  • mammoth_proportional_withdraw - withdraw in proportion to current pool weights
  • mammoth_swap - swap one ERC20 for another ERC20 (input Uint256)
  • create_pool - create new pool and provide initial liquidity

View

  • is_pool_approved - given pool address returns 1 if valid pool and 0 else

POOL CONTRACT

View

  • view_out_given_in - given amount of ERC20 in and an ERC20 for out returns the amount of the second ERC20 a user would receive for inputing the amount in a swap
  • view_in_given_out
  • view_pool_minted_given_single_in - given amount of ERC20 in return amount of LP tokens minted
  • view_single_in_given_pool_out
  • view_single_out_given_pool_in - given amount of LP tokens in and ERC20 address returns amount of given ERC20 received for burning LP tokens
  • view_pool_in_given_single_out
  • get_ERC20_balance - given ERC20 address return balance of ERC20 in pool
  • is_erc20_approved - given pool and ERC20 address returns 1 if ERC20 is approved for said pool else 0
  • IMPLEMENTS ERC20_Mintable_Burnable

TESTS

pytest tests

DEPLOYMENT INSTRUCTIONS

start local devnet for default deployment --network goerli for testnet deployment --network mainnet for mainnet

  • Set a private key variable in .env, for example PRIV_KEY=1
- nile setup PRIV_KEY
- fund your account with ETH (or testnet/devnet ETH)
- nile compile
- nile run scripts/testnet_fresh_deploy.py
- nile run scripts/approve_pool.py
- nile run scripts/create_pool.py
- nile run scripts/check_pool_creation.py

POOL CREATION INSTRUCTIONS

  • call create_pool on the router and provide list of ercs to include and initial liquidity amounts
  • it is advisable to provide liquidity ina ratio similar to real prices