import { utils } from "@coral-xyz/anchor"; import { LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; const DUAL_MARKET_PROGRAM_ID = "DiPbvUUJkDhV9jFtQsDFnMEMRJyjW5iS6NMwoySiW8ki"; const DIP_MM_PROGRAM_ID = "esdUULhoeFHro46mvkTizMzg38hKBunvErmPuUw6n9p"; const MM_DMS = "HyhjarjcywrvrpZN5BfafsLG6ejKMJMdPxhjs1ZxDKme"; export const DUAL_MARKET_PK = new PublicKey(DUAL_MARKET_PROGRAM_ID); export const DIP_MM_PK = new PublicKey(DIP_MM_PROGRAM_ID); export const DIP_MM_DMS_PLACEHOLDER_PK = new PublicKey(MM_DMS); export const MM_WALLET_PK = new PublicKey( "9SgZKdeTMaNuEZnhccK2crHxi1grXRmZKQCvNSKgVrCQ" ); export const DIP_STATE_SEED = "dip-state"; export const VAULT_MINT_SEED = "vault-mint"; export const VAULT_SEED = "vault-spl-account"; export const PREMIUM_USDC_ACCOUNT_SEED = "usdc-premium-account"; export const OPTION_MINT_SEED = "option-mint"; export const VAULT_QUOTE_SEED = "usdc-vault-account"; export const DIP_MM_PRICING_SEED = "dip-mm-pricing"; // SPL token PKs export const TBTC_MINT_PK = new PublicKey( "6DNSN2BJsaPFdFFc1zP37kkeNe4Usc1Sqkzr9C9vPWcU" ); export const WBTC_PORTAL_MINT_PK = new PublicKey( "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh" ); export const BTC_DEV_MINT_PK = new PublicKey( "JDXktC6gbDXq4zuW3BT6ToSE7timShHQBL449ULDdoMv" ); export const WETH_PORTAL_MINT_PK = new PublicKey( "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs" ); export const ETH_DEV_MINT_PK = new PublicKey( "Hccuen6RkUgEvyL9oSXW8ai9QiQaAiL8ESaqjp9oymBf" ); export const WSOL_PK = new PublicKey( "So11111111111111111111111111111111111111112" ); export const MNGO_MINT_PK = new PublicKey( "MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac" ); export const BONK_MINT_PK = new PublicKey( "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" ); export const BONK_DEV_MINT_PK = new PublicKey( "DUhoPeKG5jyEo4B58x9cLXG2Hf4CW2Xz2596qhwVUnhg" ); export const RAY_MINT_PK = new PublicKey( "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R" ); export const RAY_DEV_MINT_PK = new PublicKey( "F6XCXpw26umxERZzmWUoCkcL2VvtWmpWk1oBzMUh3mbr" ); export const USDC_MINT_PK = new PublicKey( "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" ); export const USDC_DEV_MINT_PK = new PublicKey( "HJiQv33nKujRmZQ3sJBSosXgCEmiHs3mG1yd9VcLawPM" ); export const DUAL_MINT_PK = new PublicKey( "DUALa4FC2yREwZ59PHeu1un4wis36vHRv5hWVBmzykCJ" ); export const MSOL_MINT_PK = new PublicKey( "mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So" ); export const JITOSOL_MINT_PK = new PublicKey( "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn" ); // Pyth PKs export const PYTH_BTC_PK = new PublicKey( "GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU" ); export const PYTH_BTC_DEV_PK = new PublicKey( "HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J" ); export const PYTH_ETH_PK = new PublicKey( "JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB" ); export const PYTH_ETH_DEV_PK = new PublicKey( "EdVCmQ9FSPcVe5YySXDPCRmc8aDQLKJ9xvYBMZPie1Vw" ); export const PYTH_SOL_PK = new PublicKey( "H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG" ); export const PYTH_SOL_DEV_PK = new PublicKey( "J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix" ); export const PYTH_MNGO_PK = new PublicKey( "79wm3jjcPr6RaNQ4DGvP5KxG1mNd3gEBsg6FsNVFezK4" ); export const PYTH_MNGO_DEV_PK = new PublicKey( "DCNw5mwZgjfTcoNsSZWUiXqU61ushNvr3JRQJRi1Nf95" ); export const PYTH_MSOL_PK = new PublicKey( "E4v1BBgoso9s64TQvmyownAVJbhbEPGyzA3qn4n46qj9" ); export const PYTH_JITOSOL_PK = new PublicKey( "7yyaeuJ1GGtVBLT2z2xub5ZWYKaNhF28mj1RdV4VDFVk" ); export const PYTH_JITOSOL_DEV_PK = new PublicKey( "3d4eLK2TF6UdpSjKvS5ZUnDY1uZq2sEj9Tk3cujpUaAk" ); export const PREMIUM_TOKEN_ACCOUNT_PK = PublicKey.findProgramAddressSync( [ Buffer.from(utils.bytes.utf8.encode(PREMIUM_USDC_ACCOUNT_SEED)), USDC_MINT_PK.toBuffer(), ], DUAL_MARKET_PK )[0]; // Account that receives the options from DIP. export const OPTION_VAULT_PK = new PublicKey( "9SgZKdeTMaNuEZnhccK2crHxi1grXRmZKQCvNSKgVrCQ" ); export const DAO_USDC_PK = new PublicKey( "7bg4qdKinKMSaii2FY68GwoLCFtnaAP8RjxvhseAgmoF" ); export const PYTH_MAINNET_PKS = [ PYTH_BTC_PK, PYTH_ETH_PK, PYTH_SOL_PK, // TODO: Enable this once we have DIPs with mngo and we have rpc provider that // can do more than 5 getMultipleAccounts at once. // PYTH_MNGO_PK, PYTH_MSOL_PK, PYTH_JITOSOL_PK, ]; export const PYTH_DEVNET_PKS = [ PYTH_BTC_DEV_PK, PYTH_ETH_DEV_PK, PYTH_SOL_DEV_PK, PYTH_MNGO_DEV_PK, PYTH_JITOSOL_DEV_PK, ]; export const PYTH_TO_MINT = { [PYTH_BTC_PK.toBase58()]: TBTC_MINT_PK.toBase58(), [PYTH_BTC_DEV_PK.toBase58()]: BTC_DEV_MINT_PK.toBase58(), [PYTH_ETH_PK.toBase58()]: WETH_PORTAL_MINT_PK.toBase58(), [PYTH_ETH_DEV_PK.toBase58()]: ETH_DEV_MINT_PK.toBase58(), [PYTH_SOL_PK.toBase58()]: WSOL_PK.toBase58(), [PYTH_SOL_DEV_PK.toBase58()]: WSOL_PK.toBase58(), [PYTH_MNGO_PK.toBase58()]: MNGO_MINT_PK.toBase58(), [PYTH_MNGO_DEV_PK.toBase58()]: MNGO_MINT_PK.toBase58(), [PYTH_MSOL_PK.toBase58()]: MSOL_MINT_PK.toBase58(), [PYTH_JITOSOL_PK.toBase58()]: JITOSOL_MINT_PK.toBase58(), }; export const MINT_TO_PYTH = { [TBTC_MINT_PK.toBase58()]: PYTH_BTC_PK.toBase58(), [BTC_DEV_MINT_PK.toBase58()]: PYTH_BTC_DEV_PK.toBase58(), [WETH_PORTAL_MINT_PK.toBase58()]: PYTH_ETH_PK.toBase58(), [ETH_DEV_MINT_PK.toBase58()]: PYTH_ETH_DEV_PK.toBase58(), [WSOL_PK.toBase58()]: PYTH_SOL_PK.toBase58(), [MNGO_MINT_PK.toBase58()]: PYTH_MNGO_DEV_PK.toBase58(), [MSOL_MINT_PK.toBase58()]: PYTH_MSOL_PK.toBase58(), [JITOSOL_MINT_PK.toBase58()]: PYTH_JITOSOL_PK.toBase58(), }; // Used to determine whether dip is upside or downside export const COLLATERAL_PK = [ TBTC_MINT_PK.toBase58(), BTC_DEV_MINT_PK.toBase58(), WETH_PORTAL_MINT_PK.toBase58(), ETH_DEV_MINT_PK.toBase58(), WSOL_PK.toBase58(), MNGO_MINT_PK.toBase58(), MSOL_MINT_PK.toBase58(), JITOSOL_MINT_PK.toBase58(), ]; export const QUOTE_PK = [USDC_MINT_PK.toBase58(), USDC_DEV_MINT_PK.toBase58()]; export const VOL_MAP = { [TBTC_MINT_PK.toBase58()]: 0.2, [WBTC_PORTAL_MINT_PK.toBase58()]: 0.2, [BTC_DEV_MINT_PK.toBase58()]: 0.2, [WETH_PORTAL_MINT_PK.toBase58()]: 0.25, [ETH_DEV_MINT_PK.toBase58()]: 0.25, [WSOL_PK.toBase58()]: 0.3, [MNGO_MINT_PK.toBase58()]: 0.35, [BONK_MINT_PK.toBase58()]: 0.35, [BONK_DEV_MINT_PK.toBase58()]: 0.35, [RAY_MINT_PK.toBase58()]: 0.35, [RAY_DEV_MINT_PK.toBase58()]: 0.35, [MSOL_MINT_PK.toBase58()]: 0, [JITOSOL_MINT_PK.toBase58()]: 0, }; export const DIP_STATE_SIZE = 260; export const DIP_DECIMALS = 6; export const DIP_ATOMS_PER_TOKEN = 10 ** DIP_DECIMALS; export const USDC_ATOMS_PER_TOKEN = 10 ** 6; export const NUM_SPL_ATOMS_PER_TOKEN = { [TBTC_MINT_PK.toBase58()]: 10 ** 8, [WBTC_PORTAL_MINT_PK.toBase58()]: 10 ** 8, [BTC_DEV_MINT_PK.toBase58()]: 10 ** 8, [WETH_PORTAL_MINT_PK.toBase58()]: 10 ** 6, [ETH_DEV_MINT_PK.toBase58()]: 10 ** 6, [WSOL_PK.toBase58()]: LAMPORTS_PER_SOL, [USDC_MINT_PK.toBase58()]: USDC_ATOMS_PER_TOKEN, [USDC_DEV_MINT_PK.toBase58()]: USDC_ATOMS_PER_TOKEN, [MNGO_MINT_PK.toBase58()]: 10 ** 6, [BONK_MINT_PK.toBase58()]: 10 ** 5, [BONK_DEV_MINT_PK.toBase58()]: 10 ** 5, [RAY_MINT_PK.toBase58()]: 10 ** 6, [RAY_DEV_MINT_PK.toBase58()]: 10 ** 6, [MSOL_MINT_PK.toBase58()]: 10 ** 9, [JITOSOL_MINT_PK.toBase58()]: 10 ** 9, }; // Most vol ratio that an MM bid can be over the bve. export const MM_BID_LIMIT = 3; // Risk Free Rate of Return ~ T-Bill Rate export const RF_RATE = 0.03; export const MS_PER_YEAR = 1_000 * 60 * 60 * 24 * 365; export const MIN_DIP_TIME_REMAINING_MS = 1_000 * 60 * 60 * 36; export const NO_ORACLE_PRICE = 0; // Min and max apy for a DIP to be passed to the UI. export const MIN_APY = 0.01; export const MAX_APY = 10.0; // DUAL Price in usdc atoms for LSO Strike calculation export const DUAL_PRICE = 35_000;