{"version":3,"sources":["components/Header/index.tsx","assets/bkk_election_logo.png","services/web3.ts","assets/candidates/01-460x460.jpeg","assets/indiana_jones.png","assets/candidates/02-460x460.jpeg","assets/candidates/03-460x460.jpeg","assets/candidates/04-460x460.jpeg","assets/candidates/05-460x460.jpeg","assets/candidates/06-460x460.jpeg","assets/candidates/07-460x460.jpeg","assets/candidates/08-460x460.jpeg","assets/candidates/09-460x460.jpeg","assets/candidates/10-460x460.jpeg","assets/candidates/11-460x460.jpeg","assets/candidates/12-460x460.jpeg","assets/candidates/13-460x460.jpeg","assets/candidates/14-460x460.jpeg","assets/candidates/15-460x460.jpeg","assets/candidates/16-460x460.jpeg","assets/candidates/17-460x460.jpeg","assets/candidates/18-460x460.jpeg","assets/candidates/19-460x460.jpeg","assets/candidates/20-460x460.jpeg","assets/candidates/21-460x460.jpeg","assets/candidates/22-460x460.jpeg","assets/candidates/23-460x460.jpeg","assets/candidates/24-460x460.jpeg","assets/candidates/25-460x460.jpeg","assets/candidates/26-460x460.jpeg","assets/candidates/27-460x460.jpeg","assets/candidates/28-460x460.jpeg","assets/candidates/29-460x460.jpeg","assets/candidates/30-460x460.jpeg","assets/candidates/31-460x460.jpeg","state/slices/funds.ts","bff/generate-random-addr.ts","bff/generate-followers.ts","bff/random-floor-2-digits.ts","bff/constants.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","components/FundManagerCard/index.tsx","containers/ExploreContainer/index.tsx","components/InvestExitModal/index.tsx","containers/InvestExitModalContainer/index.tsx","assets/camp_demo_logo.png","components/PrototypeWarningModal/index.tsx","containers/PrototypeWarningModalContainer/index.tsx","views/Explore/index.tsx","state/slices/notification.ts","theme/light.tsx","theme/CampCssBaseline.tsx","components/CongratDialog/index.tsx","components/CandidateCard/index.tsx","views/Result/index.tsx","App.tsx","state/slices/markets.ts","state/slices/reward-tracking.ts","state/slices/analytics.ts","reportWebVitals.ts","state/store.ts","index.tsx"],"names":["Wrapper","styled","Box","Header","role","onRoleChange","currPath","onResetState","balance","canTrade","React","useState","open","setOpen","alignItems","display","flexDirection","justifyContent","style","backgroundColor","fontFamily","src","height","width","Link","href","className","Typography","variant","fontSize","pl","Button","onClick","Modal","onClose","sx","position","top","left","transform","bgcolor","border","boxShadow","p","id","component","mt","contractAddress","abi","contract","targetChain","chainName","chainId","toString","nativeCurrency","name","decimals","symbol","rpcUrls","blockExplorerUrls","web3","Web3","givenProvider","getCandidate","no","a","ethereum","window","provider","ethers","providers","Web3Provider","signer","getSigner","electionContract","Contract","console","log","candidates","BigNumber","from","point","Error","getCandidates","eth","methods","call","points","vote","txNo","connectAndSwitchNetwork","error","undefined","account","request","method","networkVersion","params","code","isVoted","checkRights","available","number","image","pic01","thumbnail","votes","enable","party","pic02","pic03","pic04","pic05","pic06","pic07","pic08","pic09","pic10","pic11","pic12","pic13","pic14","pic15","pic16","pic17","pic18","pic19","pic20","pic21","pic22","pic23","pic24","pic25","pic26","pic27","pic28","pic29","pic30","pic31","fundsReducer","createSlice","initialState","topFunds","reducers","extraReducers","builder","addCase","loadTopFunds","fulfilled","state","action","payload","data","placeOrder","funds","investFund","statusCode","exitFund","createFund","deleteFund","reducer","generateRandomAddr","digit","Array","fill","map","Math","floor","random","length","join","generateFollowers","max","amount","ceil","randomFloor2digits","TOKEN","address","logoURI","fromTokenDecimals","Object","keys","filter","t","cachePricesKey","cachePrices","JSON","parse","localStorage","getItem","setInterval","setItem","stringify","marketCalculator","fromToken","toToken","fromTokenAmount","fromTokenAddress","toTokenAddress","toTokenAmount","fromTokenDecimalAmount","round","amountString","toLocaleString","useGrouping","includes","cache","find","c","Date","now","updatedAt","getTime","price","fetch","res","json","updatingCache","toISOString","push","currentState","mockStateKey","mockWalletAddress","getState","init","userId","userInvestor","uuid","walletAddress","orders","assets","tokens","ownFunds","copyingFunds","profile","picUri","generateCandidates","rewardTracking","copyFund","formSubmitted","showCongratulations","telegramId","twitterAccount","visitExplorePage","visitFundDashboard","visitPortfolio","f","i","generateCandidate","candidate","fundAddress","performanceFeePercent","campScore","return","risk","riskAdjustedReturn","consistency","followers","invested","tags","createdAt","generateMarkets","Promise","all","BNB","BTCB","ETH","DOT","ADA","USDT","fromTokenSymbol","toTokenSymbol","type","save","savedItem","load","addTokenToTokenAssets","token","removeTokenFromTokenAssets","adjustedAmount","getUsdtValueFromTokenAssets","reduce","value","usdt","selectUsdtBalance","acc","copyOrder","fund","investor","newOrder","fundTotalUsdtValue","fundOrderRatio","copyingFund","investorTotalAssetValue","copyingAmount","copiedFromFundAddress","copiedFormOrderId","stupidClone","obj","loadUserInvestorBff","loadTopFundsBff","placeOrderBff","order","ownFundAddr","ownFund","investFundBff","usdtAmount","errMsg","reason","exitFundBff","userTokens","createFundBff","fundInput","newFund","deleteFundBff","loadMarketsBff","markets","loadManagerDashboardBff","loadExplorePageBff","loadPortfolioBff","loadRewardDataBff","submitRewardBff","form","showCongratulationsBff","isShow","loadUserInvestor","createAsyncThunk","response","input","status","loadMarkets","loadManagerDashboard","loadVoteResult","loadExplorePage","loadPortfolio","loadRewardData","resetState","submitReward","slice","currentInvestor","setRole","actions","investorReducer","HeaderContainer","dispatch","useDispatch","useLocation","pathname","split","useSelector","investorBalance","hasOwnFund","managerBalance","useEffect","roleChangeHandler","useCallback","newRole","resetStateHandler","FundManagerCard","onClickInvest","voteStatus","onClickExit","setLoading","isFavorite","buttonMsg","loadCandidate","FundCard","shouldForwardProp","prop","color","boxSizing","margin","background","borderRadius","content","padding","textAlign","fontStyle","fontWeight","lineHeight","zIndex","right","bottom","favorite","marginTop","paddingLeft","paddingRight","paddingBottom","Card","raised","CardMedia","alt","CardContent","noWrap","CardActions","fullWidth","disabled","ExploreContainer","setVoteStatus","voteSuccess","wallet","headerMsg","then","voted","catch","e","finalVoteStatus","Grid","container","md","sm","columns","xs","IconButton","size","mb","paddingX","item","spacing","InvestExitModal","mode","onSubmit","totalInvestedUsdt","totalUsdtBalance","userInvestAmount","setUserInvestAmount","Dialog","maxWidth","PaperProps","BackdropProps","DialogContent","DialogContentText","minWidth","Avatar","pt","DialogActions","borderColor","InvestExitModalContainer","setTotalInvestedUsdt","submitHandler","PrototypeWarningModal","consent","setCosent","logo","textTransform","PrototypeWarningModalContainer","Explore","selectedFund","setSelectedFund","investOrExit","setInvestOrExit","onInvestExitClose","notifications","markAsShown","noti","n","wasShown","text","level","message","investedFund","meta","arg","notificationReducer","light","createTheme","CampCssBaseline","GlobalStyles","styles","body","CongratDialog","progress","showCongratulationsAction","DialogTitle","CandidateCard","Result","sortedCandidates","setSortedCandidates","totalVotes","setTotalVotes","result","sortedCandidatess","Number","sort","c1","c2","tVotes","TableContainer","Paper","Table","TableHead","TableRow","TableCell","align","TableBody","i2","Skeleton","animation","App","notification","notiMessage","handleClose","setReady","ThemeProvider","theme","CssBaseline","path","element","Snackbar","autoHideDuration","anchorOrigin","vertical","horizontal","Alert","severity","currentMarket","setCurrentMarket","marketReducer","submitRewardForm","showCongratulation","rewardTrackingReducer","events","client","amplitude","getInstance","setVersionName","onPerfEntry","isBasicRewardSubmitted","submitBasicReward","setUserId","logEvent","analyticsReducer","store","configureStore","market","analytics","ReactDOM","render","document","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB"],"mappings":"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","file":"static/js/main.300c67a2.chunk.js","sourcesContent":["import React from 'react'\nimport { Box, Button, Link, Typography } from '@mui/material'\nimport { styled } from '@mui/material/styles'\nimport Modal from '@mui/material/Modal'\n\nimport logo from '../../assets/bkk_election_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:10px;\n padding-right:10px;\n backdrop-filter: blur(4px)\n`\nexport type Props = {\n currPath: 'candidate' | 'result'\n role: Role\n balance: number | undefined\n canTrade: boolean\n onRoleChange: (newRole: Role) => void\n onResetState: () => void\n}\nexport const Header = ({ role, onRoleChange, currPath, balance, canTrade, onResetState }: Props):\n JSX.Element => {\n\n const style = {\n position: 'absolute' as 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: 400,\n bgcolor: 'background.paper',\n border: '2px solid #000',\n boxShadow: 24,\n p: 4,\n }\n\n const [open, setOpen] = React.useState(false)\n const handleOpen = () => {\n onResetState()\n setOpen(true)\n }\n const handleClose = () => setOpen(false)\n\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 0x691A9d8d0f0Fe1101bD8150f9511fE45504433fC\n \n \n \n \n\n}\n\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASIAAABTCAMAAAAMafpUAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAKhQTFRFAAAA/////////////////////////////////////////////////////////////////////////////////////////////////////////////////2ct/2wy/2wz/2wz/2wx/2wz/3Ar/20v/2wz/20z/20z/20x/20x/20x/2wz/2sy/20x/2wx/2wz/2wz/24w/20x/20z/20z/2wy/20x/2wyxvc5cwAAADh0Uk5TAD9vf58QT18gQP/vv69ggMCPz7CQMN+g0HBQ4PAQPzBgv5AgX5/f/69/gMBAj+/Pb1BwoNDg8LCj2iI9AAAIr0lEQVR4nO2aCXPaOhCAnbh+xUCwy335mUCABmjTHCT//5/Vt3a1K2PZhDoz7Exnio6V9pPWu5JiGFe5ylWuchVZbm5N0/wW/Lu9scprsf5LtHxvnG9qmdhNTlrtO/M7mXNHbmaLOrnKUdS4okvDbONB724TCx2qjRRlYzd+dJGS72IELT2aiOLRTAlST27RVyNqDk4gsr9xYw6jhdEwzb5jdFwMUSC3qG1Lru7mIOryNSmiH6ohW1qmmayOtnU5RHCfcE3FNqN1DlsTI7K6tH0qGqZZbbk0kdbgcoigBqK92ezkIEpdDRe6pwjpIKJOlkrLuhyinmjK2DXKQ9RVIlKb1tRBxKwZHvwyiIQvWUzlMA9R4mq4LEREIiOSwqY1ctU4Z0Nk2QjS2LYnLq9iyk0ki1u2PVbUwgFGdlg0hG1mjuPMYEHQoGFPYMnIbgRFUxAtgmlaxgi2mfclNS2qZ0L09EI9BQRqifwAMZqmzdCMslGFGpfWtuUBon2FNtEsnKIFjaObO+rVAH4e+beFAmy0kohRh+iJ2gxAN5G86SKaEL2GvPaovRJRQlCaE/qmxR98OCKPCFo2IX2SeaCiLouoI/TMRbDRRkTRh3PMSkZz2SAlolaDQYRa2IQIiwhaluxrlMi6tFeTM+VW/JoPjMJChoJ652krsUJTCCPzQxZR7GrIWMmOYohAhjhOLUO7mkNkU0Qgox/rnAnJUPBjkbmrWLQGjAoit2QRRU6BteGYUggRsMxNLcPxjENE1mMKMs2R1qmZDAU+zHOLtJqj2CbOIDyi0NXwrBUBE4sqF3EVLThEI7mkhetKIure3NyANRP+KsZy8QJm1w/CdPitCl1N/KiMqGXxLThEbo6eIT9sEURYxuKL1odmQgZZWBCm96XgK/5fGZFwbJx/6iKC2UoFRDMYFEWktnEwybasMN3B2xuk5Y4hn2N0EWW7Fn/StBG1Sn+LVJMHZlp4ei0GEU4zwYnMIcPZBv2K2XmI0iWpiKh42piDqDm8E5TEtp7JA6fOCBFZ6HOE54UPKtqI0qWriqilc4ernk2znUIS26LVbreRr6TLARHxBzrVt0gPUVtetFD0EWkFNVmtBdc5+R6RC0d5dhIieomb1VRFlGSr1SJaKFWy6wEssUmJLBaHiHc1Cq8QojE6fA0LIuqTkl4f/mpXQIRKojs1NEVZphwi/lLIIbqKIOpZ+AwfBewS2fVIWrjTV0XFEDWx+Yz0WURsH/6M1neha7vugDnGwt9xwEbUCp7R8Ee+eP5Ih0IjDVDBiPYZ8ogajKuVPuljIJGaUid9vI0K34aQofAVrI3iU5KVosjdYBFx3kltK3pfhLdRQ1bP3Bfx9zp4GxXNH4le/Bmx4ekj9V+UG3Z4RIyrOWTa0THYghcbPCK8jcK9zHxX0P0If+uIexXKHxsmeq0bmqYpvQJaHRMMbZrB0CZ+au6adlAkGrXNGBq9f4+nhLZgOCIyLTTMRE+17UC/tG5mUISWqfVDUjOner6ZeLnDB2fzdAZ58gVkJm8Gl0k2Hf7NlXmBCEWRVyai6jeXi0q9gJBeZ3gk6ldAZMivIsnGZl8KUlEhckhRXioyVi6RNHh1RHOrCiI55VR/pYSoTJOSUXUKn0xbpUfaRtURTYk9OoiYpY/EUhunRCSVRtRUqOfKN32yjaoimg3okmshwoEIRBClk8yVpnHBiH+zdtV/GUK2UTVEvfhoUQkRPRMk0mA/SLOO4u+LiMWJKpvuR3EVqNCDRi6LaO66ziQNh5UQ4SCL8hBLehqf9Sbqv1KLOsxJUci6P0ZKxLOVSg/aRsUPav9I7I4TS6fKVC070TL9jL91vMpVvpp4/wfinVGhf2Z9ubK4V8vSWJIyMcucjvd+1mz1sN5sE9n8fPRP9w1kITdYAjqP95m+9YOnnE9Wo1JUWHZbteyNPSnLOh5yOm4PKaC1XLP5tTrRN5Cd3GCfjvqwwRW/1yvFfH6mXXhFdUH0i61cr8oi8p+Yxn8U83n+Aoi8e0UtIXCyQWzZ4jfb+qfHzmfj1R8Rt+SRlESk7LXma5e1R7RU1pZD5PF7KJQXfj6HmiPKqS+H6DWnAx8CYlcjinRldYBDvxwCeRP6fFKbdfQOcFJvYceX7GfQDH6IjovD4sgQgF2229ds6J2sPMgVVsjS58PuHfxehvOBurLigJ1Q9XrwlSCK7qOIQLZ19lwtEDjnaDKgJbToPQzMnjApQ4TXfpcNvWOUL+WCZ1Dw2zOKuNquFKDPQkQsAk5bCtEGt8Qtogh/2tXqhWgvV0JEq10sBNEiLj9Q5cjPKKIljyh2tZoi2sqVEJFQISFSK4duxSDaKxBt/doiQtM9ByIUeSmirQrR07kR/QlO0CcA8lY8SUdvBpF/SGXFt8tFhLIsDURh27MiSgbTRyRXowCck4wURoQyNAaRD3XtcU09ESGll0CEktUd3HNPV0QcIu8IW18RMYhwADwrorf9fq+uzUH0HnT0Fd3+BSLj47MQRRAWj4ksiiOKKKzSjo8rJqJlah+BnsKIkMmnItoOnXc+AdHXz4vCes7VaoUIn8vPgGiRj+hIEHGudhlEe/DGkYPIOMqVFRH5+YheKaIVdbXLIOL+zyF6lSsrIjLeSUtoPL53jOvp/VG9EEHH2ETjiNuMUoig34R7Bp/9VwwiemdaL0TI09ae4YEHo1KIUAB4CAjB14MP3CLRRFytHCLdu+sMwqm76xzF6UypClVNCOmNtEbj4S68q9UMkac2qRyinAE/SHWiSJpDzRAZPpe8oZnqIVJP9Y3eXCeK/C1XWhtExrOKUUlEqmeid5922bHm1Q6R4fO+9p6+tusiYsJ4WOcxXTIYb2xpbRAF2o+k6rjLbie1ERk+SZmPL2yXDAaTctYLUXBw+IDutl/C6wB9REEgfwX74v1joVAmYCzZ0pqJf4iffp7lM15J8Q4vsb5yT6tXucpVrnKVryx/AQqdzPFz5g3iAAAAAElFTkSuQmCC\"","/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ethers } from 'ethers'\nimport Web3 from 'web3'\nimport { AbiItem } from 'web3-utils'\n\nimport contract from '../contracts/Election.json'\nimport { Election } from '../contracts/typechain/Election'\n\nconst contractAddress = \"0xC115b216a52E034e2CEf64488b94B94071cF3f74\"\nconst abi = contract.abi\n\n// const chainID = 97\n// const targetChain = {\n// chainName: 'BSC - Testnet',\n// chainId: `0x${chainID.toString(16)}`,\n// nativeCurrency: { name: 'BNB', decimals: 18, symbol: 'BNB' },\n// rpcUrls: ['https://data-seed-prebsc-1-s1.binance.org:8545'],\n// blockExplorerUrls: ['https://testnet.bscscan.com'],\n// }\nconst chainID = 56\nconst targetChain = {\n chainName: 'BSC - Mainnet',\n chainId: `0x${chainID.toString(16)}`,\n nativeCurrency: { name: 'BNB', decimals: 18, symbol: 'BNB' },\n rpcUrls: ['https://bsc-dataseed1.binance.org'],\n blockExplorerUrls: ['https://testnet.bscscan.com/'],\n}\n\nconst web3 = new Web3(Web3.givenProvider || targetChain.rpcUrls[0])\n\nexport const checkWalletIsConnected = async () => {\n const ethereum = (window as any).ethereum\n if (!ethereum) {\n console.log('Make sure you have metamask installed and logged in')\n return\n } else {\n console.log('Wallet is connected')\n }\n\n const accounts = (await ethereum.request({ method: 'eth_accounts' }) ?? [])\n\n if (accounts.length !== 0) {\n console.log(\"Found an account address: \", accounts[0])\n return accounts[0]\n } else {\n console.log(\"No account found\")\n }\n}\n\nexport const connectWalletHandler = async () => {\n const ethereum = (window as any).ethereum\n if (!ethereum) {\n // alert(\"Please install MetaMask\")\n return\n }\n\n try {\n const account = await ethereum.request({ method: 'eth_requestAccounts' })\n console.log(\"Found an account address: \", account[0])\n } catch (err) {\n console.log(err)\n }\n}\n\nexport const getCandidate = async (no: number):Promise => {\n no = no - 1\n\n const ethereum = (window as any).ethereum\n if (ethereum) {\n const provider = new ethers.providers.Web3Provider(ethereum)\n const signer = provider.getSigner()\n const electionContract = new ethers.Contract(contractAddress, abi, signer) as Election\n\n try {\n console.log('Initialize getCandidate')\n const point = await electionContract.candidates(ethers.BigNumber.from(no))\n return point\n } catch (err) {\n console.log(err)\n throw err\n }\n } else {\n throw new Error(\"Please install MetaMask\")\n }\n}\n\nexport const getCandidates = async ():Promise => {\n const ethereum = web3.eth\n\n if (ethereum) {\n //const provider = new ethers.providers.Web3Provider(ethereum)\n // ethereum.Contract(abi,contractAddress)\n\n // (new web3.eth.Contract(abi as any, contractAddress)) as Election\n\n // const signer = provider.getSigner()\n console.log(ethereum)\n const electionContract = (new ethereum.Contract(abi as AbiItem[] , contractAddress))\n\n try {\n console.log('Initialize getCandidate')\n const points = await electionContract.methods.getCandidates().call()\n console.log(\"points\", points)\n return points\n } catch (err) {\n console.log(err)\n throw err\n }\n } else {\n throw new Error(\"Please install MetaMask\")\n }\n\n\n}\n\nexport const vote = async (no: number) => {\n const ethereum = (window as any).ethereum\n if (ethereum) {\n const provider = new ethers.providers.Web3Provider(ethereum)\n const signer = provider.getSigner()\n const electionContract = new ethers.Contract(contractAddress, abi, signer) as Election\n\n try {\n console.log('Initialize vote')\n const txNo = await electionContract.vote(ethers.BigNumber.from(no))\n return txNo\n } catch (err) {\n console.log('vote error', err)\n throw err\n }\n }\n}\n\nexport const start = async () => {\n const id = 1\n const ethereum = (window as any).ethereum\n if (ethereum) {\n const provider = new ethers.providers.Web3Provider(ethereum)\n const signer = provider.getSigner()\n const electionContract = new ethers.Contract(contractAddress, abi, signer) as Election\n\n try {\n console.log('Initialize start')\n const txNo = await electionContract.start()\n return txNo\n } catch (err) {\n console.log(err)\n throw err\n }\n }\n}\n\nexport const stop = async () => {\n const id = 1\n const ethereum = (window as any).ethereum\n if (ethereum) {\n const provider = new ethers.providers.Web3Provider(ethereum)\n const signer = provider.getSigner()\n const electionContract = new ethers.Contract(contractAddress, abi, signer) as Election\n\n try {\n console.log('Initialize stop')\n const txNo = await electionContract.stop()\n return txNo\n } catch (err) {\n console.log(err)\n throw err\n }\n }\n}\n\nexport const checkRights = async () => {\n const ethereum = (window as any).ethereum\n if (ethereum) {\n const provider = new ethers.providers.Web3Provider(ethereum)\n const signer = provider.getSigner()\n const electionContract = new ethers.Contract(contractAddress, abi, signer) as Election\n\n try {\n console.log('Initialize checkRights')\n const hasRights = await electionContract.checkRights()\n return hasRights\n } catch (err) {\n console.log(err)\n throw err\n }\n } else {\n return false\n }\n}\n\nexport const getTotalVotes = async () => {\n const ethereum = (window as any).ethereum\n\n if (ethereum) {\n const provider = new ethers.providers.Web3Provider(ethereum)\n const signer = provider.getSigner()\n const electionContract = new ethers.Contract(contractAddress, abi, signer) as Election\n\n try {\n console.log('Initialize getTotalVotes')\n const totalVotes = await electionContract.totalVotes()\n console.log(\"totalVotes\", totalVotes)\n return totalVotes\n } catch (err) {\n console.log(err)\n throw err\n }\n }\n}\n\nexport const switchNetwork = async () => {\n const ethereum = (window as any).ethereum\n\n if (ethereum && ethereum.networkVersion !== chainID) {\n try {\n await ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: targetChain.chainId }]\n })\n } catch (err) {\n\n if ((err as any).code === 4902 || (err as any).code === -32603) {\n ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [\n {\n chainName: 'Polygon Mainnet',\n chainId: targetChain.chainId,\n nativeCurrency: { name: 'MATIC', decimals: 18, symbol: 'MATIC' },\n rpcUrls: ['https://polygon-rpc.com/']\n }\n ]\n })\n }\n\n console.log(err)\n throw err\n }\n }\n}\n\nexport const connectAndSwitchNetwork = async () => {\n const ethereum = (window as any).ethereum\n if (!ethereum) {\n throw new Error('Please connect to MetaMask')\n return\n }\n\n let error = undefined\n let account = undefined\n\n try {\n account = await ethereum.request({ method: 'eth_requestAccounts' })\n console.log(\"Found an account address: \", account[0])\n } catch (err) {\n error = err\n }\n\n if (error) {\n throw error\n }\n\n if (ethereum.networkVersion !== chainID) {\n try {\n await ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: targetChain.chainId }]\n })\n } catch (err) {\n\n if ((err as any).code === 4902 || (err as any).code === -32603) {\n ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [\n targetChain\n ]\n })\n }\n\n console.log(err)\n throw err\n }\n }\n\n return account[0]\n}\n\nexport const isVoted = async () => {\n const ethereum = (window as any).ethereum\n\n if (ethereum) {\n const provider = new ethers.providers.Web3Provider(ethereum)\n const signer = provider.getSigner()\n const electionContract = new ethers.Contract(contractAddress, abi, signer) as Election\n\n try {\n console.log('Initialize checkRights')\n const available = await electionContract.checkRights()\n console.log(\"checkRights\", available)\n return !available\n } catch (err) {\n console.log(err)\n throw err\n }\n }\n}\n","export default __webpack_public_path__ + \"static/media/01-460x460.d5d731b6.jpeg\";","export default __webpack_public_path__ + \"static/media/indiana_jones.e3e05c2d.png\";","export default __webpack_public_path__ + \"static/media/02-460x460.a01f665f.jpeg\";","export default __webpack_public_path__ + \"static/media/03-460x460.86a4bf57.jpeg\";","export default __webpack_public_path__ + \"static/media/04-460x460.295cc56d.jpeg\";","export default __webpack_public_path__ + \"static/media/05-460x460.be6438ad.jpeg\";","export default __webpack_public_path__ + \"static/media/06-460x460.ca2b1f2b.jpeg\";","export default __webpack_public_path__ + \"static/media/07-460x460.594909b4.jpeg\";","export default __webpack_public_path__ + \"static/media/08-460x460.f25431a5.jpeg\";","export default __webpack_public_path__ + \"static/media/09-460x460.7f3a1557.jpeg\";","export default __webpack_public_path__ + \"static/media/10-460x460.cd32bac0.jpeg\";","export default __webpack_public_path__ + \"static/media/11-460x460.f58cdefa.jpeg\";","export default __webpack_public_path__ + \"static/media/12-460x460.1d287bf9.jpeg\";","export default __webpack_public_path__ + \"static/media/13-460x460.c92b33b4.jpeg\";","export default __webpack_public_path__ + \"static/media/14-460x460.a7ae69e6.jpeg\";","export default __webpack_public_path__ + \"static/media/15-460x460.3dff24a4.jpeg\";","export default __webpack_public_path__ + \"static/media/16-460x460.a72ce342.jpeg\";","export default __webpack_public_path__ + \"static/media/17-460x460.d9f2b051.jpeg\";","export default __webpack_public_path__ + \"static/media/18-460x460.57f904c7.jpeg\";","export default __webpack_public_path__ + \"static/media/19-460x460.b6ee0217.jpeg\";","export default __webpack_public_path__ + \"static/media/20-460x460.3a20281c.jpeg\";","export default __webpack_public_path__ + \"static/media/21-460x460.a7512430.jpeg\";","export default __webpack_public_path__ + \"static/media/22-460x460.0000705c.jpeg\";","export default __webpack_public_path__ + \"static/media/23-460x460.f2a22f80.jpeg\";","export default __webpack_public_path__ + \"static/media/24-460x460.de9da8e0.jpeg\";","export default __webpack_public_path__ + \"static/media/25-460x460.7ef11d56.jpeg\";","export default __webpack_public_path__ + \"static/media/26-460x460.c149188a.jpeg\";","export default __webpack_public_path__ + \"static/media/27-460x460.bd202a88.jpeg\";","export default __webpack_public_path__ + \"static/media/28-460x460.1b2ff4a0.jpeg\";","export default __webpack_public_path__ + \"static/media/29-460x460.229b1df6.jpeg\";","export default __webpack_public_path__ + \"static/media/30-460x460.9bed3f75.jpeg\";","export default __webpack_public_path__ + \"static/media/31-460x460.6ff5ff69.jpeg\";","import { createSlice } from '@reduxjs/toolkit'\n\nimport pic01 from '../../assets/candidates/01-460x460.jpeg'\nimport pic02 from '../../assets/candidates/02-460x460.jpeg'\nimport pic03 from '../../assets/candidates/03-460x460.jpeg'\nimport pic04 from '../../assets/candidates/04-460x460.jpeg'\nimport pic05 from '../../assets/candidates/05-460x460.jpeg'\nimport pic06 from '../../assets/candidates/06-460x460.jpeg'\nimport pic07 from '../../assets/candidates/07-460x460.jpeg'\nimport pic08 from '../../assets/candidates/08-460x460.jpeg'\nimport pic09 from '../../assets/candidates/09-460x460.jpeg'\nimport pic10 from '../../assets/candidates/10-460x460.jpeg'\nimport pic11 from '../../assets/candidates/11-460x460.jpeg'\nimport pic12 from '../../assets/candidates/12-460x460.jpeg'\nimport pic13 from '../../assets/candidates/13-460x460.jpeg'\nimport pic14 from '../../assets/candidates/14-460x460.jpeg'\nimport pic15 from '../../assets/candidates/15-460x460.jpeg'\nimport pic16 from '../../assets/candidates/16-460x460.jpeg'\nimport pic17 from '../../assets/candidates/17-460x460.jpeg'\nimport pic18 from '../../assets/candidates/18-460x460.jpeg'\nimport pic19 from '../../assets/candidates/19-460x460.jpeg'\nimport pic20 from '../../assets/candidates/20-460x460.jpeg'\nimport pic21 from '../../assets/candidates/21-460x460.jpeg'\nimport pic22 from '../../assets/candidates/22-460x460.jpeg'\nimport pic23 from '../../assets/candidates/23-460x460.jpeg'\nimport pic24 from '../../assets/candidates/24-460x460.jpeg'\nimport pic25 from '../../assets/candidates/25-460x460.jpeg'\nimport pic26 from '../../assets/candidates/26-460x460.jpeg'\nimport pic27 from '../../assets/candidates/27-460x460.jpeg'\nimport pic28 from '../../assets/candidates/28-460x460.jpeg'\nimport pic29 from '../../assets/candidates/29-460x460.jpeg'\nimport pic30 from '../../assets/candidates/30-460x460.jpeg'\nimport pic31 from '../../assets/candidates/31-460x460.jpeg'\nimport {\n loadTopFunds,\n createFund,\n deleteFund,\n exitFund,\n investFund,\n placeOrder,\n} from '../api-actions'\nimport { Candidate, Fund } from '../types'\n\ntype TopFundsState = { topFunds: Fund[], isVoted: boolean }\nconst initialState: TopFundsState = { topFunds: [], isVoted: false }\n\nexport const candidates: Candidate[] = [\n {\n number: 1,\n name: 'นายวิโรจน์ ลักขณาอดิศร',\n image: pic01 as string,\n thumbnail: pic01 as string,\n votes: 0,\n enable: true,\n party: 'พรรคก้าวไกล',\n },\n {\n number: 2,\n name: 'พ.ท.หญิง ฐิฏา รังสิตพล มานิตกุล',\n image: pic02 as string,\n thumbnail: pic02 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 3,\n name: 'นายสกลธี ภัททิยกุล',\n image: pic03 as string,\n thumbnail: pic03 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 4,\n name: 'นายสุชัชวีร์ สุวรรณสวัสดิ์',\n image: pic04 as string,\n thumbnail: pic04 as string,\n votes: 0,\n enable: true,\n party: 'พรรคประชาธิปัตย์',\n },\n {\n number: 5,\n name: 'นายวีรชัย เหล่าเรืองวัฒนะ',\n image: pic05 as string,\n thumbnail: pic05 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 6,\n name: 'พล.ต.อ. อัศวิน ขวัญเมือง',\n image: pic06 as string,\n thumbnail: pic06 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 7,\n name: 'นางสาวรสนา โตสิตระกูล',\n image: pic07 as string,\n thumbnail: pic07 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 8,\n name: 'นายชัชชาติ สิทธิพันธุ์',\n image: pic08 as string,\n thumbnail: pic08 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 9,\n name: 'นางสาววัชรี วรรณศรี',\n image: pic09 as string,\n thumbnail: pic09 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 10,\n name: 'นายศุภชัย ตันติคมน์',\n image: pic10 as string,\n thumbnail: pic10 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 11,\n name: 'น.ต. ศิธา ทิวารี',\n image: pic11 as string,\n thumbnail: pic11 as string,\n votes: 0,\n enable: true,\n party: 'พรรคไทยสร้างไทย',\n },\n {\n number: 12,\n name: 'นายประยูร ครองยศ',\n image: pic12 as string,\n thumbnail: pic12 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 13,\n name: 'นายพิศาล กิตติเยาวมาลย์',\n image: pic13 as string,\n thumbnail: pic13 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 14,\n name: 'นายธเนตร วงษา',\n image: pic14 as string,\n thumbnail: pic14 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 15,\n name: 'พล.อ.ต. ทูตปรีชา เลิศสันทัดวาที',\n image: pic15 as string,\n thumbnail: pic15 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 16,\n name: 'นางสาวศศิกานต์ วัฒนะจันทร์',\n image: pic16 as string,\n thumbnail: pic16 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 17,\n name: 'นายอุเทน ชาติภิญโญ',\n image: pic17 as string,\n thumbnail: pic17 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 18,\n name: 'นางสาวสุมนา พันธุ์ไพโรจน์',\n image: pic18 as string,\n thumbnail: pic18 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 19,\n name: 'นายไกรเดช บุนนาค',\n image: pic19 as string,\n thumbnail: pic19 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 20,\n name: 'นางอมรพรรณ อุ่นสุวรรณ',\n image: pic20 as string,\n thumbnail: pic20 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 21,\n name: 'นายนิพัทธ์พนธ์ สุวรรณชนะ',\n image: pic21 as string,\n thumbnail: pic21 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 22,\n name: 'นายวรัญชัย โชคชนะ',\n image: pic22 as string,\n thumbnail: pic22 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 23,\n name: 'นายเฉลิมพล อุตรัตน์',\n image: pic23 as string,\n thumbnail: pic23 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 24,\n name: 'นายโฆสิต สุวินิจจิต',\n image: pic24 as string,\n thumbnail: pic24 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 25,\n name: 'นายประพัฒน์ บรรจงศิริเจริญ',\n image: pic25 as string,\n thumbnail: pic25 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 26,\n name: 'พล.ต.ท. มณฑล เงินวัฒนะ',\n image: pic26 as string,\n thumbnail: pic26 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 27,\n name: 'นายภูมิพัฒน์ อัศวภูภินทร์',\n image: pic27 as string,\n thumbnail: pic27 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 28,\n name: 'นายสราวุธ เบญจกุล',\n image: pic28 as string,\n thumbnail: pic28 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n },\n {\n number: 29,\n name: 'นายกฤตชัย พยอมแย้ม',\n image: pic29 as string,\n thumbnail: pic29 as string,\n votes: 0,\n enable: true,\n party: 'พรรคประชากรไทย',\n },\n {\n number: 30,\n name: 'นายพงศา ชูแนม',\n image: pic30 as string,\n thumbnail: pic30 as string,\n votes: 0,\n enable: true,\n party: 'พรรคกรีน',\n },\n {\n number: 31,\n name: 'นายวิทยา จังกอบพัฒนา',\n image: pic31 as string,\n thumbnail: pic31 as string,\n votes: 0,\n enable: true,\n party: 'ผู้สมัครอิสระ',\n }\n]\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 state.isVoted = action.payload.statusCode === 200\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","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 } 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","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 { Candidate, Fund, Market } from '../state/types'\nimport sampleAvatar from '../assets/indiana_jones.png'\nimport { candidates } from '../state/slices/funds'\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): MockState => {\n return {\n userInvestor: {\n userId: userId ?? uuid(),\n walletAddress: mockWalletAddress,\n orders: [],\n assets: {\n tokens: [{ symbol: 'USDT', amount: 1 }],\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: generateCandidates(candidates),//generateFunds(3),\n rewardTracking: {\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 generateCandidates = (candidates: Candidate[]): Fund[] => {\n return new Array(candidates.length).fill(0).map((f, i) => generateCandidate(candidates[i]))\n}\n\nconst generateCandidate = (candidate: Candidate): Fund => {\n console.log(`Generate fund no: ${candidate.number}`)\n return {\n fundAddress: generateRandomAddr(),\n performanceFeePercent: randomFloor2digits(20) + 1,\n campScore: {\n return: randomFloor2digits(10000),\n risk: 0,\n riskAdjustedReturn: 0,\n consistency: candidate.number,\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: [candidate.party], // TODO: random tags later\n profile: {\n name: candidate.name, // TODO: random name\n picUri: candidate.image,\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\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) : 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'\nimport { connectAndSwitchNetwork, vote } from '../services/web3'\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 const res: BffResponse = {\n statusCode: 500,\n }\n try {\n const acc = await connectAndSwitchNetwork()\n userInvestor.userId = acc\n res.data = userInvestor\n res.statusCode = 200\n } catch (err) {\n res.statusCode = 500\n res.error = err\n }\n\n return res\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\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 try {\n await vote(fund.campScore.consistency)\n } catch(err) {\n\n const errMsg = (err as any).reason ? (err as any).reason : 'ยกเลิกการ vote'\n\n return {\n statusCode: 500,\n error: new Error(errMsg),\n }\n }\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 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 loadVoteResult = createAsyncThunk(\n 'apis/voteResult',\n async () => {\n return 'loadVoteResult'\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 return 'reset'\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\ntype InvestorState = { currentInvestor: Investor | null, role: Role }\nconst initialState: InvestorState = { currentInvestor: null, role: 'investor' }\n\nconst slice = createSlice({\n name: 'currentInvestor',\n initialState,\n reducers: {\n setRole: (state: InvestorState, action: PayloadAction) => {\n state.role = 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 } = 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","import React from 'react'\nimport { useState ,useEffect } 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 CardMedia,\n Skeleton,\n} from '@mui/material'\n\n\nimport { Fund } from '../../state/types'\nimport { getCandidate } from '../../services/web3'\n\n\n\n\nexport type Props = {\n fund: Fund,\n voteStatus?: string,\n onClickInvest: (f: Fund) => void\n onClickExit: (f: Fund) => void\n}\n\nexport const FundManagerCard = ({ fund, onClickInvest, onClickExit, voteStatus }: Props): JSX.Element => {\n const [loading,setLoading] = useState(true)\n const [isFavorite, setFavorite] = useState(false)\n\n let buttonMsg = 'ลงคะแนน'\n\n switch (voteStatus) {\n case \"ready\":\n buttonMsg = 'ลงคะแนน'\n break\n case \"voted\":\n buttonMsg = 'ลงคะแนนแล้ว'\n break\n default:\n buttonMsg = 'กำลังเชื่อมต่อ...'\n break\n }\n \n\n\n useEffect(() => {\n void loadCandidate()\n }, [])\n\n const loadCandidate = async ()=>{\n \n const result = await getCandidate(1)\n setLoading(false)\n \n }\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: 'Kanit',\n fontStyle: 'normal',\n fontSize: '30px',\n fontWeight: 'bold',\n lineHeight: '40px',\n },\n '& .camp-score-label': {\n fontFamily: 'Kanit',\n fontStyle: 'normal',\n fontSize: '14px',\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 color: '#291F1E',\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: '15px'\n },\n\n '& .fund-content-row': {\n display: 'block',\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 '& .fund-name, .vote-button': {\n fontFamily: 'Kanit',\n },\n\n '& .fund-name': {\n fontSize: '1.3rem',\n textAlign: 'center',\n },\n\n '& .candidate-tag': {\n textAlign: 'center',\n },\n\n })\n )\n\n return (\n \n \n \n \n {((fund.campScore.consistency))}\n \n \n หมายเลข\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 \n {/* */}\n\n {/* \n {loading?: \n \n {score} คะแนน\n }\n */}\n \n \n \n \n \n )\n}\n","import React, { useEffect, useState } 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'\nimport { isVoted } from '../../services/web3'\n\ntype Input = {\n onClickInvest: (f: Fund) => void\n onClickExit: (f: Fund) => void\n}\nexport const ExploreContainer = ({ onClickInvest, onClickExit }: Input): JSX.Element | null => {\n\n const [voteStatus, setVoteStatus] = useState('not-ready')\n const topFunds = useSelector((state: RootState) => state.funds.topFunds)\n const voteSuccess = useSelector((state: RootState) => state.funds.isVoted)\n const wallet = useSelector((state: RootState) => state.investor.currentInvestor?.userId)\n\n let headerMsg = 'ลงคะแนน'\n\n useEffect(() => {\n isVoted()\n .then(voted => {\n setVoteStatus(voted ? 'voted' : 'ready')\n }).catch(e => console.error(e))\n }, [])\n\n let finalVoteStatus = voteSuccess ? 'voted' : voteStatus\n\n if (wallet && wallet.length > 0) {\n finalVoteStatus = voteSuccess ? 'voted' : voteStatus\n } else {\n finalVoteStatus = 'not-ready'\n }\n\n switch (finalVoteStatus) {\n case \"ready\":\n headerMsg = 'ท่านมี 1 คะแนนสำหรับการโหวต'\n break\n case \"voted\":\n headerMsg = 'ท่านได้ลงคะแนนโหวตแล้ว'\n break\n default:\n headerMsg = 'กำลังเชื่อมต่อ Metamask...'\n break\n }\n\n if (!topFunds) return null\n\n return \n {/* */}\n \n \n ทดลองโหวตผู้ว่าผ่าน Blockchain\n \n \n \n \n \n {/* \n */}\n \n {headerMsg}\n \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 let wasClicked = false\n\n // const ctaEnabled = userInvestAmount > 0 &&\n // (mode === 'invest' ? userInvestAmount <= totalUsdtBalance : userInvestAmount <= totalInvestedUsdt)\n\n\n\n const submitHandler = () => {\n wasClicked = true\n const numberValue = 1\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 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 < DialogContentText>\n \n \n \n {fund?.profile.name}\n หมายเลข: {fund?.campScore.consistency}\n {fund?.tags[0]}\n \n \n \n ท่านต้องการใช้สิทธิ์เพียง 1 เดียวของท่าน\n เพื่อเลือกผู้สมัครรายนี้ใช่หรือไม่?\n \n \n \n \n {mode === '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","export default __webpack_public_path__ + \"static/media/camp_demo_logo.8c75632c.png\";","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 a CAMP application prototype. It only displays the design features of our application.\n The purpose of this prototype is to give our early adopters to test and experience\n how user-friendly our app will become.\n You can also provide feedback to assist us in improving our product. Thank you:)\n \n {\n setCosent(!consent)\n }}>\n I love the prototype\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('camp-mock-state') != null\n if (hasData) return null\n return \n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport { useDispatch, useSelector } 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'\nimport { RootState } from '../../state/store'\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 voteSuccess = useSelector((state: RootState) => state.funds.isVoted)\n\n useEffect(() => {\n if (voteSuccess) {\n setSelectedFund(null)\n }\n }, [voteSuccess])\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 { 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} 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?.userId) {\n const userId = action.payload.data?.userId\n const text = `เชื่อมต่อ blockchain สำเร็จ, เลขกระเป๋าของคุณคือ: ${userId}`\n state.notifications.push({ id: uuid(), text, wasShown: false, level: 'success' })\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: `คุณได้ลงคะแนนให้กับ \"${investedFund.profile.name}\"`,\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 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","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, { useEffect, useState } from 'react'\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n} from '@mui/material'\nimport { useSelector, useDispatch } from 'react-redux'\n\nimport { RootState } from '../../state/store'\nimport { showCongratulations as showCongratulationsAction } from '../../state/api-actions'\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 }\n return (\n \n \n Congrats! You are rock!\n \n \n \n You have completed all the basic tasks in this demo.\n Therefore you will be able to submit your entry to get a chance of getting a basic reward.\n Please note that your journey is not quite end yet, keep exploring and you might be surprised\n what reward you might stump upon!\n \n \n \n )\n}\n","import React from 'react'\nimport { useState ,useEffect } from 'react'\nimport { styled } from '@mui/system'\n// import 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 CardMedia,\n Skeleton,\n} from '@mui/material'\n\n\nimport { Fund } from '../../state/types'\nimport { getCandidate } from '../../services/web3'\n\n\n\n\nexport type Props = {\n fund: Fund,\n onClickInvest: (f: Fund) => void\n onClickExit: (f: Fund) => void\n}\n\nexport const CandidateCard = ({ fund, onClickInvest, onClickExit }: Props): JSX.Element => {\n const [loading,setLoading] = useState(true)\n const [isFavorite, setFavorite] = useState(false)\n \n\n\n useEffect(() => {\n void loadCandidate()\n }, [])\n\n const loadCandidate = async ()=>{\n \n const result = await getCandidate(1)\n setLoading(false)\n \n }\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 fontFamily: 'Kanit',\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: 'Kanit',\n fontStyle: 'normal',\n fontSize: '30px',\n fontWeight: 'bold',\n lineHeight: '40px',\n },\n '& .camp-score-label': {\n fontFamily: 'Kanit',\n fontStyle: 'normal',\n fontSize: '14px',\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 color: '#291F1E',\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: '10px'\n },\n\n '& .fund-content-row': {\n display: 'block',\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 display: 'block',\n },\n\n '& .fund-name, .vote-button': {\n fontFamily: 'Kanit',\n },\n\n '& .fund-name': {\n fontSize: '1.3rem',\n textAlign: 'center',\n },\n\n '& .candidate-vote': {\n fontSize: '1.3rem',\n textAlign: 'center',\n fontFamily: 'Kanit',\n },\n\n })\n )\n\n return (\n \n \n \n \n {((fund.campScore.consistency))}\n \n \n หมายเลข\n \n \n \n \n {/* */}\n \n \n \n \n {fund.profile.name}\n \n \n \n \n {/* */}\n\n {/* \n {loading?: \n \n {score} คะแนน\n }\n */}\n \n \n \n {fund.campScore.risk.toLocaleString('en')} %\n ({fund.campScore.return.toLocaleString('en')} คะแนน)\n \n \n \n )\n}\n","import React, { useState, useEffect } from 'react'\nimport {\n Avatar,\n Box,\n Grid,\n Paper,\n Skeleton,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n} from '@mui/material'\nimport { useSelector, useDispatch } from 'react-redux'\n\nimport { FundManagerCard } from '../../components/FundManagerCard'\nimport { Fund } from '../../state/types'\nimport { RootState } from '../../state/store'\nimport { getCandidates } from '../../services/web3'\nimport { CandidateCard } from '../../components/CandidateCard'\nimport { loadVoteResult } from '../../state/api-actions'\n\nexport const Result = (): JSX.Element | null => {\n const dispatch = useDispatch()\n const [sortedCandidates, setSortedCandidates] = useState([])\n const [totalVotes, setTotalVotes] = useState(0)\n const candidates = useSelector((state: RootState) => state.funds.topFunds)\n\n useEffect(() => {\n dispatch(loadVoteResult())\n }, [])\n\n useEffect(() => {\n void getCandidates().then(result => {\n const sortedCandidatess =\n [...candidates.map((c, i) =>\n ({ ...c, campScore: { ...c.campScore, return: Number(result[i]) } }))]\n .sort((c1, c2) => c2.campScore.return - c1.campScore.return)\n\n let tVotes = 0\n\n for (const c of sortedCandidatess) {\n tVotes += c.campScore.return\n }\n\n for (const c of sortedCandidatess) {\n c.campScore.risk = (c.campScore.return / tVotes) * 100\n c.campScore.risk = Math.round(c.campScore.risk * 100) / 100\n }\n\n setSortedCandidates(sortedCandidatess)\n setTotalVotes(tVotes)\n\n console.log(sortedCandidatess)\n })\n }, [candidates])\n\n\n if (!candidates || candidates.length == 0 || !sortedCandidates || sortedCandidates.length == 0)\n return \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n\n\n\n\n\n return \n

มีผู้มาใช้สิทธิทั้งหมด

\n

{totalVotes} คน

\n

บัตรเสียทั้งหมด 0 ใบ

\n \n \n \n\n \n \n \n \n อันดับ\n \n ชื่อผู้สมัคร\n เปอร์เซ็นต์\n หมายเลข\n คะแนน\n \n \n \n {sortedCandidates.filter((e, i) => i >= 0).map((c, i2) => (\n \n \n {i2 + 1}\n \n \n \n \n \n {c.profile.name}\n \n \n {c.campScore.risk} %\n \n \n {c.campScore.consistency}\n \n \n {c.campScore.return.toLocaleString('en')}\n \n \n ))}\n \n
\n
\n
\n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport CssBaseline from '@mui/material/CssBaseline'\n// import { useLocation } from 'react-router-dom'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { Routes, Route } from 'react-router-dom'\nimport { Alert, Snackbar, ThemeProvider } from '@mui/material'\n\nimport { HeaderContainer } from './containers/HeaderContainer'\nimport { Explore } from './views/Explore'\nimport { RootState } from './state/store'\nimport { loadTopFunds, loadUserInvestor, loadRewardData } from './state/api-actions'\nimport { markAsShown } from './state/slices/notification'\nimport { light } from './theme/light'\nimport { CampCssBaseline } from './theme/CampCssBaseline'\nimport { CongratDialog } from './components/CongratDialog'\nimport { Result } from './views/Result'\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 \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, 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 { 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 loadUserInvestor,\n loadExplorePage,\n loadVoteResult,\n resetState,\n} from '../api-actions'\n\nconst events = {\n investFund: 'vote',\n visitExplorePage: 'visit vote page',\n visitVoteResult: 'visit vote result',\n resetState: 'donate',\n}\n\ntype AnalyticsState = {\n isBasicRewardSubmitted: boolean\n userId?: string\n}\ntype BasicRewardArgs = {\n walletAddress: string\n twitterId: string\n telegramId: string\n}\n\nconst amplitudeKey = '5b311bb401471f5264ada45fc338772f'\nconst client = amplitude.getInstance()\nclient.init(amplitudeKey)\nclient.setVersionName('bkk-vote-2022')\nconst initialState: AnalyticsState = {\n isBasicRewardSubmitted: false,\n}\n\nconst slice = createSlice({\n name: 'analytics',\n initialState,\n reducers: {\n submitBasicReward: (state: AnalyticsState) => {\n if (!state.isBasicRewardSubmitted) {\n state.isBasicRewardSubmitted = true\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, () => {\n try {\n client.logEvent(events.investFund)\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(loadVoteResult.fulfilled, () => {\n try {\n client.logEvent(events.visitVoteResult)\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(loadExplorePage.fulfilled, () => {\n try {\n client.logEvent(events.visitExplorePage)\n } catch (e) {\n console.log(e)\n }\n })\n builder.addCase(resetState.fulfilled, () => {\n try {\n client.logEvent(events.resetState)\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":""}