{"version":3,"sources":["components/Link.js","utils/faucet.tsx","utils/alephConnector.tsx","utils/markets.tsx","utils/utils.tsx","utils/notifications.tsx","utils/connection.tsx","utils/send.tsx","utils/constants.tsx","global_style.ts","components/ErrorBoundary.tsx","utils/useInterval.tsx","components/layout/FloatingElement.jsx","components/Orderbook.jsx","utils/usePrevious.tsx","components/layout/DataTable.jsx","utils/referrer.tsx","components/UserInfoTable/BalancesTable.jsx","components/UserInfoTable/OpenOrderTable.tsx","components/UserInfoTable/FillsTable.jsx","components/UserInfoTable/index.jsx","components/DepositDialog.jsx","components/StandaloneTokenAccountSelect.tsx","components/LinkAddress.tsx","utils/preferences.tsx","components/StandaloneBalancesDisplay.tsx","components/TradeForm.tsx","components/TradesTable.tsx","components/DeprecatedMarketsInstructions.js","components/CustomMarketDialog.jsx","pages/TradePage.tsx","components/WalletConnect.tsx","pages/OpenOrdersPage.tsx","components/UserInfoTable/WalletBalancesTable.tsx","pages/BalancesPage.tsx","components/Settings.jsx","components/CustomClusterEndpointDialog.tsx","components/TopBar.tsx","components/Footer.tsx","components/BasicLayout.js","components/useMintInput.tsx","pages/ListNewMarketPage.tsx","pages/AirdropPage.tsx","pages/FaucetPage.tsx","pages/MintTokenPage.tsx","routes.tsx","App.tsx","serviceWorker.js","index.tsx","utils/fetch-loop.tsx","utils/tokens.tsx"],"names":["Link","external","props","to","children","rest","href","target","rel","FAUCET_PROGRAM_ID","PublicKey","COMMITMENT","getPDA","findProgramAddress","Buffer","from","getMintPubkeyFromTokenAccountPubkey","connection","tokenAccountPubkey","getParsedAccountInfo","tokenMintData","value","data","tokenMintAddress","parsed","info","mint","Error","buildCreateFaucetIx","tokenMintPublicKey","faucetAccountPublicKey","amount","adminAddress","keys","pubkey","isSigner","isWritable","SYSVAR_RENT_PUBKEY","push","TransactionInstruction","programId","toArray","createFaucet","wallet","faucetAcc","Account","createFaucetIx","publicKey","SystemProgram","adapter","getMinimumBalanceForRentExemption","fromPubkey","newAccountPubkey","space","lamports","createAccIx","createAccount","createSetAuthorityInstruction","AuthorityType","MintTokens","transferAuthorityIx","getMint","mintInfo","transaction","Transaction","add","mintAuthority","equals","sendTransaction","signers","toBase58","buildAirdropTokensIx","adminPubkey","destinationAccountPubkey","faucetPubkey","pubkeyNonce","TOKEN_PROGRAM_ID","airdropTokens","faucetAddress","tokenDestinationAddress","tokenDestinationPublicKey","tokenMintPubkey","ix","AlephApi","path","query","variables","fetch","this","URL","method","headers","Accept","body","JSON","stringify","response","ok","json","responseJson","console","log","marketAddress","get","publicTrades","map","trade","market","size","Number","baseAmount","price","orderId","takerOrderId","time","timestamp","side","feeCost","takerFeeOrRebateAmount","runMarketUpdate","useMarketsList","MARKETS","filter","name","deprecated","process","REACT_APP_EXCLUDE_MARKETS","includes","useAllMarkets","useConnection","customMarkets","useCustomMarkets","getAllMarkets","Promise","all","getMarketInfos","marketInfo","Market","load","address","marketName","notify","message","description","type","markets","m","useAsyncData","tuple","length","refreshInterval","_VERY_SLOW_REFRESH_INTERVAL","useUnmigratedOpenOrdersAccounts","useWallet","deprecatedOpenOrdersAccounts","deprecatedProgramIds","Array","Set","publicKeyStr","OpenOrders","findForOwner","openOrdersAccounts","concat","openOrders","baseTokenTotal","toNumber","quoteTokenTotal","some","cacheKey","accounts","refresh","clearCache","refreshCache","MarketContext","React","createContext","_SLOW_REFRESH_INTERVAL","DEFAULT_MARKET","find","getMarketDetails","otherMarket","baseCurrency","baseMintAddress","TOKENS","token","baseLabel","quoteCurrency","quoteMintAddress","quoteLabel","useLocalStorageState","setCustomMarkets","MarketProvider","setMarketAddress","marketInfos","useEffect","useState","setMarket","_decoded","ownAddress","then","catch","e","Provider","getTradePageUrl","saved","localStorage","getItem","parse","useSelectedTokenAccounts","useMarket","context","useContext","useMarkPrice","markPrice","setMarkPrice","useOrderbook","orderbook","trades","limit","_useUnfilteredTrades","eventFlags","maker","useTrades","bb","bids","ba","asks","last","sort","a","b","getUnfilteredTrades","loadFills","useBonfidaTrades","getRecentTrades","useOrderbookAccounts","bidData","useAccountData","askData","bidOrderbook","Orderbook","decode","askOrderbook","depth","getL2","useOpenOrdersAccounts","fast","connected","getOpenOrdersAccounts","findOpenOrdersAccountsForOwner","useSelectedOpenOrdersAccount","useTokenAccounts","getTokenAccountInfo","getSelectedTokenAccountForMint","selectedPubKey","filtered","effectiveMint","useSelectedQuoteCurrencyAccount","selectedTokenAccounts","mintAddress","useSelectedBaseCurrencyAccount","useSelectedQuoteCurrencyBalances","quoteCurrencyAccount","useAccountInfo","accountInfo","loaded","TokenInstructions","WRAPPED_SOL_MINT","quoteSplSizeToNumber","BN","slice","useSelectedBaseCurrencyBalances","baseCurrencyAccount","baseSplSizeToNumber","useOpenOrders","openOrdersAccount","filterForOpenOrders","order","useLocallyStoredFeeDiscountKey","undefined","storedFeeDiscountKey","setStoredFeeDiscountKey","useFeeDiscountKeys","getFeeDiscountKeys","findFeeDiscountKeys","feeDiscountKey","useFills","fills","fill","useAllOpenOrdersBalances","useMarketInfos","programIds","stringProgramId","getAllOpenOrdersAccounts","flat","useAllOpenOrdersAccounts","loadedOpenOrdersAccounts","useMintInfos","mintInfos","mintInfosConnected","allMarkets","marketsByAddress","Object","fromEntries","openOrdersBalances","account","baseMint","quoteMint","baseMintInfo","baseFree","divideBnToNumber","baseTokenFree","getTokenMultiplierFromDecimals","decimals","baseTotal","quoteMintInfo","quoteFree","quoteTokenFree","quoteTotal","free","total","useAllOpenOrders","setLoaded","setRefresh","setOpenOrders","lastRefresh","setLastRefresh","getAllOpenOrders","_openOrders","getOpenOrdersForMarket","sleep","Math","random","loadOrdersForOwner","orders","warn","Date","getTime","refreshOpenOrders","prev","useBalances","baseCurrencyBalances","quoteCurrencyBalances","baseExists","quoteExists","key","coin","sub","unsettled","useWalletBalancesForAllMarkets","tokenAccounts","balances","parsedAccount","owner","parseTokenAccountData","additionalAmount","entries","balance","useUnmigratedDeprecatedMarkets","marketsList","deps","useUnmigratedDeprecatedMarketsInner","getMarket","x","toString","openOrdersList","useGetOpenOrdersForDeprecatedMarkets","marketsAndOrders","getOrders","useBalancesForDeprecatedMarkets","openOrderAccountBalances","forEach","inOrdersBase","inOrdersQuote","unsettledBase","unsettledQuote","customMarketsInfo","isValidPublicKey","ms","resolve","setTimeout","percentFormat","Intl","NumberFormat","style","minimumFractionDigits","maximumFractionDigits","floorToDecimal","floor","roundToDecimal","round","getDecimalCount","isNaN","split","parseInt","numerator","denominator","quotient","div","rem","umod","gcd","pow","localStorageListeners","useLocalStorageStringState","defaultState","state","listener","setState","useCallback","newState","removeItem","setItem","stringState","setStringState","useMemo","abbreviateAddress","base58","isEqual","obj1","obj2","k","mergeTransactions","transactions","t","calculateComputeUnitPrice","priorityFee","computeUnitLimit","addPriorityFeesIfNecessary","computeUnits","TransactionMessage","instructions","getLatestBlockhash","blockhash","payerKey","recentBlockhash","transactionMessage","compileToV0Message","simulateTransaction","VersionedTransaction","replaceRecentBlockhash","sigVerify","unitsConsumed","Infinity","simulatedUnits","maxComputeUnits","min","COMPUTE_UNIT_LIMIT_MULTIPLIER","unshift","ComputeBudgetProgram","setComputeUnitPrice","microLamports","setComputeUnitLimit","units","txid","placement","clusterUrl","encodeURIComponent","color","notification","opacity","backgroundColor","ENDPOINTS","endpoint","custom","accountListenerCount","Map","ConnectionContext","ConnectionProvider","setEndpoint","customEndpoints","setCustomEndpoints","availableEndpoints","Connection","sendConnection","setPriorityFee","setComputeUnits","id","onAccountChange","removeAccountChangeListener","onSlotChange","removeSlotChangeListener","useSendConnection","useConnectionConfig","endpointInfo","getAccountInfo","has","count","previousInfo","subscriptionId","setCache","set","currentItem","delete","previousInfoRef","useRef","current","calculateRequestQueueSize","requestQueueLength","calculateOrderbookSize","orderbookLength","calculateEventQueueSize","eventQueueSize","createTokenAccountTransaction","mintPublicKey","assert","getAssociatedTokenAddress","ata","createAssociatedTokenAccountInstruction","settleFunds","sendNotification","usdcRef","usdtRef","baseCurrencyAccountPubkey","quoteCurrencyAccountPubkey","result","createAccountTransaction","referrerQuoteWallet","supportsReferralFees","usdt","usdc","makeSettleFundsTransaction","settleFundsTransaction","settleFundsSigners","sendingMessage","settleAllFunds","reduce","cumulative","_programId","p","getOpenOrdersAccountsForProgramId","openOrdersAccountsForProgramIds","isZero","selectedBaseTokenAccount","selectedQuoteTokenAccount","settleTransactions","signer","s","cancelOrder","params","cancelOrders","makeMatchOrdersTransaction","makeCancelOrderInstruction","placeOrder","orderType","feeDiscountPubkey","formattedMinOrderSize","minOrderSize","toFixed","formattedTickSize","tickSize","isIncrement","num","step","abs","payer","matchOrderstransaction","startTime","getUnixTs","makePlaceOrderTransaction","placeOrderTx","placeOrderSigners","endTime","listMarket","getVaultOwnerAndNonce","nonce","createProgramAddress","toBuffer","toArrayLike","dexProgramId","vaultOwner","iaddn","baseLotSize","quoteLotSize","eventQueueLength","requestQueue","eventQueue","baseVault","quoteVault","feeRateBps","quoteDustThreshold","vaultSignerNonce","tx1","initializeAccount","tx2","getLayout","span","DexInstructions","initializeMarket","authority","signTransactions","transactionsAndSigners","signedTransactions","signedTransaction","sendSignedTransaction","DEFAULT_TIMEOUT","sentMessage","successMessage","timeout","signTransaction","getRecentBlockhash","setSigners","partialSign","signAllTransactions","rawTransaction","serialize","sendRawTransaction","skipPreflight","done","awaitTransactionSignatureConfirmation","simulateResult","err","logs","i","line","startsWith","parsedErrorInfo","parseInstructionErrorResponse","parsedError","error","rpcEndpoint","reject","onSignature","getSignatureStatuses","signatureStatuses","confirmations","resultDescription","AccountInfoResult","struct","executable","rentEpoch","GetMultipleAccountsAndContextRpcResult","array","union","jsonRpcVersion","literal","jsonrpc","jsonRpcResult","slot","getMultipleSolanaAccounts","publicKeys","args","commitment","_rpcRequest","unsafeRes","res","join","_recentBlockhash","_disableBlockhashCaching","signData","serializeMessage","wireTransaction","_serialize","encodedTransaction","encoding","MAX_PRIORITY_FEE","COMPUTE_UNIT_LIMIT","GlobalStyle","createGlobalStyle","Title","Typography","ErrorBoundary","hasError","level","Component","useInterval","callback","delay","savedCallback","setInterval","clearInterval","Wrapper","styled","FloatingElement","stretchVertical","height","SizeTitle","Row","MarkPriceTitle","Line","css","Price","smallScreen","onPrice","onSize","currentOrderbookData","lastOrderbookData","orderbookData","setOrderbookData","getCumulativeOrderbookSide","totalSize","backwards","cumulativeSize","sizePercent","reverse","sum","index","bidsToDisplay","asksToDisplay","flex","overflow","textAlign","OrderbookRow","onPriceClick","onSizeClick","MarkPriceComponent","memo","element","classList","contains","remove","clearTimeout","formattedSize","formattedPrice","ref","marginBottom","onClick","prevProps","nextProps","previousMarkPrice","usePrevious","markPriceColor","formattedMarkPrice","justify","ArrowUpOutlined","marginRight","ArrowDownOutlined","DataTable","dataSource","columns","emptyLabel","pagination","loading","pageSize","renderEmpty","padding","display","justifyContent","alignItems","ReferrerContext","ASSOCIATED_TOKEN_PROGRAM_ID","USDC_MINT","USDT_MINT","findAssociatedTokenAddress","walletAddress","SOL_TLD_AUTHORITY","getInputKey","input","getHashedName","hashed_input_name","getNameAccountKey","inputDomainKey","hashedInputName","ReferrerProvider","allowRefLink","REACT_APP_ALLOW_REF_LINK","refCode","setRefCode","setUsdc","setUsdt","fn","usdcAddress","usdtAddress","REACT_APP_USDC_REFERRAL_FEES_ADDRESS","REACT_APP_USDT_REFERRAL_FEES_ADDRESS","replace","NameRegistryState","retrieve","nameRegistryState","getTwitterRegistry","usdcAccountInfo","usdtAccountInfo","useFeesAccountsFromRefCode","useReferrer","BalancesTable","showMarket","hideWalletBalance","onSettleSuccess","title","dataIndex","render","ghost","onSettleFunds","CancelButton","Button","OpenOrderTable","onCancelSuccess","marketFilter","cancelId","setCancelId","marketFilters","orderInfos","text","filters","onFilter","record","indexOf","fontWeight","charAt","toUpperCase","sorter","showSorterTooltip","icon","DeleteOutlined","cancel","FillsTable","liquidity","Paragraph","TabPane","Tabs","Index","paddingTop","defaultActiveKey","tab","OpenOrdersTab","BalancesTab","DepositDialog","coinMint","depositCoin","onClose","baseOrQuote","providerName","providerUrl","visible","onOk","onCancel","StandaloneTokenAccountsSelect","selectedValue","label","setSelectedTokenAccounts","Fragment","width","onSelect","newSelectedTokenAccounts","Option","Text","code","offset","shape","CopyOutlined","navigator","clipboard","writeText","LinkAddress","shorten","LinkOutlined","cursor","PreferencesContext","PreferencesProvider","autoSettleEnabled","setAutoSettleEnabled","marketInfoList","currentlyFetchingMarkets","setCurrentlyFetchingMarkets","setMarkets","addToMarketsMap","marketId","autoSettle","values","autoApprove","fetchMarkets","RowBox","Tip","ActionButton","StandaloneBalancesDisplay","setBaseOrQuote","lastSettledAt","setLastSettledAt","now","formattedBalances","currency","borderColor","content","trigger","InfoCircleOutlined","align","paddingBottom","block","url","SellButton","BuyButton","sliderMarks","TradeForm","setChangeOrderRef","setSide","postOnly","setPostOnly","ioc","setIoc","baseSize","setBaseSize","quoteSize","setQuoteSize","setPrice","submitting","setSubmitting","sizeFraction","setSizeFraction","quoteBalance","baseBalance","sizeDecimalCount","priceDecimalCount","doChangeOrder","onSliderChange","updateSizeFraction","warmUpCache","findBestFeeDiscountKey","onSetBaseSize","usePrice","rawQuoteSize","rawMaxSize","maxSize","parseFloat","newSize","formatted","onSubmit","flexDirection","Group","onChange","buttonStyle","background","addonBefore","suffix","fontSize","compact","rawBaseSize","onSetQuoteSize","tipFormatter","marks","checked","disabled","PublicTrades","marginTop","minHeight","maxHeight","paddingRight","overflowY","toLocaleTimeString","DeprecatedMarketsInstructions","switchToLiveMarkets","needToCancelOrders","filteredBalances","needToSettleFunds","CustomMarketDialog","onAddCustomMarket","setMarketId","marketLabel","setMarketLabel","setBaseLabel","setQuoteLabel","loadingMarket","setLoadingMarket","wellFormedMarketId","marketAccountInfo","resetLabels","finally","knownMarket","knownProgram","knownBaseCurrency","knownQuoteCurrency","canSubmit","onDoClose","okText","okButtonProps","placeholder","LoadingOutlined","gutter","TVChartContainer","Select","OptGroup","TradePage","useParams","history","useHistory","TradePageInner","handleDeprecated","setHandleDeprecated","addMarketVisible","setAddMarketVisible","deprecatedMarkets","window","innerHeight","innerWidth","dimensions","setDimensions","document","changeOrderRef","handleResize","addEventListener","removeEventListener","componentProps","onChangeOrderRef","component","customMarket","newCustomMarkets","paddingLeft","MarketSelector","onDeleteCustomMarket","PlusCircleOutlined","extractBase","extractQuote","selectedMarket","proposedMarket","showSearch","optionFilterProp","listHeight","filterOption","option","toLowerCase","stopPropagation","nativeEvent","stopImmediatePropagation","nanoid","DeprecatedMarketsPage","RenderNormal","flexWrap","RenderSmall","RenderSmaller","xs","sm","WalletConnect","connect","disconnect","select","wallets","isModalVisible","setIsModalVisible","publicKeyString","menu","Item","v","overlay","alt","src","OpenOrdersPage","marketAddressesToNames","WalletBalancesTable","walletBalances","tokenAccountsConnected","allMarketsConnected","settlingFunds","setSettlingFunds","walletBalance","BalancesPage","mintToTickers","useMintToTickers","openOrdersFree","openOrdersTotal","Settings","usePreferences","CustomClusterEndpointDialog","testingConnection","onAddCustomEndpoint","customEndpoint","setCustomEndpoint","customEndpointName","setCustomEndpointName","LogoWrapper","EXTERNAL_LINKS","TopBar","addEndpointVisible","setAddEndpointVisible","setTestingConnection","location","useLocation","searchFocussed","handleClick","endpointInfoCustom","handler","tradePageUrl","pathname","handleError","getBlockTime","newCustomEndpoints","mode","selectedKeys","borderBottom","margin","SettingOutlined","Footer","Layout","useBreakpoint","Grid","footerElements","CustomFooter","lg","elem","Header","Content","BasicLayout","search","queryString","useMintInput","tooltip","forceSymbols","setAddress","options","ticker","validateStatus","hasFeedback","help","parseTokenMintData","initialized","ListNewMarketPage","baseMintInput","quoteMintInput","lotSize","setLotSize","setTickSize","isLoading","estimatedRent","setEstimatedRent","listedMarket","setListedMarket","rent","labelCol","wrapperCol","layout","onFinish","QuestionCircleOutlined","initialValue","Boolean","trim","direction","colon","htmlType","MINT_ADDRESS_BY_SYMBOL","FAUCET_ADDRESS_BY_SYMBOL","USDC","BTC","AirdropPage","walletContext","ethAmount","setEthAmount","usdcAmount","setUsdcAmount","customAmount","setCustomAmount","customMintAddress","setCustomMintAddress","handleNativeAirdrop","handleTokenAirdrop","requestAirdrop","LAMPORTS_PER_SOL","sig","symbol","customMint","theMint","ataAddress","max","setMintAddress","maxAirdrop","setMaxAirdrop","setFaucetAddress","maxAirdropNum","MintTokenPage","shouldCreateFaucet","setShouldCreateFaucet","setDecimals","setToken","faucet","setFaucet","numDecimals","walletPk","mintKeypair","Keypair","generate","ataPk","getMinimumBalanceForRentExemptMint","getLatestBlockhashAndContext","latestBlockhash","feePayer","MintLayout","createInitializeMintInstruction","createMintToInstruction","signature","confirmTransaction","valuePropName","Routes","basename","exact","FaucetPage","AppImpl","network","SolletWalletAdapter","SolletExtensionWalletAdapter","LedgerWalletAdapter","SolflareWalletAdapter","PhantomWalletAdapter","MathWalletAdapter","updateState","WalletProvider","autoConnect","fallback","App","hostname","match","ReactDOM","StrictMode","getElementById","serviceWorker","ready","registration","unregister","pageLoadTime","globalCache","FetchLoopListener","refreshIntervalOnError","cacheNullValues","FetchLoopInternal","timeoutId","listeners","errors","stopped","errored","notifyListeners","waitTime","timeSincePageLoad","visibilityState","hasFocus","refreshIntervalsOnError","previousRefreshInterval","globalLoops","loops","addListener","loop","removeListener","asyncFn","useReducer","rerender","initializeOnly","ACCOUNT_LAYOUT","BufferLayout","MINT_LAYOUT","supply","getOwnedAccountsFilters","memcmp","offsetOf","bytes","dataSize","getOwnedTokenAccounts","getProgramAccounts","resp","ownerAddress","splAccounts","parsedSplAccounts","allMints","uniqueMints","stringMint","getAllMintInfo"],"mappings":"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","file":"static/js/main.cfd977ee.chunk.js","sourcesContent":["import React from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nexport default function Link({ external = false, ...props }) {\n let { to, children, ...rest } = props;\n if (external) {\n return (\n \n {children}\n \n );\n }\n return (\n \n {children}\n \n );\n}\n","import { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport { Wallet } from '@solana/wallet-adapter-react';\nimport { getMint, createSetAuthorityInstruction, AuthorityType } from '@solana/spl-token';\nimport {\n Account,\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport { sendTransaction } from './send';\nimport { BN } from 'bn.js';\nimport { TOKEN_PROGRAM_ID } from './tokens';\n\nexport const FAUCET_PROGRAM_ID = new PublicKey(\n 'HjzG5cCQnEc6vx5iRQVpJtaxd1wDwcxLtVoyMvRJD6UC',\n);\n\nconst COMMITMENT = 'confirmed';\n\nconst FAUCET_SIZE = 77;\n\nconst getPDA = () =>\n PublicKey.findProgramAddress([Buffer.from('faucet')], FAUCET_PROGRAM_ID);\n\nconst getMintPubkeyFromTokenAccountPubkey = async (\n connection: Connection,\n tokenAccountPubkey: PublicKey,\n) => {\n try {\n const tokenMintData = (\n await connection.getParsedAccountInfo(tokenAccountPubkey, COMMITMENT)\n ).value!.data;\n //@ts-expect-error (doing the data parsing into steps so this ignore line is not moved around by formatting)\n const tokenMintAddress = tokenMintData.parsed.info.mint;\n\n return new PublicKey(tokenMintAddress);\n } catch (err) {\n throw new Error(\n 'Error calculating mint address from token account. Are you sure you inserted a valid token account address',\n );\n }\n};\n\nexport const inspectFaucet = async (\n connection: Connection,\n faucetAddress: string,\n) => {\n try {\n const faucetKey = new PublicKey(faucetAddress);\n const rawFaucetData = await connection.getParsedAccountInfo(faucetKey);\n const faucetArray = [...(rawFaucetData.value?.data as Buffer)];\n const mintPubkey = new PublicKey(faucetArray.slice(45, 77));\n const adminKey: null | PublicKey = faucetArray[1]\n ? new PublicKey(faucetArray.slice(5, 37))\n : null;\n const permittedAmount = new BN(faucetArray.slice(37, 45), undefined, 'le');\n return {\n faucetKey: faucetKey.toBase58(),\n mintPubkey: mintPubkey.toBase58(),\n adminKey: adminKey?.toBase58(),\n permittedAmount: permittedAmount.toString(10),\n };\n } catch (err) {\n throw new Error(\n `Are you sure there is a faucet at this address? If yes, just try again.`,\n );\n }\n};\n\nconst buildCreateFaucetIx = (\n tokenMintPublicKey: PublicKey,\n faucetAccountPublicKey: PublicKey,\n amount: any,\n adminAddress: string | undefined,\n) => {\n const keys = [\n { pubkey: tokenMintPublicKey, isSigner: false, isWritable: false },\n {\n pubkey: faucetAccountPublicKey,\n isSigner: false,\n isWritable: true,\n },\n { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false },\n ];\n\n if (adminAddress) {\n keys.push({\n pubkey: new PublicKey(adminAddress),\n isSigner: false,\n isWritable: false,\n });\n }\n\n return new TransactionInstruction({\n programId: FAUCET_PROGRAM_ID,\n data: Buffer.from([0, ...amount.toArray('le', 8)]),\n keys,\n });\n};\n\nexport const createFaucet = async (\n connection: Connection,\n wallet: Wallet,\n tokenMintAddress: string,\n amount: any,\n adminAddress: string | undefined,\n) => {\n const tokenMintPublicKey = new PublicKey(tokenMintAddress);\n const faucetAcc = new Account();\n\n const createFaucetIx = buildCreateFaucetIx(\n tokenMintPublicKey,\n faucetAcc.publicKey,\n amount,\n adminAddress,\n );\n\n const createAccIx = SystemProgram.createAccount({\n fromPubkey: wallet.adapter.publicKey!,\n newAccountPubkey: faucetAcc.publicKey,\n programId: FAUCET_PROGRAM_ID,\n space: FAUCET_SIZE,\n lamports: await connection.getMinimumBalanceForRentExemption(\n FAUCET_SIZE,\n COMMITMENT,\n ),\n });\n\n const transferAuthorityIx = createSetAuthorityInstruction(\n tokenMintPublicKey,\n wallet.adapter.publicKey!,\n AuthorityType.MintTokens,\n (await getPDA())[0],\n );\n\n const mintInfo = await getMint(connection, new PublicKey(tokenMintPublicKey));\n\n const transaction = new Transaction();\n transaction.add(createAccIx);\n if (!mintInfo.mintAuthority!.equals((await getPDA())[0])) {\n transaction.add(transferAuthorityIx);\n }\n transaction.add(createFaucetIx);\n\n await sendTransaction({\n connection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n transaction,\n signers: [faucetAcc],\n });\n\n return faucetAcc.publicKey.toBase58();\n};\n\nexport const buildAirdropTokensIx = async (\n amount: any,\n adminPubkey: PublicKey | null,\n tokenMintPublicKey: PublicKey,\n destinationAccountPubkey: PublicKey,\n faucetPubkey: PublicKey,\n) => {\n const pubkeyNonce = await getPDA();\n\n const keys = [\n { pubkey: pubkeyNonce[0], isSigner: false, isWritable: false },\n {\n pubkey: tokenMintPublicKey,\n isSigner: false,\n isWritable: true,\n },\n { pubkey: destinationAccountPubkey, isSigner: false, isWritable: true },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: faucetPubkey, isSigner: false, isWritable: false },\n ];\n\n if (adminPubkey) {\n keys.push({\n pubkey: adminPubkey,\n isSigner: true,\n isWritable: false,\n });\n }\n\n return new TransactionInstruction({\n programId: FAUCET_PROGRAM_ID,\n data: Buffer.from([1, ...amount.toArray('le', 8)]),\n keys,\n });\n};\n\nexport const airdropTokens = async (\n connection: Connection,\n wallet: Wallet,\n faucetAddress: string,\n tokenDestinationAddress: string,\n amount: any,\n) => {\n const tokenDestinationPublicKey = new PublicKey(tokenDestinationAddress);\n const faucetPubkey = new PublicKey(faucetAddress);\n const tokenMintPubkey = await getMintPubkeyFromTokenAccountPubkey(\n connection,\n tokenDestinationPublicKey,\n );\n\n const ix = await buildAirdropTokensIx(\n amount,\n wallet.adapter.publicKey,\n tokenMintPubkey,\n tokenDestinationPublicKey,\n faucetPubkey,\n );\n\n const transaction = new Transaction();\n transaction.add(ix);\n\n await sendTransaction({\n connection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n transaction,\n });\n\n return tokenDestinationPublicKey.toBase58();\n};\n\nexport const airdropTokensKeypair = async (\n connection: Connection,\n wallet: Keypair,\n faucetAddress: string,\n tokenDestinationAddress: string,\n amount: any,\n) => {\n const tokenDestinationPublicKey = new PublicKey(tokenDestinationAddress);\n const faucetPubkey = new PublicKey(faucetAddress);\n const tokenMintPubkey = await getMintPubkeyFromTokenAccountPubkey(\n connection,\n tokenDestinationPublicKey,\n );\n\n const ix = await buildAirdropTokensIx(\n amount,\n wallet.publicKey,\n tokenMintPubkey,\n tokenDestinationPublicKey,\n faucetPubkey,\n );\n\n const transaction = new Transaction();\n transaction.add(ix);\n\n const sig = await connection.sendTransaction(transaction, [wallet]);\n\n return tokenDestinationPublicKey.toBase58();\n};\n\nconst buildCloseFaucetIx = async (\n connection: Connection,\n adminPubkey: PublicKey,\n faucetPubkey: PublicKey,\n destPubkey: PublicKey,\n) => {\n const rawFaucetData = await connection.getParsedAccountInfo(faucetPubkey);\n const mintPubkey = new PublicKey(\n [...(rawFaucetData.value?.data as Buffer)].slice(45),\n );\n \n const keys = [\n { pubkey: adminPubkey, isSigner: true, isWritable: false },\n {\n pubkey: faucetPubkey,\n isSigner: false,\n isWritable: true,\n },\n { pubkey: destPubkey, isSigner: false, isWritable: true },\n { pubkey: mintPubkey, isSigner: false, isWritable: true },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: (await getPDA())[0], isSigner: false, isWritable: false },\n ];\n\n return new TransactionInstruction({\n programId: FAUCET_PROGRAM_ID,\n data: Buffer.from([2]),\n keys,\n });\n};\n\nexport const closeFaucet = async (\n connection: Connection,\n wallet: Wallet,\n faucetAddress: string,\n destAddress: string,\n) => {\n const destPubkey = new PublicKey(destAddress);\n const faucetPubkey = new PublicKey(faucetAddress);\n\n const closeFaucetIx = await buildCloseFaucetIx(\n connection,\n wallet.adapter.publicKey!,\n faucetPubkey,\n destPubkey,\n );\n const transaction = new Transaction();\n transaction.add(closeFaucetIx);\n\n await sendTransaction({\n connection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n transaction,\n });\n\n return faucetPubkey.toBase58();\n};\n","import { BonfidaTrade as ExternalAPITrade } from './types';\n\nexport default class AlephApi {\n static URL: string = 'https://openbook.api.aleph.cloud/';\n\n static async get(\n path: string,\n query: string,\n variables?: any,\n ): Promise {\n try {\n const response = await fetch(this.URL + path, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n query,\n variables,\n }),\n });\n\n if (response.ok) {\n const responseJson = await response.json();\n\n return responseJson.data ? responseJson.data : null;\n }\n } catch (err) {\n console.log(`Error fetching from Aleph API ${path}: ${err}`);\n }\n return null;\n }\n\n static async getRecentTrades(\n marketAddress: string,\n ): Promise {\n return (\n await AlephApi.get<{\n market: {\n address: string;\n stats: {\n change1h: number;\n change1hUsd: number;\n price: number;\n priceUsd: number;\n trades24h: number;\n };\n };\n publicTrades: [\n {\n baseAmount: string;\n makerFeeOrRebateAmount: string;\n makerOrderId: string;\n price: number;\n quoteAmount: string;\n side: 'buy' | 'sell';\n takerFeeOrRebateAmount: string;\n takerOrderId: string;\n timestamp: number;\n },\n ];\n }>(\n `graphql`,\n `\n {\n market(address: \"${marketAddress}\") {\n address\n stats {\n price\n priceUsd\n change1h\n change1hUsd\n trades24h\n }\n }\n publicTrades(market: \"${marketAddress}\", limit: 100) {\n price\n timestamp\n makerFeeOrRebateAmount\n takerFeeOrRebateAmount\n baseAmount\n quoteAmount\n makerOrderId\n takerOrderId\n side\n }\n }\n `,\n {\n marketAddress,\n },\n )\n )?.publicTrades.map((trade) => {\n return {\n market: marketAddress,\n size: Number(trade.baseAmount),\n price: trade.price,\n orderId: trade.takerOrderId,\n time: trade.timestamp,\n side: trade.side,\n feeCost: Number(trade.takerFeeOrRebateAmount),\n marketAddress: marketAddress,\n };\n });\n }\n}\n","import {\n Market,\n OpenOrders,\n Orderbook,\n TokenInstructions,\n} from '@openbook-dex/openbook';\nimport { PublicKey } from '@solana/web3.js';\nimport React, { useContext, useEffect, useState } from 'react';\nimport {\n divideBnToNumber,\n floorToDecimal,\n getTokenMultiplierFromDecimals,\n sleep,\n useLocalStorageState,\n} from './utils';\nimport { refreshCache, useAsyncData } from './fetch-loop';\nimport { useAccountData, useAccountInfo, useConnection } from './connection';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport tuple from 'immutable-tuple';\nimport { notify } from './notifications';\nimport BN from 'bn.js';\nimport {\n getTokenAccountInfo,\n parseTokenAccountData,\n useMintInfos,\n} from './tokens';\nimport {\n Balances,\n CustomMarketInfo,\n DeprecatedOpenOrdersBalances,\n FullMarketInfo,\n MarketContextValues,\n MarketInfo,\n OrderWithMarketAndMarketName,\n SelectedTokenAccounts,\n TokenAccount,\n} from './types';\nimport { WRAPPED_SOL_MINT } from '@openbook-dex/openbook/lib/token-instructions';\nimport { Order } from '@openbook-dex/openbook/lib/market';\nimport AlephApi from './alephConnector';\nimport { MARKETS, TOKENS } from './constants';\n\nexport async function runMarketUpdate() {}\n\nexport function useMarketsList() {\n return MARKETS.filter(\n ({ name, deprecated }) =>\n !deprecated && !process.env.REACT_APP_EXCLUDE_MARKETS?.includes(name),\n );\n}\n\nexport function useAllMarkets() {\n const connection = useConnection();\n const { customMarkets } = useCustomMarkets();\n\n const getAllMarkets = async () => {\n const markets: Array<{\n market: Market;\n marketName: string;\n programId: PublicKey;\n } | null> = await Promise.all(\n getMarketInfos(customMarkets).map(async (marketInfo) => {\n try {\n const market = await Market.load(\n connection,\n marketInfo.address,\n {},\n marketInfo.programId,\n );\n return {\n market,\n marketName: marketInfo.name,\n programId: marketInfo.programId,\n };\n } catch (e: any) {\n notify({\n message: 'Error loading all market',\n description: e.message,\n type: 'error',\n });\n return null;\n }\n }),\n );\n return markets.filter(\n (m): m is { market: Market; marketName: string; programId: PublicKey } =>\n !!m,\n );\n };\n return useAsyncData(\n getAllMarkets,\n tuple('getAllMarkets', customMarkets.length, connection),\n { refreshInterval: _VERY_SLOW_REFRESH_INTERVAL },\n );\n}\n\nexport function useUnmigratedOpenOrdersAccounts() {\n const connection = useConnection();\n const { publicKey } = useWallet();\n\n async function getUnmigratedOpenOrdersAccounts(): Promise {\n if (!connection || !publicKey) {\n return [];\n }\n console.log('refreshing useUnmigratedOpenOrdersAccounts');\n let deprecatedOpenOrdersAccounts: OpenOrders[] = [];\n const deprecatedProgramIds = Array.from(\n new Set(\n MARKETS.filter(({ deprecated }) => deprecated).map(({ programId }) =>\n programId.toBase58(),\n ),\n ),\n ).map((publicKeyStr) => new PublicKey(publicKeyStr));\n let programId: PublicKey;\n for (programId of deprecatedProgramIds) {\n try {\n const openOrdersAccounts = await OpenOrders.findForOwner(\n connection,\n publicKey,\n programId,\n );\n deprecatedOpenOrdersAccounts = deprecatedOpenOrdersAccounts.concat(\n openOrdersAccounts\n .filter(\n (openOrders) =>\n openOrders.baseTokenTotal.toNumber() ||\n openOrders.quoteTokenTotal.toNumber(),\n )\n .filter((openOrders) =>\n MARKETS.some(\n (market) =>\n market.deprecated && market.address.equals(openOrders.market),\n ),\n ),\n );\n } catch (e: any) {\n console.log(\n 'Error loading deprecated markets',\n programId?.toBase58(),\n e.message,\n );\n }\n }\n // Maybe sort\n return deprecatedOpenOrdersAccounts;\n }\n\n const cacheKey = tuple(\n 'getUnmigratedOpenOrdersAccounts',\n connection,\n publicKey?.toBase58(),\n );\n const [accounts] = useAsyncData(getUnmigratedOpenOrdersAccounts, cacheKey, {\n refreshInterval: _VERY_SLOW_REFRESH_INTERVAL,\n });\n\n return {\n accounts,\n refresh: (clearCache: boolean) => refreshCache(cacheKey, clearCache),\n };\n}\n\nconst MarketContext: React.Context =\n React.createContext(null);\n\nconst _VERY_SLOW_REFRESH_INTERVAL = 5000 * 1000;\n\n// For things that don't really change\nconst _SLOW_REFRESH_INTERVAL = 5 * 1000;\n\n// For things that change frequently\nconst _FAST_REFRESH_INTERVAL = 1000;\n\nexport const DEFAULT_MARKET = MARKETS.find(\n ({ name, deprecated }) => name === 'ETH/USDC' && !deprecated,\n);\n\nexport function getMarketDetails(\n market: Market | undefined | null,\n customMarkets: CustomMarketInfo[],\n): FullMarketInfo {\n if (!market) {\n return {};\n }\n const marketInfos = getMarketInfos(customMarkets);\n const marketInfo = marketInfos.find((otherMarket) =>\n otherMarket.address.equals(market.address),\n );\n const baseCurrency =\n (market?.baseMintAddress &&\n TOKENS.find((token) => token.address.equals(market.baseMintAddress))\n ?.name) ||\n (marketInfo?.baseLabel && `${marketInfo?.baseLabel}*`) ||\n 'UNKNOWN';\n const quoteCurrency =\n (market?.quoteMintAddress &&\n TOKENS.find((token) => token.address.equals(market.quoteMintAddress))\n ?.name) ||\n (marketInfo?.quoteLabel && `${marketInfo?.quoteLabel}*`) ||\n 'UNKNOWN';\n\n return {\n ...marketInfo,\n marketName: marketInfo?.name,\n baseCurrency,\n quoteCurrency,\n marketInfo,\n };\n}\n\nexport function useCustomMarkets() {\n const [customMarkets, setCustomMarkets] = useLocalStorageState<\n CustomMarketInfo[]\n >('customMarkets', []);\n return { customMarkets, setCustomMarkets };\n}\n\nexport function MarketProvider({ marketAddress, setMarketAddress, children }) {\n const { customMarkets, setCustomMarkets } = useCustomMarkets();\n\n const address = marketAddress && new PublicKey(marketAddress);\n const connection = useConnection();\n const marketInfos = getMarketInfos(customMarkets);\n const marketInfo =\n address && marketInfos.find((market) => market.address.equals(address));\n\n // Replace existing market with a non-deprecated one on first load\n useEffect(() => {\n if (marketInfo && marketInfo.deprecated) {\n if (DEFAULT_MARKET) {\n setMarketAddress(DEFAULT_MARKET.address.toBase58());\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [market, setMarket] = useState();\n useEffect(() => {\n if (\n market &&\n marketInfo &&\n // @ts-ignore\n market._decoded.ownAddress?.equals(marketInfo?.address)\n ) {\n return;\n }\n setMarket(null);\n if (!marketInfo || !marketInfo.address) {\n notify({\n message: 'Error loading market',\n description: 'Please select a market from the dropdown',\n type: 'error',\n });\n return;\n }\n Market.load(connection, marketInfo.address, {}, marketInfo.programId)\n .then(setMarket)\n .catch((e) => {\n notify({\n message: 'Error loading market',\n description: e.message,\n type: 'error',\n });\n });\n // eslint-disable-next-line\n }, [connection, marketInfo]);\n\n return (\n \n {children}\n \n );\n}\n\nexport function getTradePageUrl(marketAddress?: string) {\n if (!marketAddress) {\n const saved = localStorage.getItem('marketAddress');\n if (saved) {\n marketAddress = JSON.parse(saved);\n }\n marketAddress = marketAddress || DEFAULT_MARKET?.address.toBase58() || '';\n }\n return `/market/${marketAddress}`;\n}\n\nexport function useSelectedTokenAccounts(): [\n SelectedTokenAccounts,\n (newSelectedTokenAccounts: SelectedTokenAccounts) => void,\n] {\n const [selectedTokenAccounts, setSelectedTokenAccounts] =\n useLocalStorageState('selectedTokenAccounts', {});\n return [selectedTokenAccounts, setSelectedTokenAccounts];\n}\n\nexport function useMarket() {\n const context = useContext(MarketContext);\n if (!context) {\n throw new Error('Missing market context');\n }\n return context;\n}\n\nexport function useMarkPrice() {\n const [markPrice, setMarkPrice] = useState(null);\n\n const [orderbook] = useOrderbook();\n const trades = useTrades();\n\n useEffect(() => {\n let bb = orderbook?.bids?.length > 0 && Number(orderbook.bids[0][0]);\n let ba = orderbook?.asks?.length > 0 && Number(orderbook.asks[0][0]);\n let last = trades && trades.length > 0 && trades[0].price;\n\n let markPrice =\n bb && ba\n ? last\n ? [bb, ba, last].sort((a, b) => a - b)[1]\n : (bb + ba) / 2\n : null;\n\n setMarkPrice(markPrice);\n }, [orderbook, trades]);\n\n return markPrice;\n}\n\nexport function _useUnfilteredTrades(limit = 10000) {\n const { market } = useMarket();\n const connection = useConnection();\n async function getUnfilteredTrades(): Promise {\n if (!market || !connection) {\n return null;\n }\n return await market.loadFills(connection, limit);\n }\n const [trades] = useAsyncData(\n getUnfilteredTrades,\n tuple('getUnfilteredTrades', market, connection),\n { refreshInterval: _SLOW_REFRESH_INTERVAL },\n );\n return trades;\n // NOTE: For now, websocket is too expensive since the event queue is large\n // and updates very frequently\n\n // let data = useAccountData(market && market._decoded.eventQueue);\n // if (!data) {\n // return null;\n // }\n // const events = decodeEventQueue(data, limit);\n // return events\n // .filter((event) => event.eventFlags.fill && event.nativeQuantityPaid.gtn(0))\n // .map(market.parseFillEvent.bind(market));\n}\n\nexport function useBonfidaTrades() {\n const { market } = useMarket();\n const marketAddress = market?.address.toBase58();\n\n async function getBonfidaTrades() {\n if (!marketAddress) {\n return null;\n }\n\n return await AlephApi.getRecentTrades(marketAddress);\n }\n\n return useAsyncData(\n getBonfidaTrades,\n tuple('getBonfidaTrades', marketAddress),\n { refreshInterval: _SLOW_REFRESH_INTERVAL },\n false,\n );\n}\n\nexport function useOrderbookAccounts() {\n const { market } = useMarket();\n // @ts-ignore\n let bidData = useAccountData(market && market._decoded.bids);\n // @ts-ignore\n let askData = useAccountData(market && market._decoded.asks);\n return {\n bidOrderbook: market && bidData ? Orderbook.decode(market, bidData) : null,\n askOrderbook: market && askData ? Orderbook.decode(market, askData) : null,\n };\n}\n\nexport function useOrderbook(\n depth = 20,\n): [{ bids: number[][]; asks: number[][] }, boolean] {\n const { bidOrderbook, askOrderbook } = useOrderbookAccounts();\n const { market } = useMarket();\n const bids =\n !bidOrderbook || !market\n ? []\n : bidOrderbook.getL2(depth).map(([price, size]) => [price, size]);\n const asks =\n !askOrderbook || !market\n ? []\n : askOrderbook.getL2(depth).map(([price, size]) => [price, size]);\n return [{ bids, asks }, !!bids || !!asks];\n}\n\n// Want the balances table to be fast-updating, dont want open orders to flicker\n// TODO: Update to use websocket\nexport function useOpenOrdersAccounts(fast = false) {\n const { market } = useMarket();\n const { connected, publicKey, wallet } = useWallet();\n const connection = useConnection();\n async function getOpenOrdersAccounts() {\n if (!connected || !publicKey || !wallet) {\n return null;\n }\n if (!market) {\n return null;\n }\n return await market.findOpenOrdersAccountsForOwner(connection, publicKey);\n }\n return useAsyncData(\n getOpenOrdersAccounts,\n tuple('getOpenOrdersAccounts', wallet, market, connected),\n { refreshInterval: fast ? _FAST_REFRESH_INTERVAL : _SLOW_REFRESH_INTERVAL },\n );\n}\n\nexport function useSelectedOpenOrdersAccount(fast = false) {\n const [accounts] = useOpenOrdersAccounts(fast);\n if (!accounts) {\n return null;\n }\n return accounts[0];\n}\n\nexport function useTokenAccounts(): [\n TokenAccount[] | null | undefined,\n boolean,\n] {\n const { connected, publicKey, wallet } = useWallet();\n const connection = useConnection();\n async function getTokenAccounts() {\n if (!connected || !publicKey || !wallet) {\n return null;\n }\n return await getTokenAccountInfo(connection, publicKey);\n }\n return useAsyncData(\n getTokenAccounts,\n tuple('getTokenAccounts', wallet, connected),\n { refreshInterval: _SLOW_REFRESH_INTERVAL },\n );\n}\n\nexport function getSelectedTokenAccountForMint(\n accounts: TokenAccount[] | undefined | null,\n mint: PublicKey | undefined,\n selectedPubKey?: string | PublicKey | null,\n) {\n if (!accounts || !mint) {\n return null;\n }\n const filtered = accounts.filter(\n ({ effectiveMint, pubkey }) =>\n mint.equals(effectiveMint) &&\n (!selectedPubKey ||\n (typeof selectedPubKey === 'string'\n ? selectedPubKey\n : selectedPubKey.toBase58()) === pubkey.toBase58()),\n );\n return filtered && filtered[0];\n}\n\nexport function useSelectedQuoteCurrencyAccount() {\n const [accounts] = useTokenAccounts();\n const { market } = useMarket();\n const [selectedTokenAccounts] = useSelectedTokenAccounts();\n const mintAddress = market?.quoteMintAddress;\n return getSelectedTokenAccountForMint(\n accounts,\n mintAddress,\n mintAddress && selectedTokenAccounts[mintAddress.toBase58()],\n );\n}\n\nexport function useSelectedBaseCurrencyAccount() {\n const [accounts] = useTokenAccounts();\n const { market } = useMarket();\n const [selectedTokenAccounts] = useSelectedTokenAccounts();\n const mintAddress = market?.baseMintAddress;\n return getSelectedTokenAccountForMint(\n accounts,\n mintAddress,\n mintAddress && selectedTokenAccounts[mintAddress.toBase58()],\n );\n}\n\n// TODO: Update to use websocket\nexport function useSelectedQuoteCurrencyBalances() {\n const quoteCurrencyAccount = useSelectedQuoteCurrencyAccount();\n const { market } = useMarket();\n const [accountInfo, loaded] = useAccountInfo(quoteCurrencyAccount?.pubkey);\n if (!market || !quoteCurrencyAccount || !loaded || !accountInfo) {\n return null;\n }\n if (market.quoteMintAddress.equals(TokenInstructions.WRAPPED_SOL_MINT)) {\n return accountInfo?.lamports / 1e9 ?? 0;\n }\n return market.quoteSplSizeToNumber(\n new BN(accountInfo.data.slice(64, 72), 10, 'le'),\n );\n}\n\n// TODO: Update to use websocket\nexport function useSelectedBaseCurrencyBalances() {\n const baseCurrencyAccount = useSelectedBaseCurrencyAccount();\n const { market } = useMarket();\n const [accountInfo, loaded] = useAccountInfo(baseCurrencyAccount?.pubkey);\n if (!market || !baseCurrencyAccount || !loaded || !accountInfo) {\n return null;\n }\n if (market.baseMintAddress.equals(TokenInstructions.WRAPPED_SOL_MINT)) {\n return accountInfo?.lamports / 1e9 ?? 0;\n }\n return market.baseSplSizeToNumber(\n new BN(accountInfo.data.slice(64, 72), 10, 'le'),\n );\n}\n\nexport function useOpenOrders() {\n const { market, marketName } = useMarket();\n const openOrdersAccount = useSelectedOpenOrdersAccount();\n const { bidOrderbook, askOrderbook } = useOrderbookAccounts();\n if (!market || !openOrdersAccount || !bidOrderbook || !askOrderbook) {\n return null;\n }\n return market\n .filterForOpenOrders(bidOrderbook, askOrderbook, [openOrdersAccount])\n .map((order) => ({ ...order, marketName, market }));\n}\n\nexport function useTrades(limit = 100) {\n const trades = _useUnfilteredTrades(limit);\n if (!trades) {\n return null;\n }\n // Until partial fills are each given their own fill, use maker fills\n return trades\n .filter(({ eventFlags }) => eventFlags.maker)\n .map((trade) => ({\n ...trade,\n side: trade.side === 'buy' ? 'sell' : 'buy',\n }));\n}\n\nexport function useLocallyStoredFeeDiscountKey(): {\n storedFeeDiscountKey: PublicKey | undefined;\n setStoredFeeDiscountKey: (key: string) => void;\n} {\n const [storedFeeDiscountKey, setStoredFeeDiscountKey] =\n useLocalStorageState(`feeDiscountKey`, undefined);\n return {\n storedFeeDiscountKey: storedFeeDiscountKey\n ? new PublicKey(storedFeeDiscountKey)\n : undefined,\n setStoredFeeDiscountKey,\n };\n}\n\nexport function useFeeDiscountKeys(): [\n (\n | {\n pubkey: PublicKey;\n feeTier: number;\n balance: number;\n mint: PublicKey;\n }[]\n | null\n | undefined\n ),\n boolean,\n] {\n const { market } = useMarket();\n const { connected, publicKey, wallet } = useWallet();\n const connection = useConnection();\n const { setStoredFeeDiscountKey } = useLocallyStoredFeeDiscountKey();\n let getFeeDiscountKeys = async () => {\n if (!connected || !publicKey || !wallet) {\n return null;\n }\n if (!market) {\n return null;\n }\n const feeDiscountKey = await market.findFeeDiscountKeys(\n connection,\n publicKey,\n );\n if (feeDiscountKey) {\n setStoredFeeDiscountKey(feeDiscountKey[0].pubkey.toBase58());\n }\n return feeDiscountKey;\n };\n return useAsyncData(\n getFeeDiscountKeys,\n tuple('getFeeDiscountKeys', wallet, market, connected),\n { refreshInterval: _SLOW_REFRESH_INTERVAL },\n );\n}\n\nexport function useFills(limit = 100) {\n const { marketName } = useMarket();\n const fills = _useUnfilteredTrades(limit);\n const [openOrdersAccounts] = useOpenOrdersAccounts();\n if (!openOrdersAccounts || openOrdersAccounts.length === 0) {\n return null;\n }\n if (!fills) {\n return null;\n }\n return fills\n .filter((fill) =>\n openOrdersAccounts.some((openOrdersAccount) =>\n fill.openOrders.equals(openOrdersAccount.publicKey),\n ),\n )\n .map((fill) => ({ ...fill, marketName }));\n}\n\nexport function useAllOpenOrdersAccounts() {\n const { connected, publicKey } = useWallet();\n const connection = useConnection();\n const marketInfos = useMarketInfos();\n const programIds = [\n ...new Set(marketInfos.map((info) => info.programId.toBase58())),\n ].map((stringProgramId) => new PublicKey(stringProgramId));\n\n const getAllOpenOrdersAccounts = async () => {\n if (!connected || !publicKey) {\n return [];\n }\n return (\n await Promise.all(\n programIds.map((programId) =>\n OpenOrders.findForOwner(connection, publicKey, programId),\n ),\n )\n ).flat();\n };\n return useAsyncData(\n getAllOpenOrdersAccounts,\n tuple(\n 'getAllOpenOrdersAccounts',\n connection,\n connected,\n publicKey?.toBase58(),\n marketInfos.length,\n (programIds || []).length,\n ),\n { refreshInterval: _SLOW_REFRESH_INTERVAL },\n );\n}\n\nexport function useAllOpenOrdersBalances() {\n const [openOrdersAccounts, loadedOpenOrdersAccounts] =\n useAllOpenOrdersAccounts();\n const [mintInfos, mintInfosConnected] = useMintInfos();\n const [allMarkets] = useAllMarkets();\n if (!loadedOpenOrdersAccounts || !mintInfosConnected) {\n return {};\n }\n\n const marketsByAddress = Object.fromEntries(\n (allMarkets || []).map((m) => [m.market.address.toBase58(), m]),\n );\n const openOrdersBalances: {\n [mint: string]: { market: PublicKey; free: number; total: number }[];\n } = {};\n for (let account of openOrdersAccounts || []) {\n const marketInfo = marketsByAddress[account.market.toBase58()];\n const baseMint = marketInfo?.market.baseMintAddress.toBase58();\n const quoteMint = marketInfo?.market.quoteMintAddress.toBase58();\n if (!(baseMint in openOrdersBalances)) {\n openOrdersBalances[baseMint] = [];\n }\n if (!(quoteMint in openOrdersBalances)) {\n openOrdersBalances[quoteMint] = [];\n }\n\n const baseMintInfo = mintInfos && mintInfos[baseMint];\n const baseFree = divideBnToNumber(\n new BN(account.baseTokenFree),\n getTokenMultiplierFromDecimals(baseMintInfo?.decimals || 0),\n );\n const baseTotal = divideBnToNumber(\n new BN(account.baseTokenTotal),\n getTokenMultiplierFromDecimals(baseMintInfo?.decimals || 0),\n );\n const quoteMintInfo = mintInfos && mintInfos[quoteMint];\n const quoteFree = divideBnToNumber(\n new BN(account.quoteTokenFree),\n getTokenMultiplierFromDecimals(quoteMintInfo?.decimals || 0),\n );\n const quoteTotal = divideBnToNumber(\n new BN(account.quoteTokenTotal),\n getTokenMultiplierFromDecimals(quoteMintInfo?.decimals || 0),\n );\n\n openOrdersBalances[baseMint].push({\n market: account.market,\n free: baseFree,\n total: baseTotal,\n });\n openOrdersBalances[quoteMint].push({\n market: account.market,\n free: quoteFree,\n total: quoteTotal,\n });\n }\n return openOrdersBalances;\n}\n\nexport const useAllOpenOrders = (): {\n openOrders: { orders: Order[]; marketAddress: string }[] | null | undefined;\n loaded: boolean;\n refreshOpenOrders: () => void;\n} => {\n const connection = useConnection();\n const { connected, publicKey } = useWallet();\n const [loaded, setLoaded] = useState(false);\n const [refresh, setRefresh] = useState(0);\n const [openOrders, setOpenOrders] = useState<\n { orders: Order[]; marketAddress: string }[] | null | undefined\n >(null);\n const [lastRefresh, setLastRefresh] = useState(0);\n\n const refreshOpenOrders = () => {\n if (new Date().getTime() - lastRefresh > 10 * 1000) {\n setRefresh((prev) => prev + 1);\n } else {\n console.log('not refreshing');\n }\n };\n\n useEffect(() => {\n if (connected && publicKey) {\n const getAllOpenOrders = async () => {\n setLoaded(false);\n const _openOrders: { orders: Order[]; marketAddress: string }[] = [];\n const getOpenOrdersForMarket = async (marketInfo: MarketInfo) => {\n await sleep(1000 * Math.random()); // Try not to hit rate limit\n try {\n const market = await Market.load(\n connection,\n marketInfo.address,\n undefined,\n marketInfo.programId,\n );\n const orders = await market.loadOrdersForOwner(\n connection,\n publicKey,\n 30000,\n );\n _openOrders.push({\n orders: orders,\n marketAddress: marketInfo.address.toBase58(),\n });\n } catch (e: any) {\n console.warn(`Error loading open order ${marketInfo.name} - ${e}`);\n }\n };\n await Promise.all(MARKETS.map((m) => getOpenOrdersForMarket(m)));\n setOpenOrders(_openOrders);\n setLastRefresh(new Date().getTime());\n setLoaded(true);\n };\n getAllOpenOrders();\n }\n }, [connection, connected, refresh, publicKey]);\n return {\n openOrders: openOrders,\n loaded: loaded,\n refreshOpenOrders: refreshOpenOrders,\n };\n};\n\nexport function useBalances(): Balances[] {\n const baseCurrencyBalances = useSelectedBaseCurrencyBalances();\n const quoteCurrencyBalances = useSelectedQuoteCurrencyBalances();\n const openOrders = useSelectedOpenOrdersAccount(true);\n const { baseCurrency, quoteCurrency, market } = useMarket();\n const baseExists =\n openOrders && openOrders.baseTokenTotal && openOrders.baseTokenFree;\n const quoteExists =\n openOrders && openOrders.quoteTokenTotal && openOrders.quoteTokenFree;\n if (\n baseCurrency === 'UNKNOWN' ||\n quoteCurrency === 'UNKNOWN' ||\n !baseCurrency ||\n !quoteCurrency\n ) {\n return [];\n }\n return [\n {\n market,\n key: `${baseCurrency}${quoteCurrency}${baseCurrency}`,\n coin: baseCurrency,\n wallet: baseCurrencyBalances,\n orders:\n baseExists && market && openOrders\n ? market.baseSplSizeToNumber(\n openOrders.baseTokenTotal.sub(openOrders.baseTokenFree),\n )\n : null,\n openOrders,\n unsettled:\n baseExists && market && openOrders\n ? market.baseSplSizeToNumber(openOrders.baseTokenFree)\n : null,\n },\n {\n market,\n key: `${quoteCurrency}${baseCurrency}${quoteCurrency}`,\n coin: quoteCurrency,\n wallet: quoteCurrencyBalances,\n openOrders,\n orders:\n quoteExists && market && openOrders\n ? market.quoteSplSizeToNumber(\n openOrders.quoteTokenTotal.sub(openOrders.quoteTokenFree),\n )\n : null,\n unsettled:\n quoteExists && market && openOrders\n ? market.quoteSplSizeToNumber(openOrders.quoteTokenFree)\n : null,\n },\n ];\n}\n\nexport function useWalletBalancesForAllMarkets(): {\n mint: string;\n balance: number;\n}[] {\n const [tokenAccounts] = useTokenAccounts();\n const { connected } = useWallet();\n const [mintInfos, mintInfosConnected] = useMintInfos();\n\n if (!connected || !mintInfosConnected) {\n return [];\n }\n\n let balances: { [mint: string]: number } = {};\n for (let account of tokenAccounts || []) {\n if (!account.account) {\n continue;\n }\n let parsedAccount;\n if (account.effectiveMint.equals(WRAPPED_SOL_MINT)) {\n parsedAccount = {\n mint: WRAPPED_SOL_MINT,\n owner: account.pubkey,\n amount: account.account.lamports,\n };\n } else {\n parsedAccount = parseTokenAccountData(account.account.data);\n }\n if (!(parsedAccount.mint.toBase58() in balances)) {\n balances[parsedAccount.mint.toBase58()] = 0;\n }\n const mintInfo = mintInfos && mintInfos[parsedAccount.mint.toBase58()];\n const additionalAmount = divideBnToNumber(\n new BN(parsedAccount.amount),\n getTokenMultiplierFromDecimals(mintInfo?.decimals || 0),\n );\n balances[parsedAccount.mint.toBase58()] += additionalAmount;\n }\n return Object.entries(balances).map(([mint, balance]) => {\n return { mint, balance };\n });\n}\n\nexport function useUnmigratedDeprecatedMarkets() {\n const connection = useConnection();\n const { accounts } = useUnmigratedOpenOrdersAccounts();\n const marketsList =\n accounts &&\n Array.from(new Set(accounts.map((openOrders) => openOrders.market)));\n const deps = marketsList && marketsList.map((m) => m.toBase58());\n\n const useUnmigratedDeprecatedMarketsInner = async () => {\n if (!marketsList) {\n return null;\n }\n const getMarket = async (address) => {\n const marketInfo = MARKETS.find((market) =>\n market.address.equals(address),\n );\n if (!marketInfo) {\n console.log('Failed loading market');\n notify({\n message: 'Error loading market',\n type: 'error',\n });\n return null;\n }\n try {\n console.log('Loading market', marketInfo.name);\n // NOTE: Should this just be cached by (connection, marketInfo.address, marketInfo.programId)?\n return await Market.load(\n connection,\n marketInfo.address,\n {},\n marketInfo.programId,\n );\n } catch (e: any) {\n console.log('Failed loading market', marketInfo.name, e);\n notify({\n message: 'Error loading market',\n description: e.message,\n type: 'error',\n });\n return null;\n }\n };\n return (await Promise.all(marketsList.map(getMarket))).filter((x) => x);\n };\n const [markets] = useAsyncData(\n useUnmigratedDeprecatedMarketsInner,\n tuple(\n 'useUnmigratedDeprecatedMarketsInner',\n connection,\n deps && deps.toString(),\n ),\n { refreshInterval: _VERY_SLOW_REFRESH_INTERVAL },\n );\n if (!markets) {\n return null;\n }\n return markets.map((market) => ({\n market,\n openOrdersList: accounts?.filter(\n (openOrders) => market && openOrders.market.equals(market.address),\n ),\n }));\n}\n\nexport function useGetOpenOrdersForDeprecatedMarkets(): {\n openOrders: OrderWithMarketAndMarketName[] | null | undefined;\n loaded: boolean;\n refreshOpenOrders: () => void;\n} {\n const { connected, publicKey, wallet } = useWallet();\n const { customMarkets } = useCustomMarkets();\n const connection = useConnection();\n const marketsAndOrders = useUnmigratedDeprecatedMarkets();\n const marketsList =\n marketsAndOrders && marketsAndOrders.map(({ market }) => market);\n\n // This isn't quite right: open order balances could change\n const deps =\n marketsList &&\n marketsList\n .filter((market): market is Market => !!market)\n .map((market) => market.address.toBase58());\n\n async function getOpenOrdersForDeprecatedMarkets() {\n if (!connected || !publicKey) {\n return null;\n }\n if (!marketsList) {\n return null;\n }\n console.log('refreshing getOpenOrdersForDeprecatedMarkets');\n const getOrders = async (market: Market | null) => {\n if (!market) {\n return null;\n }\n const { marketName } = getMarketDetails(market, customMarkets);\n try {\n console.log('Fetching open orders for', marketName);\n // Can do better than this, we have the open orders accounts already\n return (await market.loadOrdersForOwner(connection, publicKey)).map(\n (order) => ({ marketName, market, ...order }),\n );\n } catch (e: any) {\n console.log('Failed loading open orders', market.address.toBase58(), e);\n notify({\n message: `Error loading open orders for deprecated ${marketName}`,\n description: e.message,\n type: 'error',\n });\n return null;\n }\n };\n return (await Promise.all(marketsList.map(getOrders)))\n .filter((x): x is OrderWithMarketAndMarketName[] => !!x)\n .flat();\n }\n\n const cacheKey = tuple(\n 'getOpenOrdersForDeprecatedMarkets',\n connected,\n connection,\n wallet,\n deps && deps.toString(),\n );\n const [openOrders, loaded] = useAsyncData(\n getOpenOrdersForDeprecatedMarkets,\n cacheKey,\n {\n refreshInterval: _VERY_SLOW_REFRESH_INTERVAL,\n },\n );\n console.log('openOrders', openOrders);\n return {\n openOrders,\n loaded,\n refreshOpenOrders: () => refreshCache(cacheKey),\n };\n}\n\nexport function useBalancesForDeprecatedMarkets() {\n const markets = useUnmigratedDeprecatedMarkets();\n const [customMarkets] = useLocalStorageState(\n 'customMarkets',\n [],\n );\n if (!markets) {\n return null;\n }\n\n const openOrderAccountBalances: DeprecatedOpenOrdersBalances[] = [];\n markets.forEach(({ market, openOrdersList }) => {\n const { baseCurrency, quoteCurrency, marketName } = getMarketDetails(\n market,\n customMarkets,\n );\n if (!baseCurrency || !quoteCurrency || !market) {\n return;\n }\n (openOrdersList || []).forEach((openOrders) => {\n const inOrdersBase =\n openOrders?.baseTokenTotal &&\n openOrders?.baseTokenFree &&\n market.baseSplSizeToNumber(\n openOrders.baseTokenTotal.sub(openOrders.baseTokenFree),\n );\n const inOrdersQuote =\n openOrders?.quoteTokenTotal &&\n openOrders?.quoteTokenFree &&\n market.baseSplSizeToNumber(\n openOrders.quoteTokenTotal.sub(openOrders.quoteTokenFree),\n );\n const unsettledBase =\n openOrders?.baseTokenFree &&\n market.baseSplSizeToNumber(openOrders.baseTokenFree);\n const unsettledQuote =\n openOrders?.quoteTokenFree &&\n market.baseSplSizeToNumber(openOrders.quoteTokenFree);\n\n openOrderAccountBalances.push({\n marketName,\n market,\n coin: baseCurrency,\n key: `${marketName}${baseCurrency}`,\n orders: inOrdersBase,\n unsettled: unsettledBase,\n openOrders,\n });\n openOrderAccountBalances.push({\n marketName,\n market,\n coin: quoteCurrency,\n key: `${marketName}${quoteCurrency}`,\n orders: inOrdersQuote,\n unsettled: unsettledQuote,\n openOrders,\n });\n });\n });\n return openOrderAccountBalances;\n}\n\nexport function getMarketInfos(\n customMarkets: CustomMarketInfo[],\n): MarketInfo[] {\n const customMarketsInfo = customMarkets.map((m) => ({\n ...m,\n address: new PublicKey(m.address),\n programId: new PublicKey(m.programId),\n deprecated: false,\n }));\n\n return [...customMarketsInfo, ...MARKETS];\n}\n\nexport function useMarketInfos() {\n const { customMarkets } = useCustomMarkets();\n return getMarketInfos(customMarkets);\n}\n\n/**\n * If selling, choose min tick size. If buying choose a price\n * s.t. given the state of the orderbook, the order will spend\n * `cost` cost currency.\n *\n * @param orderbook serum Orderbook object\n * @param cost quantity to spend. Base currency if selling,\n * quote currency if buying.\n * @param tickSizeDecimals size of price increment of the market\n */\nexport function getMarketOrderPrice(\n orderbook: Orderbook,\n cost: number,\n tickSizeDecimals?: number,\n) {\n if (orderbook.isBids) {\n return orderbook.market.tickSize;\n }\n let spentCost = 0;\n let price, sizeAtLevel, costAtLevel: number;\n const asks = orderbook.getL2(1000);\n for ([price, sizeAtLevel] of asks) {\n costAtLevel = price * sizeAtLevel;\n if (spentCost + costAtLevel > cost) {\n break;\n }\n spentCost += costAtLevel;\n }\n const sendPrice = Math.min(price * 1.02, asks[0][0] * 1.05);\n let formattedPrice;\n if (tickSizeDecimals) {\n formattedPrice = floorToDecimal(sendPrice, tickSizeDecimals);\n } else {\n formattedPrice = sendPrice;\n }\n return formattedPrice;\n}\n\nexport function getExpectedFillPrice(\n orderbook: Orderbook,\n cost: number,\n tickSizeDecimals?: number,\n) {\n let spentCost = 0;\n let avgPrice = 0;\n let price, sizeAtLevel, costAtLevel: number;\n for ([price, sizeAtLevel] of orderbook.getL2(1000)) {\n costAtLevel = (orderbook.isBids ? 1 : price) * sizeAtLevel;\n if (spentCost + costAtLevel > cost) {\n avgPrice += (cost - spentCost) * price;\n spentCost = cost;\n break;\n }\n avgPrice += costAtLevel * price;\n spentCost += costAtLevel;\n }\n const totalAvgPrice = avgPrice / Math.min(cost, spentCost);\n let formattedPrice;\n if (tickSizeDecimals) {\n formattedPrice = floorToDecimal(totalAvgPrice, tickSizeDecimals);\n } else {\n formattedPrice = totalAvgPrice;\n }\n return formattedPrice;\n}\n\nexport function useCurrentlyAutoSettling(): [\n boolean,\n (currentlyAutoSettling: boolean) => void,\n] {\n const [currentlyAutoSettling, setCurrentlyAutosettling] =\n useState(false);\n return [currentlyAutoSettling, setCurrentlyAutosettling];\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedMessage,\n VersionedTransaction,\n} from '@solana/web3.js';\nimport BN from 'bn.js';\nimport { COMPUTE_UNIT_LIMIT_MULTIPLIER } from './constants';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\n\nexport function isValidPublicKey(key) {\n if (!key) {\n return false;\n }\n try {\n new PublicKey(key);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport const percentFormat = new Intl.NumberFormat(undefined, {\n style: 'percent',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n});\n\nexport function floorToDecimal(\n value: number,\n decimals: number | undefined | null,\n) {\n return decimals\n ? Math.floor(value * 10 ** decimals) / 10 ** decimals\n : Math.floor(value);\n}\n\nexport function roundToDecimal(\n value: number,\n decimals: number | undefined | null,\n) {\n return decimals ? Math.round(value * 10 ** decimals) / 10 ** decimals : value;\n}\n\nexport function getDecimalCount(value): number {\n if (\n !isNaN(value) &&\n Math.floor(value) !== value &&\n value.toString().includes('.')\n )\n return value.toString().split('.')[1].length || 0;\n if (\n !isNaN(value) &&\n Math.floor(value) !== value &&\n value.toString().includes('e')\n )\n return parseInt(value.toString().split('e-')[1] || '0');\n return 0;\n}\n\nexport function divideBnToNumber(numerator: BN, denominator: BN): number {\n const quotient = numerator.div(denominator).toNumber();\n const rem = numerator.umod(denominator);\n const gcd = rem.gcd(denominator);\n return quotient + rem.div(gcd).toNumber() / denominator.div(gcd).toNumber();\n}\n\nexport function getTokenMultiplierFromDecimals(decimals: number): BN {\n return new BN(10).pow(new BN(decimals));\n}\n\nconst localStorageListeners = {};\n\nexport function useLocalStorageStringState(\n key: string,\n defaultState: string | null = null,\n): [string | null, (newState: string | null) => void] {\n const state = localStorage.getItem(key) || defaultState;\n\n const [, notify] = useState(key + '\\n' + state);\n\n useEffect(() => {\n if (!localStorageListeners[key]) {\n localStorageListeners[key] = [];\n }\n localStorageListeners[key].push(notify);\n return () => {\n localStorageListeners[key] = localStorageListeners[key].filter(\n (listener) => listener !== notify,\n );\n if (localStorageListeners[key].length === 0) {\n delete localStorageListeners[key];\n }\n };\n }, [key]);\n\n const setState = useCallback<(newState: string | null) => void>(\n (newState) => {\n const changed = state !== newState;\n if (!changed) {\n return;\n }\n\n if (newState === null) {\n localStorage.removeItem(key);\n } else {\n localStorage.setItem(key, newState);\n }\n localStorageListeners[key]?.forEach((listener) =>\n listener(key + '\\n' + newState),\n );\n },\n [state, key],\n );\n\n return [state, setState];\n}\n\nexport function useLocalStorageState(\n key: string,\n defaultState: T | null = null,\n): [T, (newState: T) => void] {\n let [stringState, setStringState] = useLocalStorageStringState(\n key,\n JSON.stringify(defaultState),\n );\n return [\n useMemo(() => stringState && JSON.parse(stringState), [stringState]),\n (newState) => setStringState(JSON.stringify(newState)),\n ];\n}\n\nexport function useEffectAfterTimeout(effect, timeout) {\n useEffect(() => {\n const handle = setTimeout(effect, timeout);\n return () => clearTimeout(handle);\n });\n}\n\nexport function useListener(emitter, eventName) {\n const [, forceUpdate] = useState(0);\n useEffect(() => {\n const listener = () => forceUpdate((i) => i + 1);\n emitter.on(eventName, listener);\n return () => emitter.removeListener(eventName, listener);\n }, [emitter, eventName]);\n}\n\nexport function abbreviateAddress(address: PublicKey, size = 4) {\n const base58 = address.toBase58();\n return base58.slice(0, size) + '…' + base58.slice(-size);\n}\n\nexport function isEqual(obj1, obj2, keys) {\n if (!keys && Object.keys(obj1).length !== Object.keys(obj2).length) {\n return false;\n }\n keys = keys || Object.keys(obj1);\n for (const k of keys) {\n if (obj1[k] !== obj2[k]) {\n // shallow comparison\n return false;\n }\n }\n return true;\n}\n\nexport function flatten(obj, { prefix = '', restrictTo }) {\n let restrict = restrictTo;\n if (restrict) {\n restrict = restrict.filter((k) => obj.hasOwnProperty(k));\n }\n const result = {};\n (function recurse(obj, current, keys) {\n (keys || Object.keys(obj)).forEach((key) => {\n const value = obj[key];\n const newKey = current ? current + '.' + key : key; // joined key with dot\n if (value && typeof value === 'object') {\n // @ts-ignore\n recurse(value, newKey); // nested object\n } else {\n result[newKey] = value;\n }\n });\n })(obj, prefix, restrict);\n return result;\n}\n\nexport function mergeTransactions(\n transactions: (Transaction | TransactionInstruction | undefined)[],\n) {\n const transaction = new Transaction();\n transactions\n .filter((t): t is Transaction => t !== undefined)\n .forEach((t) => {\n transaction.add(t);\n });\n return transaction;\n}\n\nexport function calculateComputeUnitPrice(\n priorityFee,\n computeUnitLimit,\n): number {\n return priorityFee / (computeUnitLimit * 1e-6);\n}\n\nexport async function addPriorityFeesIfNecessary(\n connection: Connection,\n transaction: Transaction,\n wallet: BaseSignerWalletAdapter,\n priorityFee?: number,\n computeUnits?: number,\n): Promise {\n let transactionMessage = new TransactionMessage({\n payerKey: wallet.publicKey!,\n instructions: transaction.instructions,\n recentBlockhash: (await connection.getLatestBlockhash()).blockhash,\n }).compileToV0Message();\n let simulatedUnits =\n (\n await connection.simulateTransaction(\n new VersionedTransaction(transactionMessage),\n {\n replaceRecentBlockhash: true,\n sigVerify: false,\n },\n )\n ).value.unitsConsumed || Infinity;\n\n let maxComputeUnits = Math.floor(\n Math.min(\n computeUnits || Infinity,\n simulatedUnits * COMPUTE_UNIT_LIMIT_MULTIPLIER,\n ),\n );\n\n if (priorityFee != undefined) {\n transaction.instructions.unshift(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: Math.floor(\n calculateComputeUnitPrice(priorityFee, maxComputeUnits),\n ),\n }),\n );\n }\n\n if (computeUnits != undefined) {\n transaction.instructions.unshift(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: maxComputeUnits,\n }),\n );\n }\n\n return transaction;\n}\n","import React from 'react';\nimport { notification } from 'antd';\nimport Link from '../components/Link';\nimport { useConnection } from './connection';\n\nexport function notify({\n message,\n description,\n txid,\n type = 'info',\n placement = 'bottomLeft',\n clusterUrl = undefined,\n}: {\n message: string;\n description?: string | JSX.Element;\n txid?: string;\n type?: string;\n placement?: string;\n clusterUrl?: string;\n}) {\n if (txid) {\n description = (\n \n View transaction {txid.slice(0, 8)}...{txid.slice(txid.length - 8)}\n \n );\n }\n notification[type]({\n message: {message},\n description: (\n {description}\n ),\n placement,\n style: {\n backgroundColor: 'white',\n },\n });\n}\n","import { useLocalStorageState } from './utils';\nimport { Account, AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { setCache, useAsyncData } from './fetch-loop';\nimport tuple from 'immutable-tuple';\nimport { ConnectionContextValues, EndpointInfo } from './types';\n\nexport const ENDPOINTS: EndpointInfo[] = [\n {\n name: 'devnet',\n endpoint: 'https://staging-rpc.dev.eclipsenetwork.xyz',\n custom: false,\n },\n { name: 'localnet', endpoint: 'http://127.0.0.1:8899', custom: false },\n];\n\nconst accountListenerCount = new Map();\n\nconst ConnectionContext: React.Context =\n React.createContext(null);\n\nexport function ConnectionProvider({ children }) {\n const [endpoint, setEndpoint] = useLocalStorageState(\n 'connectionEndpts',\n ENDPOINTS[0].endpoint,\n );\n const [customEndpoints, setCustomEndpoints] = useLocalStorageState<\n EndpointInfo[]\n >('customConnectionEndpoints', []);\n const availableEndpoints = ENDPOINTS.concat(customEndpoints);\n\n const connection = useMemo(\n () => new Connection(endpoint, 'recent'),\n [endpoint],\n );\n const sendConnection = useMemo(\n () => new Connection(endpoint, 'recent'),\n [endpoint],\n );\n const [priorityFee, setPriorityFee] = useState(undefined);\n const [computeUnits, setComputeUnits] = useState(\n undefined,\n );\n\n // The websocket library solana/web3.js uses closes its websocket connection when the subscription list\n // is empty after opening its first time, preventing subsequent subscriptions from receiving responses.\n // This is a hack to prevent the list from every getting empty\n useEffect(() => {\n const id = connection.onAccountChange(new Account().publicKey, () => {});\n return () => {\n connection.removeAccountChangeListener(id);\n };\n }, [connection]);\n\n useEffect(() => {\n const id = connection.onSlotChange(() => null);\n return () => {\n connection.removeSlotChangeListener(id);\n };\n }, [connection]);\n\n useEffect(() => {\n const id = sendConnection.onAccountChange(\n new Account().publicKey,\n () => {},\n );\n return () => {\n sendConnection.removeAccountChangeListener(id);\n };\n }, [sendConnection]);\n\n useEffect(() => {\n const id = sendConnection.onSlotChange(() => null);\n return () => {\n sendConnection.removeSlotChangeListener(id);\n };\n }, [sendConnection]);\n\n return (\n \n {children}\n \n );\n}\n\nexport function useConnection() {\n const context = useContext(ConnectionContext);\n if (!context) {\n throw new Error('Missing connection context');\n }\n return context.connection;\n}\n\nexport function useSendConnection() {\n const context = useContext(ConnectionContext);\n if (!context) {\n throw new Error('Missing connection context');\n }\n return context.sendConnection;\n}\n\nexport function useConnectionConfig() {\n const context = useContext(ConnectionContext);\n if (!context) {\n throw new Error('Missing connection context');\n }\n return {\n priorityFee: context.priorityFee,\n setPriorityFee: context.setPriorityFee,\n computeUnits: context.computeUnits,\n setComputeUnits: context.setComputeUnits,\n endpoint: context.endpoint,\n endpointInfo: context.availableEndpoints.find(\n (info) => info.endpoint === context.endpoint,\n ),\n setEndpoint: context.setEndpoint,\n availableEndpoints: context.availableEndpoints,\n setCustomEndpoints: context.setCustomEndpoints,\n };\n}\n\nexport function useAccountInfo(\n publicKey: PublicKey | undefined | null,\n): [AccountInfo | null | undefined, boolean] {\n const connection = useConnection();\n const cacheKey = tuple(connection, publicKey?.toBase58());\n const [accountInfo, loaded] = useAsyncData | null>(\n async () => (publicKey ? connection.getAccountInfo(publicKey) : null),\n cacheKey,\n { refreshInterval: 60_000 },\n );\n useEffect(() => {\n if (!publicKey) {\n return;\n }\n if (accountListenerCount.has(cacheKey)) {\n let currentItem = accountListenerCount.get(cacheKey);\n ++currentItem.count;\n } else {\n let previousInfo: AccountInfo | null = null;\n const subscriptionId = connection.onAccountChange(publicKey, (info) => {\n if (\n !previousInfo ||\n !previousInfo.data.equals(info.data) ||\n previousInfo.lamports !== info.lamports\n ) {\n previousInfo = info;\n setCache(cacheKey, info);\n }\n });\n accountListenerCount.set(cacheKey, { count: 1, subscriptionId });\n }\n return () => {\n let currentItem = accountListenerCount.get(cacheKey);\n let nextCount = currentItem.count - 1;\n if (nextCount <= 0) {\n connection.removeAccountChangeListener(currentItem.subscriptionId);\n accountListenerCount.delete(cacheKey);\n } else {\n --currentItem.count;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cacheKey]);\n const previousInfoRef = useRef | null | undefined>(null);\n if (\n !accountInfo ||\n !previousInfoRef.current ||\n !previousInfoRef.current.data.equals(accountInfo.data) ||\n previousInfoRef.current.lamports !== accountInfo.lamports\n ) {\n previousInfoRef.current = accountInfo;\n }\n return [previousInfoRef.current, loaded];\n}\n\nexport function useAccountData(publicKey) {\n const [accountInfo] = useAccountInfo(publicKey);\n return accountInfo && accountInfo.data;\n}\n","import { notify } from './notifications';\nimport {\n addPriorityFeesIfNecessary,\n getDecimalCount,\n mergeTransactions,\n sleep,\n} from './utils';\nimport { getSelectedTokenAccountForMint } from './markets';\nimport {\n Account,\n AccountInfo,\n Commitment,\n Connection,\n PublicKey,\n RpcResponseAndContext,\n SimulatedTransactionResponse,\n SystemProgram,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport {\n getAssociatedTokenAddress,\n createAssociatedTokenAccountInstruction,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\nimport BN from 'bn.js';\nimport {\n DexInstructions,\n Market,\n OpenOrders,\n parseInstructionErrorResponse,\n TokenInstructions,\n} from '@openbook-dex/openbook';\nimport { SelectedTokenAccounts, TokenAccount } from './types';\nimport { Order } from '@openbook-dex/openbook/lib/market';\nimport { Buffer } from 'buffer';\nimport assert from 'assert';\nimport { struct } from 'superstruct';\nimport {\n BaseSignerWalletAdapter,\n WalletAdapter,\n} from '@solana/wallet-adapter-base';\nimport { TOKENS } from './constants';\n\nexport const REQUEST_QUEUE_ITEM_SIZE = 88;\nexport const EVENT_QUEUE_ITEM_SIZE = 80;\nexport const ORDERBOOK_ITEM_SIZE = 72;\nexport const QUEUE_HEADER_SIZE = 44;\nexport const ORDERBOOK_HEADER_SIZE = 52;\n\nexport function calculateRequestQueueSize(requestQueueLength): number {\n return requestQueueLength * REQUEST_QUEUE_ITEM_SIZE + QUEUE_HEADER_SIZE;\n}\n\nexport function calculateOrderbookSize(orderbookLength): number {\n return orderbookLength * ORDERBOOK_ITEM_SIZE + ORDERBOOK_HEADER_SIZE;\n}\n\nexport function calculateEventQueueSize(eventQueueSize): number {\n return eventQueueSize * EVENT_QUEUE_ITEM_SIZE + QUEUE_HEADER_SIZE;\n}\n\nexport async function createTokenAccountTransaction({\n connection,\n wallet,\n mintPublicKey,\n}: {\n connection: Connection;\n wallet: WalletAdapter;\n mintPublicKey: PublicKey;\n}): Promise<{\n transaction: Transaction;\n newAccountPubkey: PublicKey;\n}> {\n assert(wallet.publicKey, 'Expected `publicKey` to be non-null');\n const ata = await getAssociatedTokenAddress(\n mintPublicKey,\n wallet.publicKey!,\n false,\n );\n const transaction = new Transaction();\n transaction.add(\n createAssociatedTokenAccountInstruction(\n wallet.publicKey!,\n ata,\n wallet.publicKey!,\n mintPublicKey,\n ),\n );\n return {\n transaction,\n newAccountPubkey: ata,\n };\n}\n\nexport async function settleFunds({\n market,\n openOrders,\n connection,\n wallet,\n baseCurrencyAccount,\n quoteCurrencyAccount,\n sendNotification = true,\n usdcRef = undefined,\n usdtRef = undefined,\n priorityFee = undefined,\n computeUnits = undefined,\n}: {\n market: Market;\n openOrders: OpenOrders;\n connection: Connection;\n wallet: BaseSignerWalletAdapter;\n baseCurrencyAccount: TokenAccount;\n quoteCurrencyAccount: TokenAccount;\n sendNotification?: boolean;\n usdcRef?: PublicKey;\n usdtRef?: PublicKey;\n priorityFee?: number;\n computeUnits?: number;\n}): Promise {\n if (\n !market ||\n !wallet ||\n !connection ||\n !openOrders ||\n (!baseCurrencyAccount && !quoteCurrencyAccount)\n ) {\n if (sendNotification) {\n notify({ message: 'Not connected' });\n }\n return;\n }\n\n let createAccountTransaction: Transaction | undefined;\n let baseCurrencyAccountPubkey = baseCurrencyAccount?.pubkey;\n let quoteCurrencyAccountPubkey = quoteCurrencyAccount?.pubkey;\n\n if (!baseCurrencyAccountPubkey) {\n const result = await createTokenAccountTransaction({\n connection,\n wallet,\n mintPublicKey: market.baseMintAddress,\n });\n baseCurrencyAccountPubkey = result?.newAccountPubkey;\n createAccountTransaction = result?.transaction;\n }\n if (!quoteCurrencyAccountPubkey) {\n const result = await createTokenAccountTransaction({\n connection,\n wallet,\n mintPublicKey: market.quoteMintAddress,\n });\n quoteCurrencyAccountPubkey = result?.newAccountPubkey;\n createAccountTransaction = result?.transaction;\n }\n let referrerQuoteWallet: PublicKey | null = null;\n if (market.supportsReferralFees) {\n const usdt = TOKENS.find(({ name }) => name === 'USDT');\n const usdc = TOKENS.find(({ name }) => name === 'USDC');\n if (usdtRef && usdt && market.quoteMintAddress.equals(usdt.address)) {\n referrerQuoteWallet = usdtRef;\n } else if (\n usdcRef &&\n usdc &&\n market.quoteMintAddress.equals(usdc.address)\n ) {\n referrerQuoteWallet = usdcRef;\n }\n }\n const { transaction: settleFundsTransaction, signers: settleFundsSigners } =\n await market.makeSettleFundsTransaction(\n connection,\n openOrders,\n baseCurrencyAccountPubkey,\n quoteCurrencyAccountPubkey,\n referrerQuoteWallet,\n );\n\n let transaction = mergeTransactions([\n createAccountTransaction,\n settleFundsTransaction,\n ]);\n\n console.log('Settling funds...');\n return await sendTransaction({\n transaction,\n signers: settleFundsSigners,\n wallet,\n connection,\n sendingMessage: 'Settling funds...',\n sendNotification,\n priorityFee,\n computeUnits,\n });\n}\n\nexport async function settleAllFunds({\n connection,\n wallet,\n tokenAccounts,\n markets,\n selectedTokenAccounts,\n priorityFee = undefined,\n computeUnits = undefined,\n}: {\n connection: Connection;\n wallet: BaseSignerWalletAdapter;\n tokenAccounts: TokenAccount[];\n markets: Market[];\n selectedTokenAccounts?: SelectedTokenAccounts;\n priorityFee?: number;\n computeUnits?: number;\n}) {\n if (!markets || !wallet || !connection || !tokenAccounts) {\n return;\n }\n\n const programIds: PublicKey[] = [];\n markets\n .reduce((cumulative, m) => {\n // @ts-ignore\n cumulative.push(m._programId);\n return cumulative;\n }, [])\n .forEach((programId) => {\n if (!programIds.find((p) => p.equals(programId))) {\n programIds.push(programId);\n }\n });\n\n const getOpenOrdersAccountsForProgramId = async (programId) => {\n assert(wallet.publicKey, 'Expected `publicKey` to be non-null');\n const openOrdersAccounts = await OpenOrders.findForOwner(\n connection,\n wallet.publicKey,\n programId,\n );\n return openOrdersAccounts.filter(\n (openOrders) =>\n openOrders.baseTokenFree.toNumber() ||\n openOrders.quoteTokenFree.toNumber(),\n );\n };\n\n const openOrdersAccountsForProgramIds = await Promise.all(\n programIds.map((programId) => getOpenOrdersAccountsForProgramId(programId)),\n );\n const openOrdersAccounts = openOrdersAccountsForProgramIds.reduce(\n (accounts, current) => accounts.concat(current),\n [],\n );\n\n const settleTransactions = (\n await Promise.all(\n openOrdersAccounts.map((openOrdersAccount) => {\n const market = markets.find((m) =>\n // @ts-ignore\n m._decoded?.ownAddress?.equals(openOrdersAccount.market),\n );\n if (\n openOrdersAccount.baseTokenFree.isZero() &&\n openOrdersAccount.quoteTokenFree.isZero()\n ) {\n // nothing to settle for this market.\n return null;\n }\n const baseMint = market?.baseMintAddress;\n const quoteMint = market?.quoteMintAddress;\n\n const selectedBaseTokenAccount = getSelectedTokenAccountForMint(\n tokenAccounts,\n baseMint,\n baseMint &&\n selectedTokenAccounts &&\n selectedTokenAccounts[baseMint.toBase58()],\n )?.pubkey;\n const selectedQuoteTokenAccount = getSelectedTokenAccountForMint(\n tokenAccounts,\n quoteMint,\n quoteMint &&\n selectedTokenAccounts &&\n selectedTokenAccounts[quoteMint.toBase58()],\n )?.pubkey;\n if (!selectedBaseTokenAccount || !selectedQuoteTokenAccount) {\n return null;\n }\n return (\n market &&\n market.makeSettleFundsTransaction(\n connection,\n openOrdersAccount,\n selectedBaseTokenAccount,\n selectedQuoteTokenAccount,\n )\n );\n }),\n )\n ).filter(\n (\n x,\n ): x is {\n signers: Account[];\n transaction: Transaction;\n payer: PublicKey;\n } => !!x,\n );\n if (!settleTransactions || settleTransactions.length === 0) return;\n\n const transactions = settleTransactions.slice(0, 4).map((t) => t.transaction);\n const signers: Array = [];\n settleTransactions\n .reduce((cumulative: Array, t) => cumulative.concat(t.signers), [])\n .forEach((signer) => {\n if (!signers.find((s) => s.publicKey.equals(signer.publicKey))) {\n signers.push(signer);\n }\n });\n\n const transaction = mergeTransactions(transactions);\n\n return await sendTransaction({\n transaction,\n signers,\n wallet,\n connection,\n priorityFee,\n computeUnits,\n });\n}\n\nexport async function cancelOrder(params: {\n market: Market;\n connection: Connection;\n wallet: BaseSignerWalletAdapter;\n order: Order;\n priorityFee?: number;\n computeUnits?: number;\n}) {\n return cancelOrders({ ...params, orders: [params.order] });\n}\n\nexport async function cancelOrders({\n market,\n wallet,\n connection,\n orders,\n priorityFee = undefined,\n computeUnits = undefined,\n}: {\n market: Market;\n wallet: BaseSignerWalletAdapter;\n connection: Connection;\n orders: Order[];\n priorityFee?: number;\n computeUnits?: number;\n}) {\n const transaction = market.makeMatchOrdersTransaction(5);\n assert(wallet.publicKey, 'Expected `publicKey` to be non-null');\n const publicKey = wallet.publicKey;\n orders.forEach((order) => {\n transaction.add(\n market.makeCancelOrderInstruction(connection, publicKey, order),\n );\n });\n transaction.add(market.makeMatchOrdersTransaction(5));\n\n return await sendTransaction({\n transaction,\n wallet,\n connection,\n sendingMessage: 'Sending cancel...',\n priorityFee,\n computeUnits,\n });\n}\n\nexport async function placeOrder({\n side,\n price,\n size,\n orderType,\n market,\n connection,\n wallet,\n baseCurrencyAccount,\n quoteCurrencyAccount,\n feeDiscountPubkey = undefined,\n priorityFee = undefined,\n computeUnits = undefined,\n}: {\n side: 'buy' | 'sell';\n price: number;\n size: number;\n orderType: 'ioc' | 'postOnly' | 'limit';\n market: Market | undefined | null;\n connection: Connection;\n wallet: BaseSignerWalletAdapter;\n baseCurrencyAccount: PublicKey | undefined;\n quoteCurrencyAccount: PublicKey | undefined;\n feeDiscountPubkey: PublicKey | undefined;\n priorityFee?: number;\n computeUnits?: number;\n}) {\n let formattedMinOrderSize =\n market?.minOrderSize?.toFixed(getDecimalCount(market.minOrderSize)) ||\n market?.minOrderSize;\n let formattedTickSize =\n market?.tickSize?.toFixed(getDecimalCount(market.tickSize)) ||\n market?.tickSize;\n const isIncrement = (num, step) =>\n Math.abs((num / step) % 1) < 1e-5 ||\n Math.abs(((num / step) % 1) - 1) < 1e-5;\n if (isNaN(price)) {\n notify({ message: 'Invalid price', type: 'error' });\n return;\n }\n if (isNaN(size)) {\n notify({ message: 'Invalid size', type: 'error' });\n return;\n }\n if (!wallet || !wallet.publicKey) {\n notify({ message: 'Connect wallet', type: 'error' });\n return;\n }\n if (!market) {\n notify({ message: 'Invalid market', type: 'error' });\n return;\n }\n if (!isIncrement(size, market.minOrderSize)) {\n notify({\n message: `Size must be an increment of ${formattedMinOrderSize}`,\n type: 'error',\n });\n return;\n }\n if (size < market.minOrderSize) {\n notify({ message: 'Size too small', type: 'error' });\n return;\n }\n if (!isIncrement(price, market.tickSize)) {\n notify({\n message: `Price must be an increment of ${formattedTickSize}`,\n type: 'error',\n });\n return;\n }\n if (price < market.tickSize) {\n notify({ message: 'Price under tick size', type: 'error' });\n return;\n }\n const owner = wallet.publicKey;\n const transaction = new Transaction();\n const signers: Account[] = [];\n\n if (!baseCurrencyAccount) {\n const { transaction: createAccountTransaction, newAccountPubkey } =\n await createTokenAccountTransaction({\n connection,\n wallet,\n mintPublicKey: market.baseMintAddress,\n });\n transaction.add(createAccountTransaction);\n baseCurrencyAccount = newAccountPubkey;\n }\n if (!quoteCurrencyAccount) {\n const { transaction: createAccountTransaction, newAccountPubkey } =\n await createTokenAccountTransaction({\n connection,\n wallet,\n mintPublicKey: market.quoteMintAddress,\n });\n transaction.add(createAccountTransaction);\n quoteCurrencyAccount = newAccountPubkey;\n }\n\n const payer = side === 'sell' ? baseCurrencyAccount : quoteCurrencyAccount;\n if (!payer) {\n notify({\n message: 'Need an SPL token account for cost currency',\n type: 'error',\n });\n return;\n }\n const params = {\n owner,\n payer,\n side,\n price,\n size,\n orderType,\n feeDiscountPubkey: feeDiscountPubkey || null,\n };\n console.log(params);\n\n const matchOrderstransaction = market.makeMatchOrdersTransaction(5);\n transaction.add(matchOrderstransaction);\n const startTime = getUnixTs();\n let { transaction: placeOrderTx, signers: placeOrderSigners } =\n await market.makePlaceOrderTransaction(\n connection,\n params,\n 120_000,\n 120_000,\n );\n const endTime = getUnixTs();\n console.log(`Creating order transaction took ${endTime - startTime}`);\n transaction.add(placeOrderTx);\n transaction.add(market.makeMatchOrdersTransaction(5));\n signers.push(...placeOrderSigners);\n\n return await sendTransaction({\n transaction,\n wallet,\n connection,\n signers,\n sendingMessage: 'Sending order...',\n priorityFee,\n computeUnits,\n });\n}\n\nexport async function listMarket({\n connection,\n wallet,\n baseMint,\n quoteMint,\n baseLotSize,\n quoteLotSize,\n dexProgramId,\n priorityFee = undefined,\n computeUnits = undefined,\n eventQueueLength = 2978,\n requestQueueLength = 63,\n orderbookLength = 909,\n}: {\n connection: Connection;\n wallet: BaseSignerWalletAdapter;\n baseMint: PublicKey;\n quoteMint: PublicKey;\n baseLotSize: number;\n quoteLotSize: number;\n dexProgramId: PublicKey;\n priorityFee?: number;\n computeUnits?: number;\n eventQueueLength?: number;\n requestQueueLength?: number;\n orderbookLength?: number;\n}) {\n assert(wallet.publicKey, 'Expected `publicKey` to be non-null');\n\n const market = new Account();\n const requestQueue = new Account();\n const eventQueue = new Account();\n const bids = new Account();\n const asks = new Account();\n const baseVault = new Account();\n const quoteVault = new Account();\n const feeRateBps = 0;\n const quoteDustThreshold = new BN(100);\n\n async function getVaultOwnerAndNonce() {\n const nonce = new BN(0);\n while (true) {\n try {\n const vaultOwner = await PublicKey.createProgramAddress(\n [market.publicKey.toBuffer(), nonce.toArrayLike(Buffer, 'le', 8)],\n dexProgramId,\n );\n return [vaultOwner, nonce];\n } catch (e: any) {\n nonce.iaddn(1);\n }\n }\n }\n const [vaultOwner, vaultSignerNonce] = await getVaultOwnerAndNonce();\n\n const tx1 = new Transaction();\n tx1.add(\n SystemProgram.createAccount({\n fromPubkey: wallet.publicKey,\n newAccountPubkey: baseVault.publicKey,\n lamports: await connection.getMinimumBalanceForRentExemption(165),\n space: 165,\n programId: TokenInstructions.TOKEN_PROGRAM_ID,\n }),\n SystemProgram.createAccount({\n fromPubkey: wallet.publicKey,\n newAccountPubkey: quoteVault.publicKey,\n lamports: await connection.getMinimumBalanceForRentExemption(165),\n space: 165,\n programId: TokenInstructions.TOKEN_PROGRAM_ID,\n }),\n TokenInstructions.initializeAccount({\n account: baseVault.publicKey,\n mint: baseMint,\n owner: vaultOwner,\n }),\n TokenInstructions.initializeAccount({\n account: quoteVault.publicKey,\n mint: quoteMint,\n owner: vaultOwner,\n }),\n );\n\n const tx2 = new Transaction();\n tx2.add(\n SystemProgram.createAccount({\n fromPubkey: wallet.publicKey,\n newAccountPubkey: market.publicKey,\n lamports: await connection.getMinimumBalanceForRentExemption(\n Market.getLayout(dexProgramId).span,\n ),\n space: Market.getLayout(dexProgramId).span,\n programId: dexProgramId,\n }),\n SystemProgram.createAccount({\n fromPubkey: wallet.publicKey,\n newAccountPubkey: requestQueue.publicKey,\n lamports: await connection.getMinimumBalanceForRentExemption(\n calculateRequestQueueSize(requestQueueLength),\n ),\n space: calculateRequestQueueSize(requestQueueLength),\n programId: dexProgramId,\n }),\n SystemProgram.createAccount({\n fromPubkey: wallet.publicKey,\n newAccountPubkey: eventQueue.publicKey,\n lamports: await connection.getMinimumBalanceForRentExemption(\n calculateEventQueueSize(eventQueueLength),\n ),\n space: calculateEventQueueSize(eventQueueLength),\n programId: dexProgramId,\n }),\n SystemProgram.createAccount({\n fromPubkey: wallet.publicKey,\n newAccountPubkey: bids.publicKey,\n lamports: await connection.getMinimumBalanceForRentExemption(\n calculateOrderbookSize(orderbookLength),\n ),\n space: calculateOrderbookSize(orderbookLength),\n programId: dexProgramId,\n }),\n SystemProgram.createAccount({\n fromPubkey: wallet.publicKey,\n newAccountPubkey: asks.publicKey,\n lamports: await connection.getMinimumBalanceForRentExemption(\n calculateOrderbookSize(orderbookLength),\n ),\n space: calculateOrderbookSize(orderbookLength),\n programId: dexProgramId,\n }),\n DexInstructions.initializeMarket({\n market: market.publicKey,\n requestQueue: requestQueue.publicKey,\n eventQueue: eventQueue.publicKey,\n bids: bids.publicKey,\n asks: asks.publicKey,\n baseVault: baseVault.publicKey,\n quoteVault: quoteVault.publicKey,\n baseMint,\n quoteMint,\n baseLotSize: new BN(baseLotSize),\n quoteLotSize: new BN(quoteLotSize),\n feeRateBps,\n vaultSignerNonce,\n quoteDustThreshold,\n programId: dexProgramId,\n authority: undefined,\n }),\n );\n\n // Dev Note: No priority fees are added to this transaction\n const signedTransactions = await signTransactions({\n transactionsAndSigners: [\n { transaction: tx1, signers: [baseVault, quoteVault] },\n {\n transaction: tx2,\n signers: [market, requestQueue, eventQueue, bids, asks],\n },\n ],\n wallet,\n connection,\n });\n for (let signedTransaction of signedTransactions) {\n await sendSignedTransaction({\n signedTransaction,\n connection,\n priorityFee,\n computeUnits,\n });\n }\n\n return market.publicKey;\n}\n\nexport const getUnixTs = () => {\n return new Date().getTime() / 1000;\n};\n\nconst DEFAULT_TIMEOUT = 15000;\n\nexport async function sendTransaction({\n transaction,\n wallet,\n signers = [],\n connection,\n sendingMessage = 'Sending transaction...',\n sentMessage = 'Transaction sent',\n successMessage = 'Transaction confirmed',\n timeout = DEFAULT_TIMEOUT,\n sendNotification = true,\n priorityFee = undefined,\n computeUnits = undefined,\n}: {\n transaction: Transaction;\n wallet: BaseSignerWalletAdapter;\n signers?: Array;\n connection: Connection;\n sendingMessage?: string;\n sentMessage?: string;\n successMessage?: string;\n timeout?: number;\n sendNotification?: boolean;\n priorityFee?: number;\n computeUnits?: number;\n}) {\n const signedTransaction = await signTransaction({\n transaction: await addPriorityFeesIfNecessary(\n connection,\n transaction,\n wallet,\n priorityFee,\n computeUnits,\n ),\n // transaction,\n wallet,\n signers,\n connection,\n });\n return await sendSignedTransaction({\n signedTransaction,\n connection,\n sendingMessage,\n sentMessage,\n successMessage,\n timeout,\n sendNotification,\n priorityFee,\n computeUnits,\n });\n}\n\nexport async function signTransaction({\n transaction,\n wallet,\n signers = [],\n connection,\n}: {\n transaction: Transaction;\n wallet: BaseSignerWalletAdapter;\n signers?: Array;\n connection: Connection;\n}) {\n assert(wallet.publicKey, 'Expected `publicKey` to be non-null');\n transaction.recentBlockhash = (\n await connection.getRecentBlockhash('max')\n ).blockhash;\n transaction.setSigners(wallet.publicKey, ...signers.map((s) => s.publicKey));\n if (signers.length > 0) {\n transaction.partialSign(...signers);\n }\n return await wallet.signTransaction(transaction);\n}\n\nexport async function signTransactions({\n transactionsAndSigners,\n wallet,\n connection,\n}: {\n transactionsAndSigners: {\n transaction: Transaction;\n signers?: Array;\n }[];\n wallet: BaseSignerWalletAdapter;\n connection: Connection;\n}) {\n assert(wallet.publicKey, 'Expected `publicKey` to be non-null');\n const publicKey = wallet.publicKey;\n const blockhash = (await connection.getRecentBlockhash('max')).blockhash;\n transactionsAndSigners.forEach(({ transaction, signers = [] }) => {\n transaction.recentBlockhash = blockhash;\n transaction.setSigners(publicKey, ...signers.map((s) => s.publicKey));\n if (signers?.length > 0) {\n transaction.partialSign(...signers);\n }\n });\n return await wallet.signAllTransactions(\n transactionsAndSigners.map(({ transaction }) => transaction),\n );\n}\n\nexport async function sendSignedTransaction({\n signedTransaction,\n connection,\n sendingMessage = 'Sending transaction...',\n sentMessage = 'Transaction sent',\n successMessage = 'Transaction confirmed',\n timeout = DEFAULT_TIMEOUT,\n sendNotification = true,\n priorityFee = undefined,\n computeUnits = undefined,\n}: {\n signedTransaction: Transaction;\n connection: Connection;\n sendingMessage?: string;\n sentMessage?: string;\n successMessage?: string;\n timeout?: number;\n sendNotification?: boolean;\n priorityFee?: number;\n computeUnits?: number;\n}): Promise {\n const rawTransaction = signedTransaction.serialize();\n const startTime = getUnixTs();\n if (sendNotification) {\n notify({ message: sendingMessage });\n }\n const txid: TransactionSignature = await connection.sendRawTransaction(\n rawTransaction,\n {\n skipPreflight: true,\n },\n );\n if (sendNotification) {\n notify({ message: sentMessage, type: 'success', txid });\n }\n\n console.log('Started awaiting confirmation for', txid);\n\n let done = false;\n (async () => {\n while (!done && getUnixTs() - startTime < timeout) {\n connection.sendRawTransaction(rawTransaction, {\n skipPreflight: true,\n });\n await sleep(300);\n }\n })();\n try {\n await awaitTransactionSignatureConfirmation(txid, timeout, connection);\n } catch (err: any) {\n if (err.timeout) {\n throw new Error('Timed out awaiting confirmation on transaction');\n }\n let simulateResult: SimulatedTransactionResponse | null = null;\n try {\n simulateResult = (\n await simulateTransaction(connection, signedTransaction, 'single')\n ).value;\n } catch (e: any) {}\n if (simulateResult && simulateResult.err) {\n if (simulateResult.logs) {\n for (let i = simulateResult.logs.length - 1; i >= 0; --i) {\n const line = simulateResult.logs[i];\n if (line.startsWith('Program log: ')) {\n throw new Error(\n 'Transaction failed: ' + line.slice('Program log: '.length),\n );\n }\n }\n }\n let parsedError;\n if (\n typeof simulateResult.err == 'object' &&\n 'InstructionError' in simulateResult.err\n ) {\n const parsedErrorInfo = parseInstructionErrorResponse(\n signedTransaction,\n simulateResult.err['InstructionError'] as any,\n );\n parsedError = parsedErrorInfo.error;\n } else {\n parsedError = JSON.stringify(simulateResult.err);\n }\n throw new Error(parsedError);\n }\n throw new Error('Transaction failed');\n } finally {\n done = true;\n }\n if (sendNotification) {\n notify({\n message: successMessage,\n type: 'success',\n txid,\n clusterUrl: connection.rpcEndpoint,\n });\n }\n\n console.log('Latency', txid, getUnixTs() - startTime);\n return txid;\n}\n\nasync function awaitTransactionSignatureConfirmation(\n txid: TransactionSignature,\n timeout: number,\n connection: Connection,\n) {\n let done = false;\n const result = await new Promise((resolve, reject) => {\n (async () => {\n setTimeout(() => {\n if (done) {\n return;\n }\n done = true;\n console.log('Timed out for txid', txid);\n reject({ timeout: true });\n }, timeout);\n try {\n connection.onSignature(\n txid,\n (result) => {\n console.log('WS confirmed', txid, result);\n done = true;\n if (result.err) {\n reject(result.err);\n } else {\n resolve(result);\n }\n },\n 'recent',\n );\n console.log('Set up WS connection', txid);\n } catch (e: any) {\n done = true;\n console.log('WS error in setup', txid, e);\n }\n while (!done) {\n // eslint-disable-next-line no-loop-func\n (async () => {\n try {\n const signatureStatuses = await connection.getSignatureStatuses([\n txid,\n ]);\n const result = signatureStatuses && signatureStatuses.value[0];\n if (!done) {\n if (!result) {\n console.log('REST null result for', txid, result);\n } else if (result.err) {\n console.log('REST error for', txid, result);\n done = true;\n reject(result.err);\n } else if (!result.confirmations) {\n console.log('REST no confirmations for', txid, result);\n } else {\n console.log('REST confirmation for', txid, result);\n done = true;\n resolve(result);\n }\n }\n } catch (e: any) {\n if (!done) {\n console.log('REST connection error: txid', txid, e);\n }\n }\n })();\n await sleep(300);\n }\n })();\n });\n done = true;\n return result;\n}\n\nfunction jsonRpcResult(resultDescription: any) {\n const jsonRpcVersion = struct.literal('2.0');\n return struct.union([\n struct({\n jsonrpc: jsonRpcVersion,\n id: 'string',\n error: 'any',\n }),\n struct({\n jsonrpc: jsonRpcVersion,\n id: 'string',\n error: 'null?',\n result: resultDescription,\n }),\n ]);\n}\n\nfunction jsonRpcResultAndContext(resultDescription: any) {\n return jsonRpcResult({\n context: struct({\n slot: 'number',\n }),\n value: resultDescription,\n });\n}\n\nconst AccountInfoResult = struct({\n executable: 'boolean',\n owner: 'string',\n lamports: 'number',\n data: 'any',\n rentEpoch: 'number?',\n});\n\nexport const GetMultipleAccountsAndContextRpcResult = jsonRpcResultAndContext(\n struct.array([struct.union(['null', AccountInfoResult])]),\n);\n\nexport async function getMultipleSolanaAccounts(\n connection: Connection,\n publicKeys: PublicKey[],\n): Promise<\n RpcResponseAndContext<{ [key: string]: AccountInfo | null }>\n> {\n const args = [publicKeys.map((k) => k.toBase58()), { commitment: 'recent' }];\n // @ts-ignore\n const unsafeRes = await connection._rpcRequest('getMultipleAccounts', args);\n const res = GetMultipleAccountsAndContextRpcResult(unsafeRes);\n if (res.error) {\n throw new Error(\n 'failed to get info about accounts ' +\n publicKeys.map((k) => k.toBase58()).join(', ') +\n ': ' +\n res.error.message,\n );\n }\n assert(typeof res.result !== 'undefined');\n const accounts: Array<{\n executable: any;\n owner: PublicKey;\n lamports: any;\n data: Buffer;\n } | null> = [];\n for (const account of res.result.value) {\n let value: {\n executable: any;\n owner: PublicKey;\n lamports: any;\n data: Buffer;\n } | null = null;\n if (res.result.value) {\n const { executable, owner, lamports, data } = account;\n assert(data[1] === 'base64');\n value = {\n executable,\n owner: new PublicKey(owner),\n lamports,\n data: Buffer.from(data[0], 'base64'),\n };\n }\n accounts.push(value);\n }\n return {\n context: {\n slot: res.result.context.slot,\n },\n value: Object.fromEntries(\n accounts.map((account, i) => [publicKeys[i].toBase58(), account]),\n ),\n };\n}\n\n/** Copy of Connection.simulateTransaction that takes a commitment parameter. */\nasync function simulateTransaction(\n connection: Connection,\n transaction: Transaction,\n commitment: Commitment,\n): Promise> {\n // @ts-ignore\n transaction.recentBlockhash = await connection._recentBlockhash(\n // @ts-ignore\n connection._disableBlockhashCaching,\n );\n\n const signData = transaction.serializeMessage();\n // @ts-ignore\n const wireTransaction = transaction._serialize(signData);\n const encodedTransaction = wireTransaction.toString('base64');\n const config: any = { encoding: 'base64', commitment };\n const args = [encodedTransaction, config];\n\n // @ts-ignore\n const res = await connection._rpcRequest('simulateTransaction', args);\n if (res.error) {\n throw new Error('failed to simulate transaction: ' + res.error.message);\n }\n return res.result;\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { MarketInfo, TokenInfo } from './types';\n\nexport const MAX_PRIORITY_FEE = 10_000;\nexport const COMPUTE_UNIT_LIMIT = 1_000_000;\nexport const COMPUTE_UNIT_LIMIT_MULTIPLIER = 1.1;\n\nexport const MARKETS: MarketInfo[] = [\n {\n address: new PublicKey('8GmrrARv2SQ5Z8eKnrvJ9VrcZHDoeGmRfR5MY5jmqfuM'),\n name: 'ETH/USDC',\n programId: new PublicKey('xY9r3jzQQLYuxBycxfT31xytsPDrpacWnyswMskn16s'),\n deprecated: false,\n quoteLabel: 'USDC',\n baseLabel: 'ETH',\n },\n {\n address: new PublicKey('4riVQRGVHbwA6buZBLyBTKh7rByNQHpeua85Fcze8z5p'),\n name: 'BTC/USDC',\n programId: new PublicKey('xY9r3jzQQLYuxBycxfT31xytsPDrpacWnyswMskn16s'),\n deprecated: false,\n quoteLabel: 'USDC',\n baseLabel: 'BTC',\n },\n];\n\nexport const TOKENS: TokenInfo[] = [\n {\n name: 'ETH',\n address: new PublicKey('So11111111111111111111111111111111111111112'),\n },\n {\n name: 'USDC',\n address: new PublicKey('Usdc2oYTsrjCH3KbCva8bLZwbqjcQLafAFjf5ifPNxa'),\n },\n {\n name: 'BTC',\n address: new PublicKey('2WGF5NgLZV3cg473ZNh41vzj3PU8HwLr3RB1PbyvCSXu'),\n },\n];\n","import { createGlobalStyle } from 'styled-components';\n\nexport const GlobalStyle = createGlobalStyle`\nhtml,body{\n background: #11161D;\n}\ninput[type=number]::-webkit-inner-spin-button {\n opacity: 0;\n}\ninput[type=number]:hover::-webkit-inner-spin-button,\ninput[type=number]:focus::-webkit-inner-spin-button {\n opacity: 0.25;\n}\n/* width */\n::-webkit-scrollbar {\n width: 15px;\n}\n/* Track */\n::-webkit-scrollbar-track {\n background: #2d313c;\n}\n/* Handle */\n::-webkit-scrollbar-thumb {\n background: #5b5f67;\n}\n/* Handle on hover */\n::-webkit-scrollbar-thumb:hover {\n background: #5b5f67;\n}\n.ant-slider-track, .ant-slider:hover .ant-slider-track {\n background-color: #2abdd2;\n opacity: 0.75;\n}\n.ant-slider-track,\n.ant-slider ant-slider-track:hover {\n background-color: #2abdd2;\n opacity: 0.75;\n}\n.ant-slider-dot-active,\n.ant-slider-handle,\n.ant-slider-handle-click-focused,\n.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) {\n border: 2px solid #2abdd2; \n}\n.ant-table-tbody > tr.ant-table-row:hover > td {\n background: #273043;\n}\n.ant-table-tbody > tr > td {\n border-bottom: 8px solid #1A2029;\n}\n.ant-table-container table > thead > tr:first-child th {\n border-bottom: none;\n}\n.ant-divider-horizontal.ant-divider-with-text::before, .ant-divider-horizontal.ant-divider-with-text::after {\n border-top: 1px solid #434a59 !important;\n}\n.ant-layout {\n background: #11161D\n }\n .ant-table {\n background: #212734;\n }\n .ant-table-thead > tr > th {\n background: #1A2029;\n }\n.ant-select-item-option-content {\n img {\n margin-right: 4px;\n }\n}\n.ant-modal-content {\n background-color: #212734;\n}\n\n@-webkit-keyframes highlight {\n from { background-color: #2abdd2;}\n to {background-color: #1A2029;}\n}\n@-moz-keyframes highlight {\n from { background-color: #2abdd2;}\n to {background-color: #1A2029;}\n}\n@-keyframes highlight {\n from { background-color: #2abdd2;}\n to {background-color: #1A2029;}\n}\n.flash {\n -moz-animation: highlight 0.5s ease 0s 1 alternate ;\n -webkit-animation: highlight 0.5s ease 0s 1 alternate;\n animation: highlight 0.5s ease 0s 1 alternate;\n}`;\n","import React, { Component } from 'react';\nimport { Typography } from 'antd';\n\nconst { Title } = Typography;\n\nexport default class ErrorBoundary extends Component {\n state = {\n hasError: false,\n };\n\n static getDerivedStateFromError(error) {\n return { hasError: true };\n }\n\n render() {\n if (this.state.hasError) {\n return (\n
\n
\n Something went wrong.\n Please try again later.\n
\n
\n );\n }\n\n return this.props.children!;\n }\n}\n","import { useRef, useEffect } from 'react';\n\nexport function useInterval(callback, delay) {\n const savedCallback = useRef<() => void>();\n\n // Remember the latest callback.\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval.\n useEffect(() => {\n function tick() {\n savedCallback.current && savedCallback.current();\n }\n if (delay !== null) {\n let id = setInterval(tick, delay);\n return () => {\n clearInterval(id);\n };\n }\n }, [delay]);\n}\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst Wrapper = styled.div`\n margin: 5px;\n padding: 20px;\n background-color: #1a2029;\n`;\n\nexport default function FloatingElement({\n style = {},\n children,\n stretchVertical = false,\n}) {\n return (\n \n {children}\n \n );\n}\n","import { Col, Row } from 'antd';\nimport React, { useRef, useEffect, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { useMarket, useOrderbook, useMarkPrice } from '../utils/markets';\nimport { isEqual, getDecimalCount } from '../utils/utils';\nimport { useInterval } from '../utils/useInterval';\nimport FloatingElement from './layout/FloatingElement';\nimport usePrevious from '../utils/usePrevious';\nimport { ArrowUpOutlined, ArrowDownOutlined } from '@ant-design/icons';\n\nconst Title = styled.div`\n color: rgba(255, 255, 255, 1);\n`;\n\nconst SizeTitle = styled(Row)`\n padding: 20px 0 14px;\n color: #434a59;\n`;\n\nconst MarkPriceTitle = styled(Row)`\n padding: 20px 0 14px;\n font-weight: 700;\n`;\n\nconst Line = styled.div`\n text-align: right;\n float: right;\n height: 100%;\n ${(props) =>\n props['data-width'] &&\n css`\n width: ${props['data-width']};\n `}\n ${(props) =>\n props['data-bgcolor'] &&\n css`\n background-color: ${props['data-bgcolor']};\n `}\n`;\n\nconst Price = styled.div`\n position: absolute;\n right: 5px;\n color: white;\n`;\n\nexport default function Orderbook({ smallScreen, depth = 7, onPrice, onSize }) {\n const markPrice = useMarkPrice();\n const [orderbook] = useOrderbook();\n const { baseCurrency, quoteCurrency } = useMarket();\n\n const currentOrderbookData = useRef(null);\n const lastOrderbookData = useRef(null);\n\n const [orderbookData, setOrderbookData] = useState(null);\n\n useInterval(() => {\n if (\n !currentOrderbookData.current ||\n JSON.stringify(currentOrderbookData.current) !==\n JSON.stringify(lastOrderbookData.current)\n ) {\n let bids = orderbook?.bids || [];\n let asks = orderbook?.asks || [];\n\n let sum = (total, [, size], index) =>\n index < depth ? total + size : total;\n let totalSize = bids.reduce(sum, 0) + asks.reduce(sum, 0);\n\n let bidsToDisplay = getCumulativeOrderbookSide(bids, totalSize, false);\n let asksToDisplay = getCumulativeOrderbookSide(asks, totalSize, true);\n\n currentOrderbookData.current = {\n bids: orderbook?.bids,\n asks: orderbook?.asks,\n };\n\n setOrderbookData({ bids: bidsToDisplay, asks: asksToDisplay });\n }\n }, 250);\n\n useEffect(() => {\n lastOrderbookData.current = {\n bids: orderbook?.bids,\n asks: orderbook?.asks,\n };\n }, [orderbook]);\n\n function getCumulativeOrderbookSide(orders, totalSize, backwards = false) {\n let cumulative = orders\n .slice(0, depth)\n .reduce((cumulative, [price, size], i) => {\n const cumulativeSize = (cumulative[i - 1]?.cumulativeSize || 0) + size;\n cumulative.push({\n price,\n size,\n cumulativeSize,\n sizePercent: Math.round((cumulativeSize / (totalSize || 1)) * 100),\n });\n return cumulative;\n }, []);\n if (backwards) {\n cumulative = cumulative.reverse();\n }\n return cumulative;\n }\n\n return (\n \n Orderbook\n \n \n Size ({baseCurrency})\n \n \n Price ({quoteCurrency})\n \n \n {orderbookData?.asks.map(({ price, size, sizePercent }) => (\n onPrice(price)}\n onSizeClick={() => onSize(size)}\n />\n ))}\n \n {orderbookData?.bids.map(({ price, size, sizePercent }) => (\n onPrice(price)}\n onSizeClick={() => onSize(size)}\n />\n ))}\n \n );\n}\n\nconst OrderbookRow = React.memo(\n ({ side, price, size, sizePercent, onSizeClick, onPriceClick }) => {\n const element = useRef();\n\n const { market } = useMarket();\n\n useEffect(() => {\n // eslint-disable-next-line\n !element.current?.classList.contains('flash') &&\n element.current?.classList.add('flash');\n const id = setTimeout(\n () =>\n element.current?.classList.contains('flash') &&\n element.current?.classList.remove('flash'),\n 250,\n );\n return () => clearTimeout(id);\n }, [price, size]);\n\n let formattedSize =\n market?.minOrderSize && !isNaN(size)\n ? Number(size).toFixed(getDecimalCount(market.minOrderSize) + 1)\n : size;\n\n let formattedPrice =\n market?.tickSize && !isNaN(price)\n ? Number(price).toFixed(getDecimalCount(market.tickSize) + 1)\n : price;\n\n return (\n \n \n {formattedSize}\n \n \n \n {formattedPrice}\n \n \n );\n },\n (prevProps, nextProps) =>\n isEqual(prevProps, nextProps, ['price', 'size', 'sizePercent']),\n);\n\nconst MarkPriceComponent = React.memo(\n ({ markPrice }) => {\n const { market } = useMarket();\n const previousMarkPrice = usePrevious(markPrice);\n\n let markPriceColor =\n markPrice > previousMarkPrice\n ? '#41C77A'\n : markPrice < previousMarkPrice\n ? '#F23B69'\n : 'white';\n\n let formattedMarkPrice =\n markPrice &&\n market?.tickSize &&\n markPrice.toFixed(getDecimalCount(market.tickSize));\n\n return (\n \n \n {markPrice > previousMarkPrice && (\n \n )}\n {markPrice < previousMarkPrice && (\n \n )}\n {formattedMarkPrice || '----'}\n \n \n );\n },\n (prevProps, nextProps) => isEqual(prevProps, nextProps, ['markPrice']),\n);\n","import { useEffect, useRef } from 'react';\n\nexport default function usePrevious(value) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = useRef();\n\n // Store current value in ref\n useEffect(() => {\n ref.current = value;\n }, [value]); // Only re-run if value changes\n\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n","import React from 'react';\nimport { ConfigProvider, Table } from 'antd';\n\nexport default function DataTable({\n dataSource,\n columns,\n emptyLabel = 'No data',\n pagination = false,\n loading = false,\n pageSize = 10,\n}) {\n const customizeRenderEmpty = () => (\n \n {emptyLabel}\n \n );\n\n return (\n \n \n \n );\n}\n","import React, { useContext, useEffect, useState } from 'react';\nimport { useConnection } from './connection';\nimport { PublicKey } from '@solana/web3.js';\nimport {\n NameRegistryState,\n getHashedName,\n getNameAccountKey,\n getTwitterRegistry,\n} from '@solana/spl-name-service';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { useLocalStorageState } from './utils';\n\ninterface ReferrerContextValues {\n usdcRef: PublicKey | undefined;\n usdtRef: PublicKey | undefined;\n setRefCode: (arg: any) => void;\n refCode: string | undefined;\n allowRefLink: boolean;\n}\n\nconst ReferrerContext: React.Context = React.createContext(\n null,\n);\n\nexport const ASSOCIATED_TOKEN_PROGRAM_ID: PublicKey = new PublicKey(\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n);\n\nconst USDC_MINT = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');\nconst USDT_MINT = new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB');\n\nexport async function findAssociatedTokenAddress(\n walletAddress: PublicKey,\n tokenMintAddress: PublicKey,\n): Promise {\n return (\n await PublicKey.findProgramAddress(\n [\n walletAddress.toBuffer(),\n TOKEN_PROGRAM_ID.toBuffer(),\n tokenMintAddress.toBuffer(),\n ],\n ASSOCIATED_TOKEN_PROGRAM_ID,\n )\n )[0];\n}\n\n// Address of the SOL TLD\nexport const SOL_TLD_AUTHORITY = new PublicKey(\n '58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx',\n);\n\nexport const getInputKey = async (input: string) => {\n let hashed_input_name = await getHashedName(input);\n let inputDomainKey = await getNameAccountKey(\n hashed_input_name,\n undefined,\n SOL_TLD_AUTHORITY,\n );\n return { inputDomainKey: inputDomainKey, hashedInputName: hashed_input_name };\n};\n\nexport const useFeesAccountsFromRefCode = (refCode: string | undefined) => {\n const connection = useConnection();\n const [usdc, setUsdc] = useState(undefined);\n const [usdt, setUsdt] = useState(undefined);\n\n useEffect(() => {\n const fn = async () => {\n let usdcAddress: undefined | PublicKey = undefined;\n let usdtAddress: undefined | PublicKey = undefined;\n if (!refCode) {\n setUsdc(\n process.env.REACT_APP_USDC_REFERRAL_FEES_ADDRESS\n ? new PublicKey(process.env.REACT_APP_USDC_REFERRAL_FEES_ADDRESS)\n : undefined,\n );\n setUsdt(\n process.env.REACT_APP_USDT_REFERRAL_FEES_ADDRESS\n ? new PublicKey(process.env.REACT_APP_USDT_REFERRAL_FEES_ADDRESS)\n : undefined,\n );\n return;\n }\n try {\n let nameRegistryState: NameRegistryState;\n if (refCode.includes('.sol')) {\n const { inputDomainKey } = await getInputKey(\n refCode.replace('.sol', ''),\n );\n nameRegistryState = await NameRegistryState.retrieve(\n connection,\n inputDomainKey,\n );\n } else {\n nameRegistryState = await getTwitterRegistry(connection, refCode);\n }\n usdcAddress = await findAssociatedTokenAddress(\n nameRegistryState.owner,\n USDC_MINT,\n );\n usdtAddress = await findAssociatedTokenAddress(\n nameRegistryState.owner,\n USDT_MINT,\n );\n const usdcAccountInfo = await connection.getAccountInfo(usdcAddress);\n const usdtAccountInfo = await connection.getAccountInfo(usdtAddress);\n if (!!usdcAccountInfo?.data) setUsdc(usdcAddress);\n if (!!usdtAccountInfo?.data) setUsdt(usdtAddress);\n } catch (err) {\n console.warn(`Error getting refcode ${err}`);\n }\n };\n fn();\n }, [connection, refCode]);\n return { usdcRef: usdc, usdtRef: usdt };\n};\n\nexport const ReferrerProvider = ({ children }) => {\n const allowRefLink = process.env.REACT_APP_ALLOW_REF_LINK === 'true';\n const [refCode, setRefCode] = useLocalStorageState('refCode');\n const { usdcRef, usdtRef } = useFeesAccountsFromRefCode(\n allowRefLink ? refCode : undefined,\n );\n useEffect(() => {\n if (!allowRefLink) setRefCode(null);\n }, [allowRefLink, setRefCode]);\n return (\n \n {children}\n \n );\n};\n\nexport const useReferrer = () => {\n const context = useContext(ReferrerContext);\n if (!context) throw new Error('Missing referrer context');\n return {\n usdcRef: context.usdcRef,\n usdtRef: context.usdtRef,\n setRefCode: context.setRefCode,\n refCode: context.refCode,\n allowRefLink: context.allowRefLink,\n };\n};\n","import { Button } from 'antd';\nimport React from 'react';\nimport {\n useTokenAccounts,\n getSelectedTokenAccountForMint,\n} from '../../utils/markets';\nimport DataTable from '../layout/DataTable';\nimport { useSendConnection, useConnectionConfig } from '../../utils/connection';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { settleFunds } from '../../utils/send';\nimport { notify } from '../../utils/notifications';\nimport { useReferrer } from '../../utils/referrer';\n\nexport default function BalancesTable({\n balances,\n showMarket,\n hideWalletBalance,\n onSettleSuccess,\n}) {\n const [accounts] = useTokenAccounts();\n const connection = useSendConnection();\n const { wallet } = useWallet();\n const { usdcRef, usdtRef } = useReferrer();\n const { priorityFee, computeUnits } = useConnectionConfig();\n\n async function onSettleFunds(market, openOrders) {\n try {\n await settleFunds({\n market,\n openOrders,\n connection,\n wallet,\n baseCurrencyAccount: getSelectedTokenAccountForMint(\n accounts,\n market?.baseMintAddress,\n ),\n quoteCurrencyAccount: getSelectedTokenAccountForMint(\n accounts,\n market?.quoteMintAddress,\n ),\n usdcRef,\n usdtRef,\n priorityFee,\n computeUnits,\n });\n } catch (e) {\n notify({\n message: 'Error settling funds',\n description: e.message,\n type: 'error',\n });\n return;\n }\n onSettleSuccess && onSettleSuccess();\n }\n\n const columns = [\n showMarket\n ? {\n title: 'Market',\n dataIndex: 'marketName',\n key: 'marketName',\n }\n : null,\n {\n title: 'Coin',\n dataIndex: 'coin',\n key: 'coin',\n },\n hideWalletBalance\n ? null\n : {\n title: 'Wallet Balance',\n dataIndex: 'wallet',\n key: 'wallet',\n },\n {\n title: 'Orders',\n dataIndex: 'orders',\n key: 'orders',\n },\n {\n title: 'Unsettled',\n dataIndex: 'unsettled',\n key: 'unsettled',\n },\n {\n key: 'action',\n render: ({ market, openOrders, marketName }) => (\n
\n onSettleFunds(market, openOrders)}\n >\n Settle {marketName}\n \n
\n ),\n },\n ].filter((x) => x);\n return (\n \n );\n}\n","import React, { useState } from 'react';\nimport DataTable from '../layout/DataTable';\n\nimport styled from 'styled-components';\nimport { Button, Col, Row, Tag } from 'antd';\nimport { cancelOrder } from '../../utils/send';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useConnectionConfig, useSendConnection } from '../../utils/connection';\nimport { notify } from '../../utils/notifications';\nimport { DeleteOutlined } from '@ant-design/icons';\nimport { OrderWithMarketAndMarketName } from '../../utils/types';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\n\nconst CancelButton = styled(Button)`\n color: #f23b69;\n border: 1px solid #f23b69;\n`;\n\nexport default function OpenOrderTable({\n openOrders,\n onCancelSuccess,\n pageSize,\n loading,\n marketFilter,\n}: {\n openOrders: OrderWithMarketAndMarketName[] | null | undefined;\n onCancelSuccess?: () => void;\n pageSize?: number;\n loading?: boolean;\n marketFilter?: boolean;\n}) {\n let { wallet } = useWallet();\n let connection = useSendConnection();\n\n const [cancelId, setCancelId] = useState(null);\n const { priorityFee, computeUnits } = useConnectionConfig();\n\n async function cancel(order) {\n setCancelId(order?.orderId);\n try {\n if (!wallet) {\n return null;\n }\n\n await cancelOrder({\n order,\n market: order.market,\n connection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n priorityFee,\n computeUnits,\n });\n } catch (e: any) {\n notify({\n message: 'Error cancelling order',\n description: e.message,\n type: 'error',\n });\n return;\n } finally {\n setCancelId(null);\n }\n onCancelSuccess && onCancelSuccess();\n }\n\n const marketFilters = [\n ...new Set((openOrders || []).map((orderInfos) => orderInfos.marketName)),\n ].map((marketName) => {\n return { text: marketName, value: marketName };\n });\n\n const columns = [\n {\n title: 'Market',\n dataIndex: 'marketName',\n key: 'marketName',\n filters: marketFilter ? marketFilters : undefined,\n onFilter: (value, record) => record.marketName.indexOf(value) === 0,\n },\n {\n title: 'Side',\n dataIndex: 'side',\n key: 'side',\n render: (side) => (\n \n {side.charAt(0).toUpperCase() + side.slice(1)}\n \n ),\n sorter: (a, b) => {\n if (a.side === b.side) {\n return 0;\n } else if (a.side === 'buy') {\n return 1;\n } else {\n return -1;\n }\n },\n showSorterTooltip: false,\n },\n {\n title: 'Size',\n dataIndex: 'size',\n key: 'size',\n sorter: (a, b) => b.size - a.size,\n showSorterTooltip: false,\n },\n {\n title: 'Price',\n dataIndex: 'price',\n key: 'price',\n sorter: (a, b) => b.price - a.price,\n showSorterTooltip: false,\n },\n {\n key: 'orderId',\n render: (order) => (\n
\n }\n onClick={() => cancel(order)}\n loading={cancelId + '' === order?.orderId + ''}\n >\n Cancel\n \n
\n ),\n },\n ];\n const dataSource = (openOrders || []).map((order) => ({\n ...order,\n key: order.orderId,\n }));\n\n return (\n \n \n \n \n \n );\n}\n","import React from 'react';\nimport { Row, Col, Tag } from 'antd';\nimport { useFills, useMarket } from '../../utils/markets';\nimport DataTable from '../layout/DataTable';\n\nexport default function FillsTable() {\n const fills = useFills();\n\n const { quoteCurrency } = useMarket();\n\n const columns = [\n {\n title: 'Market',\n dataIndex: 'marketName',\n key: 'marketName',\n },\n {\n title: 'Side',\n dataIndex: 'side',\n key: 'side',\n render: (side) => (\n \n {side.charAt(0).toUpperCase() + side.slice(1)}\n \n ),\n },\n {\n title: `Size`,\n dataIndex: 'size',\n key: 'size',\n },\n {\n title: `Price`,\n dataIndex: 'price',\n key: 'price',\n },\n {\n title: `Liquidity`,\n dataIndex: 'liquidity',\n key: 'liquidity',\n },\n {\n title: quoteCurrency ? `Fees (${quoteCurrency})` : 'Fees',\n dataIndex: 'feeCost',\n key: 'feeCost',\n },\n ];\n\n const dataSource = (fills || []).map((fill) => ({\n ...fill,\n key: `${fill.orderId}${fill.side}`,\n liquidity: fill.eventFlags.maker ? 'Maker' : 'Taker',\n }));\n\n return (\n <>\n \n \n \n \n \n \n );\n}\n","import BalancesTable from './BalancesTable';\nimport OpenOrderTable from './OpenOrderTable';\nimport React from 'react';\nimport { Tabs, Typography } from 'antd';\nimport FillsTable from './FillsTable';\nimport FloatingElement from '../layout/FloatingElement';\nimport FeesTable from './FeesTable';\nimport { useOpenOrders, useBalances, useMarket } from '../../utils/markets';\nimport Link from '../Link';\n\nconst { Paragraph } = Typography;\nconst { TabPane } = Tabs;\n\nexport default function Index() {\n const { market } = useMarket();\n return (\n \n \n \n Make sure to go to Balances and click Settle to send out your funds.\n \n \n To fund your wallet, head to the Airdrop{' '}\n page.\n \n \n \n \n \n \n \n \n \n \n \n \n {/* {market && market.supportsSrmFeeDiscounts ? (\n \n \n \n ) : null} */}\n \n \n );\n}\n\nconst OpenOrdersTab = () => {\n const openOrders = useOpenOrders();\n\n return ;\n};\n\nconst BalancesTab = () => {\n const balances = useBalances();\n\n return ;\n};\n","import React from 'react';\nimport { Modal } from 'antd';\nimport {\n useSelectedBaseCurrencyAccount,\n useMarket,\n useSelectedQuoteCurrencyAccount,\n} from '../utils/markets';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport Link from './Link';\n\nexport default function DepositDialog({ onClose, baseOrQuote }) {\n const { market, baseCurrency, quoteCurrency } = useMarket();\n\n const { providerName, providerUrl } = useWallet();\n const baseCurrencyAccount = useSelectedBaseCurrencyAccount();\n const quoteCurrencyAccount = useSelectedQuoteCurrencyAccount();\n let coinMint;\n let account;\n let depositCoin;\n if (baseOrQuote === 'base') {\n coinMint = market?.baseMintAddress;\n account = baseCurrencyAccount;\n depositCoin = baseCurrency;\n } else if (baseOrQuote === 'quote') {\n coinMint = market?.quoteMintAddress;\n account = quoteCurrencyAccount;\n depositCoin = quoteCurrency;\n } else {\n account = null;\n }\n if (!coinMint) {\n return null;\n }\n return (\n \n
\n

Mint address:

\n

{coinMint.toBase58()}

\n
\n

SPL Deposit address:

\n

\n {account ? (\n account.pubkey.toBase58()\n ) : (\n <>\n Visit{' '}\n \n {providerName}\n {' '}\n to create an account for this mint\n \n )}\n

\n
\n
\n \n );\n}\n","import React from 'react';\nimport { TokenAccount } from '../utils/types';\nimport { useSelectedTokenAccounts } from '../utils/markets';\nimport { Button, Col, Select, Typography } from 'antd';\nimport { CopyOutlined } from '@ant-design/icons';\nimport { abbreviateAddress } from '../utils/utils';\nimport { notify } from '../utils/notifications';\n\nexport default function StandaloneTokenAccountsSelect({\n accounts,\n mint,\n label,\n}: {\n accounts: TokenAccount[] | null | undefined;\n mint: string | undefined;\n label?: boolean;\n}) {\n const [\n selectedTokenAccounts,\n setSelectedTokenAccounts,\n ] = useSelectedTokenAccounts();\n\n let selectedValue: string | undefined;\n if (mint && mint in selectedTokenAccounts) {\n selectedValue = selectedTokenAccounts[mint];\n } else if (accounts && accounts?.length > 0) {\n selectedValue = accounts[0].pubkey.toBase58();\n } else {\n selectedValue = undefined;\n }\n\n const setTokenAccountForCoin = (value) => {\n if (!mint) {\n notify({\n message: 'Error selecting token account',\n description: 'Mint is undefined',\n type: 'error',\n });\n return;\n }\n const newSelectedTokenAccounts = { ...selectedTokenAccounts };\n newSelectedTokenAccounts[mint] = value;\n setSelectedTokenAccounts(newSelectedTokenAccounts);\n };\n\n return (\n \n {label && Token account:}\n \n \n {accounts?.map((account) => (\n \n \n {label\n ? abbreviateAddress(account.pubkey, 8)\n : account.pubkey.toBase58()}\n \n \n ))}\n \n \n \n }\n size={'small'}\n onClick={() =>\n selectedValue && navigator.clipboard.writeText(selectedValue)\n }\n />\n \n \n );\n}\n","import React from 'react';\nimport { Button } from 'antd';\nimport { LinkOutlined } from '@ant-design/icons';\n\nexport default function LinkAddress({\n title,\n address,\n shorten = false,\n}: {\n title?: undefined | any;\n address: string;\n shorten?: boolean;\n}) {\n return (\n
\n {title &&

{title}

}\n }\n href={'https://solscan.io/address/' + address}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ cursor: 'pointer' }}\n >\n {shorten ? `${address.slice(0, 4)}...${address.slice(-4)}` : address}\n \n
\n );\n}\n","import React, { useContext, useState } from 'react';\nimport { sleep, useLocalStorageState } from './utils';\nimport { useInterval } from './useInterval';\nimport { useConnection, useConnectionConfig } from './connection';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { useMarketInfos, useTokenAccounts } from './markets';\nimport { settleAllFunds } from './send';\nimport { PreferencesContextValues } from './types';\nimport { Market } from '@openbook-dex/openbook';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\n\nexport const AUTO_SETTLE_DISABLED_OVERRIDE = true;\n\nconst PreferencesContext = React.createContext(\n null,\n);\n\nexport function PreferencesProvider({ children }) {\n const [autoSettleEnabled, setAutoSettleEnabled] = useLocalStorageState(\n 'autoSettleEnabled',\n true,\n );\n\n const [tokenAccounts] = useTokenAccounts();\n const { connected, wallet } = useWallet();\n const marketInfoList = useMarketInfos();\n const [currentlyFetchingMarkets, setCurrentlyFetchingMarkets] =\n useState(false);\n const [markets, setMarkets] = useState>(new Map());\n const addToMarketsMap = (marketId, market) => {\n setMarkets((prev) => new Map(prev).set(marketId, market));\n };\n const connection = useConnection();\n const { priorityFee, computeUnits } = useConnectionConfig();\n\n useInterval(() => {\n const autoSettle = async () => {\n if (AUTO_SETTLE_DISABLED_OVERRIDE) {\n return;\n }\n if (!wallet) {\n return;\n }\n try {\n console.log('Settling funds...');\n await settleAllFunds({\n connection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n tokenAccounts: tokenAccounts || [],\n markets: [...markets.values()],\n priorityFee,\n computeUnits,\n });\n } catch (e: any) {\n console.log('Error auto settling funds: ' + e.message);\n return;\n }\n console.log('Finished settling funds.');\n };\n connected &&\n (wallet?.adapter as any).autoApprove &&\n autoSettleEnabled &&\n autoSettle();\n }, 20000);\n\n // warms up the market and open orders cache for auto-settlement\n useInterval(() => {\n const fetchMarkets = async () => {\n if (!wallet) {\n // only need these markets for auto-settlement, so don't fetch unless we are connected.\n return;\n }\n setCurrentlyFetchingMarkets(true);\n for (const marketInfo of marketInfoList) {\n if (markets.has(marketInfo.address.toString())) {\n continue;\n }\n try {\n const market = await Market.load(\n connection,\n marketInfo.address,\n {},\n marketInfo.programId,\n );\n addToMarketsMap(marketInfo.address.toString(), market);\n await sleep(1000);\n } catch (e: any) {\n console.log('Error fetching market: ' + e.message);\n }\n }\n setCurrentlyFetchingMarkets(false);\n };\n connected &&\n (wallet?.adapter as any).autoApprove &&\n autoSettleEnabled &&\n !currentlyFetchingMarkets &&\n fetchMarkets();\n }, 60000);\n\n return (\n \n {children}\n \n );\n}\n\nexport function usePreferences() {\n const context = useContext(PreferencesContext);\n if (!context) {\n throw new Error('Missing preferences context');\n }\n return {\n autoSettleEnabled: context.autoSettleEnabled,\n setAutoSettleEnabled: context.setAutoSettleEnabled,\n };\n}\n","import { Button, Col, Divider, Popover, Row } from 'antd';\nimport React, { useState } from 'react';\nimport FloatingElement from './layout/FloatingElement';\nimport styled from 'styled-components';\nimport {\n useBalances,\n useMarket,\n useSelectedBaseCurrencyAccount,\n useSelectedOpenOrdersAccount,\n useSelectedQuoteCurrencyAccount,\n useTokenAccounts,\n} from '../utils/markets';\nimport DepositDialog from './DepositDialog';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport Link from './Link';\nimport { settleFunds } from '../utils/send';\nimport { useConnectionConfig, useSendConnection } from '../utils/connection';\nimport { notify } from '../utils/notifications';\nimport { Balances } from '../utils/types';\nimport StandaloneTokenAccountsSelect from './StandaloneTokenAccountSelect';\nimport LinkAddress from './LinkAddress';\nimport { InfoCircleOutlined } from '@ant-design/icons';\nimport { useInterval } from '../utils/useInterval';\nimport { useLocalStorageState } from '../utils/utils';\nimport { AUTO_SETTLE_DISABLED_OVERRIDE } from '../utils/preferences';\nimport { useReferrer } from '../utils/referrer';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\n\nconst RowBox = styled(Row)`\n padding-bottom: 20px;\n`;\n\nconst Tip = styled.p`\n font-size: 12px;\n padding-top: 6px;\n`;\n\nconst ActionButton = styled(Button)`\n color: #2abdd2;\n background-color: #212734;\n border-width: 0px;\n`;\n\nexport default function StandaloneBalancesDisplay() {\n const { baseCurrency, quoteCurrency, market } = useMarket();\n const { priorityFee, computeUnits } = useConnectionConfig();\n const balances = useBalances();\n const openOrdersAccount = useSelectedOpenOrdersAccount(true);\n const connection = useSendConnection();\n const { wallet, connected } = useWallet();\n const [baseOrQuote, setBaseOrQuote] = useState('');\n const baseCurrencyAccount = useSelectedBaseCurrencyAccount();\n const quoteCurrencyAccount = useSelectedQuoteCurrencyAccount();\n const [tokenAccounts] = useTokenAccounts();\n const baseCurrencyBalances =\n balances && balances.find((b) => b.coin === baseCurrency);\n const quoteCurrencyBalances =\n balances && balances.find((b) => b.coin === quoteCurrency);\n const [autoSettleEnabled] = useLocalStorageState('autoSettleEnabled', true);\n const [lastSettledAt, setLastSettledAt] = useState(0);\n const { usdcRef, usdtRef } = useReferrer();\n async function onSettleFunds() {\n if (!wallet) {\n notify({\n message: 'Wallet not connected',\n description: 'wallet is undefined',\n type: 'error',\n });\n return;\n }\n\n if (!market) {\n notify({\n message: 'Error settling funds',\n description: 'market is undefined',\n type: 'error',\n });\n return;\n }\n if (!openOrdersAccount) {\n notify({\n message: 'Error settling funds',\n description: 'Open orders account is undefined',\n type: 'error',\n });\n return;\n }\n if (!baseCurrencyAccount) {\n notify({\n message: 'Error settling funds',\n description: 'Open orders account is undefined',\n type: 'error',\n });\n return;\n }\n if (!quoteCurrencyAccount) {\n notify({\n message: 'Error settling funds',\n description: 'Open orders account is undefined',\n type: 'error',\n });\n return;\n }\n\n try {\n await settleFunds({\n market,\n openOrders: openOrdersAccount,\n connection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n baseCurrencyAccount,\n quoteCurrencyAccount,\n usdcRef,\n usdtRef,\n priorityFee,\n computeUnits,\n });\n } catch (e: any) {\n notify({\n message: 'Error settling funds',\n description: e.message,\n type: 'error',\n });\n }\n }\n\n useInterval(() => {\n const autoSettle = async () => {\n if (\n AUTO_SETTLE_DISABLED_OVERRIDE ||\n !wallet ||\n !market ||\n !openOrdersAccount ||\n !baseCurrencyAccount ||\n !quoteCurrencyAccount ||\n !autoSettleEnabled\n ) {\n return;\n }\n if (\n !baseCurrencyBalances?.unsettled &&\n !quoteCurrencyBalances?.unsettled\n ) {\n return;\n }\n if (Date.now() - lastSettledAt < 15000) {\n return;\n }\n try {\n setLastSettledAt(Date.now());\n await settleFunds({\n market,\n openOrders: openOrdersAccount,\n connection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n baseCurrencyAccount,\n quoteCurrencyAccount,\n usdcRef,\n usdtRef,\n priorityFee,\n computeUnits,\n });\n } catch (e: any) {\n console.log('Error auto settling funds: ' + e.message);\n return;\n }\n };\n connected &&\n (wallet?.adapter as any).autoApprove &&\n autoSettleEnabled &&\n autoSettle();\n }, 1000);\n\n const formattedBalances: [\n string | undefined,\n Balances | undefined,\n string,\n string | undefined,\n ][] = [\n [\n baseCurrency,\n baseCurrencyBalances,\n 'base',\n market?.baseMintAddress.toBase58(),\n ],\n [\n quoteCurrency,\n quoteCurrencyBalances,\n 'quote',\n market?.quoteMintAddress.toBase58(),\n ],\n ];\n\n return (\n \n {formattedBalances.map(\n ([currency, balances, baseOrQuote, mint], index) => (\n \n \n {currency}{' '}\n {mint && (\n }\n placement=\"bottomRight\"\n title=\"Token mint\"\n trigger=\"hover\"\n >\n \n \n )}\n \n {connected && (\n \n account.effectiveMint.toBase58() === mint,\n )}\n mint={mint}\n label\n />\n \n )}\n \n Wallet balance:\n {balances && balances.wallet}\n \n \n Unsettled balance:\n {balances && balances.unsettled}\n \n \n \n setBaseOrQuote(baseOrQuote)}\n >\n Deposit\n \n \n \n \n Settle\n \n \n \n \n All deposits go to your{' '}\n \n {wallet?.adapter.name}\n {' '}\n wallet\n \n \n ),\n )}\n setBaseOrQuote('')}\n />\n \n );\n}\n","import { Button, Input, Radio, Slider, Switch } from 'antd';\nimport React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport {\n useFeeDiscountKeys,\n useLocallyStoredFeeDiscountKey,\n useMarket,\n useMarkPrice,\n useSelectedBaseCurrencyAccount,\n useSelectedBaseCurrencyBalances,\n useSelectedOpenOrdersAccount,\n useSelectedQuoteCurrencyAccount,\n useSelectedQuoteCurrencyBalances,\n} from '../utils/markets';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { notify } from '../utils/notifications';\nimport {\n floorToDecimal,\n getDecimalCount,\n roundToDecimal,\n} from '../utils/utils';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport {\n useConnection,\n useConnectionConfig,\n useSendConnection,\n} from '../utils/connection';\nimport FloatingElement from './layout/FloatingElement';\nimport { getUnixTs, placeOrder } from '../utils/send';\nimport { SwitchChangeEventHandler } from 'antd/es/switch';\nimport { refreshCache } from '../utils/fetch-loop';\nimport tuple from 'immutable-tuple';\n\nconst SellButton = styled(Button)`\n margin: 20px 0px 0px 0px;\n background: #f23b69;\n border-color: #f23b69;\n`;\n\nconst BuyButton = styled(Button)`\n margin: 20px 0px 0px 0px;\n background: #02bf76;\n border-color: #02bf76;\n`;\n\nconst sliderMarks = {\n 0: '0%',\n 25: '25%',\n 50: '50%',\n 75: '75%',\n 100: '100%',\n};\n\nexport default function TradeForm({\n style,\n setChangeOrderRef,\n}: {\n style?: any;\n setChangeOrderRef?: (\n ref: ({ size, price }: { size?: number; price?: number }) => void,\n ) => void;\n}) {\n const [side, setSide] = useState<'buy' | 'sell'>('buy');\n const { baseCurrency, quoteCurrency, market } = useMarket();\n const baseCurrencyBalances = useSelectedBaseCurrencyBalances();\n const quoteCurrencyBalances = useSelectedQuoteCurrencyBalances();\n const baseCurrencyAccount = useSelectedBaseCurrencyAccount();\n const quoteCurrencyAccount = useSelectedQuoteCurrencyAccount();\n const openOrdersAccount = useSelectedOpenOrdersAccount(true);\n const { connected, publicKey, wallet } = useWallet();\n const sendConnection = useSendConnection();\n const markPrice = useMarkPrice();\n useFeeDiscountKeys();\n const { storedFeeDiscountKey: feeDiscountKey } =\n useLocallyStoredFeeDiscountKey();\n const { priorityFee, computeUnits } = useConnectionConfig();\n\n const [postOnly, setPostOnly] = useState(false);\n const [ioc, setIoc] = useState(false);\n const [baseSize, setBaseSize] = useState(undefined);\n const [quoteSize, setQuoteSize] = useState(undefined);\n const [price, setPrice] = useState(undefined);\n const [submitting, setSubmitting] = useState(false);\n const [sizeFraction, setSizeFraction] = useState(0);\n\n const availableQuote =\n openOrdersAccount && market\n ? market.quoteSplSizeToNumber(openOrdersAccount.quoteTokenFree)\n : 0;\n\n let quoteBalance = (quoteCurrencyBalances || 0) + (availableQuote || 0);\n let baseBalance = baseCurrencyBalances || 0;\n let sizeDecimalCount =\n market?.minOrderSize && getDecimalCount(market.minOrderSize);\n let priceDecimalCount = market?.tickSize && getDecimalCount(market.tickSize);\n\n useEffect(() => {\n setChangeOrderRef && setChangeOrderRef(doChangeOrder);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [setChangeOrderRef]);\n\n useEffect(() => {\n baseSize && price && onSliderChange(sizeFraction);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [side]);\n\n useEffect(() => {\n updateSizeFraction();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [price, baseSize]);\n\n useEffect(() => {\n const warmUpCache = async () => {\n try {\n if (!publicKey || !market) {\n console.log(`Skipping refreshing accounts`);\n return;\n }\n const startTime = getUnixTs();\n console.log(`Refreshing accounts for ${market.address}`);\n await market?.findOpenOrdersAccountsForOwner(sendConnection, publicKey);\n await market?.findBestFeeDiscountKey(sendConnection, publicKey);\n const endTime = getUnixTs();\n console.log(\n `Finished refreshing accounts for ${market.address} after ${\n endTime - startTime\n }`,\n );\n } catch (e: any) {\n console.log(`Encountered error when refreshing trading accounts: ${e}`);\n }\n };\n warmUpCache();\n const id = setInterval(warmUpCache, 30_000);\n return () => clearInterval(id);\n }, [market, sendConnection, publicKey]);\n\n const onSetBaseSize = (baseSize: number | undefined) => {\n setBaseSize(baseSize);\n if (!baseSize) {\n setQuoteSize(undefined);\n return;\n }\n let usePrice = price || markPrice;\n if (!usePrice) {\n setQuoteSize(undefined);\n return;\n }\n const rawQuoteSize = baseSize * usePrice;\n const quoteSize =\n baseSize && roundToDecimal(rawQuoteSize, sizeDecimalCount);\n setQuoteSize(quoteSize);\n };\n\n const onSetQuoteSize = (quoteSize: number | undefined) => {\n setQuoteSize(quoteSize);\n if (!quoteSize) {\n setBaseSize(undefined);\n return;\n }\n let usePrice = price || markPrice;\n if (!usePrice) {\n setBaseSize(undefined);\n return;\n }\n const rawBaseSize = quoteSize / usePrice;\n const baseSize = quoteSize && roundToDecimal(rawBaseSize, sizeDecimalCount);\n setBaseSize(baseSize);\n };\n\n const doChangeOrder = ({\n size,\n price,\n }: {\n size?: number;\n price?: number;\n }) => {\n const formattedSize = size && roundToDecimal(size, sizeDecimalCount);\n const formattedPrice = price && roundToDecimal(price, priceDecimalCount);\n formattedSize && onSetBaseSize(formattedSize);\n formattedPrice && setPrice(formattedPrice);\n };\n\n const updateSizeFraction = () => {\n const rawMaxSize =\n side === 'buy' ? quoteBalance / (price || markPrice || 1) : baseBalance;\n const maxSize = floorToDecimal(rawMaxSize, sizeDecimalCount);\n const sizeFraction = Math.min(((baseSize || 0) / maxSize) * 100, 100);\n setSizeFraction(sizeFraction);\n };\n\n const onSliderChange = (value) => {\n if (!price && markPrice) {\n let formattedMarkPrice: number | string = priceDecimalCount\n ? markPrice.toFixed(priceDecimalCount)\n : markPrice;\n setPrice(\n typeof formattedMarkPrice === 'number'\n ? formattedMarkPrice\n : parseFloat(formattedMarkPrice),\n );\n }\n\n let newSize;\n if (side === 'buy') {\n if (price || markPrice) {\n newSize = ((quoteBalance / (price || markPrice || 1)) * value) / 100;\n }\n } else {\n newSize = (baseBalance * value) / 100;\n }\n\n // round down to minOrderSize increment\n let formatted = floorToDecimal(newSize, sizeDecimalCount);\n\n onSetBaseSize(formatted);\n };\n\n const postOnChange: SwitchChangeEventHandler = (checked) => {\n if (checked) {\n setIoc(false);\n }\n setPostOnly(checked);\n };\n const iocOnChange: SwitchChangeEventHandler = (checked) => {\n if (checked) {\n setPostOnly(false);\n }\n setIoc(checked);\n };\n\n async function onSubmit() {\n if (!price) {\n console.warn('Missing price');\n notify({\n message: 'Missing price',\n type: 'error',\n });\n return;\n } else if (!baseSize) {\n console.warn('Missing size');\n notify({\n message: 'Missing size',\n type: 'error',\n });\n return;\n }\n\n setSubmitting(true);\n try {\n if (!wallet) {\n return null;\n }\n\n await placeOrder({\n side,\n price,\n size: baseSize,\n orderType: ioc ? 'ioc' : postOnly ? 'postOnly' : 'limit',\n market,\n connection: sendConnection,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n baseCurrencyAccount: baseCurrencyAccount?.pubkey,\n quoteCurrencyAccount: quoteCurrencyAccount?.pubkey,\n feeDiscountPubkey: feeDiscountKey,\n priorityFee,\n computeUnits,\n });\n refreshCache(tuple('getTokenAccounts', wallet, connected));\n setPrice(undefined);\n onSetBaseSize(undefined);\n } catch (e: any) {\n console.warn(e);\n notify({\n message: 'Error placing order',\n description: e.message,\n type: 'error',\n });\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n \n
\n setSide(e.target.value)}\n value={side}\n buttonStyle=\"solid\"\n style={{\n marginBottom: 8,\n width: '100%',\n }}\n >\n \n BUY\n \n \n SELL\n \n \n Price
}\n suffix={\n {quoteCurrency}\n }\n value={price}\n type=\"number\"\n step={market?.tickSize || 1}\n onChange={(e) => setPrice(parseFloat(e.target.value))}\n />\n \n Size}\n suffix={\n {baseCurrency}\n }\n value={baseSize}\n type=\"number\"\n step={market?.minOrderSize || 1}\n onChange={(e) => onSetBaseSize(parseFloat(e.target.value))}\n />\n \n {quoteCurrency}\n \n }\n value={quoteSize}\n type=\"number\"\n step={market?.minOrderSize || 1}\n onChange={(e) => onSetQuoteSize(parseFloat(e.target.value))}\n />\n \n `${value}%`}\n marks={sliderMarks}\n onChange={onSliderChange}\n />\n
\n {'POST '}\n \n {'IOC '}\n \n
\n \n {side === 'buy' ? (\n \n Buy {baseCurrency}\n \n ) : (\n \n Sell {baseCurrency}\n \n )}\n \n );\n}\n","import { Col, Row } from 'antd';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { useMarket, useBonfidaTrades } from '../utils/markets';\nimport { getDecimalCount } from '../utils/utils';\nimport FloatingElement from './layout/FloatingElement';\nimport { BonfidaTrade } from '../utils/types';\nimport BN from 'bn.js';\n\nconst Title = styled.div`\n color: rgba(255, 255, 255, 1);\n`;\nconst SizeTitle = styled(Row)`\n padding: 20px 0 14px;\n color: #434a59;\n`;\n\nexport default function PublicTrades({ smallScreen }) {\n const { baseCurrency, quoteCurrency, market } = useMarket();\n const [trades, loaded] = useBonfidaTrades();\n\n return (\n \n Recent Market trades\n \n Price ({quoteCurrency}) \n \n Size ({baseCurrency})\n \n \n Time\n \n \n {!!trades && loaded && (\n \n {trades.map((trade: BonfidaTrade, i: number) => (\n \n \n {market?.tickSize && !isNaN(trade.price)\n ? Number(trade.price).toFixed(\n getDecimalCount(market.tickSize),\n )\n : trade.price}\n \n \n {market?.minOrderSize && !isNaN(trade.size)\n ? market!.baseSplSizeToNumber(new BN(trade.size))\n : trade.size}\n \n \n {trade.time && new Date(trade.time).toLocaleTimeString()}\n \n \n ))}\n \n )}\n \n );\n}\n","import { Button, Divider, Spin, Typography } from 'antd';\nimport React from 'react';\nimport {\n useGetOpenOrdersForDeprecatedMarkets,\n useBalancesForDeprecatedMarkets,\n useUnmigratedOpenOrdersAccounts,\n} from '../utils/markets';\nimport FloatingElement from './layout/FloatingElement';\nimport CheckOutlined from '@ant-design/icons/lib/icons/CheckOutlined';\nimport BalancesTable from './UserInfoTable/BalancesTable';\nimport OpenOrderTable from './UserInfoTable/OpenOrderTable';\nimport SyncOutlined from '@ant-design/icons/lib/icons/SyncOutlined';\n\nconst { Title } = Typography;\n\nexport default function DeprecatedMarketsInstructions({ switchToLiveMarkets }) {\n const balances = useBalancesForDeprecatedMarkets();\n const {\n openOrders,\n loaded,\n refreshOpenOrders,\n } = useGetOpenOrdersForDeprecatedMarkets();\n\n const { refresh } = useUnmigratedOpenOrdersAccounts();\n const needToCancelOrders = !openOrders || openOrders.length > 0;\n const filteredBalances =\n balances &&\n balances.filter(({ orders, unsettled }) => orders > 0 || unsettled > 0);\n const needToSettleFunds = filteredBalances && filteredBalances.length > 0;\n return (\n \n \n Migrate new markets\n \n \n Markets on older versions of the DEX or using Wrapped USDT are now\n deprecated. To migrate over to the new markets, please cancel your\n orders and settle your funds on old markets. To convert from Wrapped\n USDT to Native USDT use sollet.io.\n \n
\n \n
\n {!balances ? (\n \n ) : (\n <>\n \n {!needToCancelOrders && } Cancel your orders\n \n {needToCancelOrders ? (\n loaded ? (\n {\n setTimeout(() => {\n refresh();\n refreshOpenOrders();\n }, 1000); // Wait so that on-chain account state reflects the update\n }}\n />\n ) : (\n \n )\n ) : null}\n \n {!needToSettleFunds && } Settle your funds\n \n {needToSettleFunds && (\n {\n setTimeout(refresh, 1000); // Wait so that on-chain account state reflects the update\n }}\n />\n )}\n Switch to upgraded markets\n
\n \n Switch to new markets\n \n
\n \n )}\n
\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { Col, Input, Modal, Row, Typography } from 'antd';\nimport { notify } from '../utils/notifications';\nimport { isValidPublicKey } from '../utils/utils';\nimport { PublicKey } from '@solana/web3.js';\nimport { Market } from '@openbook-dex/openbook';\nimport { useAccountInfo, useConnection } from '../utils/connection';\nimport { MARKETS, TOKENS } from '../utils/constants';\nimport { LoadingOutlined } from '@ant-design/icons';\n\nconst { Text } = Typography;\n\nexport default function CustomMarketDialog({\n visible,\n onAddCustomMarket,\n onClose,\n}) {\n const connection = useConnection();\n\n const [marketId, setMarketId] = useState('');\n\n const [marketLabel, setMarketLabel] = useState('');\n const [baseLabel, setBaseLabel] = useState('');\n const [quoteLabel, setQuoteLabel] = useState('');\n\n const [market, setMarket] = useState(null);\n const [loadingMarket, setLoadingMarket] = useState(false);\n\n const wellFormedMarketId = isValidPublicKey(marketId);\n\n const [marketAccountInfo] = useAccountInfo(\n wellFormedMarketId ? new PublicKey(marketId) : null,\n );\n const programId = marketAccountInfo\n ? marketAccountInfo.owner.toBase58()\n : MARKETS.find(({ deprecated }) => !deprecated).programId.toBase58();\n\n useEffect(() => {\n if (!wellFormedMarketId || !programId) {\n resetLabels();\n return;\n }\n setLoadingMarket(true);\n Market.load(\n connection,\n new PublicKey(marketId),\n {},\n new PublicKey(programId),\n )\n .then((market) => {\n setMarket(market);\n })\n .catch(() => {\n resetLabels();\n setMarket(null);\n })\n .finally(() => setLoadingMarket(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [connection, marketId, programId]);\n\n const resetLabels = () => {\n setMarketLabel(null);\n setBaseLabel(null);\n setQuoteLabel(null);\n };\n\n const knownMarket = MARKETS.find(\n (m) =>\n m.address.toBase58() === marketId && m.programId.toBase58() === programId,\n );\n const knownProgram = MARKETS.find(\n (m) => m.programId.toBase58() === programId,\n );\n const knownBaseCurrency =\n market?.baseMintAddress &&\n TOKENS.find((token) => token.address.equals(market.baseMintAddress))?.name;\n\n const knownQuoteCurrency =\n market?.quoteMintAddress &&\n TOKENS.find((token) => token.address.equals(market.quoteMintAddress))?.name;\n\n const canSubmit =\n !loadingMarket &&\n !!market &&\n market.publicKey.toBase58() === marketId &&\n marketId &&\n programId &&\n marketLabel &&\n (knownBaseCurrency || baseLabel) &&\n (knownQuoteCurrency || quoteLabel) &&\n wellFormedMarketId;\n\n const onSubmit = () => {\n if (!canSubmit) {\n notify({\n message: 'Please fill in all fields with valid values',\n type: 'error',\n });\n return;\n }\n\n let params = {\n address: marketId,\n programId,\n name: marketLabel,\n };\n if (!knownBaseCurrency) {\n params.baseLabel = baseLabel;\n }\n if (!knownQuoteCurrency) {\n params.quoteLabel = quoteLabel;\n }\n onAddCustomMarket(params);\n onDoClose();\n };\n\n const onDoClose = () => {\n resetLabels();\n setMarket(null);\n setMarketId(null);\n onClose();\n };\n\n return (\n \n
\n {wellFormedMarketId ? (\n <>\n {!market && !loadingMarket && (\n \n Not a valid market\n \n )}\n {market && knownMarket && (\n \n Market known: {knownMarket.name}\n \n )}\n {market && !knownProgram && (\n \n Warning: unknown DEX program\n \n )}\n {market && knownProgram && knownProgram.deprecated && (\n \n Warning: deprecated DEX program\n \n )}\n \n ) : (\n <>\n {marketId && !wellFormedMarketId && (\n \n Invalid market ID\n \n )}\n \n )}\n \n \n setMarketId(e.target.value)}\n suffix={loadingMarket ? : null}\n />\n \n \n\n \n \n setMarketLabel(e.target.value)}\n />\n \n \n \n \n setBaseLabel(e.target.value)}\n />\n {market && !knownBaseCurrency && (\n
\n Warning: unknown token\n
\n )}\n \n \n setQuoteLabel(e.target.value)}\n />\n {market && !knownQuoteCurrency && (\n
\n Warning: unknown token\n
\n )}\n \n
\n
\n \n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button, Col, Popover, Row, Select, Typography } from 'antd';\nimport styled from 'styled-components';\nimport Orderbook from '../components/Orderbook';\nimport UserInfoTable from '../components/UserInfoTable';\nimport StandaloneBalancesDisplay from '../components/StandaloneBalancesDisplay';\nimport {\n getMarketInfos,\n getTradePageUrl,\n MarketProvider,\n useMarket,\n useMarketsList,\n useUnmigratedDeprecatedMarkets,\n} from '../utils/markets';\nimport TradeForm from '../components/TradeForm';\nimport TradesTable from '../components/TradesTable';\nimport LinkAddress from '../components/LinkAddress';\nimport DeprecatedMarketsInstructions from '../components/DeprecatedMarketsInstructions';\nimport {\n DeleteOutlined,\n InfoCircleOutlined,\n PlusCircleOutlined,\n} from '@ant-design/icons';\nimport CustomMarketDialog from '../components/CustomMarketDialog';\nimport { notify } from '../utils/notifications';\nimport { useHistory, useParams } from 'react-router-dom';\nimport { nanoid } from 'nanoid';\n\n// import { TVChartContainer } from '../components/TradingView';\n// Use following stub for quick setup without the TradingView private dependency\nfunction TVChartContainer() {\n return <>;\n}\n\nconst { Option, OptGroup } = Select;\n\nconst Wrapper = styled.div`\n height: 100%;\n display: flex;\n flex-direction: column;\n padding: 16px 16px;\n .borderNone .ant-select-selector {\n border: none !important;\n }\n`;\n\nexport default function TradePage() {\n const { marketAddress } = useParams();\n useEffect(() => {\n if (marketAddress) {\n localStorage.setItem('marketAddress', JSON.stringify(marketAddress));\n }\n }, [marketAddress]);\n const history = useHistory();\n function setMarketAddress(address) {\n history.push(getTradePageUrl(address));\n }\n\n return (\n \n \n \n );\n}\n\nfunction TradePageInner() {\n const {\n market,\n marketName,\n customMarkets,\n setCustomMarkets,\n setMarketAddress,\n } = useMarket();\n const markets = useMarketsList();\n const [handleDeprecated, setHandleDeprecated] = useState(false);\n const [addMarketVisible, setAddMarketVisible] = useState(false);\n const deprecatedMarkets = useUnmigratedDeprecatedMarkets();\n const [dimensions, setDimensions] = useState({\n height: window.innerHeight,\n width: window.innerWidth,\n });\n\n useEffect(() => {\n document.title = marketName ? `${marketName} — Openbook` : 'Openbook';\n }, [marketName]);\n\n const changeOrderRef =\n useRef<({ size, price }: { size?: number; price?: number }) => void>();\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n height: window.innerHeight,\n width: window.innerWidth,\n });\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const width = dimensions?.width;\n const componentProps = {\n onChangeOrderRef: (ref) => (changeOrderRef.current = ref),\n onPrice: useCallback(\n (price) => changeOrderRef.current && changeOrderRef.current({ price }),\n [],\n ),\n onSize: useCallback(\n (size) => changeOrderRef.current && changeOrderRef.current({ size }),\n [],\n ),\n };\n const component = (() => {\n if (handleDeprecated) {\n return (\n setHandleDeprecated(false)}\n />\n );\n } else if (width < 1000) {\n return ;\n } else if (width < 1450) {\n return ;\n } else {\n return ;\n }\n })();\n\n const onAddCustomMarket = (customMarket) => {\n const marketInfo = getMarketInfos(customMarkets).some(\n (m) => m.address.toBase58() === customMarket.address,\n );\n if (marketInfo) {\n notify({\n message: `A market with the given ID already exists`,\n type: 'error',\n });\n return;\n }\n const newCustomMarkets = [...customMarkets, customMarket];\n setCustomMarkets(newCustomMarkets);\n setMarketAddress(customMarket.address);\n };\n\n const onDeleteCustomMarket = (address) => {\n const newCustomMarkets = customMarkets.filter((m) => m.address !== address);\n setCustomMarkets(newCustomMarkets);\n };\n\n return (\n <>\n setAddMarketVisible(false)}\n onAddCustomMarket={onAddCustomMarket}\n />\n \n \n \n \n \n {market ? (\n \n }\n placement=\"bottomRight\"\n title=\"Market address\"\n trigger=\"click\"\n >\n \n \n \n ) : null}\n \n setAddMarketVisible(true)}\n />\n \n {deprecatedMarkets && deprecatedMarkets.length > 0 && (\n \n \n \n You have unsettled funds on old markets! Please go through\n them to claim your funds.\n \n \n \n \n \n \n )}\n \n {component}\n \n \n );\n}\n\nfunction MarketSelector({\n markets,\n placeholder,\n setHandleDeprecated,\n customMarkets,\n onDeleteCustomMarket,\n}) {\n const { market, setMarketAddress } = useMarket();\n\n const onSetMarketAddress = (marketAddress) => {\n setHandleDeprecated(false);\n setMarketAddress(marketAddress);\n };\n\n const extractBase = (a) => a.split('/')[0];\n const extractQuote = (a) => a.split('/')[1];\n\n const selectedMarket = getMarketInfos(customMarkets)\n .find(\n (proposedMarket) =>\n market?.address && proposedMarket.address.equals(market.address),\n )\n ?.address?.toBase58();\n\n return (\n \n option?.name?.toLowerCase().indexOf(input.toLowerCase()) >= 0\n }\n >\n {customMarkets && customMarkets.length > 0 && (\n \n {customMarkets.map(({ address, name }, i) => (\n \n \n {name}\n {selectedMarket !== address && (\n \n {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n onDeleteCustomMarket && onDeleteCustomMarket(address);\n }}\n />\n \n )}\n \n \n ))}\n \n )}\n \n {markets\n .sort((a, b) =>\n extractQuote(a.name) === 'USDT' && extractQuote(b.name) !== 'USDT'\n ? -1\n : extractQuote(a.name) !== 'USDT' &&\n extractQuote(b.name) === 'USDT'\n ? 1\n : 0,\n )\n .sort((a, b) =>\n extractBase(a.name) < extractBase(b.name)\n ? -1\n : extractBase(a.name) > extractBase(b.name)\n ? 1\n : 0,\n )\n .map(({ address, name, deprecated }, i) => (\n \n {name} {deprecated ? ' (Deprecated)' : null}\n \n ))}\n \n \n );\n}\n\nconst DeprecatedMarketsPage = ({ switchToLiveMarkets }) => {\n return (\n <>\n \n \n \n \n \n \n );\n};\n\nconst RenderNormal = ({ onChangeOrderRef, onPrice, onSize }) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nconst RenderSmall = ({ onChangeOrderRef, onPrice, onSize }) => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nconst RenderSmaller = ({ onChangeOrderRef, onPrice, onSize }) => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n","import { Button, Dropdown, Menu, Modal } from 'antd';\nimport React, { useState } from 'react';\n\nimport LinkAddress from './LinkAddress';\nimport { useWallet } from '@solana/wallet-adapter-react';\n\nexport default function WalletConnect() {\n const {\n connected,\n publicKey,\n connect,\n disconnect,\n select,\n wallet,\n wallets,\n } = useWallet();\n const [isModalVisible, setIsModalVisible] = useState(false);\n const publicKeyString = publicKey?.toBase58() || '';\n\n const menu = (\n \n {connected && }\n {\n setIsModalVisible((v) => !v);\n }}\n >\n Change Wallet\n \n \n );\n\n return (\n <>\n {\n setIsModalVisible(true);\n }\n }\n overlay={menu}\n style={{ display: 'inline-flex' }}\n >\n {connected ? 'Disconnect' : 'Connect'}\n \n {\n setIsModalVisible(false);\n }}\n width={400}\n >\n {wallets.map(({ adapter }) => {\n const onClick = function () {\n select(adapter.name);\n setIsModalVisible(false);\n };\n\n return (\n \n }\n style={{\n display: 'block',\n width: '100%',\n textAlign: 'left',\n marginBottom: 8,\n }}\n >\n {adapter.name}\n \n );\n })}\n \n \n );\n}\n","import React from 'react';\nimport FloatingElement from '../components/layout/FloatingElement';\nimport {\n useAllMarkets,\n useAllOpenOrders,\n useMarketInfos,\n} from '../utils/markets';\nimport OpenOrderTable from '../components/UserInfoTable/OpenOrderTable';\nimport { Button, Row } from 'antd';\nimport { OrderWithMarketAndMarketName } from '../utils/types';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport WalletConnect from '../components/WalletConnect';\n\nexport default function OpenOrdersPage() {\n const { connected } = useWallet();\n const { openOrders, loaded, refreshOpenOrders } = useAllOpenOrders();\n let marketInfos = useMarketInfos();\n let marketAddressesToNames = Object.fromEntries(\n marketInfos.map((info) => [info.address.toBase58(), info.name]),\n );\n let [allMarkets] = useAllMarkets();\n const marketsByAddress = Object.fromEntries(\n (allMarkets || []).map((marketInfo) => [\n marketInfo.market.address.toBase58(),\n marketInfo.market,\n ]),\n );\n\n const dataSource: OrderWithMarketAndMarketName[] = (openOrders || [])\n .map((orderInfos) =>\n orderInfos.orders.map((order) => {\n return {\n marketName: marketAddressesToNames[orderInfos.marketAddress],\n market: marketsByAddress[orderInfos.marketAddress],\n ...order,\n };\n }),\n )\n .flat();\n\n if (!connected) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n \n \n );\n}\n","import React, { useState } from 'react';\nimport DataTable from '../layout/DataTable';\nimport { Button, Row } from 'antd';\nimport { settleAllFunds } from '../../utils/send';\nimport { notify } from '../../utils/notifications';\nimport { useConnection, useConnectionConfig } from '../../utils/connection';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport {\n useAllMarkets,\n useSelectedTokenAccounts,\n useTokenAccounts,\n} from '../../utils/markets';\nimport StandaloneTokenAccountsSelect from '../StandaloneTokenAccountSelect';\nimport { abbreviateAddress } from '../../utils/utils';\nimport { PublicKey } from '@solana/web3.js';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\n\nexport default function WalletBalancesTable({\n walletBalances,\n}: {\n walletBalances: {\n coin: string;\n mint: string;\n walletBalance: number;\n openOrdersFree: number;\n openOrdersTotal: number;\n }[];\n}) {\n const connection = useConnection();\n const { wallet, connected } = useWallet();\n const [selectedTokenAccounts] = useSelectedTokenAccounts();\n const [tokenAccounts, tokenAccountsConnected] = useTokenAccounts();\n const [allMarkets, allMarketsConnected] = useAllMarkets();\n const [settlingFunds, setSettlingFunds] = useState(false);\n const { priorityFee, computeUnits } = useConnectionConfig();\n\n async function onSettleFunds() {\n setSettlingFunds(true);\n try {\n if (!wallet) {\n notify({\n message: 'Wallet not connected',\n description: 'Wallet not connected',\n type: 'error',\n });\n return;\n }\n\n if (!tokenAccounts || !tokenAccountsConnected) {\n notify({\n message: 'Error settling funds',\n description: 'TokenAccounts not connected',\n type: 'error',\n });\n return;\n }\n if (!allMarkets || !allMarketsConnected) {\n notify({\n message: 'Error settling funds',\n description: 'Markets not connected',\n type: 'error',\n });\n return;\n }\n await settleAllFunds({\n connection,\n tokenAccounts,\n selectedTokenAccounts,\n wallet: wallet.adapter as BaseSignerWalletAdapter,\n markets: allMarkets.map((marketInfo) => marketInfo.market),\n priorityFee,\n computeUnits,\n });\n } catch (e: any) {\n notify({\n message: 'Error settling funds',\n description: e.message,\n type: 'error',\n });\n } finally {\n setSettlingFunds(false);\n }\n }\n\n const columns = [\n {\n title: 'Coin',\n key: 'coin',\n width: '20%',\n render: (walletBalance) => (\n \n \n {walletBalance.coin ||\n abbreviateAddress(new PublicKey(walletBalance.mint))}\n \n \n ),\n },\n {\n title: 'Wallet Balance',\n dataIndex: 'walletBalance',\n key: 'walletBalance',\n width: '20%',\n },\n {\n title: 'Open orders total balances',\n dataIndex: 'openOrdersTotal',\n key: 'openOrdersTotal',\n width: '20%',\n },\n {\n title: 'Unsettled balances',\n dataIndex: 'openOrdersFree',\n key: 'openOrdersFree',\n width: '20%',\n },\n {\n title: 'Selected token account',\n key: 'selectTokenAccount',\n width: '20%',\n render: (walletBalance) => (\n \n t.effectiveMint.toBase58() === walletBalance.mint,\n )}\n mint={walletBalance.mint}\n />\n \n ),\n },\n ];\n return (\n \n \n {connected && (\n \n )}\n \n );\n}\n","import React from 'react';\nimport { Tabs } from 'antd';\nimport {\n useAllOpenOrdersBalances,\n useWalletBalancesForAllMarkets,\n} from '../utils/markets';\nimport FloatingElement from '../components/layout/FloatingElement';\nimport WalletBalancesTable from '../components/UserInfoTable/WalletBalancesTable';\nimport { useMintToTickers } from '../utils/tokens';\n\nconst { TabPane } = Tabs;\n\nexport default function BalancesPage() {\n const walletBalances = useWalletBalancesForAllMarkets();\n const mintToTickers = useMintToTickers();\n const openOrdersBalances = useAllOpenOrdersBalances();\n\n const data = (walletBalances || []).map((balance) => {\n const balances = {\n coin: mintToTickers[balance.mint],\n mint: balance.mint,\n walletBalance: balance.balance,\n openOrdersFree: 0,\n openOrdersTotal: 0,\n };\n for (let openOrdersAccount of openOrdersBalances[balance.mint] || []) {\n balances['openOrdersFree'] += openOrdersAccount.free;\n balances['openOrdersTotal'] += openOrdersAccount.total;\n }\n return balances;\n });\n\n return (\n \n \n \n \n \n \n \n );\n}\n","import React from 'react';\nimport { Switch, Typography } from 'antd';\nimport { usePreferences } from '../utils/preferences';\n\nconst { Paragraph } = Typography;\n\nexport default function Settings({ autoApprove }) {\n const { autoSettleEnabled, setAutoSettleEnabled } = usePreferences();\n\n return (\n
\n {' '}\n Auto settle\n {!autoApprove && (\n \n To use auto settle, first enable auto approval in your wallet\n \n )}\n
\n );\n}\n","import React, { useState } from 'react';\nimport { Col, Input, Modal, Row } from 'antd';\nimport { EndpointInfo } from '../utils/types';\n\nexport default function CustomClusterEndpointDialog({\n visible,\n testingConnection,\n onAddCustomEndpoint,\n onClose,\n}: {\n visible: boolean;\n testingConnection: boolean;\n onAddCustomEndpoint: (info: EndpointInfo) => void;\n onClose?: () => void;\n}) {\n const [customEndpoint, setCustomEndpoint] = useState('');\n const [customEndpointName, setCustomEndpointName] = useState('');\n\n const onSubmit = () => {\n const fullEndpoint = 'https://' + customEndpoint;\n const params = {\n name: customEndpointName,\n endpoint: fullEndpoint,\n custom: true,\n };\n onAddCustomEndpoint(params);\n onDoClose();\n };\n const onDoClose = () => {\n setCustomEndpoint('');\n setCustomEndpointName('');\n onClose && onClose();\n };\n const canSubmit = customEndpoint !== '' && customEndpointName !== '';\n\n return (\n \n \n \n setCustomEndpointName(e.target.value)}\n />\n \n \n \n \n setCustomEndpoint(e.target.value)}\n />\n \n \n \n );\n}\n","import {\n InfoCircleOutlined,\n PlusCircleOutlined,\n SettingOutlined,\n} from '@ant-design/icons';\nimport { Button, Col, Menu, Popover, Row, Select, Switch } from 'antd';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport logo from '../assets/logo.svg';\nimport styled from 'styled-components';\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport {\n ENDPOINTS,\n useConnection,\n useConnectionConfig,\n} from '../utils/connection';\nimport Settings from './Settings';\nimport CustomClusterEndpointDialog from './CustomClusterEndpointDialog';\nimport { EndpointInfo } from '../utils/types';\nimport { notify } from '../utils/notifications';\nimport { Connection } from '@solana/web3.js';\nimport WalletConnect from './WalletConnect';\nimport AppSearch from './AppSearch';\nimport { getTradePageUrl } from '../utils/markets';\nimport { COMPUTE_UNIT_LIMIT, MAX_PRIORITY_FEE } from '../utils/constants';\n\nconst Wrapper = styled.div`\n background-color: #0d1017;\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n padding: 0px 30px;\n flex-wrap: wrap;\n`;\nconst LogoWrapper = styled.div`\n display: flex;\n align-items: center;\n color: #2abdd2;\n font-weight: bold;\n cursor: pointer;\n img {\n height: 30px;\n margin-right: 8px;\n }\n`;\n\nconst EXTERNAL_LINKS = {\n '/learn':\n 'https://docs.projectserum.com/trade-on-serum-dex/trade-on-serum-dex-1',\n '/add-market': 'https://serum-academy.com/en/add-market/',\n '/wallet-support': 'https://serum-academy.com/en/wallet-support',\n '/dex-list': 'https://serum-academy.com/en/dex-list/',\n '/developer-resources': 'https://serum-academy.com/en/developer-resources/',\n '/explorer': 'https://solscan.io',\n '/srm-faq': 'https://projectserum.com/srm-faq',\n '/swap': 'https://swap.projectserum.com',\n};\n\nexport default function TopBar() {\n const { connected, wallet } = useWallet();\n const {\n endpoint,\n endpointInfo,\n setEndpoint,\n availableEndpoints,\n setCustomEndpoints,\n setPriorityFee,\n setComputeUnits,\n } = useConnectionConfig();\n const [addEndpointVisible, setAddEndpointVisible] = useState(false);\n const [testingConnection, setTestingConnection] = useState(false);\n const location = useLocation();\n const history = useHistory();\n const [searchFocussed, setSearchFocussed] = useState(false);\n const [isPriorityEnabled, setIsPriorityEnabled] = useState(false);\n\n const priorityOnChange = (checked) => {\n setIsPriorityEnabled(checked);\n\n if (checked) {\n setPriorityFee(MAX_PRIORITY_FEE);\n setComputeUnits(COMPUTE_UNIT_LIMIT);\n } else {\n setPriorityFee(undefined);\n setComputeUnits(undefined);\n }\n };\n\n const handleClick = useCallback(\n (e) => {\n if (!(e.key in EXTERNAL_LINKS)) {\n history.push(e.key);\n }\n },\n [history],\n );\n\n const onAddCustomEndpoint = (info: EndpointInfo) => {\n const existingEndpoint = availableEndpoints.some(\n (e) => e.endpoint === info.endpoint,\n );\n if (existingEndpoint) {\n notify({\n message: `An endpoint with the given url already exists`,\n type: 'error',\n });\n return;\n }\n\n const handleError = (e) => {\n console.log(`Connection to ${info.endpoint} failed: ${e}`);\n notify({\n message: `Failed to connect to ${info.endpoint}`,\n type: 'error',\n });\n };\n\n try {\n const connection = new Connection(info.endpoint, 'recent');\n connection\n .getBlockTime(0)\n .then(() => {\n setTestingConnection(true);\n console.log(`testing connection to ${info.endpoint}`);\n const newCustomEndpoints = [\n ...availableEndpoints.filter((e) => e.custom),\n info,\n ];\n setEndpoint(info.endpoint);\n setCustomEndpoints(newCustomEndpoints);\n })\n .catch(handleError);\n } catch (e: any) {\n handleError(e);\n } finally {\n setTestingConnection(false);\n }\n };\n\n const endpointInfoCustom = endpointInfo && endpointInfo.custom;\n useEffect(() => {\n const handler = () => {\n if (endpointInfoCustom) {\n setEndpoint(ENDPOINTS[0].endpoint);\n }\n };\n window.addEventListener('beforeunload', handler);\n return () => window.removeEventListener('beforeunload', handler);\n }, [endpointInfoCustom, setEndpoint]);\n\n const tradePageUrl = location.pathname.startsWith('/market/')\n ? location.pathname\n : getTradePageUrl();\n\n return (\n <>\n setAddEndpointVisible(false)}\n />\n \n history.push(tradePageUrl)}>\n \"Logo\"\n \n \n \n TRADE\n \n {connected &&\n (!searchFocussed || location.pathname === '/balances') && (\n \n BALANCES\n \n )}\n {connected &&\n (!searchFocussed || location.pathname === '/orders') && (\n \n ORDERS\n \n )}\n {(!searchFocussed || location.pathname === '/list-new-market') && (\n \n ADD MARKET\n \n )}\n {(!searchFocussed || location.pathname === '/mint-token') && (\n \n MINT TOKEN\n \n )}\n {(!searchFocussed || location.pathname === '/airdrop') && (\n \n AIRDROP\n \n )}\n \n {/*
\n \n \n Priority Fees\n \n \n \n setAddEndpointVisible(true)}\n />\n \n \n \n \n \n \n \n \n {availableEndpoints.map(({ name, endpoint }) => (\n \n {name}\n \n ))}\n \n \n \n
*/}\n {connected && (\n
\n \n }\n placement=\"bottomRight\"\n title=\"Settings\"\n trigger=\"click\"\n >\n \n \n
\n )}\n
\n \n
\n
\n \n );\n}\n","import React from 'react';\nimport { Layout, Row, Col, Grid } from 'antd';\nimport Link from './Link';\nimport { helpUrls } from './HelpUrls';\nimport { useReferrer } from '../utils/referrer';\nconst { Footer } = Layout;\nconst { useBreakpoint } = Grid;\n\nconst footerElements = [\n // {\n // description: 'Serum Developer Resources',\n // link: helpUrls.developerResources,\n // },\n // { description: 'Discord', link: helpUrls.discord },\n // { description: 'Telegram', link: helpUrls.telegram },\n // { description: 'GitHub', link: helpUrls.github },\n // { description: 'Project Serum', link: helpUrls.projectSerum },\n // { description: 'Solana Network', link: helpUrls.solanaBeach },\n];\n\nexport const CustomFooter = () => {\n const smallScreen = !useBreakpoint().lg;\n const { refCode, allowRefLink } = useReferrer();\n return (\n \n {refCode && allowRefLink && (\n Your referrer is {refCode}\n )}\n \n {!smallScreen && (\n <>\n \n {footerElements.map((elem: any, index) => {\n return (\n // \n // \n // {elem.description}\n // \n // \n <>\n );\n })}\n \n )}\n {/* */}\n \n \n );\n};\n","import { Layout } from 'antd';\nimport React, { useEffect } from 'react';\nimport TopBar from './TopBar';\nimport { CustomFooter as Footer } from './Footer';\nimport { useReferrer } from '../utils/referrer';\nimport queryString from 'query-string';\nimport { useLocation } from 'react-router-dom';\nimport { notify } from '../utils/notifications';\nconst { Header, Content } = Layout;\n\nexport default function BasicLayout({ children }) {\n const { refCode, setRefCode, allowRefLink } = useReferrer();\n const { search } = useLocation();\n const parsed = queryString.parse(search);\n\n useEffect(() => {\n if (!!parsed.refCode && parsed.refCode !== refCode && allowRefLink) {\n notify({ message: `New referrer ${parsed.refCode} added` });\n setRefCode(parsed.refCode);\n }\n }, [parsed, refCode, setRefCode, allowRefLink]);\n\n return (\n \n \n
\n \n
\n {children}\n