Developers Bot SDK - BaseCalculate prices and prepare buy/sell transactions via the Moonshot SDK
The trading instructions for buy and sell (but not mint) are directly available on-chain via the Moonshot Smart Contract.
Overview
The Moonshot SDK for EVM provides the following functions:
Minting of a token
Prepare and submit transactions
Buy an initial amount of the tokens you minted
Get price of the token / position on bonding curve
Calculate collateral/token in and out
Generate buy and sell transactions (both exact in and out)
Installation
Install the package using npm or yarn
Copy
Copy npm i @wen-moon-ser/moonshot-sdk-evm
# or
yarn add @wen-moon-ser/moonshot-sdk-evm
Example in Wen Moon repo : https://github.com/wen-moon-ser/moonshot-sdk-evm/blob/main/README.md
Initializing Moonshot
To initialize the Moonshot SDK, you need to create an instance of the Moonshot class. Before instantiating the Moonshot class, define your rpcUrl and signer.
Public endpoints for rpcUrl
Parameters of the Moonshot class
environment : You can initialize the environment for either mainnet or devnet
For Mainnet, use Environment.MAINNET
For Devnet, use Environemnt.TESTNET
signer : generated through your private key and rpcUrl
Copy import { Wallet } from 'ethers' ;
import { JsonRpcProvider } from 'ethers' ;
import { Moonshot , Token , FixedSide , Environment } from '@wen-moon-ser/moonshot-sdk-evm' ;
export const buyTx = async () : Promise < void > => {
console .log ( '--- Buying token example ---' );
const rpcUrl = 'https://base-sepolia.gateway.tenderly.co' ;
const provider = new JsonRpcProvider (rpcUrl);
const signer = new Wallet ( 'private key' , provider);
const moonshot = new Moonshot ({
signer : signer ,
env : Environment . TESTNET ,
});
Buy Example
Copy import {ethers , JsonRpcProvider , Wallet} from "ethers" ;
import {Environment , FixedSide , Moonshot , Token} from "@wen-moon-ser/moonshot-sdk-evm" ;
const buyExactIn = async (tokenAddress : string ) => {
const provider = new JsonRpcProvider ( process . env . RPC_URL as string );
const signer = new Wallet ( 'private_key' , provider);
const moonshot = new Moonshot ({
signer ,
env : Environment . TESTNET ,
});
const token = await Token .create ({
moonshot ,
provider ,
tokenAddress ,
});
const collateralAmount = ethers .parseEther ( '0.001' );
const tokenAmountForTransaction = await token .getTokenAmountByCollateral ({
collateralAmount ,
tradeDirection : 'BUY' ,
});
const slippageBps = 1000 ;
const buyTx = await token .prepareTx ({
slippageBps ,
tokenAmount : tokenAmountForTransaction ,
collateralAmount : collateralAmount ,
tradeDirection : 'BUY' ,
fixedSide : FixedSide . IN ,
});
const walletAddress = await signer .getAddress ();
const feeData = await provider .getFeeData ();
const nonce = await provider .getTransactionCount (walletAddress , 'latest' );
const enrichedBuyTx = {
... buyTx ,
gasPrice : feeData .gasPrice ,
nonce : nonce ,
from : walletAddress ,
};
const buyTxGasLimit = await provider .estimateGas (enrichedBuyTx);
const buyTxResponse = await signer .sendTransaction ({
... buyTx ,
gasLimit : buyTxGasLimit ,
});
const buyTxReceipt = await buyTxResponse .wait ();
if ( buyTxReceipt ?.status === 1 ) {
const balance = await token .balanceOf (walletAddress);
console .log (balance);
}
};
Sell Example
Copy import {JsonRpcProvider , Wallet} from "ethers" ;
import {Environment , FixedSide , Moonshot , Token} from "@wen-moon-ser/moonshot-sdk-evm" ;
const sellExactIn = async (tokenAddress : string ) => {
const provider = new JsonRpcProvider ( process . env . RPC_URL as string );
const signer = new Wallet ( 'private_key' , provider);
const walletAddress = await signer .getAddress ();
const moonshot = new Moonshot ({
signer ,
env : Environment . TESTNET ,
});
const token = await Token .create ({
moonshot ,
provider ,
tokenAddress ,
});
const tokenAmount = await token .balanceOf (walletAddress);
await token .approveForMoonshotSell (tokenAmount);
const collateralAmountForTransaction =
await token .getCollateralAmountByTokens ({
tokenAmount ,
tradeDirection : 'BUY' ,
});
const slippageBps = 1000 ;
const sellTx = await token .prepareTx ({
slippageBps ,
tokenAmount ,
collateralAmount : collateralAmountForTransaction ,
tradeDirection : 'SELL' ,
fixedSide : FixedSide . IN ,
});
const feeData = await provider .getFeeData ();
const nonce = await provider .getTransactionCount (walletAddress , 'latest' );
const enrichedSellTx = {
... sellTx ,
gasPrice : feeData .gasPrice ,
nonce : nonce ,
from : walletAddress ,
};
const sellTxGasLimit = await provider .estimateGas (enrichedSellTx);
const sellTxResponse = await signer .sendTransaction ({
... enrichedSellTx ,
gasLimit : sellTxGasLimit ,
});
const sellTxReceipt = await sellTxResponse .wait ();
if ( sellTxReceipt ?.status === 1 ) {
const balance = await token .balanceOf (walletAddress);
console .log (balance);
}
};
Mint Example
Image size restrictions - 2 MB for the icon and 5 MB for the banner
Recommended aspect ratio - 1 : 1 for the icon and 3:1 for the banner
tokenAmount - Lets you buy an initial amount of tokens that you just minted
Copy import {Environment , MigrationDex , MintTokenCurveType , Moonshot} from "@wen-moon-ser/moonshot-sdk-evm" ;
import {JsonRpcProvider , Transaction , Wallet} from "ethers" ;
const mintTx = async () => {
const provider = new JsonRpcProvider ( process . env . RPC_URL as string );
const signer = new Wallet ( 'private_key' , provider);
const moonshot = new Moonshot ({
signer ,
env : Environment . TESTNET ,
});
const mockImg = '...' ;
const prepMint = await moonshot .prepareMintTx ({
name : 'TEST_TOKEN' ,
symbol : 'TEST_TOKEN' ,
curveType : MintTokenCurveType . CONSTANT_PRODUCT_V1 ,
migrationDex : MigrationDex . UNISWAP ,
icon : mockImg ,
description : 'TEST_TOKEN' ,
links : [{ url : 'https://x.com' , label : 'x handle' }] ,
banner : mockImg ,
creator : await signer .getAddress () ,
tokenAmount : '10000000000000' ,
});
const deserializedTransaction = Transaction .from (
prepMint .transaction ,
) .toJSON ();
const walletAddress = await signer .getAddress ();
const feeData = await provider .getFeeData ();
const tx = {
... deserializedTransaction ,
gasPrice : feeData .gasPrice ,
from : walletAddress ,
nonce : await provider .getTransactionCount (walletAddress , 'latest' ) ,
};
const gasLimit = await provider .estimateGas (tx);
const txResponse = await signer .sendTransaction ({
... tx ,
gasLimit ,
});
const receipt = await txResponse .wait ();
if ( receipt ?.status === 1 ) {
const res = await moonshot .submitMintTx ({
token : prepMint .token ,
signedTransaction : JSON .stringify (txResponse) ,
tokenId : prepMint .draftTokenId ,
});
const createdTokenAddress = receipt ?.logs[ 0 ].address;
console .log (createdTokenAddress);
}
}