An unofficial library to make it easier to work with sudoswap in JS.
This is a work in progress, issues and PR are welcome.
- Wrap contract calls to make it easier to interact with pools/router from JS.
- Parse historical trade events of pools.
- Helpers to format sudo related data such as delta and fee.
npm install @musedao/sudoswap.js
const sudoswap = require("@musedao/sudoswap.js");
const sudo = new sudoswap(`https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY}`, process.env.PRIVATE_KEY); //RPC and optional private key if used for sending transactions
// Or you can pass a web3 provider exposed by metamask/walletconnect
// window.ethereum.enable();
//const sudo = new sudoswap(window.ethereum)
const pool = sudo.getPool("0x6210e6229aec95d17f57dab93e042013d7d3603c"); //any sudo pool
const router = sudo.router(); //use the router
pool.getSellNFTQuote(nbNFT) //get x NFTs sell quote
pool.getBuyNFTQuote(nbNFT) //get x NFTs buy quote
pool.getType() // Type of pool: TRADE/SELL/BUY
pool.getNFT() // Address of the NFT
pool.getDelta()
pool.getSpotPrice()
pool.getFee()
pool.getOwner() // return owner of pool
pool.getCurve() // EXPONENTIAL or LINEAR
pool.getAssetRecipient()
pool.getAllHeldIds() // return all nft ids in the pool
pool.getNFTContract() // return an ethers.js instance of the ERC721 contract
pool.getPoolContract() // return an ethers.js instance of the pool contract
pool.getTrades()
Returns an array containing all past trades from the pool:
[
{
type: 'NFT_OUT_POOL',
transactionHash: '0x843a0612826b6820383fd8b5b08e97c8645221ee8f9622bcf3ea9ed7c1bfebc1',
blockNumber: 15391750,
nfts: [ '4024' ],
nbNfts: 1,
buyer: '0x095aca033F31708Bf2542F15f7C5AEAFFA9B8e0b',
fee: '30000000000000000',
delta: '1100000000000000000',
lpFee: '103321068658202847',
protocolFee: '17220178109700474',
inputValue: '3564576868707998237',
pricePerNft: '3564576868707998237',
priceBefore: '3130941474490995379',
priceAfter: '3571014492753623300',
timestamp: 1661191376,
pool: '0x451018623f2ea29a625ac5e051720eeac2b0e765',
logIndex: 130
},
{
type: 'NFT_IN_POOL',
transactionHash: '0xabd28282f9f3b3b074e57c0a7fbb0adbf67def90b3dddba43cd088aef957fe65',
blockNumber: 15391959,
nfts: [ '7309' ],
nbNfts: 1,
buyer: '0x451018623F2EA29A625Ac5e051720eEAc2b0E765',
fee: '30000000000000000',
delta: '1030000000000000000',
lpFee: '117843478260869568',
protocolFee: '19640579710144928',
outputValue: '3790631884057971129',
pricePerNft: '3790631884057971129',
priceBefore: '3928115942028985625',
priceAfter: '3571014492753623291',
timestamp: 1661194031,
pool: '0x451018623f2ea29a625ac5e051720eeac2b0e765'
}
]
To execute trades via the router you need to pass a private key when intializing sudoswap js.
const router = await sudo.router();
await router.isApprovedForRouter(nftCollection); //check if signer gave approval to the router for spend
const tx = await router.approveCollection(nftCollection); //set approval from nft collection to the router if wasn't set.
//buy any nfts from pools
const tx = await router.swapETHForAnyNFTs(
swapList,
ethRecipient,
nftRecipient,
deadline,
ethAmount
)
//buy specific nft ids from pool
const tx = await router.swapETHForSpecificNFTs(
swapList,
ethRecipient,
nftRecipient,
deadline,
ethAmount
)
// Sell nfts
const tx = await router.swapNFTsForToken(
swapList,
minOutput,
tokenRecipient,
deadline
)
// Approve the router to spend your nft if not already approved
const tx = await router.approveCollection(nftAddress)
// Check if the router was approved to spend your nft
const isApprovedForRouter = await router.isApprovedForRouter(nftAddress)
To create pools with the Factory you need to pass a private key when intializing sudoswap js.
const factory = sudo.factory()
factory.createPairETH( nft, bondingCurve, assetRecipient, poolType, delta, fee, spotPrice, initialNFTIds) // Create new pair
factory.getNewPairsAddress()
factory.getNewPairsInstance()
factory.approveCollection()
factory.isApprovedForFactory()
Utilitiy functions to make it easier simulating behaviour.
const utils = sudo.utils;
utils.getBuyInfo(curve, fee, delta, spotPrice, nbNfts) // simulates curve. returns: inputValue, newDelta, lpFee, protocolFee, newSpotPrice
utils.getSellInfo(curve, fee, delta, spotPrice, nbNfts) //simulates curve returns: outputValue, newDelta, lpFee, protocolFee, newSpotPrice
utils.formatDelta("0.05", "exponential") // returns correct format for a 5% exponential curve.
utils.formatFee("0.05") // returns correct format for a 5% fee.