{"version":3,"sources":["assets/camp_demo_logo.png","bff/constants.ts","components/HeaderCoinBalance/index.tsx","components/HeaderRole/index.tsx","components/Header/index.tsx","assets/indiana_jones.png","bff/generate-random-addr.ts","bff/generate-followers.ts","bff/random-floor-2-digits.ts","bff/token-decimals-converter.ts","bff/market-calculator.ts","bff/mock-state.ts","bff/manage-token-assets.ts","bff/get-usdt-value-from-token-assets.ts","bff/selectors.ts","bff/copy-order.ts","bff/api.ts","state/api-actions.ts","state/slices/investor.ts","containers/HeaderContainer/index.tsx","assets/mini_chart.png","components/FundManagerCard/index.tsx","containers/ExploreContainer/index.tsx","components/InvestExitModal/index.tsx","containers/InvestExitModalContainer/index.tsx","components/PrototypeWarningModal/index.tsx","containers/PrototypeWarningModalContainer/index.tsx","views/Explore/index.tsx","components/TradingGraph/index.tsx","containers/TradingGraphContainer/index.tsx","containers/SwapPanelContainer/index.tsx","views/Swap/index.tsx","components/InvestorPortfolioPositionList/CoinPositionItem.tsx","components/InvestorPortfolioPositionList/index.tsx","components/InvestorPortfolioSummary/index.tsx","bff/get-total-invested-from-token-asstet-array.ts","containers/InvestorPortfolioContainer/index.tsx","views/Port/index.tsx","state/slices/notification.ts","theme/dark.tsx","theme/light.tsx","assets/bg-camp-main.png","theme/CampCssBaseline.tsx","components/MarketListModal/index.tsx","components/OpenPosition/index.tsx","state/slices/markets.ts","bff/auto-fill.ts","containers/OpenPositionContainer/index.tsx","components/TradeHistory/index.tsx","containers/TradeHistoryContainer/index.tsx","views/Trade/index.tsx","components/CreateFundHeader/index.tsx","components/CreateFundButton/index.tsx","components/CreateFundForm/index.tsx","components/CreateFundSummary/index.tsx","containers/CreateFundContainer/index.tsx","components/FundDashboardChart/TimeSelection.tsx","components/FundDashboardChart/index.tsx","containers/FundDashboardChartContainer/fake-data.ts","containers/FundDashboardChartContainer/index.tsx","components/FundDashboardSummary/SummaryCard.tsx","components/FundDashboardSummary/index.tsx","containers/FundDashboardSummaryContainer/index.tsx","components/PortfolioPositionList/CoinPositionItem.tsx","components/PortfolioPositionList/index.tsx","containers/FundDashboardAssetsContainer/index.tsx","views/FundDashboard/index.tsx","components/CongratDialog/index.tsx","bff/auto-manage-funds.ts","App.tsx","state/slices/funds.ts","state/slices/reward-tracking.ts","state/slices/analytics.ts","reportWebVitals.ts","state/store.ts","index.tsx"],"names":["TOKEN","symbol","name","decimals","address","logoURI","TOKEN_LIST","Object","keys","filter","t","FUND_NAME","HeaderCoinBalance","prop","Box","borderRadius","display","justifyContent","p","style","backgroundColor","Avatar","alt","src","USDT","sx","height","width","Typography","variant","fontWeight","value","amount","thousandSeparator","displayType","fixedDecimalScale","decimalScale","HeaderRole","role","onChanged","alignItems","justifyItems","Link","underline","onClick","color","Switch","checked","onChange","Wrapper","styled","Header","onRoleChange","currPath","balance","canTrade","onResetState","flexDirection","logo","href","className","pr","pl","Button","generateRandomAddr","digit","Array","fill","map","Math","floor","random","length","join","generateFollowers","max","ceil","randomFloor2digits","fromTokenDecimals","cachePricesKey","cachePrices","JSON","parse","window","localStorage","getItem","setInterval","setItem","stringify","marketCalculator","a","fromToken","toToken","fromTokenAmount","fromTokenAddress","toTokenAddress","toTokenAmount","fromTokenDecimalAmount","round","amountString","toLocaleString","useGrouping","includes","console","error","cache","find","c","Date","now","updatedAt","getTime","price","fetch","res","json","data","updatingCache","toISOString","push","currentState","undefined","mockStateKey","mockWalletAddress","getState","Error","init","userId","tracking","userInvestor","uuid","walletAddress","orders","assets","tokens","ownFunds","copyingFunds","profile","picUri","funds","generateFunds","rewardTracking","copyFund","createFund","formSubmitted","placeOrder","showCongratulations","telegramId","twitterAccount","visitExplorePage","visitFundDashboard","visitPortfolio","_","i","generateFund","no","log","fundAddress","performanceFeePercent","campScore","return","risk","riskAdjustedReturn","consistency","followers","invested","tags","sample","sampleAvatar","createdAt","generateMarkets","Promise","all","BNB","BTCB","ETH","DOT","ADA","fromTokenSymbol","toTokenSymbol","type","save","savedItem","load","addTokenToTokenAssets","token","removeTokenFromTokenAssets","adjustedAmount","getUsdtValueFromTokenAssets","reduce","usdt","selectOwnFund","investor","f","selectCopyingFund","selectUsdtBalance","acc","copyOrder","fund","newOrder","fundTotalUsdtValue","fundOrderRatio","copyingFund","investorTotalAssetValue","copyingAmount","id","copiedFromFundAddress","copiedFormOrderId","stupidClone","obj","loadUserInvestorBff","statusCode","loadTopFundsBff","placeOrderBff","order","ownFundAddr","ownFund","investFundBff","usdtAmount","investorAddress","userTokens","exitFundBff","createFundBff","fundInput","newFund","deleteFundBff","loadMarketsBff","markets","loadManagerDashboardBff","loadExplorePageBff","loadPortfolioBff","loadRewardDataBff","resetBff","submitRewardBff","form","showCongratulationsBff","isShow","loadUserInvestor","createAsyncThunk","response","loadTopFunds","input","status","investFund","exitFund","deleteFund","loadMarkets","loadManagerDashboard","loadExplorePage","loadPortfolio","loadRewardData","resetState","submitReward","localStorageKey","initialState","currentInvestor","showDrawer","slice","createSlice","reducers","setRole","state","action","payload","setShowDrawer","extraReducers","builder","addCase","fulfilled","actions","investorReducer","reducer","HeaderContainer","dispatch","useDispatch","useLocation","pathname","split","useSelector","investorBalance","hasOwnFund","managerBalance","topFunds","useEffect","roleChangeHandler","useCallback","newRole","resetStateHandler","FundManagerCard","onClickInvest","onClickExit","useState","isFavorite","setFavorite","FundCard","shouldForwardProp","position","boxSizing","margin","background","boxShadow","top","left","content","transform","padding","textAlign","fontFamily","fontSize","fontStyle","lineHeight","zIndex","right","bottom","favorite","marginTop","paddingLeft","paddingRight","paddingBottom","Card","raised","component","toFixed","CardHeader","IconButton","toggleFavorite","CardContent","noWrap","overflow","miniChart","Divider","align","CardActions","fullWidth","ExploreContainer","Grid","container","md","mt","size","item","mb","xs","spacing","PercentAction","InvestExitModal","onClose","mode","totalInvestedUsdt","totalUsdtBalance","onSubmit","setAmount","userInvestAmount","setUserInvestAmount","Dialog","maxWidth","open","PaperProps","BackdropProps","DialogTitle","DialogContent","DialogContentText","minWidth","pt","border","prefix","OutlinedInput","startAdornment","InputAdornment","endAdornment","maxHeight","borderTopRightRadius","borderBottomRightRadius","WebkitTextFillColor","inputProps","pattern","placeholder","e","preval","target","test","substring","onSelectPercent","percent","toString","DialogActions","disabled","Number","isNaN","borderColor","numberValue","SpendPercentButtonGroup","gridColumn","ButtonGroup","InvestExitModalContainer","setTotalInvestedUsdt","submitHandler","PrototypeWarningModal","consent","setCosent","Modal","textTransform","PrototypeWarningModalContainer","Explore","selectedFund","setSelectedFund","investOrExit","setInvestOrExit","onInvestExitClose","TradingGraph","theme","autosize","interval","range","allow_symbol_change","save_image","TradingGraphContainer","currentMarket","market","replace","SwapPanelContainer","frameBorder","Swap","sm","lg","xl","StlyledCell","TableCell","StlyledFirstCell","StlyledLastCell","StlyledRow","TableRow","PositionListItem","icon","shortName","unit","pnl","currentValue","InvestorPortfolioPositionList","TableContainer","Paper","Table","borderCollapse","borderSpacing","TableHead","TableBody","coinPositions","coinPosition","key","StlyledBox","Text","text","weight","children","InvestorPortfolioSummary","alignContent","flexBasis","portfolioSummaryModel","investorName","avatarUri","ml","decimalSeparator","totalBalance","totalInvested","avalable","getUsdValueFormTokenAssetsArray","tokenAssets","tokenAsset","prev","curr","InvestorPortfolioContainer","summary","setSummary","setCoinPositions","copyingFundsFromInvestor","copyingFundsAssets","totalUsdtAvailable","sum","then","positions","v","selectFund","catch","direction","sort","Port","notifications","markAsShown","noti","n","wasShown","level","message","investedFund","meta","arg","notificationReducer","dark","createTheme","palette","primary","main","secondary","success","default","paper","divider","typography","allVariants","components","MuiCard","styleOverrides","root","MuiCardMedia","MuiAvatar","light","CampCssBaseline","GlobalStyles","styles","body","backgroundImage","CampBackgroundImage","backgroundRepeat","backgroundSize","MarketListModal","onSelectMarket","filteredList","setFilteredList","scroll","minHeight","Input","event","ticker","toLowerCase","borderWidth","List","index","disableGutters","button","secondaryAction","ListItemButton","ListItemAvatar","img","ListItemText","Wraper","InputCurrencyStyled","LineDashed","OrderSide","OpenPosition","available","onPlaceOrder","orderSide","setOrderSide","marginRight","capitalize","FormControl","setCurrentMarket","marketReducer","count","subscribers","OpenPositionContainer","autoFillCount","setAutoFillCount","ownFundUsdt","setOpen","subscriber","subKey","callback","s","Skeleton","openMarket","marKetProp","orderSize","side","marketName","closePositionOrderId","selected","BodyCell","TradeHistory","onClickMarket","closePositionIds","o","openPositions","colSpan","flexWrap","Tooltip","title","placement","ListItem","setValue","format","TradeHistoryContainer","ownFundOrders","Trade","CreateFundHeader","step","Stack","Stepper","activeStep","Step","StepLabel","CreateFundBtn","borderStyle","CreateFundButton","CreateFundForm","onContinue","onBack","fundName","setFundName","perfFee","setPerfFee","CreateFundBackButton","alpha","CreateFundConntinueButton","InputLabel","shrink","htmlFor","InputBase","transition","Slider","defaultValue","min","_event","newValue","TextField","m","borderBottom","chosen","parseFloat","InputProps","CreateFundSummaryBox","CreateFundSummary","CreateFundContainer","setStep","step1BackHandle","step1ContinueHandle","onCreate","ToggleButtonGroupStyled","ToggleButtonGroup","ToggleButtonStyled","ToggleButton","TypographySelectedStyled","TypographyStyled","TimeSelection","setTimeframe","React","time","setTime","exclusive","newTime","StackStyled","FundDashboardChart","paddingX","paddingY","ResponsiveContainer","AreaChart","x1","y1","x2","y2","offset","stopColor","stopOpacity","XAxis","dataKey","stroke","YAxis","orientation","origin","CartesianGrid","contentStyle","formatter","labelFormatter","Area","fillOpacity","getRand","getMonthDayShortName","date","month","day","hour24data","d","hour","minute","day7data","day30data","day90data","FundDashboardChartContainer","setData","timeframe","LabelStyled","ValueStyled","SummaryCard","label","FundDashboardSummary","pnlPercent","aum","numberOfInvestors","cashBalance","suffix","FundDashboardSummaryContainer","selectInvestedFromOwnFund","cInvested","selectInvestedFromCopyingFund","selectTokensFromOwnFund","copyingFundTokens","selectCopyingFundTokens","tokensUsdtValue","setTokensUsdtValue","cTokensUsdtValue","setCTokensUsdtValue","allInvested","CoinPositionItem","PortfolioPositionList","averageOpen","profitLossDollar","profitLossPercent","FundDashboardAssetsContainer","FundDashboard","isCreateFund","setIsCreateFund","CongratDialog","progress","showCongratulationsAction","Container","Confetti","getRandomToken","randIndex","App","notification","isInvestorLoading","notiMessage","handleClose","ready","setReady","openOrders","openCopiedOrders","flat","ownFundOrderNumber","fundOpenOrders","forEach","validFunds","newOrderUsdtAmount","fundUsdtBalance","randToken","buyOrders","sellOrder","copiedOrder","sellCopiedOrder","ThemeProvider","CssBaseline","path","element","to","Snackbar","autoHideDuration","anchorOrigin","vertical","horizontal","Alert","severity","fundsReducer","submitRewardForm","showCongratulation","rewardTrackingReducer","events","sendFbPixelEvent","eventName","fbq","client","amplitude","getInstance","setVersionName","onPerfEntry","isBasicRewardSubmitted","source","URLSearchParams","location","search","get","submitBasicReward","logEvent","setUserId","analyticsReducer","store","configureStore","analytics","ReactDOM","render","document","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB"],"mappings":"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","file":"static/js/main.6d4c2453.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/camp_demo_logo.8c75632c.png\";","import { Token } from '../state/types'\n\nexport const TOKEN: Record = {\n 'USDT': {\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: 18,\n address: '0x55d398326f99059ff775485246999027b3197955',\n logoURI: 'https://tokens.1inch.io/0xdac17f958d2ee523a2206206994597c13d831ec7.png',\n },\n 'BNB': {\n symbol: 'BNB',\n name: 'BNB',\n decimals: 18,\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n logoURI: 'https://assets.coingecko.com/coins/images/825/thumb_2x/bnb-icon2_2x.png?1644979850',\n },\n 'ETH': {\n symbol: 'ETH',\n name: 'Ethereum Token',\n decimals: 18,\n address: '0x2170ed0880ac9a755fd29b2688956bd959f933f8',\n logoURI: 'https://assets.coingecko.com/coins/images/279/thumb_2x/ethereum.png?1595348880',\n },\n 'DOT': {\n symbol: 'DOT',\n name: 'DOT',\n decimals: 18,\n address: '0x7083609fce4d1d8dc0c979aab8c869ea2c873402',\n logoURI: 'https://tokens.1inch.io/0x7083609fce4d1d8dc0c979aab8c869ea2c873402.png',\n },\n 'ADA': {\n symbol: 'ADA',\n name: 'Cardano Token',\n decimals: 18,\n address: '0x3ee2200efb3400fabb9aacf31297cbdd1d435d47',\n logoURI: 'https://tokens.1inch.io/0x3ee2200efb3400fabb9aacf31297cbdd1d435d47.png',\n },\n 'BTCB': {\n symbol: 'BTCB',\n name: 'BTCB Token',\n decimals: 18,\n address: '0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c',\n logoURI: 'https://tokens.1inch.io/0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c.png',\n },\n}\n\nexport const TOKEN_LIST = Object.keys(TOKEN).filter(t => t !== 'USDT') as Token['symbol'][]\n\nexport const FUND_NAME: string[] = [\n 'YellowCity Partners',\n 'FirstMont Trust',\n 'OakTree Capital',\n 'BlackStone Group',\n 'StateHill Associates',\n 'RedRock Capital',\n 'SilverStone Partners',\n 'SpringRock Holdings',\n 'HudsonBay Holdings',\n 'OakTree Partners',\n 'BlackBay Capital',\n 'BlackOcean Management',\n 'PineView Capital',\n 'GreenRiver Securities',\n 'GoldRiver Capital',\n 'SilverRoad Capital',\n 'PineMount Capital',\n 'OakStreet Advisors',\n 'SummerHill Management',\n 'OakHill Trust',\n]\n\n","/* eslint-disable no-unused-vars */\n\nimport React from 'react'\nimport {\n Avatar, Typography, Box\n} from '@mui/material'\nimport NumberFormat from 'react-number-format'\n\nimport { TOKEN } from '../../bff/constants'\n\nexport type Props = {\n amount: number | undefined\n}\n\nexport const HeaderCoinBalance = (prop: Props): JSX.Element => {\n return (\n \n \n \n \n \n \n )\n}\n\n","import React from 'react'\nimport {\n Typography, Box, Switch, Link\n} from '@mui/material'\n\nimport { Role } from '../../state/types'\n\nexport type Props = {\n role: Role\n onChanged: (newRole: Role) => void\n}\n\nexport const HeaderRole = ({ role, onChanged }: Props): JSX.Element => {\n return (\n \n onChanged('investor')}\n >\n \n Investor\n \n \n onChanged(role === 'manager' ? 'investor' : 'manager')}\n color=\"primary\"\n />\n onChanged('manager')}\n >\n \n Manager\n \n \n \n )\n}\n\n","import React from 'react'\nimport { Box, Button, Link, Typography } from '@mui/material'\nimport { styled } from '@mui/material/styles'\n\nimport logo from '../../assets/camp_demo_logo.png'\nimport { Role } from '../../state/types'\nimport { HeaderCoinBalance } from '../HeaderCoinBalance/index'\nimport './index.css'\nimport { HeaderRole } from '../HeaderRole'\n\nconst Wrapper = styled(Box)`\n height:80px;\n alignItems:'center';\n padding-left:50px;\n padding-right:50px;\n backdrop-filter: blur(4px)\n`\n\nexport type Props = {\n currPath: 'explore' | 'swap' | 'port' | 'trade' | 'fund-dashboard'\n role: Role\n balance: number | undefined\n canTrade: boolean\n onRoleChange: (newRole: Role) => void\n onResetState: () => void\n}\n\nexport const Header = ({ role, onRoleChange, currPath, balance, canTrade, onResetState }: Props):\n JSX.Element => {\n\n return \n \n \n \n {\n role === 'investor' ?\n \n \n EXPLORE\n \n \n \n SWAP\n \n \n \n PORTFOLIO\n \n :\n \n \n DASHBOARD\n \n \n {canTrade && \n TRADE\n }\n \n }\n \n \n \n \n \n \n \n\n}\n\n","export default __webpack_public_path__ + \"static/media/indiana_jones.e3e05c2d.png\";","export const generateRandomAddr = (): string => {\n const l = 40\n const digit = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'\n return `0x${new Array(l).fill(0).map(() => digit[Math.floor(Math.random() * digit.length)]).join('')}`\n}\n\n","import { Investor } from '../state/types'\n\nimport { generateRandomAddr } from './generate-random-addr'\n\nexport const generateFollowers = (max: number): Investor['walletAddress'][] => {\n const amount = Math.ceil(Math.random() * max)\n return new Array(amount).fill(0).map(() => generateRandomAddr())\n}\n","export const randomFloor2digits = (max: number): number => {\n return Math.floor(Math.random() * max * 100) / 100\n}\n","import { Token, TokenAmount, TokenDecimalAmount } from '../state/types'\n\nimport { TOKEN } from './constants'\n\nexport const toTokenDecimals = (symbol: Token['symbol'], amount: TokenAmount): TokenDecimalAmount => {\n return amount * (10 ** TOKEN[symbol].decimals)\n}\n\nexport const fromTokenDecimals = (symbol: Token['symbol'], amount: TokenDecimalAmount): TokenAmount => {\n return amount / (10 ** TOKEN[symbol].decimals)\n}\n\n","import { Token, TokenAmount } from '../state/types'\n\nimport { TOKEN } from './constants'\nimport { fromTokenDecimals, toTokenDecimals } from './token-decimals-converter'\n\ntype Input = {\n fromToken: Token['symbol'],\n toToken: Token['symbol'],\n fromTokenAmount: TokenAmount,\n}\n\ntype Output = {\n toToken: Token['symbol'],\n toTokenAmount: TokenAmount,\n}\n\ntype OneInchOutput = {\n toTokenAmount: number\n}\n\nconst ttl = 60 * 1000 // 1 minute\n\ntype CachePrices = {\n fromToken: Token['symbol']\n toToken: Token['symbol']\n updatedAt: string\n price: number\n}\nconst cachePricesKey = 'cachePrices'\nconst cachePrices = JSON.parse(window.localStorage.getItem(cachePricesKey) ?? '[]') as CachePrices[]\n\nsetInterval(() => {\n if (window.localStorage) {\n window.localStorage.setItem(cachePricesKey, JSON.stringify(cachePrices))\n }\n}, 10000)\n\nexport const marketCalculator = async ({ fromToken, toToken, fromTokenAmount }: Input): Promise => {\n const fromTokenAddress = TOKEN[fromToken].address\n const toTokenAddress = TOKEN[toToken].address\n\n if (fromTokenAddress === toTokenAddress) {\n return { toToken, toTokenAmount: fromTokenAmount }\n }\n\n const fromTokenDecimalAmount = Math.round(toTokenDecimals(fromToken, fromTokenAmount))\n const amountString = fromTokenDecimalAmount.toLocaleString('fullwide', { useGrouping: false })\n if(amountString.includes('.')) {\n console.error('Amount string was wrong: ', amountString)\n }\n const cache = cachePrices.find(c => c.fromToken === fromToken && c.toToken === toToken)\n if (cache && (Date.now() < new Date(cache.updatedAt).getTime() + ttl)) {\n return {\n toToken,\n toTokenAmount: fromTokenAmount / cache.price,\n }\n }\n let res\n try {\n // eslint-disable-next-line max-len\n res = await fetch(`https://api.1inch.exchange/v4.0/56/quote?fromTokenAddress=${fromTokenAddress}&toTokenAddress=${toTokenAddress}&amount=${amountString}`)\n } catch (e) {\n console.error(e)\n throw e\n }\n const data = await res.json() as OneInchOutput\n const updatingCache = cachePrices.find(c => c.fromToken === fromToken && c.toToken === toToken)\n if (updatingCache) {\n updatingCache.price = fromTokenDecimalAmount / data.toTokenAmount\n updatingCache.updatedAt = new Date().toISOString()\n } else {\n cachePrices.push({\n fromToken,\n toToken,\n price: fromTokenDecimalAmount / data.toTokenAmount,\n updatedAt: new Date().toISOString(),\n })\n }\n\n return {\n toToken,\n toTokenAmount: fromTokenDecimals(toToken, data.toTokenAmount),\n }\n}\n\n","/* eslint-disable require-jsdoc */\nimport { sample } from 'lodash'\nimport { v4 as uuid } from 'uuid'\n\nimport { Fund, Market, RewardProgress } from '../state/types'\nimport sampleAvatar from '../assets/indiana_jones.png'\n\nimport { MockState } from './types'\nimport { generateRandomAddr } from './generate-random-addr'\nimport { generateFollowers } from './generate-followers'\nimport { randomFloor2digits } from './random-floor-2-digits'\nimport { FUND_NAME, TOKEN } from './constants'\nimport { marketCalculator } from './market-calculator'\n\nlet currentState: MockState | undefined = undefined\nconst mockStateKey = 'camp-mock-state'\nconst mockWalletAddress = '0x0000000000000000000000000000000000000000'\n\nexport const getState = (): MockState => {\n if (!currentState) {\n throw new Error('state was not loaded')\n }\n return currentState\n}\n\nconst init = (userId: string|undefined = undefined, tracking: RewardProgress | undefined = undefined): MockState => {\n return {\n userInvestor: {\n userId: userId ?? uuid(),\n walletAddress: mockWalletAddress,\n orders: [],\n assets: {\n tokens: [{ symbol: 'USDT', amount: 10000 }],\n ownFunds: [],\n copyingFunds: [],\n },\n profile: {\n name: 'Camp Demo',\n picUri: 'https://cloudfront-us-east-1.images.arcpublishing.com/coindesk/DW5IM2H7M5H57DIXFP7ZBI4JAM.jpg',\n },\n },\n funds: generateFunds(3),\n rewardTracking: tracking ?? {\n copyFund: 0,\n createFund: 0,\n formSubmitted: false,\n placeOrder: 0,\n showCongratulations: false,\n telegramId: '',\n twitterAccount: '',\n visitExplorePage: 0,\n visitFundDashboard: 0,\n visitPortfolio: 0,\n walletAddress: '',\n }\n }\n}\n\nconst generateFunds = (amount: number): Fund[] => {\n return new Array(amount).fill(0).map((_, i) => generateFund(i))\n}\n\nconst generateFund = (no: number): Fund => {\n console.log(`Generate fund no: ${no}`)\n return {\n fundAddress: generateRandomAddr(),\n performanceFeePercent: randomFloor2digits(20) + 1,\n campScore: {\n return: randomFloor2digits(25),\n risk: randomFloor2digits(25),\n riskAdjustedReturn: randomFloor2digits(30),\n consistency: randomFloor2digits(20),\n },\n followers: generateFollowers(100),\n orders: [],\n assets: {\n tokens: [{ symbol: 'USDT', amount: 1e6 }], // TODO: random USDT size later\n },\n invested: 1e6,\n tags: ['#BNB', '#DEX', '#FASTEARN'], // TODO: random tags later\n profile: {\n name: sample(FUND_NAME) ?? '', // TODO: random name\n picUri: sampleAvatar as string,\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n}\n\n\n\nexport const generateMarkets = async (): Promise => {\n console.log('Load market')\n return await Promise.all([\n TOKEN.BNB.symbol,\n TOKEN.BTCB.symbol,\n TOKEN.ETH.symbol,\n TOKEN.DOT.symbol,\n TOKEN.ADA.symbol,\n ].map(async (symbol) => {\n return {\n fromTokenSymbol: symbol,\n toTokenSymbol: TOKEN.USDT.symbol,\n name: `${symbol}/${TOKEN.USDT.symbol}`,\n price: (await marketCalculator({\n fromToken: symbol,\n toToken: TOKEN.USDT.symbol,\n fromTokenAmount: 1,\n })).toTokenAmount,\n type: 'spot',\n }\n }))\n\n}\n\nconst load = (): void => {\n if (window.localStorage) {\n const savedItem = window.localStorage.getItem(mockStateKey)\n if (savedItem) {\n console.log('state loaded.')\n currentState = JSON.parse(savedItem) as MockState\n return\n }\n }\n\n currentState = init()\n console.log('state init.')\n}\n\nexport const reset = (): void => {\n currentState = currentState ? init(currentState.userInvestor.userId, currentState.rewardTracking) : init()\n save()\n}\n\nexport const save = (): void => {\n if (window.localStorage) {\n window.localStorage.setItem(mockStateKey, JSON.stringify(currentState))\n }\n}\n\nload()\n","import { TokenAmount, TokenAsset, Token } from '../state/types'\n\nexport const addTokenToTokenAssets = (tokens: TokenAsset[], symbol: Token['symbol'], amount: TokenAmount): void => {\n const token = tokens.find((t) => t.symbol === symbol)\n if (token) {\n token.amount += amount\n } else {\n tokens.push({ symbol, amount })\n }\n}\n\nexport const removeTokenFromTokenAssets = (\n tokens: TokenAsset[],\n symbol: Token['symbol'], amount: TokenAmount,\n): void => {\n const token = tokens.find((t) => t.symbol === symbol)\n\n if (!token) {\n throw new Error('Insufficient token amount')\n }\n\n const adjustedAmount = token.amount - amount < 0.000001 ? token.amount : amount\n\n if (token.amount < adjustedAmount) {\n throw new Error('Insufficient token amount')\n }\n\n token.amount -= adjustedAmount\n}\n\n","import { TokenAmount, TokenAsset } from '../state/types'\n\nimport { marketCalculator } from './market-calculator'\n\nexport const getUsdtValueFromTokenAssets = async (tokens: TokenAsset[]): Promise => {\n return (await Promise.all(tokens.map((token: TokenAsset) => {\n return marketCalculator({\n fromToken: token.symbol,\n toToken: 'USDT',\n fromTokenAmount: token.amount,\n })\n }))).reduce((value, usdt) => value + usdt.toTokenAmount, 0)\n}\n\n","import { CopyingFund, Fund, Investor, TokenAsset } from '../state/types'\n\nexport const selectOwnFund = (investor: Investor | null, funds: Fund[]): Fund | undefined => {\n if (!investor) return\n return funds.find(f => f.fundAddress === investor.assets.ownFunds?.[0])\n}\n\nexport const selectCopyingFundTokens = (\n copyingFund: CopyingFund | undefined\n): TokenAsset[] | undefined => {\n return copyingFund?.assets?.tokens\n}\n\nexport const selectCopyingFund = (investor: Investor | null): CopyingFund | undefined => {\n if (!investor) return\n return investor.assets.copyingFunds?.[0]\n}\n\nexport const selectUsdtBalance = (tokens: TokenAsset[]): number =>\n tokens\n .filter((a) => a.symbol === 'USDT')\n .reduce((acc, t) => acc + t.amount, 0)\n\nexport const selectTokensFromOwnFund = (ownFund: Fund | undefined): TokenAsset[] | undefined => ownFund?.assets?.tokens\n\nexport const selectFollowersFromOwnFund = (ownFund: Fund | undefined): string[] | undefined => ownFund?.followers\n\nexport const selectInvestedFromOwnFund = (\n ownFund: Fund | undefined\n): number => ownFund?.invested ?? 0\n\nexport const selectInvestedFromCopyingFund = (\n copyingFund: CopyingFund | undefined\n): number => copyingFund?.invested ?? 0\n\nexport const selectCashBalanceFromOwnFund = (ownFund: Fund | undefined): number => ownFund ?\n selectUsdtBalance(ownFund.assets.tokens)\n : 0\n","import { v4 as uuid } from 'uuid'\n\nimport { Investor, Fund, Order } from '../state/types'\n\nimport { getUsdtValueFromTokenAssets } from './get-usdt-value-from-token-assets'\nimport { selectUsdtBalance } from './selectors'\n\nexport const copyOrder = async (fund: Fund, investor: Investor, newOrder: Order): Promise => {\n const fundTotalUsdtValue = await getUsdtValueFromTokenAssets(fund.assets.tokens)\n const fundOrderRatio = newOrder.fromTokenAmount / fundTotalUsdtValue\n\n const copyingFund = investor.assets.copyingFunds.find((f) => f.fundAddress === fund.fundAddress)\n if (!copyingFund) return\n\n // Example:\n // given the fund's total asset usdt value is 100 usdt and the new order is 10 usdt then\n // ratio - 10/100 = 0.1 or 10%\n // the user's total asset usdt value is 50\n // then the user should get the copied order value 50 * 0.1 = 5 usdt\n const investorTotalAssetValue = await getUsdtValueFromTokenAssets(copyingFund.assets.tokens)\n const copyingAmount = investorTotalAssetValue * fundOrderRatio\n const investorUsdtBalance = selectUsdtBalance(copyingFund.assets.tokens)\n\n // checking if the user has sufficient usdt\n if (investorUsdtBalance > copyingAmount) {\n copyingFund.orders.push({\n ...newOrder,\n id: uuid(),\n fromTokenAmount: copyingAmount,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n copiedFromFundAddress: fund.fundAddress,\n copiedFormOrderId: newOrder.id\n })\n }\n}\n\n","import { Order, Fund, Role, Investor, Market, RewardProgress, RewardSubmitForm } from '../state/types'\n\nimport { generateMarkets, getState, reset, save } from './mock-state'\nimport { generateFollowers } from './generate-followers'\nimport { generateRandomAddr } from './generate-random-addr'\nimport { addTokenToTokenAssets, removeTokenFromTokenAssets } from './manage-token-assets'\nimport { TOKEN } from './constants'\nimport { randomFloor2digits } from './random-floor-2-digits'\nimport { copyOrder } from './copy-order'\n\ntype AppState = {\n userInvestor: Investor,\n funds: Fund[],\n rewardTracking: RewardProgress,\n}\n\ntype BffResponse = {\n statusCode: number\n data?: T\n error?: Error | unknown\n}\n\nconst stupidClone = (obj: T): T => JSON.parse(JSON.stringify(obj)) as T\n\nexport const loadUserInvestorBff = async (): Promise> => {\n const { userInvestor } = getState()\n return {\n statusCode: 200,\n data: stupidClone(userInvestor),\n }\n}\n\nexport const loadTopFundsBff = async (): Promise> => {\n const { funds } = getState()\n return {\n statusCode: 200,\n data: stupidClone(funds),\n }\n}\n\nexport const placeOrderBff = async (order: Order, role: Role): Promise> => {\n try {\n const currentState = getState()\n const { userInvestor, funds, rewardTracking } = currentState\n if (role === 'investor') {\n userInvestor.orders.push(order)\n }\n if (role === 'manager') {\n const ownFundAddr = userInvestor.assets.ownFunds?.[0]\n if (!ownFundAddr) throw new Error('User has no fund')\n\n const ownFund = funds.find((f) => f.fundAddress === ownFundAddr)\n\n if (!ownFund) throw new Error('Fund not found')\n\n ownFund.orders.push(order)\n\n if (ownFund.followers.includes(userInvestor.walletAddress)) {\n await copyOrder(ownFund, userInvestor, order)\n }\n }\n\n rewardTracking.placeOrder += 1\n\n save()\n\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const investFundBff = async (\n fundAddress: Fund['fundAddress'],\n usdtAmount: number,\n): Promise> => {\n try {\n const currentState = getState()\n const { userInvestor, funds, rewardTracking } = currentState\n const fund = funds.find((f) => f.fundAddress === fundAddress)\n\n if (!fund) throw new Error('Fund not found')\n\n const { walletAddress: investorAddress } = userInvestor\n\n if (!fund.followers.includes(investorAddress)) {\n fund.followers.push(userInvestor.walletAddress)\n }\n\n const { copyingFunds, tokens: userTokens } = userInvestor.assets\n\n // remove usdt from user\n removeTokenFromTokenAssets(userTokens, 'USDT', usdtAmount)\n\n // move usdt to copying fund\n const copyingFund = copyingFunds.find((f) => f.fundAddress === fundAddress)\n if (copyingFund) {\n addTokenToTokenAssets(copyingFund.assets.tokens, 'USDT', usdtAmount)\n copyingFund.invested += usdtAmount\n } else {\n userInvestor.assets.copyingFunds.push({\n invested: usdtAmount,\n fundAddress,\n assets: {\n tokens: [\n { symbol: 'USDT', amount: usdtAmount },\n ],\n },\n orders: [],\n })\n }\n\n rewardTracking.copyFund += 1\n\n save()\n\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const exitFundBff = async (\n fundAddress: Fund['fundAddress'],\n usdtAmount: number,\n): Promise> => {\n try {\n const currentState = getState()\n const { userInvestor, funds } = currentState\n const fund = funds.find((f) => f.fundAddress === fundAddress)\n\n if (!fund) throw new Error('Fund not found')\n\n const { copyingFunds, tokens: userTokens } = userInvestor.assets\n const copyingFund = copyingFunds.find((f) => f.fundAddress === fundAddress)\n\n if (!copyingFund) {\n throw new Error('No fund to exit')\n }\n\n // remove usdt from fund\n removeTokenFromTokenAssets(copyingFund.assets.tokens, 'USDT', usdtAmount)\n copyingFund.invested -= usdtAmount\n\n // add usdt to user\n addTokenToTokenAssets(userTokens, 'USDT', usdtAmount)\n\n save()\n\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const createFundBff = async (\n fundInput: Pick,\n): Promise> => {\n try {\n const currentState = getState()\n const { userInvestor, funds, rewardTracking } = currentState\n const newFund: Fund = {\n fundAddress: generateRandomAddr(),\n performanceFeePercent: fundInput.performanceFeePercent,\n campScore: {\n return: randomFloor2digits(25),\n risk: randomFloor2digits(25),\n riskAdjustedReturn: randomFloor2digits(30),\n consistency: randomFloor2digits(20),\n },\n followers: generateFollowers(10),\n orders: [],\n assets: {\n tokens: [\n {\n symbol: TOKEN.USDT.symbol,\n amount: 100000\n }\n ]\n },\n invested: 100000,\n tags: fundInput.tags,\n profile: fundInput.profile,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n funds.push(newFund)\n userInvestor.assets.ownFunds.push(newFund.fundAddress)\n rewardTracking.createFund += 1\n\n save()\n\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const deleteFundBff = async (fundAddress: Fund['fundAddress']): Promise> => {\n try {\n const currentState = getState()\n const { userInvestor, funds } = currentState\n userInvestor.assets.ownFunds = userInvestor.assets.ownFunds.filter((f: Fund['fundAddress']) => f !== fundAddress)\n currentState.funds = funds.filter((f) => f.fundAddress !== fundAddress)\n\n save()\n\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\n\nexport const loadMarketsBff = async (): Promise> => {\n const markets = await generateMarkets()\n return {\n statusCode: 200,\n data: stupidClone(markets),\n }\n}\n\nexport const loadManagerDashboardBff = async (): Promise> => {\n try {\n const currentState = getState()\n const { rewardTracking } = currentState\n rewardTracking.visitFundDashboard += 1\n save()\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const loadExplorePageBff = async (): Promise> => {\n try {\n const currentState = getState()\n const { rewardTracking } = currentState\n rewardTracking.visitExplorePage += 1\n save()\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const loadPortfolioBff = async (): Promise> => {\n try {\n const currentState = getState()\n const { rewardTracking } = currentState\n rewardTracking.visitPortfolio += 1\n save()\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const loadRewardDataBff = async (): Promise> => {\n try {\n const currentState = getState()\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const resetBff = async (): Promise> => {\n try {\n reset()\n const currentState = getState()\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const submitRewardBff = async (form: RewardSubmitForm): Promise> => {\n try {\n const currentState = getState()\n const { rewardTracking } = currentState\n rewardTracking.walletAddress = form.walletAddress\n rewardTracking.telegramId = form.telegramId\n rewardTracking.twitterAccount = form.twitterAccount\n rewardTracking.formSubmitted = true\n save()\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n\nexport const showCongratulationsBff = async (isShow: boolean): Promise> => {\n try {\n const currentState = getState()\n const { rewardTracking } = currentState\n rewardTracking.showCongratulations = isShow\n save()\n return {\n statusCode: 200,\n data: stupidClone(currentState),\n }\n } catch (e) {\n return {\n statusCode: 500,\n error: e,\n }\n }\n}\n","import { createAsyncThunk } from '@reduxjs/toolkit'\nimport { v4 as uuid } from 'uuid'\n\nimport {\n createFundBff,\n deleteFundBff,\n exitFundBff,\n investFundBff,\n loadExplorePageBff,\n loadManagerDashboardBff,\n loadMarketsBff,\n loadTopFundsBff,\n loadPortfolioBff,\n loadUserInvestorBff,\n loadRewardDataBff,\n placeOrderBff,\n resetBff,\n submitRewardBff,\n showCongratulationsBff,\n} from '../bff/api'\n\nimport { Fund, Order, RewardSubmitForm, Role } from './types'\n\nexport const loadUserInvestor = createAsyncThunk(\n 'apis/loadUserInvestor',\n async () => {\n const response = await loadUserInvestorBff()\n return response\n },\n)\n\nexport const loadTopFunds = createAsyncThunk(\n 'apis/loadTopFunds',\n async () => {\n const response = await loadTopFundsBff()\n return response\n },\n)\nexport type PlaceOrderInput = Pick\nexport const placeOrder = createAsyncThunk(\n 'apis/placeOrder',\n async ({ input, role }: { input: PlaceOrderInput, role: Role }) => {\n //call genrate order\n const newOrder: Order = {\n id: uuid(),\n type: 'market',\n status: 'open',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n ...input,\n }\n const response = await placeOrderBff(newOrder, role)\n return response\n },\n)\n\nexport const investFund = createAsyncThunk(\n 'apis/investFund',\n async ({ fundAddress, usdtAmount }: { fundAddress: Fund['fundAddress'], usdtAmount: number }) => {\n const response = await investFundBff(fundAddress, usdtAmount)\n return response\n },\n)\n\nexport const exitFund = createAsyncThunk(\n 'apis/exitFund',\n async ({ fundAddress, usdtAmount }: { fundAddress: Fund['fundAddress'], usdtAmount: number }) => {\n const response = await exitFundBff(fundAddress, usdtAmount)\n return response\n },\n)\n\nexport const createFund = createAsyncThunk(\n 'apis/createFund',\n async (\n fundInput: Pick,\n ) => {\n const response = await createFundBff(fundInput)\n return response\n },\n)\n\nexport const deleteFund = createAsyncThunk(\n 'apis/deleteFund',\n async (fundAddress: Fund['fundAddress']) => {\n const response = await deleteFundBff(fundAddress)\n return response\n },\n)\n\nexport const loadMarkets = createAsyncThunk(\n 'apis/loadMarkets',\n async () => {\n\n const response = await loadMarketsBff()\n return response\n },\n)\n\nexport const loadManagerDashboard = createAsyncThunk(\n 'apis/visitFundDashboard',\n async () => {\n const response = await loadManagerDashboardBff()\n return response\n },\n)\n\nexport const loadExplorePage = createAsyncThunk(\n 'apis/visitExplorePage',\n async () => {\n const response = await loadExplorePageBff()\n return response\n },\n)\n\nexport const loadPortfolio = createAsyncThunk(\n 'apis/visitPortfolio',\n async () => {\n const response = await loadPortfolioBff()\n return response\n },\n)\n\nexport const loadRewardData = createAsyncThunk(\n 'apis/loadRewardData',\n async () => {\n const response = await loadRewardDataBff()\n return response\n },\n)\n\nexport const resetState = createAsyncThunk(\n 'apis/resetState',\n async () => {\n const response = await resetBff()\n return response\n },\n)\n\nexport const submitReward = createAsyncThunk(\n 'apis/submitReward',\n async (form: RewardSubmitForm) => {\n const response = await submitRewardBff(form)\n return response\n },\n)\n\nexport const showCongratulations = createAsyncThunk(\n 'apis/showCongratulations',\n async (isShow: boolean) => {\n const response = await showCongratulationsBff(isShow)\n return response\n },\n)\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nimport {\n loadUserInvestor,\n createFund,\n deleteFund,\n exitFund,\n investFund,\n placeOrder,\n} from '../api-actions'\nimport { Investor, Role } from '../types'\n\nconst localStorageKey = 'show-reward-tracker'\n\ntype InvestorState = { currentInvestor: Investor | null, role: Role, showDrawer: boolean }\nconst initialState: InvestorState = {\n currentInvestor: null,\n role: 'investor',\n showDrawer: !localStorage.getItem(localStorageKey),\n}\n\nconst slice = createSlice({\n name: 'currentInvestor',\n initialState,\n reducers: {\n setRole: (state: InvestorState, action: PayloadAction) => {\n state.role = action.payload\n },\n setShowDrawer: (state: InvestorState, action: PayloadAction) => {\n if(!localStorage.getItem(localStorageKey)) {\n localStorage.setItem(localStorageKey, 'true')\n }\n state.showDrawer = action.payload\n },\n },\n extraReducers: (builder) => {\n builder.addCase(loadUserInvestor.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.currentInvestor = action.payload.data\n }\n })\n builder.addCase(placeOrder.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.currentInvestor = action.payload.data.userInvestor\n }\n })\n builder.addCase(investFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.currentInvestor = action.payload.data.userInvestor\n }\n })\n builder.addCase(exitFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.currentInvestor = action.payload.data.userInvestor\n }\n })\n builder.addCase(createFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.currentInvestor = action.payload.data.userInvestor\n }\n })\n builder.addCase(deleteFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.currentInvestor = action.payload.data.userInvestor\n }\n })\n },\n})\n\nexport const { setRole, setShowDrawer } = slice.actions\nexport const { reducer: investorReducer } = slice\n","import React, { useCallback, useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useLocation } from 'react-router-dom'\n\nimport { Header, Props } from '../../components/Header'\nimport { loadUserInvestor, resetState } from '../../state/api-actions'\nimport { setRole } from '../../state/slices/investor'\nimport { RootState } from '../../state/store'\nimport { Role } from '../../state/types'\n\nexport const HeaderContainer = (): JSX.Element => {\n const dispatch = useDispatch()\n const { pathname } = useLocation()\n const currPath = (pathname.split('/')?.[1] ?? 'explore') as Props['currPath']\n const role = useSelector((state: RootState) => state.investor.role)\n const investorBalance = useSelector((state: RootState) =>\n state.investor.currentInvestor?.assets.tokens.find(f => f.symbol === 'USDT')?.amount)\n const hasOwnFund = useSelector((state: RootState) =>\n state.investor.currentInvestor?.assets.ownFunds[0] ? true : false\n )\n const managerBalance = useSelector((state: RootState) =>\n hasOwnFund ?\n state.funds.topFunds.find(\n f => f.fundAddress === state.investor.currentInvestor?.assets.ownFunds[0])?.assets.tokens.filter(\n (a) => a.symbol === 'USDT')\n .reduce((acc, t) => acc + t.amount, 0) :\n 0\n )\n\n useEffect(() => {\n const initRole: Role = currPath === 'fund-dashboard' || currPath === 'trade' ? 'manager' : 'investor'\n dispatch(setRole(initRole))\n }, [])\n\n const roleChangeHandler = useCallback((newRole: Role) => {\n dispatch(setRole(newRole))\n }, [])\n\n const resetStateHandler = useCallback(() => {\n dispatch(resetState())\n dispatch(loadUserInvestor())\n }, [])\n\n return <>\n
\n \n}\n","export default __webpack_public_path__ + \"static/media/mini_chart.767b16f1.png\";","import React from 'react'\nimport { useState } from 'react'\nimport { styled } from '@mui/system'\nimport FavoriteIcon from '@mui/icons-material/Favorite'\nimport {\n Card,\n CardContent,\n Typography,\n CardActions,\n Button,\n Divider,\n Avatar,\n Box,\n CardHeader,\n IconButton,\n} from '@mui/material'\n\nimport miniChart from '../../assets/mini_chart.png'\n//import whaleHunter from '../../assets/whale_hunter.png'\nimport { Fund } from '../../state/types'\n\n\n\nexport type Props = {\n fund: Fund,\n onClickInvest: (f: Fund) => void\n onClickExit: (f: Fund) => void\n}\n\nexport const FundManagerCard = ({ fund, onClickInvest, onClickExit }: Props): JSX.Element => {\n const [isFavorite, setFavorite] = useState(false)\n\n function toggleFavorite(isFavorite: boolean) {\n const toggleValue = !isFavorite\n setFavorite(toggleValue)\n }\n\n const FundCard = styled('div', {\n shouldForwardProp: (prop) => prop !== \"favorite\",\n })<{ favorite?: boolean; }>(({ favorite }) => (\n {\n position: 'relative',\n color: '#434343',\n boxSizing: 'initial',\n margin: '20px',\n background: '#01203D',\n boxShadow: '1px 1px 10px rgba(113, 99, 203, 0.5)',\n borderRadius: 10,\n\n '&::before': {\n position: 'absolute',\n top: '-0.5rem',\n left: '6.0rem',\n content: '\\'\\'',\n background: '#421C0D',\n height: '14px',\n width: '13px',\n transform: 'rotate(45deg)'\n },\n '&::after': {\n position: 'absolute',\n content: '\\'\\'',\n top: '-11px',\n left: '1.5rem',\n padding: '0.5rem',\n width: '4rem',\n background: '#F07645',\n color: 'white',\n textAlign: 'center',\n fontFamily: '\\'Roboto\\', sans-serif',\n boxShadow: '4px 4px 15px rgba(26, 35, 126, 0.2)',\n height: '40px',\n fontSize: '10px'\n },\n '&::hover': {\n background: '#082746',\n boxShadow: '1.02px 1.02px 10.2px 3px rgba(240, 118, 69, 0.7)',\n borderRadius: '10.2px'\n },\n '& .camp-score': {\n fontFamily: 'Montserrat',\n fontStyle: 'normal',\n fontSize: '30px',\n fontWeight: 'bold',\n lineHeight: '40px',\n },\n '& .camp-score-label': {\n fontFamily: 'Montserrat',\n fontStyle: 'normal',\n fontSize: '10px',\n top: '-5px',\n position: 'relative'\n },\n '& Card': {\n width: 345\n },\n\n '& .wrap-camp-score': {\n position: 'absolute',\n zIndex: 1,\n left: '1.5rem',\n top: '-0.7rem',\n width: '5rem',\n textAlign: 'center'\n },\n\n '& .wrap-favorite': {\n position: 'relative',\n background: '#C4C4C4',\n height: '142px'\n },\n\n '& .wrap-cover': {\n position: 'absolute',\n // // background: '#C4C4C4',\n // height: '142px',\n\n top: '0rem',\n left: '0rem',\n right: '0rem',\n bottom: '0rem',\n width: '5rem',\n\n },\n '& .cover': {\n position: 'absolute',\n top: '0rem',\n left: '0rem',\n right: '0rem',\n bottom: '0rem',\n background: '#C4C4C4',\n // height: '500px',\n width: '15rem',\n\n\n },\n\n '& .favorite-color': {\n backgroundColor: '#ffffff', color: favorite ? '#ff0000' : '#C4C4C4'\n },\n\n '& .fund-avatar': {\n position: 'absolute', top: '132px', left: '28px'\n },\n\n '& .fund-content': {\n marginTop: '40px'\n },\n\n '& .fund-content-row': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n flexDirection: 'row',\n },\n\n '& .wrap-action': {\n justifyContent: 'space-between',\n paddingLeft: '20px',\n paddingRight: '20px',\n paddingBottom: '20px'\n }\n\n })\n )\n\n return (\n \n \n \n \n {((fund.campScore.return + fund.campScore.riskAdjustedReturn +\n fund.campScore.consistency + fund.campScore.risk) * 0.1).toFixed(2)}\n \n \n CAMP SCORE\n \n \n {\n toggleFavorite(isFavorite)\n }}\n >\n \n \n }\n // title={\n // \n // }\n >\n\n \n \n\n \n\n \n \n \n {fund.profile.name}\n \n \n {fund.tags}\n \n \n Rank : -\n \n \n \n\n \n \n\n \n \n Return (Since inception)\n \n \n No. of Investors\n \n \n \n \n 100\n \n \n 10\n \n \n \n \n Max. Drawdown\n \n \n Asset under management\n \n \n \n \n 0%\n \n \n {fund.assets.tokens.length}\n \n \n \n\n \n \n \n \n \n )\n}\n","import React from 'react'\nimport { useSelector } from 'react-redux'\nimport { Grid, IconButton, Typography, Box } from '@mui/material'\nimport InfoIcon from '@mui/icons-material/Info'\n\nimport { Fund } from '../../state/types'\nimport { RootState } from '../../state/store'\nimport { FundManagerCard } from '../../components/FundManagerCard'\n\ntype Input = {\n onClickInvest: (f: Fund) => void\n onClickExit: (f: Fund) => void\n}\nexport const ExploreContainer = ({ onClickInvest, onClickExit }: Input): JSX.Element | null => {\n const topFunds = useSelector((state: RootState) => state.funds.topFunds)\n\n if (!topFunds) return null\n\n return \n \n \n EXPLORE\n \n \n \n \n \n \n Choose a fund to invest in\n \n \n {topFunds.map((f: Fund) => (\n \n \n \n \n \n ))}\n \n\n \n}\n","/* eslint-disable no-unused-vars */\nimport Box from '@mui/material/Box'\nimport NumberFormat from 'react-number-format'\nimport React, { FunctionComponent, useState } from 'react'\nimport {\n Avatar,\n Button,\n ButtonGroup,\n InputAdornment,\n OutlinedInput,\n Typography,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n} from '@mui/material'\n\nimport { Fund } from '../../state/types'\n\nexport type Props = {\n fund: Fund | null\n onClose: () => void\n totalInvestedUsdt: number\n totalUsdtBalance: number\n mode: 'invest' | 'exit'\n onSubmit: (userInvestAmount: number, setUserInvestAmount: (v: number) => void) => void\n onClickInvest: (f: Fund | null) => void\n onClickExit: (f: Fund | null) => void\n}\n\nconst PercentAction = { P25: 25, P50: 50, P75: 75, P100: 100 }\nexport const InvestExitModal = ({\n fund,\n onClose,\n mode,\n totalInvestedUsdt,\n totalUsdtBalance,\n onSubmit,\n onClickInvest,\n onClickExit,\n}: Props): JSX.Element => {\n\n\n const [amount, setAmount] = useState('')\n const [userInvestAmount, setUserInvestAmount] = useState(0)\n\n // const ctaEnabled = userInvestAmount > 0 &&\n // (mode === 'invest' ? userInvestAmount <= totalUsdtBalance : userInvestAmount <= totalInvestedUsdt)\n\n\n\n const submitHandler = () => {\n if (amount == '' || Number.isNaN(amount)) {\n setAmount('')\n return\n }\n const numberValue = Number(amount)\n if (numberValue <= 0) return\n console.log(userInvestAmount)\n onSubmit(numberValue, setUserInvestAmount)\n }\n\n // function setActionVolume(percent: number): void {\n // setPercent(percent)\n // setUserInvestAmount((totalUsdtBalance * percent) / 100)\n // }\n function setActionVolume(percent: number) {\n if (mode == 'invest') {\n const amountValue = totalUsdtBalance * percent / 100.00\n setAmount(amountValue.toString())\n } else {\n const amountValue = totalInvestedUsdt * percent / 100.00\n setAmount(amountValue.toString())\n }\n }\n\n //function setAmount(event: React.ChangeEvent): void {\n // const re = /^[0-9\\b]+$/\n // const amountValue = event.target.value\n // if (amountValue === '' || re.test(amountValue)) {\n // const amount = Number.parseFloat(amountValue)\n // const currentBalance = 100\n // setUserInvestAmount(amount > currentBalance ? currentBalance : amount)\n // setPercent(0)\n // }\n // }\n\n const onAmountChange = (e: React.ChangeEvent) => {\n const reg = /^[0-9]*[.,]?[0-9]*$/\n const preval = e.target.value\n if (e.target.value === '' || reg.test(e.target.value)) {\n setAmount(e.target.value)\n }\n else {\n e.target.value = preval.substring(0, (preval.length - 1))\n }\n }\n return (\n \n \n \n \n onClickInvest(fund)}\n variant={mode === 'invest' ? 'contained' : 'text'}\n color='primary'\n sx={{ width: '50%' }}>Invest\n onClickExit(fund)}\n variant={mode === 'exit' ? 'contained' : 'text'}\n color='secondary'\n sx={{ width: '50%' }}>\n Exit\n \n \n \n \n < DialogContentText>\n \n \n \n {fund?.profile.name}\n {fund?.tags}\n Rank : -\n \n \n Current balance (USDT)\n \n Amount\n \n \n \n \n Invested (USDT)\n \n Amount\n \n \n \n \n \n You {mode}\n \n Amount\n }\n endAdornment={\n USDT\n }\n aria-describedby=\"outlined-weight-helper-text\"\n inputProps={{\n style: { textAlign: 'right', fontSize: '20px' },\n pattern: '^[0-9]*[.,]?[0-9]*$',\n }}\n value={amount}\n placeholder='0'\n onChange={onAmountChange}\n />\n \n \n \n \n \n {mode === 'invest' ? 'Invest' : 'Exit'}\n \n \n \n )\n}\n\ntype SpendPercentButtonGroupProps = {\n onSelectPercent: (percent: number) => void\n}\n\nconst SpendPercentButtonGroup: FunctionComponent = ({ onSelectPercent }) =>\n \n \n \n \n \n \n \n \n","import React, { useCallback, useEffect, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\n\nimport { Fund } from '../../state/types'\nimport { RootState } from '../../state/store'\nimport { InvestExitModal } from '../../components/InvestExitModal'\n//import { getUsdtValueFromTokenAssets } from '../../bff/get-usdt-value-from-token-assets'\nimport { exitFund, investFund } from '../../state/api-actions'\n\ntype Input = {\n fund: Fund | null\n onClose: () => void\n mode: 'invest' | 'exit'\n onClickInvest: (f: Fund | null) => void\n onClickExit: (f: Fund | null) => void\n}\nexport function InvestExitModalContainer(\n { fund, onClose, mode, onClickInvest, onClickExit }: Input): JSX.Element | null {\n const dispatch = useDispatch()\n const [totalInvestedUsdt, setTotalInvestedUsdt] = useState(0)\n const currentInvestor = useSelector((state: RootState) => state.investor.currentInvestor)\n\n useEffect(() => {\n if (!currentInvestor) return\n\n const copyingFund = currentInvestor.assets.copyingFunds\n .find((f) => f.fundAddress === fund?.fundAddress ?? '')\n\n if (!copyingFund) {\n setTotalInvestedUsdt(0)\n return\n }\n setTotalInvestedUsdt(copyingFund.invested)\n }, [currentInvestor, fund])\n\n const submitHandler = useCallback((userInvestAmount: number, setUserInvestAmount: (v: number) => void) => {\n if (fund) {\n if (mode === 'invest') {\n dispatch(investFund({ fundAddress: fund.fundAddress, usdtAmount: userInvestAmount }))\n }\n if (mode === 'exit') {\n dispatch(exitFund({ fundAddress: fund.fundAddress, usdtAmount: userInvestAmount }))\n }\n setUserInvestAmount(0)\n }\n }, [fund, mode])\n\n if (!currentInvestor) return null\n\n const totalUsdtBalance = currentInvestor.assets.tokens\n .filter((a) => a.symbol === 'USDT')\n .reduce((acc, t) => acc + t.amount, 0)\n\n return \n}\n\n","import React, { useState } from 'react'\nimport { Modal, Box, Typography, Button } from '@mui/material'\n\nimport logo from '../../assets/camp_demo_logo.png'\n\nexport const PrototypeWarningModal = (): JSX.Element => {\n const [consent, setCosent] = useState(false)\n\n return (\n \n \n \n \n This is CAMP DEMO\n \n \n The 10,000 USDT given to you is fake! fee free to use it :)\n \n \n You can try 6 easy steps and submit for 500 CAMP lucky draw!!\n \n {\n localStorage.setItem('show-demo-popup', 'true')\n setCosent(!consent)\n }}>\n I love CAMP demo\n \n \n \n )\n}\n","import React from 'react'\n\nimport { PrototypeWarningModal } from '../../components/PrototypeWarningModal'\n\nexport function PrototypeWarningModalContainer(): JSX.Element | null {\n const hasData = localStorage.getItem('show-demo-popup') != null\n if (hasData) return null\n return \n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\n\nimport { ExploreContainer } from '../../containers/ExploreContainer'\nimport { InvestExitModalContainer } from '../../containers/InvestExitModalContainer'\nimport { PrototypeWarningModalContainer } from '../../containers/PrototypeWarningModalContainer'\nimport { Fund } from '../../state/types'\nimport { loadExplorePage } from '../../state/api-actions'\n\n\nexport const Explore = (): JSX.Element => {\n const dispatch = useDispatch()\n const [selectedFund, setSelectedFund] = useState(null)\n const [investOrExit, setInvestOrExit] = useState<'invest' | 'exit'>('invest')\n const onClickInvest = useCallback((f: Fund|null) => {\n setInvestOrExit('invest')\n setSelectedFund(f)\n }, [])\n\n const onClickExit = useCallback((f: Fund|null) => {\n setInvestOrExit('exit')\n setSelectedFund(f)\n }, [])\n\n const onInvestExitClose = useCallback(() => {\n setSelectedFund(null)\n }, [])\n\n // example-send-basic-reward\n // const onSendSend = useCallback(() => {\n // dispatch(submitBasicReward({\n // walletAddress: 'walletAddress',\n // twitterId: 'twitterId',\n // telegramId: 'telegramId',\n // }))\n // }, [])\n // \n\n\n useEffect(() => {\n dispatch(loadExplorePage())\n }, [])\n\n return
\n \n \n \n
\n}\n","import { Box } from '@mui/material'\nimport React from 'react'\nimport { AdvancedRealTimeChart } from 'react-ts-tradingview-widgets'\n\nexport type Props = {\n symbol?: string\n}\nexport const TradingGraph = ({ symbol = 'BNBUSDT' }: Props): JSX.Element => {\n return \n \n \n}\n","import React from 'react'\nimport { useSelector } from 'react-redux'\n\nimport { TradingGraph } from '../../components/TradingGraph'\nimport { RootState } from '../../state/store'\nexport const TradingGraphContainer = (): JSX.Element | null => {\n const currentMarket = useSelector((state: RootState) => state.market.currentMarket)\n // if (!currentMarket) return null\n return \n}\n\n","import React from 'react'\n\nconst wardenUrl = 'https://sentry-ward.wardenswap.finance/#/white-label-swap'\nconst fromToken = '0x55d398326f99059ff775485246999027b3197955'\nconst toToken = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\n\nexport const SwapPanelContainer = (): JSX.Element => \n","import React from 'react'\nimport { Grid } from '@mui/material'\n\nimport { TradingGraphContainer } from '../../containers/TradingGraphContainer'\nimport { SwapPanelContainer } from '../../containers/SwapPanelContainer'\n\nexport const Swap = (): JSX.Element =>\n \n \n \n \n \n \n \n \n","import React from 'react'\nimport { Avatar, TableCell, TableRow, Typography, Box } from '@mui/material'\nimport { styled } from '@mui/material/styles'\nimport NumberFormat from 'react-number-format'\n\nimport { CoinPositionModel } from '.'\n\nconst StlyledCell = styled(TableCell)`\n border-bottom:none;\n height: 73px;\n`\n\nconst StlyledFirstCell = styled(StlyledCell)`\n border-radius: 5px 0px 0px 5px;\n height: 73px;\n\n`\n\nconst StlyledLastCell = styled(StlyledCell)`\n border-radius: 0px 5px 5px 0px;\n height: 73px;\n`\nconst StlyledRow = styled(TableRow)`\n background-color: #14395B;\n height: 73px;\n border-color: none;\n`\n\nexport const PositionListItem = (prop: CoinPositionModel): JSX.Element | null => {\n if (!prop) return null\n\n const handleClick = () => {\n if (prop.onClick && prop.fundAddress) {\n prop.onClick(prop.fundAddress)\n }\n }\n return (\n \n \n \n \n {prop.shortName}\n {prop.name}\n \n \n \n \n\n \n \n \n \n \n \n\n \n \n \n \n {/* \n \n */}\n )\n}\n","import React from 'react'\nimport {\n TableContainer, Table, TableHead, TableRow, TableCell,\n Paper,\n TableBody,\n Typography,\n} from '@mui/material'\n\nimport { PositionListItem } from './CoinPositionItem'\n\nexport type CoinPositionModel = {\n fundAddress?: string\n icon?: string\n shortName?: string\n name?: string\n unit?: number\n invested?: number\n pnl?: number\n currentValue?: number\n onClick?: (address: string) => void\n}\n\nexport type Props = {\n coinPositions: CoinPositionModel[]\n}\n\nexport const InvestorPortfolioPositionList = (prop: Props): JSX.Element =>\n \n \n \n \n \n Market\n Unit\n Invested\n P/L\n Value($)\n {/* */}\n \n \n \n {prop.coinPositions.map((coinPosition, key) => {\n return (\n )\n })}\n \n
\n \n\n","import React, { FunctionComponent } from 'react'\nimport { Box, Avatar, Typography } from '@mui/material'\nimport { styled } from '@mui/material/styles'\nimport NumberFormat from 'react-number-format'\n\nconst StlyledBox = styled(Box)`\n border-radius: 10px;\n background-color: #01203D;\n box-shadow: 0px 0px 10px rgba(113, 99, 203, 0.4);\n margin: 5px;\n padding-left: 25px;\n padding-right: 25px;\n display: flex;\n justify-content: center;\n align-items: flex-end;\n align-content: flex-end;\n flex-direction: column;\n height: 120px;\n flex-basis: 100%;\n`\ntype TextProps = {\n text?: string,\n color?: string,\n size?: string,\n weight?: string\n}\n\nexport type InvestorPortfolioSummaryModel = {\n avatarUri: string\n investorName: string\n totalInvested: number\n totalBalance: number\n avalable: number\n}\n\nexport type Props = {\n portfolioSummaryModel: InvestorPortfolioSummaryModel\n}\n\nconst Text: FunctionComponent = ({ text = '',\n color = 'text',\n size = '30px',\n weight = '400',\n children,\n}) =>\n \n {text}\n {children}\n \n\nexport const InvestorPortfolioSummary = (prop: Props): JSX.Element | null => {\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 \n}\n\n\n","import { TokenAmount, TokenAsset } from '../state/types'\n\n\nimport { getUsdtValueFromTokenAssets } from './get-usdt-value-from-token-assets'\n\nexport const getUsdValueFormTokenAssetsArray = async (tokenAssets: TokenAsset[][]): Promise => {\n return (await Promise.all(tokenAssets.map((tokenAsset: TokenAsset[]) => {\n return getUsdtValueFromTokenAssets(tokenAsset)\n }))).reduce((prev, curr) => prev + curr, 0)\n\n}\n\n","/* eslint-disable */\nimport React, { useEffect, useState } from 'react'\nimport { Grid, Typography } from '@mui/material'\nimport { useSelector } from 'react-redux'\n\nimport { CoinPositionModel, InvestorPortfolioPositionList } from '../../components/InvestorPortfolioPositionList'\nimport { RootState } from '../../state/store'\nimport { getUsdtValueFromTokenAssets } from '../../bff/get-usdt-value-from-token-assets'\nimport { InvestorPortfolioSummary, InvestorPortfolioSummaryModel } from '../../components/InvestorPortfolioSummary'\nimport { getUsdValueFormTokenAssetsArray } from '../../bff/get-total-invested-from-token-asstet-array'\nimport { TOKEN } from '../../bff/constants'\n\nexport const InvestorPortfolioContainer = () => {\n const [summary, setSummary] = useState(null)\n const [coinPositions, setCoinPositions] = useState([])\n const topFunds = useSelector((state: RootState) => state.funds.topFunds)\n const currentInvestor = useSelector((state: RootState) => state.investor.currentInvestor)\n const copyingFundsFromInvestor = useSelector((state: RootState) => state.investor.currentInvestor?.assets.copyingFunds)\n\n useEffect(() => {\n if (!currentInvestor) return\n const copyingFundsAssets = currentInvestor.assets.copyingFunds.map(fund => fund.assets.tokens)\n\n const totalUsdtAvailable = currentInvestor.assets.tokens\n .filter((a) => a.symbol === 'USDT')\n .reduce((acc, t) => acc + t.amount, 0)\n\n let sum: InvestorPortfolioSummaryModel = {\n avatarUri: currentInvestor.profile?.picUri ?? '',\n investorName: currentInvestor.profile?.name ?? 'Unnamed investor',\n totalInvested: 0,\n totalBalance: 0,\n avalable: totalUsdtAvailable,\n\n }\n getUsdValueFormTokenAssetsArray(copyingFundsAssets).then(value => {\n sum = {\n ...sum,\n totalInvested: value,\n totalBalance: value + sum.avalable\n\n }\n setSummary(sum)\n })\n\n // getUsdtValueFromTokenAssets(copyingFund.assets.tokens)\n // .then((v) => setTotalInvestedUsdt(v))\n // .catch(e => console.log(e))\n //create add stable coin\n let positions: CoinPositionModel[] = []\n positions.push(\n {\n icon: TOKEN.USDT.logoURI,\n name: TOKEN.USDT.name,\n shortName: TOKEN.USDT.symbol,\n unit: totalUsdtAvailable,\n currentValue: totalUsdtAvailable,\n }\n )\n setCoinPositions([...positions])\n //let copyingFundsSummary: CoinPositionModel[] = []\n if (copyingFundsFromInvestor)\n Promise.all(\n copyingFundsFromInvestor.map(async fund => {\n getUsdtValueFromTokenAssets(fund.assets.tokens).then((v) => {\n const invested = currentInvestor.assets.copyingFunds.find(f => f.fundAddress == fund.fundAddress)?.invested ?? 0\n if (invested > 0) {\n positions.push(\n {\n fundAddress: fund.fundAddress,\n icon: topFunds.find(f => f.fundAddress == fund.fundAddress)?.profile.picUri,\n //shortName: TOKEN.USDT.symbol,\n shortName: topFunds.find(f => f.fundAddress == fund.fundAddress)?.profile.name,\n //unit: totalUsdtAvailable,\n currentValue: v,//copyingFunds.find(f => f.fundAddress === fund.fundAddress)?.assets.tokens.find(token => token.symbol === 'USDT')?.amount,\n invested: invested,\n pnl: v - (invested ?? 0),\n onClick: selectFund\n }\n )\n setCoinPositions([...positions])\n }\n\n })\n .catch(e => console.log(e))\n })\n )\n // copyingFunds.forEach(fund => {\n\n // positions.push(\n // {\n // fundAddress: fund.fundAddress,\n // icon: fund.profile.picUri,\n // //shortName: TOKEN.USDT.symbol,\n // shortName: fund.profile.name,\n // //unit: totalUsdtAvailable,\n // currentValue: copyingFunds.find(f => f.fundAddress === fund.fundAddress)?.assets.tokens.find(token => token.symbol === 'USDT')?.amount,\n // invested: currentInvestor.assets.copyingFunds.find(f => f.fundAddress == fund.fundAddress)?.invested,\n // pnl: 100,\n // onClick: selectFund\n // }\n // )\n // })\n\n\n // positions.push(...copyingFundsSummary)\n\n\n\n\n // setCoinPositions(currentInvestor.assets.tokens.map((t) => ({\n // icon: 'https://assets.coingecko.com/coins/images/1/thumb_2x/bitcoin.png?1547033579',\n // name: 'Test',\n // shortName: t.symbol,\n // unit: t.amount,\n\n // invested: 0,\n // pnl: 0,\n // currentValue: 0,\n // })))\n }, [currentInvestor, topFunds])\n // Summary:\n // Investor Image\n // Total Balance\n // Total Invested\n // Available\n\n //List\n // Stable Coin\n // Unit\n // Value\n\n // Fund List\n // Invested\n // PnL%\n // Current Value\n\n const selectFund = (address: String) => {\n console.log(address)\n }\n\n return \n \n \n PORTFOLIO\n \n \n {summary && \n \n }\n {coinPositions &&\n < Grid item xs>\n \n
\n }\n
\n}\n","import React, { useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\n\nimport { loadPortfolio } from '../../state/api-actions'\nimport { InvestorPortfolioContainer } from '../../containers/InvestorPortfolioContainer'\n\nexport const Port = (): JSX.Element => {\n\n const dispatch = useDispatch()\n\n useEffect(() => {\n dispatch(loadPortfolio())\n }, [])\n\n return <>\n \n \n}\n","import { v4 as uuid } from 'uuid'\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nimport {\n loadUserInvestor,\n createFund,\n deleteFund,\n exitFund,\n investFund,\n placeOrder,\n loadTopFunds,\n resetState,\n} from '../api-actions'\nimport { NotificationMsg } from '../types'\n\ntype NotificationState = { notifications: NotificationMsg[] }\nconst initialState: NotificationState = { notifications: [] }\n\nconst slice = createSlice({\n name: 'notification',\n initialState,\n reducers: {\n markAsShown: (state: NotificationState, action: PayloadAction) => {\n const noti = state.notifications.find((n) => n.id === action.payload.id)\n if (noti) {\n noti.wasShown = true\n }\n },\n },\n extraReducers: (builder) => {\n builder.addCase(loadUserInvestor.fulfilled, (state, action) => {\n if (action.payload.data && action.payload.data?.profile) {\n const { name } = action.payload.data.profile\n const text = `Hello ${name}`\n state.notifications.push({ id: uuid(), text, wasShown: false, level: 'info' })\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n builder.addCase(loadTopFunds.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.notifications.push({ id: uuid(), text: 'Top funds was loaded', wasShown: false, level: 'info' })\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n builder.addCase(placeOrder.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.notifications.push({\n id: uuid(),\n text: 'The order was successfully PLACED!',\n wasShown: false,\n level: 'success'\n })\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n builder.addCase(investFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n const investedFund = action.payload.data?.funds?.find(f => f.fundAddress === action.meta.arg.fundAddress)\n if (investedFund) {\n state.notifications.push({\n id: uuid(),\n text: `You've just invested (${action.meta.arg.usdtAmount} USDT) to \"${investedFund.profile.name}\" fund`,\n wasShown: false,\n level: 'success' })\n }\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n builder.addCase(exitFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n const investedFund = action.payload.data?.funds?.find(f => f.fundAddress === action.meta.arg.fundAddress)\n if (investedFund) {\n state.notifications.push({\n id: uuid(),\n text:\n `You've just withdrawed (${action.meta.arg.usdtAmount} USDT) from \"${investedFund.profile.name}\" fund`,\n wasShown: false,\n level: 'success'\n })\n }\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n builder.addCase(createFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n const newFund = action.payload.data?.funds?.find(f =>\n f.fundAddress === action.payload.data?.userInvestor?.assets?.ownFunds?.[0])\n if (newFund) {\n state.notifications.push({\n id: uuid(),\n text: `Your new fund \"${newFund.profile.name}\" has just been CREATED!`,\n wasShown: false,\n level: 'success'\n })\n }\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n builder.addCase(deleteFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n const newFund = action.payload.data?.funds?.find(f =>\n f.fundAddress === action.payload.data?.userInvestor?.assets?.ownFunds?.[0])\n if (newFund) {\n state.notifications.push({\n id: uuid(),\n text: `Your fund \"${newFund.profile.name}\" has been DELETED!`,\n wasShown: false,\n level: 'success'\n })\n }\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n builder.addCase(resetState.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.notifications.push({\n id: uuid(),\n text: 'All fake data was reset!',\n wasShown: false,\n level: 'success'\n })\n return\n }\n\n if (action.payload.error instanceof Error) {\n state.notifications.push({ id: uuid(), text: action.payload.error.message, wasShown: false, level: 'error' })\n return\n }\n\n state.notifications.push({ id: uuid(), text: 'unknown error', wasShown: false, level: 'error' })\n })\n },\n})\n\n\nexport const { markAsShown } = slice.actions\nexport const { reducer: notificationReducer } = slice\n","// import { ThemeOptions } from '@mui/material'\nimport { createTheme } from '@mui/material/styles'\nexport const dark = createTheme({\n palette: {\n primary: {\n main: '#F07645',\n },\n secondary: {\n main: '#244E8E',\n dark: '#01203D',\n },\n text: {\n primary: '#FFFFFF',\n secondary: 'rgba(255, 255, 255, 0.46)',\n },\n success: {\n main: '#5CC953',\n },\n background: {\n default: '#131722',\n paper: '#02080e',\n },\n divider: '#ffffff',\n },\n typography: {\n allVariants: {\n color: 'white',\n },\n },\n components: {\n MuiCard: {\n styleOverrides: {\n root: {\n backgroundColor: '#01203D',\n borderRadius: '13px',\n },\n },\n },\n MuiCardMedia: {\n styleOverrides: {\n root: {\n backgroundColor: '#C4C4C4',\n\n },\n },\n },\n MuiAvatar: {\n styleOverrides: {\n root: {\n width: '85px',\n height: '85px',\n border: '1.02px solid #FFFFFF',\n boxSizing: 'border-box',\n background: '#001529',\n color: '#ffffff',\n },\n },\n },\n },\n})\n","// import { ThemeOptions } from '@mui/material'\nimport { createTheme } from '@mui/material/styles'\nexport const light=createTheme({\n palette: {\n primary: {\n main: '#F07645',\n },\n secondary: {\n main: '#244E8E',\n dark: '#01203D',\n },\n text: {\n primary: '#FFFFFF',\n secondary: 'rgba(255, 255, 255, 0.46)',\n },\n success: {\n main: '#5CC953',\n },\n background: {\n default: '#0D3050',\n paper: '#02080e',\n },\n divider: '#ffffff',\n },\n typography: {\n allVariants: {\n color: 'white',\n },\n },\n components: {\n MuiCard: {\n styleOverrides: {\n root: {\n backgroundColor: '#01203D',\n borderRadius: '13px',\n },\n },\n },\n MuiCardMedia: {\n styleOverrides: {\n root: {\n backgroundColor: '#C4C4C4',\n\n },\n },\n },\n MuiAvatar: {\n styleOverrides: {\n root: {\n width: '85px',\n height: '85px',\n border: '1.02px solid #FFFFFF',\n boxSizing: 'border-box',\n background: '#001529',\n color: '#ffffff',\n },\n },\n },\n },\n})\n","export default __webpack_public_path__ + \"static/media/bg-camp-main.60a5d095.png\";","import * as React from 'react'\nimport GlobalStyles from '@mui/material/GlobalStyles'\n\nimport CampBackgroundImage from '../assets/bg-camp-main.png'\n\nexport const CampCssBaseline = (): JSX.Element => {\n return (\n \n \n \n )\n}\n","import React, { useState, useEffect } from 'react'\nimport {\n Avatar,\n List,\n ListItemText,\n ListItem,\n ListItemAvatar,\n ListItemButton,\n Typography,\n Input,\n InputAdornment,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n} from '@mui/material'\nimport NumberFormat from 'react-number-format'\nimport SearchIcon from '@mui/icons-material/Search'\n\n\nexport type Market = {\n ticker: string;\n name: string;\n price?: number;\n img?: string;\n}\n\nexport type Props = {\n open: boolean;\n onClose: () => void;\n markets: Market[];\n onSelectMarket: (market: Market) => void\n}\n\nexport const MarketListModal = ({ open, onClose, markets = [], onSelectMarket }: Props): JSX.Element => {\n\n const [filteredList, setFilteredList] = useState(markets)\n\n const onSearch = (event: React.ChangeEvent) => {\n const value = event.target.value\n\n if (value === '') {\n setFilteredList(markets)\n return\n }\n\n setFilteredList(markets.filter((token) => token.ticker.toLowerCase().includes(value.toLowerCase())))\n }\n useEffect(() => {\n setFilteredList(markets)\n }, [markets])\n\n return (\n \n \n \n Select Token\n \n \n \n\n }\n />\n \n \n < DialogContentText>\n \n {filteredList && filteredList.map((token, index) =>\n \n \n \n }\n >\n onSelectMarket(token)}\n >\n \n \n \n \n \n \n ,\n )}\n \n \n \n \n \n \n )\n}\n\n","import React, { FunctionComponent, useState } from 'react'\nimport { styled } from '@mui/material/styles'\nimport {\n Avatar,\n ButtonGroup,\n Button,\n Typography,\n Box,\n FormControl,\n InputAdornment,\n OutlinedInput,\n} from '@mui/material'\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'\nimport { capitalize } from 'lodash'\nimport NumberFormat from 'react-number-format'\n\nconst Wraper = styled(Box)`\n border-radius: 10px;\n background-color: #1F222C;\n padding: 27px 32px 32px 32px;\n height: fit-content;\n`\nconst InputCurrencyStyled = styled(Box)`\n margin-top:12px;\n border-radius: 7px;\n height: 55px;\n background-color: #FFFFFF26;\n padding: 10px;\n`\nconst LineDashed = styled(Box)`\n border: 1px dashed rgba(255, 255, 255, 0.5);\n margin-top: 23px;\n margin-bottom: 23px;\n`\n\nconst PercentAction = { P25: 25, P50: 50, P75: 75, P100: 100 }\nconst OrderSide = { BUY: 'buy', SELL: 'sell' }\n\ntype SpendPercentButtonGroupProps = {\n onSelectPercent: (percent: number) => void\n}\n\nconst SpendPercentButtonGroup: FunctionComponent = ({ onSelectPercent }) =>\n \n \n \n \n \n \n \n \n\nexport type Props = {\n target: Token;\n available: number;\n onPlaceOrder: (orderSize: number, side: 'buy' | 'sell') => void;\n}\n\nexport type Token = {\n name: string;\n price: number;\n icon: string;\n onClick: () => void;\n}\nexport const OpenPosition = ({\n target,\n available,\n onPlaceOrder,\n}: Props): JSX.Element => {\n\n const [amount, setAmount] = useState('')\n const [orderSide, setOrderSide] = useState(OrderSide.BUY)\n\n\n const onAmountChange = (e: React.ChangeEvent) => {\n const reg = /^[0-9]*[.,]?[0-9]*$/\n const preval = e.target.value\n if (e.target.value === '' || reg.test(e.target.value)) {\n setAmount(e.target.value)\n }\n else {\n e.target.value = preval.substring(0, (preval.length - 1))\n }\n }\n\n\n\n function setActionVolume(percent: number) {\n\n const amountValue = available * percent / 100.00\n setAmount(amountValue.toString())\n\n }\n\n const onClickPlaceOrder = () => {\n if (amount == '' || Number.isNaN(amount)) {\n setAmount('')\n return\n }\n const numberValue = Number(amount)\n\n if (numberValue <= 0 || numberValue > available) return\n\n onPlaceOrder(numberValue, 'buy')\n setAmount('')\n }\n console.log()\n return \n \n \n setOrderSide(OrderSide.BUY)}\n variant={orderSide === OrderSide.BUY ? 'contained' : 'text'}\n color='primary'\n sx={{\n width: '50%',\n\n }}>Buy\n setOrderSide(OrderSide.SELL)}\n variant={orderSide === OrderSide.SELL ? 'contained' : 'text'}\n color='secondary'\n sx={{\n width: '50%',\n }}>Sell\n \n \n \n < Typography variant='h6' > Select Token({target.name})\n \n \n \n \n {target.name}\n \n \n \n \n \n < Typography variant='h6'> {capitalize(orderSide)} Token ({target.name})\n \n \n \n \n Amount\n }\n endAdornment={\n USDT\n }\n aria-describedby=\"outlined-weight-helper-text\"\n inputProps={{\n style: { textAlign: 'right', fontSize: '20px' },\n pattern: '^[0-9]*[.,]?[0-9]*$',\n }}\n value={amount}\n placeholder='0'\n onChange={onAmountChange}\n />\n \n \n \n \n \n \n \n \n < Typography color='rgba(255, 255, 255, 0.5)' noWrap variant='body2'>Available Balance (USDT):\n < Typography color='rgba(255, 255, 255, 0.5)' noWrap variant='body2'>\n \n \n \n\n \n \n {orderSide}\n \n\n \n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\n\nimport { Market } from '../types'\nimport { loadMarkets } from '../api-actions'\n\ntype MarketState = { currentMarket: Market | null, markets: Market[] }\nconst initialState: MarketState = { currentMarket: null, markets: [] }\n\nconst slice = createSlice({\n name: 'market',\n initialState,\n reducers: {\n setCurrentMarket: (state: MarketState, action: PayloadAction) => {\n state.currentMarket = action.payload\n },\n },\n extraReducers: (builder) => {\n builder.addCase(loadMarkets.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.markets = action.payload?.data\n return\n }\n })\n }\n})\n\nexport const { setCurrentMarket } = slice.actions\nexport const { reducer: marketReducer } = slice\n","import { Order } from '../state/types'\n\nimport { addTokenToTokenAssets, removeTokenFromTokenAssets } from './manage-token-assets'\nimport { marketCalculator } from './market-calculator'\nimport { getState, save } from './mock-state'\n\nlet count = 0\ntype Subscriber = {\n key: string\n callback: (count: number) => void\n}\nlet subscribers: Subscriber[] = []\n\nexport const subscribeAutoFill = (subscriber: Subscriber): number => {\n return subscribers.push(subscriber)\n}\n\nexport const unsubscribeAutoFill = (key: string): void => {\n subscribers = subscribers.filter(s => s.key !== key)\n}\n\nexport const startAutoFill: () => void = () => {\n setInterval(async () => {\n const { userInvestor, funds } = getState()\n\n // Filling user orders\n const openOrders = userInvestor.orders.filter(\n (order: Order) => order.status === 'open')\n\n for(const order of openOrders) {\n try {\n order.status = 'filled'\n\n const { fromToken, toToken, fromTokenAmount } = order\n order.toTokenAmount = (await marketCalculator({ fromToken, toToken, fromTokenAmount })).toTokenAmount\n\n removeTokenFromTokenAssets(userInvestor.assets.tokens, order.fromToken, order.fromTokenAmount)\n addTokenToTokenAssets(userInvestor.assets.tokens, order.toToken, order.toTokenAmount)\n } catch (e) {\n order.status = 'cancelled'\n console.error(e)\n return\n }\n }\n\n // Filling open copied orders\n const openCopiedOrders = userInvestor.assets.copyingFunds\n .map(f => f.orders)\n .flat()\n .filter(o => o.status === 'open')\n for(const order of openCopiedOrders) {\n try {\n order.status = 'filled'\n\n const { fromToken, toToken, fromTokenAmount } = order\n order.toTokenAmount = (await marketCalculator({ fromToken, toToken, fromTokenAmount })).toTokenAmount\n\n const fund = userInvestor.assets.copyingFunds.find((f) => f.fundAddress === order.copiedFromFundAddress)\n\n if (!fund) {\n order.status = 'cancelled'\n return\n }\n\n removeTokenFromTokenAssets(fund.assets.tokens, order.fromToken, order.fromTokenAmount)\n addTokenToTokenAssets(fund.assets.tokens, order.toToken, order.toTokenAmount)\n } catch(e) {\n order.status = 'cancelled'\n console.error(e)\n return\n }\n }\n\n // Filling fund orders\n let ownFundOrderNumber = 0\n for (const fund of funds) {\n const fundOpenOrders = fund.orders\n .filter((order: Order) => order.status === 'open')\n if (fund.fundAddress === userInvestor.assets.ownFunds?.[0]) {\n ownFundOrderNumber += fundOpenOrders.length\n }\n for (const order of fundOpenOrders) {\n order.status = 'filled'\n try {\n const { fromToken, toToken, fromTokenAmount } = order\n order.toTokenAmount = (await marketCalculator({ fromToken, toToken, fromTokenAmount })).toTokenAmount\n\n removeTokenFromTokenAssets(fund.assets.tokens, order.fromToken, order.fromTokenAmount)\n addTokenToTokenAssets(fund.assets.tokens, order.toToken, order.toTokenAmount)\n } catch (e) {\n order.status = 'cancelled'\n console.error(e)\n return\n }\n }\n }\n\n save()\n\n if (ownFundOrderNumber > 0) {\n count++\n subscribers.forEach(s => s.callback(count))\n }\n }, 1000)\n\n}\n","\nimport React, { useState, useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Box, Skeleton } from '@mui/material'\n\nimport { TOKEN } from '../../bff/constants'\nimport { MarketListModal, Market } from '../../components/MarketListModal'\nimport { OpenPosition, Token } from '../../components/OpenPosition'\nimport { loadMarkets, loadTopFunds, placeOrder } from '../../state/api-actions'\nimport { setCurrentMarket } from '../../state/slices/markets'\nimport { RootState } from '../../state/store'\nimport { PlaceOrderInput } from '../../state/api-actions'\nimport { subscribeAutoFill, unsubscribeAutoFill } from '../../bff/auto-fill'\n\n\nexport const OpenPositionContainer = (): JSX.Element | null => {\n const dispatch = useDispatch()\n\n //redux state\n\n const [autoFillCount, setAutoFillCount] = useState(0)\n const markets = useSelector((state: RootState) => state.market.markets)\n const currentMarket = useSelector((state: RootState) => state.market.currentMarket || state.market.markets[0])\n const currentInvestor = useSelector((state: RootState) => state.investor.currentInvestor)\n const role = useSelector((state: RootState) => state.investor.role)\n const ownFundUsdt = useSelector(\n (state: RootState) =>\n state.funds.topFunds.find((f) =>\n f.fundAddress === state.investor?.currentInvestor?.assets?.ownFunds?.[0])\n ?.assets.tokens.filter((a) => a.symbol === 'USDT').reduce((acc, t) => acc + t.amount, 0))\n\n\n //local state\n const [open, setOpen] = useState(false)\n\n useEffect(() => {\n const subKey = 'OpenPositionContainer'\n subscribeAutoFill({\n key: subKey,\n callback: setAutoFillCount,\n })\n dispatch(loadMarkets())\n return () => {\n unsubscribeAutoFill(subKey)\n }\n }, [])\n\n useEffect(() => {\n dispatch(loadTopFunds())\n }, [autoFillCount])\n\n\n // useEffect(() => {\n // const totalUsdtBalance = ownFundUsdt?.assets.tokens.filter((a) => a.symbol === 'USDT')\n // .reduce((acc, t) => acc + t.amount, 0)\n // setAvailableUsdt(totalUsdtBalance || 0)\n // }, [ownFundUsdt])\n\n useEffect(() => {\n if (!currentMarket) {\n dispatch(setCurrentMarket(markets[0]))\n }\n }, [markets])\n\n console.log({ currentInvestor, currentMarket, markets })\n\n if (!currentInvestor || !currentMarket)\n return \n \n \n\n\n\n const onPlaceOrder = (orderSize: number, side: 'buy' | 'sell') => {\n const input: PlaceOrderInput = {\n marketName: currentMarket?.name || 'BNB',\n side: side,\n fromToken: currentMarket.toTokenSymbol || '',\n fromTokenAmount: orderSize,\n toToken: currentMarket.fromTokenSymbol,\n toTokenAmount: orderSize / currentMarket.price,\n closePositionOrderId: '',\n }\n\n dispatch(placeOrder({ input, role }))\n }\n\n //call back\n const onClickToken1 = () => {\n openMarket()\n }\n\n const onClose = () => {\n setOpen(false)\n }\n\n const onSelectMarket = (market: Market) => {\n const selected = markets.find(e => e.fromTokenSymbol === market.ticker)\n if (selected) {\n dispatch(setCurrentMarket(selected))\n }\n onClose()\n }\n\n const openMarket = () => {\n setOpen(true)\n }\n //props\n const marKetProp: Market[] = markets.map(item => ({\n ticker: TOKEN[item.fromTokenSymbol].symbol,\n name: TOKEN[item.fromTokenSymbol].name,\n price: item.price,\n img: TOKEN[item.fromTokenSymbol].logoURI,\n }))\n const target: Token = {\n name: TOKEN[currentMarket?.fromTokenSymbol ?? 'BNB'].symbol,\n price: currentMarket?.price ?? 0,\n icon: TOKEN[currentMarket?.fromTokenSymbol ?? 'BNB'].logoURI,\n onClick: onClickToken1,\n }\n\n return <>\n \n \n \n}\n","import React, { useEffect, useState } from 'react'\nimport {\n TableContainer,\n Table,\n TableHead,\n TableRow,\n TableCell,\n Paper,\n TableBody,\n Typography,\n Tooltip,\n Box,\n Button,\n} from '@mui/material'\nimport InfoIcon from '@mui/icons-material/Info'\nimport { styled } from '@mui/material/styles'\nimport NumberFormat from 'react-number-format'\nimport { format } from 'date-fns'\n\nimport { Order } from '../../state/types'\nimport { marketCalculator } from '../../bff'\n\nexport type History = {\n date: Date\n market: string\n openPosition: number\n unit: number\n value: number\n}\nexport type Props = {\n data?: Order[]\n onClose: (order: Order) => void\n onClickMarket: (name: string) => void\n}\n\nconst dateTimePattern = 'dd/MM/yyyy hh:mm:ss'\n\nconst BodyCell = styled(TableCell)`\n border-bottom: none;\n`\n\nexport const TradeHistory = ({ data, onClose, onClickMarket }: Props): JSX.Element => {\n\n\n const closePositionIds = data?.filter((o) => o.closePositionOrderId !== '')?.map((o) => o.closePositionOrderId)\n\n const openPositions = data?.filter((o) => o.closePositionOrderId === '' && o.status === 'filled')\n\n const orders = openPositions?.filter((o) => !closePositionIds?.includes(o.id))\n\n return \n \n \n \n \n \n Open Trade \n \n \n \n\n \n \n \n \n \n Date\n Market\n Entry Price\n Unit\n Value\n \n \n \n \n {orders &&\n orders.map((item, index) =>\n \n )\n }\n \n
\n
\n}\n\ntype ListItemProps = {\n data: Order\n onClose: (order: Order) => void\n onClickMarket: (name: string) => void\n}\nconst ListItem = ({ data, onClose, onClickMarket }: ListItemProps): JSX.Element => {\n const { createdAt, marketName, fromTokenAmount, toTokenAmount, toToken, fromToken } = data\n const price = toTokenAmount ? fromTokenAmount / toTokenAmount : 0\n\n\n const [value, setValue] = useState(0)\n\n useEffect(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n marketCalculator({ fromToken: toToken, toToken: fromToken, fromTokenAmount: toTokenAmount || 0 })\n .then(value => {\n console.log(value)\n setValue(value.toTokenAmount)\n })\n }, [])\n\n return < TableRow\n >\n {/* date */}\n < BodyCell > {format(new Date(createdAt), dateTimePattern)}\n {/* market */}\n < BodyCell >\n \n\n \n {/* entry price / avarage price */}\n < BodyCell align=\"right\" > \n \n \n {/* unit */}\n < BodyCell align=\"right\" > \n \n \n {/* value */}\n < BodyCell align=\"right\" > \n \n \n {/* action */}\n < BodyCell >\n \n \n \n\n}","import React from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\n\nimport { placeOrder } from '../../state/api-actions'\nimport { TradeHistory } from '../../components/TradeHistory'\nimport { PlaceOrderInput } from '../../state/api-actions'\nimport { RootState } from '../../state/store'\nimport { Order } from '../../state/types'\nimport { setCurrentMarket } from '../../state/slices/markets'\n\nexport const TradeHistoryContainer = (): JSX.Element | null => {\n const dispatch = useDispatch()\n const role = useSelector((state: RootState) => state.investor.role)\n const markets = useSelector((state: RootState) => state.market.markets)\n const ownFundAddr = useSelector((state: RootState) => state.investor.currentInvestor?.assets?.ownFunds?.[0])\n const ownFundOrders = useSelector((state: RootState) =>\n state.funds.topFunds.find(f => f.fundAddress === ownFundAddr)?.orders)\n\n if (!ownFundAddr) return null\n\n const onCloseOrder = (order: Order) => {\n const market = markets.find(e => e.name === order.marketName)\n\n if (!market) return\n\n const input: PlaceOrderInput = {\n marketName: order.marketName,\n side: order.side == 'buy' ? 'sell' : 'buy',\n fromToken: order.toToken,\n fromTokenAmount: order.toTokenAmount ?? 0,\n toToken: order.fromToken,\n toTokenAmount: order.toTokenAmount ?? 0 / market.price,\n closePositionOrderId: order.id,\n }\n\n dispatch(placeOrder({ input, role }))\n }\n\n const onClickMarket = (market: string) => {\n const selected = markets.find(e => e.name === market)\n if (selected) {\n dispatch(setCurrentMarket(selected))\n }\n }\n\n\n return \n}\n","import React from 'react'\nimport { Grid, Box } from '@mui/material'\n\nimport { TradingGraphContainer } from '../../containers/TradingGraphContainer'\nimport { OpenPositionContainer } from '../../containers/OpenPositionContainer'\nimport { TradeHistoryContainer } from '../../containers/TradeHistoryContainer'\n\n\nexport const Trade = (): JSX.Element => {\n return \n \n \n \n \n \n \n \n \n \n \n}\n","import React from 'react'\nimport { Box, Stack, Step, StepLabel, Stepper, Typography } from '@mui/material'\n\ntype Props = {\n step: number\n}\nexport const CreateFundHeader = ({ step }: Props): JSX.Element => {\n return \n Create your Fund\n \n With CAMP you can create and manage more than 1 fund at a time\n \n \n \n \n {''}\n \n \n {''}\n \n \n {''}\n \n \n \n \n}\n","import { Button } from '@mui/material'\nimport { styled } from '@mui/system'\nimport React from 'react'\nimport AddCircleOutlinedIcon from '@mui/icons-material/AddCircleOutlined'\n\ntype Props = {\n onClick: () => void\n}\n\nconst CreateFundBtn = styled(Button)({\n height: 120,\n color: '#ffffff',\n borderColor: '#ffffff',\n borderStyle: 'dashed',\n flexDirection: 'column',\n})\nexport const CreateFundButton = ({ onClick }: Props): JSX.Element => {\n return (\n \n Create Fund\n \n \n )\n}\n","import { alpha, Box, Button, FormControl, Grid, InputAdornment, InputBase, InputLabel, \n Slider, Stack, styled, TextField } \nfrom '@mui/material'\nimport React, { useState } from 'react'\n\nexport type Props = {\n onContinue: (p: { fundName: string, perfFee: number }) => void\n onBack: () => void\n}\n\nexport type OnContinueParameters = Parameters[0]\n\nexport const CreateFundForm = ({\n onContinue,\n onBack,\n}: Props): JSX.Element => {\n const [fundName, setFundName] = useState('')\n const [perfFee, setPerfFee] = useState(0)\n const minPerfFee = 0\n const maxPerfFee = 50\n\n const handleFundName = (event: React.ChangeEvent) => {\n setFundName(event.target.value)\n }\n\n const handlePerfFee = (event: React.ChangeEvent) => {\n const chosen = Number.parseFloat(event.target.value)\n setPerfFee(!isNaN(chosen) ? Math.min(chosen, 50) : minPerfFee)\n }\n\n const handlePerfFeeSlider = (_event: Event, newValue: number | number[]) => {\n setPerfFee(newValue as number)\n }\n\n const CreateFundBackButton = styled(Button)({\n backgroundColor: '#39434C',\n color: '#ffffff',\n '&:hover': {\n boxShadow: `${alpha('#39434C', 0.25)} 0 0 0 0.2rem`,\n backgroundColor: '#39434C',\n }\n })\n\n const CreateFundConntinueButton = styled(Button)({\n color: '#ffffff'\n})\n\n\n return \n \n \n Fund Name\n \n \n \n \n Performance Fee\n \n \n \n \n \n \n \n %,\n }} />\n \n \n \n \n onBack()}>Back\n onContinue({ fundName, perfFee })} disabled={!fundName}>Continue\n \n \n}\n","import React from 'react'\nimport { Button, Stack, styled, Typography } from '@mui/material'\n\nconst CreateFundSummaryBox = styled(Stack)({\n border: 'solid 1px',\n padding: '20px',\n borderRadius: '5px',\n color: '#F07645',\n background: 'rgba(0, 0, 0, 0.24)',\n\n '& .MuiTypography-root':{\n color: '#F07645',\n },\n '& .MuiButton-root':{\n color: '#ffffff'\n }\n})\n\n\nexport const CreateFundSummary = (): JSX.Element => {\n return \n Congratulations !\n \n Your fund has been created. Click the button below to continue.\n \n \n \n}\n","import React, { useCallback, useState } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Stack } from '@mui/material'\n\nimport { CreateFundHeader } from '../../components/CreateFundHeader'\nimport { CreateFundButton } from '../../components/CreateFundButton'\nimport { CreateFundForm, OnContinueParameters } from '../../components/CreateFundForm'\nimport { CreateFundSummary } from '../../components/CreateFundSummary'\nimport { createFund } from '../../state/api-actions'\n\ntype Prop = {\n onCreate: () => void\n}\n\nexport const CreateFundContainer = (prop: Prop): JSX.Element => {\n const dispatch = useDispatch()\n const [step, setStep] = useState(0)\n \n const step1BackHandle = useCallback(() => setStep(0), [])\n const step1ContinueHandle = useCallback(({ fundName, perfFee }: OnContinueParameters) => {\n dispatch(createFund({\n profile: { name: fundName, picUri: '' },\n performanceFeePercent: perfFee,\n tags: ['#prototype', '#testfund'],\n }))\n setStep(2)\n }, [])\n\n return \n \n { step === 0 ? (\n {setStep(1), prop.onCreate()}} />\n ) : null }\n { step === 1 ? (\n \n ) : null }\n { step === 2 ? (\n \n ) : null }\n \n}\n","import React from 'react'\nimport { ToggleButtonGroup, ToggleButton, Typography } from '@mui/material'\nimport { styled } from '@mui/material/styles'\n\nconst ToggleButtonGroupStyled = styled(ToggleButtonGroup)`\n background-color: rgba(255, 255, 255, 0.14);\n border-radius: 10px;\n`\n\nconst ToggleButtonStyled = styled(ToggleButton)`\n background-color: transparent !important;\n border-width: 0px;\n width: 50px;\n padding: 0px;\n`\n\nconst TypographySelectedStyled = styled(Typography)`\n background-color: #01203D;\n border-radius: 5px;\n width: 45px;\n height: 28px;\n line-height: 28px;\n align-items: center;\n font-size: 14px;\n`\n\nconst TypographyStyled = styled(Typography)`\n align-items: center;\n line-height: inherit;\n font-size: 14px;\n`\n\ntype Input = {\n setTimeframe: (tf: string) => void\n}\nexport const TimeSelection = ({ setTimeframe }: Input): JSX.Element => {\n const [time, setTime] = React.useState('24h')\n\n const handleChange = (_event: React.MouseEvent, newTime: string) => {\n if (newTime) {\n setTime(newTime)\n setTimeframe(newTime)\n }\n }\n return \n \n {time === '24h'\n ? (24h)\n : (24h)\n }\n \n \n {time === '7d'\n ? (7d)\n : (7d)\n }\n \n \n {time === '30d'\n ? (30d)\n : (30d)\n }\n \n \n {time === '90d'\n ? (90d)\n : (90d)\n }\n \n \n}\n\n","import React from 'react'\nimport { Stack, Typography } from '@mui/material'\nimport { AreaChart, XAxis, YAxis, CartesianGrid, Area, Tooltip, ResponsiveContainer } from 'recharts'\nimport { styled } from '@mui/material/styles'\n\nimport { TimeSelection } from './TimeSelection'\n\nconst StackStyled = styled(Stack)`\n background-color: #01203D;\n border-radius: 10px;\n box-shadow: 0px 4px 4px rgba(255, 255, 255, 0.03);\n`\n\nexport type DataPoint = {\n xLabel: string,\n value: number\n}\ntype Input = {\n data: DataPoint[]\n setTimeframe: (tf: string) => void\n}\n\nexport const FundDashboardChart = ({ data, setTimeframe }: Input): JSX.Element => {\n return \n \n PROFIT/LOSS\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n `${value}%`}\n labelFormatter={() => 'Equity'}\n />\n \n \n \n \n}\n","const HOUR_IN_MS = 60 * 60 * 1000\nconst DAY_IN_MS = 24 * HOUR_IN_MS\nconst MONTH_IN_MS = 30 * DAY_IN_MS\nconst getRand = () => (Math.random() - 0.5) * 100\nconst getMonthDayShortName = (date: Date) => date.toLocaleString('default', { month: 'short', day: '2-digit' })\nconst getDayHourShortName = (date: Date) => date.toLocaleString('default', {\n month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit',\n})\n\nexport const hour24data = [\n new Date(Date.now() - 24 * HOUR_IN_MS),\n new Date(Date.now() - 22 * HOUR_IN_MS),\n new Date(Date.now() - 20 * HOUR_IN_MS),\n new Date(Date.now() - 18 * HOUR_IN_MS),\n new Date(Date.now() - 16 * HOUR_IN_MS),\n new Date(Date.now() - 14 * HOUR_IN_MS),\n new Date(Date.now() - 12 * HOUR_IN_MS),\n new Date(Date.now() - 10 * HOUR_IN_MS),\n new Date(Date.now() - 8 * HOUR_IN_MS),\n new Date(Date.now() - 6 * HOUR_IN_MS),\n new Date(Date.now() - 4 * HOUR_IN_MS),\n new Date(Date.now() - 2 * HOUR_IN_MS),\n new Date(),\n].map(d => ({ \"xLabel\": getDayHourShortName(d), \"value\": getRand() }))\nexport const day7data = [\n new Date(Date.now() - 6 * DAY_IN_MS),\n new Date(Date.now() - 5 * DAY_IN_MS),\n new Date(Date.now() - 4 * DAY_IN_MS),\n new Date(Date.now() - 3 * DAY_IN_MS),\n new Date(Date.now() - 2 * DAY_IN_MS),\n new Date(Date.now() - 1 * DAY_IN_MS),\n new Date(),\n].map(d => ({ \"xLabel\": getMonthDayShortName(d), \"value\": getRand() }))\nexport const day30data = [\n new Date(Date.now() - 30 * DAY_IN_MS),\n new Date(Date.now() - 27 * DAY_IN_MS),\n new Date(Date.now() - 24 * DAY_IN_MS),\n new Date(Date.now() - 21 * DAY_IN_MS),\n new Date(Date.now() - 18 * DAY_IN_MS),\n new Date(Date.now() - 15 * DAY_IN_MS),\n new Date(Date.now() - 12 * DAY_IN_MS),\n new Date(Date.now() - 9 * DAY_IN_MS),\n new Date(Date.now() - 6 * DAY_IN_MS),\n new Date(Date.now() - 3 * DAY_IN_MS),\n new Date(),\n].map(d => ({ \"xLabel\": getMonthDayShortName(d), \"value\": getRand() }))\nexport const day90data = [\n new Date(Date.now() - 2 * MONTH_IN_MS),\n new Date(Date.now() - 1.5 * MONTH_IN_MS),\n new Date(Date.now() - 1 * MONTH_IN_MS),\n new Date(Date.now() - 0.5 * MONTH_IN_MS),\n new Date(),\n].map(d => ({ \"xLabel\": getMonthDayShortName(d), \"value\": getRand() }))\n","import React, { useEffect, useState } from 'react'\n\nimport { DataPoint, FundDashboardChart } from '../../components/FundDashboardChart'\n\nimport { day30data, day7data, day90data, hour24data } from './fake-data'\n\nexport const FundDashboardChartContainer = (): JSX.Element => {\n const [data, setData] = useState([])\n const [timeframe, setTimeframe] = useState('24h')\n\n useEffect(() => {\n switch(timeframe) {\n case '24h': {\n setData(hour24data)\n } break\n case '7d': {\n setData(day7data)\n } break\n case '30d': {\n setData(day30data)\n } break\n case '90d': {\n setData(day90data)\n } break\n }\n }, [timeframe])\n\n return \n}\n","import React from 'react'\nimport { Stack, Typography } from '@mui/material'\nimport { styled } from '@mui/material/styles'\n\nconst StackStyled = styled(Stack)`\n background-color: #01203D;\n border-radius: 5px;\n box-shadow: 0px 4px 4px rgba(255, 255, 255, 0.03);\n height: 120px;\n`\n\nconst LabelStyled = styled(Typography)`\n color: white;\n opacity: 0.5;\n`\n\nconst ValueStyled = styled(Typography)`\n font-weight: 600;\n`\n\ntype Input = {\n label: string\n children: React.ReactChild\n}\n\nexport const SummaryCard = ({ label, children }: Input): JSX.Element => {\n return \n {label}\n \n {children}\n \n \n}\n","import React from 'react'\nimport NumberFormat from 'react-number-format'\nimport { Stack } from '@mui/material'\n\nimport { SummaryCard } from './SummaryCard'\n\ntype Input = {\n pnlPercent: number\n aum: number\n numberOfInvestors: number\n invested: number\n cashBalance: number\n}\nexport const FundDashboardSummary = ({\n pnlPercent,\n aum,\n numberOfInvestors,\n invested,\n cashBalance,\n}: Input): JSX.Element => {\n return \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n}\n","import React, { useEffect, useState } from 'react'\nimport { useSelector } from 'react-redux'\n\nimport { getUsdtValueFromTokenAssets } from '../../bff/get-usdt-value-from-token-assets'\nimport {\n selectCashBalanceFromOwnFund,\n selectCopyingFund,\n selectCopyingFundTokens,\n selectFollowersFromOwnFund,\n selectInvestedFromCopyingFund,\n selectInvestedFromOwnFund,\n selectOwnFund,\n selectTokensFromOwnFund,\n} from '../../bff/selectors'\nimport { FundDashboardSummary } from '../../components/FundDashboardSummary'\nimport { RootState } from '../../state/store'\n\nexport const FundDashboardSummaryContainer = (): JSX.Element | null => {\n const followers = useSelector((state: RootState) => selectFollowersFromOwnFund(\n selectOwnFund(state.investor.currentInvestor, state.funds.topFunds),\n ))\n const invested = useSelector((state: RootState) =>\n selectInvestedFromOwnFund(\n selectOwnFund(state.investor.currentInvestor, state.funds.topFunds),\n )\n )\n const cInvested = useSelector((state: RootState) =>\n selectInvestedFromCopyingFund(\n selectCopyingFund(state.investor.currentInvestor)\n )\n )\n const cashBalance = useSelector((state: RootState) => selectCashBalanceFromOwnFund(\n selectOwnFund(state.investor.currentInvestor, state.funds.topFunds),\n ))\n const tokens = useSelector((state: RootState) => selectTokensFromOwnFund(\n selectOwnFund(state.investor.currentInvestor, state.funds.topFunds),\n ))\n\n const copyingFundTokens = useSelector((state: RootState) => selectCopyingFundTokens(\n selectCopyingFund(state.investor.currentInvestor),\n ))\n\n const [tokensUsdtValue, setTokensUsdtValue] = useState(0)\n const [cTokensUsdtValue, setCTokensUsdtValue] = useState(0)\n\n useEffect(() => {\n if (tokens) {\n getUsdtValueFromTokenAssets(tokens)\n .then(value => setTokensUsdtValue(value))\n .catch(e => console.error(e))\n }\n }, [tokens])\n\n useEffect(() => {\n if (copyingFundTokens) {\n getUsdtValueFromTokenAssets(copyingFundTokens)\n .then(value => setCTokensUsdtValue(value))\n .catch(e => console.error(e))\n }\n }, [copyingFundTokens])\n\n const aum = tokensUsdtValue + cTokensUsdtValue\n const allInvested = invested + cInvested\n const pnlPercent = ((aum - allInvested) / allInvested) * 100\n\n return \n}\n","import React, { useState, useEffect } from 'react'\nimport { Avatar, TableCell, TableRow, Typography, Box } from '@mui/material'\nimport { styled } from '@mui/material/styles'\nimport NumberFormat from 'react-number-format'\n\nimport { marketCalculator } from '../../bff'\n\nimport { CoinPositionModel } from '.'\n\nconst StlyledCell = styled(TableCell)`\n border-bottom:none;\n height: 73px;\n`\n\nconst StlyledFirstCell = styled(StlyledCell)`\n border-radius: 5px 0px 0px 5px;\n height: 73px;\n\n`\n\nconst StlyledLastCell = styled(StlyledCell)`\n border-radius: 0px 5px 5px 0px;\n height: 73px;\n`\nconst StlyledRow = styled(TableRow)`\n background-color: #14395B;\n height: 73px;\n border-color: none;\n`\n\nexport const CoinPositionItem = (prop: CoinPositionModel): JSX.Element | null => {\n\n if (!prop) return null\n const [value, setValue] = useState(0)\n\n useEffect(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n marketCalculator({ fromToken: prop.toToken, toToken: 'USDT', fromTokenAmount: prop.unit || 0 })\n .then(value => {\n if (value.toTokenAmount > 0)\n setValue(value.toTokenAmount)\n })\n }, [])\n\n return (\n \n \n \n \n {prop.shortName}\n {prop.name}\n \n {prop.unit.toLocaleString()}\n {/* {prop.averageOpen.toLocaleString()}\n {prop.invested.toLocaleString()}\n {prop.profitLossDollar.toLocaleString()}\n {prop.profitLossPercent.toLocaleString()} */}\n \n \n \n {/* \n \n */}\n )\n}\n","import React from 'react'\nimport {\n TableContainer, Table, TableHead, TableRow, TableCell,\n Paper,\n TableBody,\n Typography,\n} from '@mui/material'\n\nimport { Token } from '../../state/types'\n\nimport { CoinPositionItem } from './CoinPositionItem'\n\nexport type CoinPositionModel = {\n icon: string\n shortName: string\n name: string\n unit: number\n averageOpen: number\n invested: number\n profitLossDollar: number\n profitLossPercent: number\n currentValue: number\n toToken: Token['symbol'],\n}\n\nexport type Props = {\n coinPositions: CoinPositionModel[]\n}\n\nexport const PortfolioPositionList = (prop: Props): JSX.Element =>\n \n \n \n \n \n Market\n Unit\n {/* AVG.Open\n Invested\n P/L($)\n P/L(%) */}\n Value($)\n {/* */}\n \n \n \n {prop.coinPositions.map((coinPosition, key) => {\n return (\n )\n })}\n \n
\n \n\n","import React from 'react'\n\nimport { TOKEN } from '../../bff/constants'\nimport { PortfolioPositionList } from '../../components/PortfolioPositionList'\nimport { TokenAsset } from '../../state/types'\n\ntype Prop = {\n assets: {\n tokens: TokenAsset[]\n }\n}\n\nexport const FundDashboardAssetsContainer = (prop: Prop): JSX.Element => {\n const assets = prop.assets.tokens.filter((t) => t.amount > 0).map((t) => ({\n icon: TOKEN[t.symbol].logoURI,\n name: TOKEN[t.symbol].name,\n shortName: t.symbol,\n unit: t.amount,\n averageOpen: 0,\n invested: 0,\n profitLossDollar: 0,\n profitLossPercent: 0,\n currentValue: 0,\n toToken: t.symbol\n\n }))\n\n return \n}\n","import React, { useState, useEffect } from 'react'\nimport { Typography, Grid, Box } from '@mui/material'\nimport DeleteForeverIcon from '@mui/icons-material/DeleteForever'\nimport { useDispatch, useSelector } from 'react-redux'\n\nimport { RootState } from '../../state/store'\nimport { deleteFund, loadManagerDashboard } from '../../state/api-actions'\nimport { CreateFundContainer } from '../../containers/CreateFundContainer'\nimport { FundDashboardChartContainer } from '../../containers/FundDashboardChartContainer'\nimport { FundDashboardSummaryContainer } from '../../containers/FundDashboardSummaryContainer'\nimport { FundDashboardAssetsContainer } from '../../containers/FundDashboardAssetsContainer'\n\nexport const FundDashboard = (): JSX.Element => {\n const [isCreateFund, setIsCreateFund] = useState(false)\n const dispatch = useDispatch()\n const ownFund = useSelector(\n (state: RootState) =>\n state.funds.topFunds.find((f) => f.fundAddress === state.investor?.currentInvestor?.assets?.ownFunds?.[0]))\n\n useEffect(() => {\n dispatch(loadManagerDashboard())\n }, [])\n\n // if (ownFund) {\n // console.log(ownFund)\n // }\n return <>\n {((!ownFund && !isCreateFund) || (!ownFund && isCreateFund) || (ownFund && isCreateFund)) && (\n setIsCreateFund(true)} />\n )}\n\n {!isCreateFund && ownFund && (\n \n {ownFund.profile.name}{'\\'s Dashboard'}\n dispatch(deleteFund(ownFund.fundAddress))} />\n \n\n \n \n \n \n \n \n \n \n Assets\n \n \n \n \n )}\n \n}\n","import React, { useEffect, useState } from 'react'\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n Box,\n Container\n} from '@mui/material'\nimport Confetti from 'react-confetti'\nimport { useSelector, useDispatch } from 'react-redux'\n\nimport { RootState } from '../../state/store'\nimport { showCongratulations as showCongratulationsAction } from '../../state/api-actions'\nimport { setShowDrawer } from '../../state/slices/investor'\n\n\nexport const CongratDialog = (): JSX.Element | null => {\n const dispatch = useDispatch()\n const [open, setOpen] = useState(false)\n //investor\n const visitExplorePage = useSelector((state: RootState) => state.rewardTracking.progress.visitExplorePage)\n const copyFund = useSelector((state: RootState) => state.rewardTracking.progress.copyFund)\n const visitPortfolio = useSelector((state: RootState) => state.rewardTracking.progress.visitPortfolio)\n //manager\n const placeOrder = useSelector((state: RootState) => state.rewardTracking.progress.placeOrder)\n const visitFundDashboard = useSelector((state: RootState) => state.rewardTracking.progress.visitFundDashboard)\n const createFund = useSelector((state: RootState) => state.rewardTracking.progress.createFund)\n //submit\n const showCongratulations = useSelector((state: RootState) => state.rewardTracking.progress.showCongratulations)\n\n\n useEffect(() => {\n\n if (showCongratulations == undefined) return\n const finishedInvestor = visitExplorePage > 0 && copyFund > 0 && visitPortfolio > 0\n const finishedManager = placeOrder > 0 && visitFundDashboard > 0 && createFund > 0\n const shouldShow = showCongratulations == false && finishedInvestor && finishedManager\n if (shouldShow) {\n setOpen(true)\n\n dispatch(showCongratulationsAction(true))\n\n }\n\n }, [visitExplorePage, copyFund, visitPortfolio, placeOrder, visitFundDashboard, createFund, showCongratulations])\n const onClose = () => {\n setOpen(false)\n dispatch(setShowDrawer(true))\n }\n return (\n \n \n \n

Congrats! You rock!

\n
\n \n \n You have completed all the basic tasks in this demo.\n \n \n \n Therefore you will be able to submit your entry to get a chance of getting a basic reward.\n \n \n \n Please note that your journey is not quite end yet, keep exploring and you might be surprised\n what reward you would stump upon!\n \n \n \n
\n )\n}\n","import { v4 as uuid } from 'uuid'\n\nimport { Order, Token } from '../state/types'\n\nimport { getState, save } from './mock-state'\nimport { copyOrder } from './copy-order'\nimport { selectUsdtBalance } from './selectors'\nimport { TOKEN_LIST } from './constants'\n\nimport { marketCalculator } from '.'\n\nconst getRandomToken = (): Token['symbol'] => {\n const randIndex = Math.floor(Math.random() * TOKEN_LIST.length)\n return TOKEN_LIST[randIndex]\n}\n\nconst INTERVAL = 60000\nexport const startAutoManageFunds = (): void => {\n setInterval(async () => {\n const { userInvestor, funds } = getState()\n const validFunds = funds\n .filter(f => f.followers.includes(userInvestor.walletAddress))\n .filter(f => f.fundAddress !== userInvestor.assets.ownFunds?.[0])\n for (const fund of validFunds) {\n // random amount to place an order\n const newOrderUsdtAmount = Math.max(Math.random() * 10000, 5000)\n // checking if a fund has enough money\n // then place the order for random token\n const fundUsdtBalance = selectUsdtBalance(fund.assets.tokens)\n if (newOrderUsdtAmount <= fundUsdtBalance) {\n const randToken = getRandomToken()\n const newOrder: Order<'USDT', typeof randToken> = {\n id: uuid(),\n type: 'market',\n marketName: `${randToken}/USDT`,\n side: 'buy',\n fromToken: 'USDT',\n fromTokenAmount: newOrderUsdtAmount,\n toToken: randToken,\n status: 'open',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n fund.orders.push(newOrder)\n\n await copyOrder(fund, userInvestor, newOrder)\n }\n\n // sell any orders that has 5% profit\n const buyOrders = fund.orders\n .filter(o => o.status === 'filled')\n .filter(o => !o.closePositionOrderId)\n\n for (const order of buyOrders) {\n if (!order.toTokenAmount) return\n const { toTokenAmount: tokenUsdtValue } = await marketCalculator({\n fromToken: order.toToken,\n toToken: 'USDT',\n fromTokenAmount: order.toTokenAmount,\n })\n const pnl = tokenUsdtValue - order.fromTokenAmount\n const pnlPercent = (pnl / order.fromTokenAmount) * 100\n\n if (pnlPercent > 5) { // profit 5%\n const sellOrder: Order = {\n id: uuid(),\n type: 'market',\n marketName: `${order.toToken}/USDT`,\n side: 'sell',\n fromToken: order.toToken,\n fromTokenAmount: order.toTokenAmount ?? 0,\n toToken: 'USDT',\n status: 'open',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n order.closePositionOrderId = sellOrder.id\n fund.orders.push(sellOrder)\n\n // sell the copied order too\n const copyingFund = userInvestor.assets.copyingFunds.find(f => f.fundAddress === fund.fundAddress)\n if (!copyingFund) return\n\n const copiedOrder = copyingFund.orders.find(o => o.copiedFormOrderId === order.id)\n if (!copiedOrder) return\n\n const sellCopiedOrder = {\n id: uuid(),\n type: 'market',\n marketName: `${copiedOrder.toToken}/USDT`,\n side: 'sell',\n fromToken: copiedOrder.toToken,\n fromTokenAmount: copiedOrder.toTokenAmount ?? 0,\n toToken: 'USDT',\n status: 'open',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n copiedFormOrderId: sellOrder.id,\n copiedFromFundAddress: fund.fundAddress,\n } as const\n\n copyingFund.orders.push(sellCopiedOrder)\n }\n }\n }\n\n save()\n }, INTERVAL)\n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport CssBaseline from '@mui/material/CssBaseline'\nimport { useLocation } from 'react-router-dom'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { Routes, Route, Navigate } from 'react-router-dom'\nimport { Alert, Snackbar, ThemeProvider } from '@mui/material'\n\nimport { HeaderContainer } from './containers/HeaderContainer'\nimport { Explore } from './views/Explore'\nimport { Swap } from './views/Swap'\nimport { Port } from './views/Port'\nimport { RootState } from './state/store'\nimport { loadTopFunds, loadUserInvestor, loadRewardData } from './state/api-actions'\nimport { markAsShown } from './state/slices/notification'\nimport { dark } from './theme/dark'\nimport { light } from './theme/light'\nimport { CampCssBaseline } from './theme/CampCssBaseline'\nimport { Trade } from './views/Trade'\nimport { FundDashboard } from './views/FundDashboard'\nimport { startAutoFill } from './bff/auto-fill'\nimport { CongratDialog } from './components/CongratDialog'\nimport { startAutoManageFunds } from './bff/auto-manage-funds'\n\nexport const App = (): JSX.Element => {\n const dispatch = useDispatch()\n\n const { pathname } = useLocation()\n const currPath = (pathname.split('/')?.[1] ?? 'explore')\n\n const { notifications } = useSelector((state: RootState) => state.notification)\n const isInvestorLoading = useSelector((state: RootState) => !state.investor.currentInvestor)\n const hasOwnFund = useSelector((state: RootState) =>\n !!state.investor.currentInvestor?.assets?.ownFunds\n && state.investor.currentInvestor.assets.ownFunds.length > 0\n )\n\n const role = useSelector((state: RootState) => state.investor.role)\n const notiMessage = notifications.find((n) => !n.wasShown)\n const handleClose = useCallback(() => {\n if (notiMessage) {\n dispatch(markAsShown(notiMessage))\n }\n }, [notiMessage])\n const [ready, setReady] = useState(false)\n\n useEffect(() => {\n dispatch(loadUserInvestor())\n dispatch(loadTopFunds())\n //load tracking reward\n dispatch(loadRewardData())\n startAutoFill()\n startAutoManageFunds()\n }, [])\n\n useEffect(() => {\n setReady(true)\n }, [role])\n\n\n if (notiMessage?.level === 'info') {\n dispatch(markAsShown(notiMessage))\n }\n\n return \n \n \n \n \n {ready &&\n \n } />\n : }\n />\n : }\n />\n : }\n />\n : \n } />\n \n : \n : \n }\n />\n \n }\n\n\n {notiMessage?.level !== 'info' ? (\n \n \n {notiMessage?.text ?? ''}\n \n \n ) : undefined}\n \n}\n","import { createSlice } from '@reduxjs/toolkit'\n\nimport {\n loadTopFunds,\n createFund,\n deleteFund,\n exitFund,\n investFund,\n placeOrder,\n} from '../api-actions'\nimport { Fund } from '../types'\n\ntype TopFundsState = { topFunds: Fund[] }\nconst initialState: TopFundsState = { topFunds: [] }\n\nconst slice = createSlice({\n name: 'funds',\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n builder.addCase(loadTopFunds.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.topFunds = action.payload.data\n }\n })\n builder.addCase(placeOrder.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.topFunds = action.payload.data.funds\n }\n })\n builder.addCase(investFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.topFunds = action.payload.data.funds\n }\n })\n builder.addCase(exitFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.topFunds = action.payload.data.funds\n }\n })\n builder.addCase(createFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.topFunds = action.payload.data.funds\n }\n })\n builder.addCase(deleteFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.topFunds = action.payload.data.funds\n }\n })\n },\n})\n\nexport const { reducer: fundsReducer } = slice\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nimport {\n loadExplorePage,\n createFund,\n investFund,\n placeOrder,\n loadManagerDashboard,\n loadPortfolio,\n loadRewardData,\n submitReward,\n} from '../api-actions'\nimport { RewardProgress, RewardSubmitForm } from '../types'\nimport { save } from '../../bff/mock-state'\n\n// Basic tasks:\n// 1. Investor - Explore Explore page\n// 2. Investor - Copy fund\n// 3. Investor - Explore portfolio\n// 4. Manager - Create fund\n// 5. Manager - Start trade\n// 6. Manager - Explore dashboard\n\ntype RewardTrackingState = { progress: RewardProgress }\nconst initialState: RewardTrackingState = {\n progress: {\n visitExplorePage: 0,\n copyFund: 0,\n visitPortfolio: 0,\n createFund: 0,\n placeOrder: 0,\n visitFundDashboard: 0,\n formSubmitted: false,\n telegramId: '',\n twitterAccount: '',\n walletAddress: '',\n showCongratulations: false,\n }\n}\n\nconst slice = createSlice({\n name: 'rewardTracking',\n initialState,\n reducers: {\n copyFund: (state: RewardTrackingState, action: PayloadAction) => {\n if (action.payload > 0) {\n state.progress.copyFund += action.payload\n }\n },\n submitRewardForm: (state: RewardTrackingState, action: PayloadAction) => {\n state.progress.telegramId = action.payload.telegramId\n state.progress.twitterAccount = action.payload.twitterAccount\n state.progress.walletAddress = action.payload.walletAddress\n // TODO: send analytics\n state.progress.formSubmitted = true\n save()\n },\n showCongratulation: (state: RewardTrackingState, action: PayloadAction) => {\n state.progress.showCongratulations = action.payload\n },\n },\n extraReducers: (builder) => {\n // 1. Investor - Explore Explore page\n builder.addCase(loadExplorePage.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.progress.visitExplorePage += 1\n return\n }\n })\n // 2. Investor - Copy fund\n builder.addCase(investFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n const investedFund = action.payload.data?.funds?.find(f => f.fundAddress === action.meta.arg.fundAddress)\n if (investedFund) {\n state.progress.copyFund += 1\n }\n return\n }\n })\n // 3. Investor - Explore portfolio\n builder.addCase(loadPortfolio.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.progress.visitPortfolio += 1\n return\n }\n })\n // 4. Manager - Create fund\n builder.addCase(createFund.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.progress.createFund += 1\n return\n }\n })\n // 5. Manager - Start trade\n builder.addCase(placeOrder.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.progress.placeOrder += 1\n return\n }\n })\n // 6. Manager - Explore dashboard\n builder.addCase(loadManagerDashboard.fulfilled, (state, action) => {\n if (action.payload.data) {\n state.progress.visitFundDashboard += 1\n return\n }\n })\n builder.addCase(loadRewardData.fulfilled, (state, action) => {\n if (action.payload.data) {\n console.log('load reward data')\n if (action.payload.data.rewardTracking) {\n state.progress = action.payload.data.rewardTracking\n }\n\n return\n }\n })\n builder.addCase(submitReward.fulfilled, (state, action) => {\n if (action.payload.data) {\n console.log('submit reward')\n state.progress = action.payload.data.rewardTracking\n return\n }\n })\n\n },\n})\nexport const { showCongratulation, submitRewardForm } = slice.actions\nexport const { reducer: rewardTrackingReducer } = slice\n","import amplitude from 'amplitude-js'\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nimport {\n investFund,\n exitFund,\n createFund,\n deleteFund,\n placeOrder,\n loadUserInvestor,\n loadManagerDashboard,\n loadExplorePage,\n loadPortfolio,\n resetState,\n} from '../api-actions'\n\nconst events = {\n investFund: 'invest fund',\n exitFund: 'exit fund',\n createFund: 'create fund',\n deleteFund: 'delete fund',\n placeOrder: 'place order',\n submitBasicReward: 'submit basic reward',\n visitFundDashboard: 'visit fund dashboard',\n visitExplorePage: 'visit explore page',\n visitPortfolio: 'visit portfolio',\n resetState: 'reset state',\n}\n\ntype AnalyticsState = {\n isBasicRewardSubmitted: boolean\n source: string\n userId?: string\n}\ntype BasicRewardArgs = {\n walletAddress: string\n twitterId: string\n telegramId: string\n}\n\nconst sendFbPixelEvent = (eventName: 'Lead' | 'CompleteRegistration') => {\n // eslint-disable-next-line\n (window as any).fbq('track', eventName)\n}\n\nconst amplitudeKey = '5b311bb401471f5264ada45fc338772f'\nconst client = amplitude.getInstance()\nclient.init(amplitudeKey)\nclient.setVersionName('demoV2')\n\nconst sourceParam = new URLSearchParams(window.location.search).get('source')\nconst initialState: AnalyticsState = {\n isBasicRewardSubmitted: false,\n source: sourceParam || 'organic',\n}\n\nconst slice = createSlice({\n name: 'analytics',\n initialState,\n reducers: {\n submitBasicReward: (state: AnalyticsState, action: PayloadAction) => {\n if (!state.isBasicRewardSubmitted) {\n const data = action.payload\n state.isBasicRewardSubmitted = true\n client.logEvent(events.submitBasicReward, {\n ...data,\n source: state.source,\n })\n sendFbPixelEvent('CompleteRegistration')\n }\n },\n },\n extraReducers: (builder) => {\n builder.addCase(loadUserInvestor.fulfilled, (state, action) => {\n try {\n if (!state.userId || state.userId !== action.payload.data?.userId) {\n client.setUserId(action.payload.data?.userId ?? null)\n state.userId = action.payload.data?.userId\n }\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(investFund.fulfilled, (state) => {\n try {\n client.logEvent(events.investFund, { source: state.source })\n sendFbPixelEvent('Lead')\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(exitFund.fulfilled, (state) => {\n try {\n client.logEvent(events.exitFund, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(createFund.fulfilled, (state) => {\n try {\n client.logEvent(events.createFund, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(deleteFund.fulfilled, (state) => {\n try {\n client.logEvent(events.deleteFund, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(placeOrder.fulfilled, (state) => {\n try {\n client.logEvent(events.placeOrder, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(loadManagerDashboard.fulfilled, (state) => {\n try {\n client.logEvent(events.visitFundDashboard, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(loadPortfolio.fulfilled, (state) => {\n try {\n client.logEvent(events.visitPortfolio, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(loadExplorePage.fulfilled, (state) => {\n try {\n client.logEvent(events.visitExplorePage, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(resetState.fulfilled, (state) => {\n try {\n client.logEvent(events.resetState, { source: state.source })\n } catch (e) {\n console.log(e)\n }\n })\n },\n})\n\n\nexport const { submitBasicReward } = slice.actions\nexport const { reducer: analyticsReducer } = slice\n","import { ReportHandler } from 'web-vitals'\n\nexport const reportWebVitals = (onPerfEntry?: ReportHandler): void => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n","import { configureStore } from '@reduxjs/toolkit'\n\nimport { investorReducer } from './slices/investor'\nimport { fundsReducer } from './slices/funds'\nimport { notificationReducer } from './slices/notification'\nimport { marketReducer } from './slices/markets'\nimport { rewardTrackingReducer } from './slices/reward-tracking'\nimport { analyticsReducer } from './slices/analytics'\n\nexport const store = configureStore({\n reducer: {\n investor: investorReducer,\n funds: fundsReducer,\n notification: notificationReducer,\n market: marketReducer,\n rewardTracking: rewardTrackingReducer,\n analytics: analyticsReducer,\n },\n})\n\nexport type RootState = ReturnType\nexport type AppDispatch = typeof store.dispatch\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport { BrowserRouter } from 'react-router-dom'\nimport { Provider } from 'react-redux'\n\nimport { App } from './App'\nimport { store } from './state/store'\nimport { reportWebVitals } from './reportWebVitals'\n\nReactDOM.render(\n \n \n \n \n \n ,\n document.getElementById('root'),\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}