{"version":3,"sources":["sagas/helpers/inventory/constants.js","services/autoLogin.js","sagas/helpers/inventory/cooldownUtils.jsx","sagas/helpers/play/reactMsgSender_obf.js","sagas/helpers/play/unityBridge.js","generalUtils/utils.js","reducers/GameUiReducer.js","GlobalState/reducers.js","GlobalState/Store.js","constants/hiveNfts.js","constants/envs.js","services/UserService.js","helpers/client.js","constants/links.js","constants/templateIds.js","generalUtils/secure.js","reducers/UserReducer.js","generalUtils/secure/checksums.js","services/monitoring/hacksNotify.js","reducers/PlayReducer.js","reducers/InventoryReducer.js","sagas/helpers/wallet/waxUtils.js","reducers/MarsStorage.js","reducers/AdminPaneReducer.js","generalUtils/hiveData/reader.js","reducers/WalletReducer.js","config/endpoints.js","generalUtils/uiHacks/uiHacks.js","pages/Play/subComponents/utils/requiredNFts/pvpRemoteConfig.js","config/accounts.js","routing/authUtils.js","images/logos/cs-logo.jpg","generalUtils/formatBalance.jsx","images/logos/WaxLogo.png","images/logos/HiveLogo.png","images/logos/EthLogo.png","images/logos/BtcLogo.png","pages/LandingPage/Login/Shared/ChainProps.jsx","pages/LandingPage/Login/Shared/ChainIcon.jsx","images/logos/SklLogo.png","pages/Leaderboard/Prizes/utils/prices/coingecko.js","components/Menu/LeftMenu/NameAndBalance.jsx","config/featureFlags.js","pages/LandingPage/subcomp/Banners/AnonAd.jsx","pages/Play/subComponents/utils/requiredNFts/localTournamentData.js","components/Menu/children/ActiveTourneyMsg.jsx","components/Menu/LeftMenu/storage/subComponents.jsx","constants/currencies.js","components/Menu/LeftMenu/storage/utils.js","components/Menu/LeftMenu/storage/constants.js","config/contractNames.js","pages/Play/subComponents/spaceships/constants.js","generalUtils/constants.js","components/Menu/LeftMenu/storage/init/validations/subscriptions.js","generalUtils/paymentMemo.js","components/Menu/LeftMenu/storage/init/validations/utils.js","components/Menu/LeftMenu/storage/init/validations/resources.js","components/Menu/LeftMenu/storage/init/loadStorage.js","components/Menu/LeftMenu/storage/purchaseSubs.jsx","images/gifs/LoadingSpinner.jsx","components/Menu/LeftMenu/images/ScifiStorage2.gif","components/Menu/LeftMenu/storage/StoragePane.jsx","components/Menu/LeftMenu/SocialLinks.jsx","components/Menu/Menu.jsx","images/icons/exit.png","sagas/helpers/wallet/waxUtils2.js","generalUtils/pvp/poolBalance.js","sagas/helpers/wallet/hiveUtils.js","pages/Wallet/subComponents/SwapUtils/swapCore.js","pages/Play/subComponents/spaceships/travels.js","pages/Wallet/utils.js","pages/Wallet/subComponents/SendWax.jsx","pages/Wallet/subComponents/WaxBalance.jsx","pages/common/InfoIcon.jsx","pages/Wallet/subComponents/LiquidityPools.jsx","pages/Wallet/subComponents/ChainChoice.jsx","constants/genericConstants.jsx","pages/Wallet/subComponents/SwapUtils/sendBoomWithSession.js","pages/Wallet/subComponents/SwapUtils/constants.js","pages/Wallet/subComponents/MinSwapAmounts.jsx","services/monitoring/discordNotifications.js","services/api/warmup.js","pages/Wallet/subComponents/KeychainSwapWidget.jsx","pages/Wallet/subComponents/Swaps.jsx","config/appConfig.js","pages/Wallet/HiveTokensPanes.jsx","pages/Wallet/subComponents/WaxTokensPanes.jsx","pages/Wallet/subComponents/WaxTokensStaking.jsx","sagas/helpers/login/linking.js","sagas/helpers/wallet/btcUtils.js","pages/Inventory/chains/AccountLinking.jsx","pages/Wallet/subComponents/BtcLinkPane.jsx","pages/Wallet/Wallet.jsx","pages/Play/overlays/LevelChoice.jsx","pages/Play/overlays/Resources/resourcesPrices.js","pages/Play/subComponents/spaceships/checkSession.js","pages/Play/subComponents/spaceships/travelPrices.js","pages/Play/overlays/Resources/paymentUtils.js","pages/Play/subComponents/spaceships/ui.jsx","pages/Play/subComponents/utils/requiredNfts.js","pages/Play/subComponents/utils/countChars.js","pages/Play/overlays/Resources/ResourcesPayment.jsx","pages/Play/subComponents/spaceships/freeTravels.jsx","pages/Play/subComponents/spaceships/nextLevRequirements.js","pages/Play/subComponents/spaceships/components/spaceshipsInfo.js","pages/Play/subComponents/spaceships/components/ThreeSpaceships.jsx","pages/Play/subComponents/spaceships/components/SpaceTravelPane.jsx","pages/Play/subComponents/claims/wrapperData/utils.js","pages/Play/PlayerStats.jsx","pages/Play/subComponents/ScholarshipPane.jsx","pages/Play/subComponents/launchPodAndResults/prepLastMatchInfo.jsx","pages/Play/subComponents/utils/time.js","pages/Play/subComponents/launchPodAndResults/PlayTime.jsx","services/notifications/joinTourney.js","pages/Play/subComponents/launchPodAndResults/MatchResults.jsx","pages/Play/subComponents/launchPodAndResults/Penalties.jsx","pages/Play/subComponents/launchPodAndResults/PlayAndMatchOutcome.jsx","pages/Play/subComponents/claims/ClaimDisclaimer.jsx","pages/Play/subComponents/claims/wrapperData/extractors.js","pages/Play/subComponents/claims/wrapperData/claimBoomRequirements.js","pages/Play/subComponents/claims/PendingRewards.jsx","pages/Play/subComponents/claims/buttonsPanes/utils.js","pages/Play/subComponents/claims/buttonsPanes/BoomRewardsActions.jsx","pages/Play/subComponents/claims/buttonsPanes/MarsRewardsActions.jsx","pages/Play/subComponents/claims/buttonsPanes/ProxRewardsAction.jsx","pages/Play/subComponents/claims/claim.js","pages/Play/subComponents/claims/ClaimResult.jsx","pages/Play/subComponents/WhichChains.jsx","pages/Play/RightPaneRewards.jsx","pages/Play/Play.jsx","config/appRemoteStatus.js","pages/LandingPage/utils/bannerAds.js","sagas/helpers/wallet/payAfterTrial/payForNextLevel.js","pages/LandingPage/utils/freeTrial.jsx","_embedAssets/sci-fi-warning.png","generalUtils/browser/browserType.js","pages/LandingPage/subcomp/SuggestBrowser.jsx","images/logos/LogoWrite2.png","pages/LandingPage/subcomp/LogoLanding.jsx","pages/LandingPage/subcomp/Banners/LandingBanner.jsx","pages/LandingPage/Login/Shared/MaintenanceMessage.jsx","generalUtils/browser/urlParams.js","pages/LandingPage/Login/Shared/TermsConditions.jsx","pages/LandingPage/Login/Shared/BitcoinLnInstructions.jsx","pages/LandingPage/Login/Shared/ChainChoicePanel.jsx","pages/LandingPage/Login/Shared/GameModesBtn.jsx","sagas/helpers/login/verifyUser.js","sagas/helpers/inventory/fetchInventory.jsx","sagas/helpers/inventory/extractNfts.js","sagas/helpers/inventory/marketplacePrices.jsx","sagas/helpers/inventory/processInventory.js","generalUtils/hiveData/healthyHeNodes.js","sagas/helpers/inventory/hiveNfts.js","pages/LandingPage/Login/Hive/config.js","pages/LandingPage/Login/Shared/utils/navigation.js","pages/LandingPage/Login/Hive/HiveLoginPanel.jsx","config/accessConfig.jsx","sagas/helpers/login/verifyAccessAllowed.js","pages/LandingPage/Login/Wax/config.js","pages/LandingPage/Login/Wax/WaxLoginPanel.jsx","pages/LandingPage/Login/Bitcoin/BitcoinLoginPanel.jsx","pages/LandingPage/Login/Ethereum/config.js","pages/LandingPage/Login/Ethereum/SkaleChain/SkaleLoginPanel.jsx","pages/LandingPage/Login/Ethereum/EthNetworkChoice.jsx","pages/LandingPage/Login/Ethereum/EthChain/EthLoginPanel.jsx","pages/LandingPage/Login/LoginOptions.jsx","pages/LandingPage/config/config.js","pages/LandingPage/Login/Shared/PlayerMode.jsx","pages/LandingPage/subcomp/P2E/P2EarnPane.jsx","pages/LandingPage/subcomp/F2P/F2PlayPane.jsx","pages/LandingPage/LandingPage.jsx","pages/Leaderboard/Prizes/config.js","pages/Leaderboard/Prizes/utils/prices/alcor.js","pages/Leaderboard/Prizes/utils/prices/hiveEngine.js","pages/Leaderboard/Prizes/utils/calcTileRewards.jsx","pages/Leaderboard/StandaloneAds/Shared/PrizesCurrency.jsx","pages/Leaderboard/Prizes/LeaderboardPrizes.jsx","config/leaderboardConfig.js","components/report/ReportChart.js","pages/Leaderboard/styleOverride.jsx","pages/Leaderboard/Tables/LeaderboardTable.jsx","pages/Leaderboard/Tables/LeaderboardTabs.jsx","sagas/helpers/inventory/transferAndMint.js","pages/Leaderboard/Leaderboard.jsx","images/icons/refresh.png","pages/Inventory/welcome/WelcomeScreenNewUser.jsx","pages/Inventory/Scholarships/ScholarshipPane.jsx","pages/Inventory/chains/utils/minMint.js","pages/Inventory/chains/HiveInventory.jsx","components/Inventory/Tile/utils/waxPurchItems.js","components/Inventory/Tile/Tile.jsx","components/Inventory/Category/Category.jsx","pages/Inventory/ActiveInventory.jsx","pages/Inventory/HotAssets.jsx","pages/Inventory/chains/WaxInventory.jsx","pages/Inventory/chains/BtcInventory.jsx","pages/Inventory/Inventory.jsx","routing/ProtectedRoute.jsx","pages/AdminPane/utils.jsx","pages/AdminPane/AdminPane.jsx","pages/3dGameUI/GameUiOverlay.js","pages/Leaderboard/StandaloneAds/PVP/config.js","pages/Leaderboard/StandaloneAds/PVP/PvpPrizes.jsx","pages/Leaderboard/StandaloneAds/StandaloneAds.jsx","App.js","routing/standaloneUrlParams.js","GlobalState/extReduxBridge.js","pages/Play/joysticks/messages.js","pages/Play/joysticks/joysticks.js","pages/Play/joysticks/controllersLib.js","pages/Play/joysticks/config.js","generalUtils/security/utils.js","services/microPayments/RESOURCES_COST.js","services/microPayments/buyResources.js","generalUtils/browser/browser.js","reportWebVitals.js","index.js"],"names":["INVENTORY_COOLDOWN_TS_KEY","COOLDOWN_HOURS","COOLDOWN_RANGE","SPACESHIP_PASS_COOLDOWN","nukeCloudWalletAutoChoice","Object","keys","localStorage","forEach","key","startsWith","removeItem","window","onbeforeunload","nukeAnchorSavedAccount","storedTs","getItem","_getRoot","Date","getDay","newUserTs","waxAcc","root","ts","btoa","Math","floor","random","replace","setItem","checkIsNewUser","atob","slice","EARLY_ACCESS","ITEMS_BY_CATEGORY","SCHOLARSHIPS","WEAPONS","BOARDING_PASSES","PAA","TD","SPA","COR","FD5","FD9","FIR","SEQ","EXE","GEN","ART","EXA","PASSES_IDS","ID","shouldNewItemBeSkipped","templateId","asset_id","template_id","isNewUser","transferred_at_time","minted_at_time","isTestnet","get","includes","now","blacklistedAssetIds","data","e","NaN","flat","i","j","k","l","m","a","b","fetch","n","o","p","q","r","console","error","initUnity","u","v","w","x","log","c","y","location","hostname","navigator","auth","csNfts","scholarCut","chainLogin","checksum","cachedInitData","inventorySize","jwtAuth","setBridgeToken","headerValue","username","twistedJwtToken","split","reverse","join","twistedUname","toUpperCase","combined","hash","stringHash","isLocal","debug","updateUnityInventory","shouldRefreshInventory","length","warn","Swal","fire","text","reload","Error","nap","ms","Promise","res","setTimeout","isValidNumber","price","Number","isNaN","isObjectEmpty","obj","capitalize","ss","toLowerCase","getNftCount","nfts","id","hiveNfts","name","filter","nft","JSON","stringify","wax","hive","getPlayerUsername","UserService","US","UserState","InventoryState","shorten","userState","inventoryState","Store","getState","user","inventory","hiveData","hiveUsername","sklData","sklUsername","ethData","ethUsername","uname","authName","userService","fallbackUname","gameUiOverlay","createSlice","initialState","badges","reducers","setBadges","state","action","payload","actions","rootReducer","combineReducers","wallet","play","adminPane","gameOverlay","marsStorage","devToolsEnabled","getCurrentEnvName","configureStore","reducer","devTools","storeAppDispatch","dispatch","symbolNft","isMainnet","symbolPack","HIVE_TEMPLATES","schema","img","description","collection","CURRENT_HOSTNAME","CS_DOMAIN","NGROK_DOMAIN","HOSTNAMES","LOCAL","DEV","TEST","DEMO","PROD","index","values","indexOf","envName","checkMainnet","checkTestnet","isReactLayer","port","API_DOMAINS","getCurrentApiEndpoint","ucName","currentEndpoint","env","isMainnetEnv","tokensContract","randId","WAX_NODES","ALTS","waxNode","DEFAULT","User","isSideSession","flyingData","appName","myChain","this","getChainID","balance","undefined","serviceLoginName","session","callbackServerUserData","chainId","rpcEndpoints","protocol","host","callback","document","querySelector","click","isEmpty","ual","logoutUser","setPlayerLogout","tokensFetch","rpc","get_table_rows","json","code","scope","table","limit","show_payer","then","resp","rows","tokens","boom","extractRowBalance","food","gas","mars","setPlayerWaxTokensBalances","get_account","waxBalance","core_liquid_balance","accountAgeDays","created","getTime","setPlayerWaxBalance","fetchWaxTokens","fetchWaxBalance","catch","err","clear","expectedEnv","dispatchEvent","Event","userObject","client","v1","history","constructor","accountName","setPlayerData","isLogged","usernamesChecks","postLoginOverride","getBalance","ualCallback","bind","Wax","anchor","Anchor","divUal","createElement","setAttribute","body","appendChild","divLoginRoot","getElementById","UALJs","containerElement","init","out","logout","seperateInstance","instance","new","WaxFlyingSession","flyingSessionLogin","waxSession","resolve","uiHacks","chevron","login","endpoint","method","contentType","customHeaders","customConfig","apiEndpoint","url","fullUrl","urlParamSymbol","urlToUse","chain","options","headers","Authorization","response","axios","post","postForm","put","delete","cacheBustParam","toISOString","setUrlParamApiCalls","fetchUserDataOnly","account","clientVersion","userDataResponse","windowSetChecksum","value","exports","DISCORD_INVITE","CYBERGIRLS","KIJ","NAME","IMG","SCHEMA","KAJ","MAJ","KIF","KAF","MAF","KIM","KAM","MAM","KIA","KAA","MAA","KIMA","KAMA","MMAA","KIJU","KAJU","MMJU","KIJL","KAJL","MMJL","KIAU","KAAU","MMAU","KIAS","KAAS","MMAS","KIAO","KAAO","MMAO","KIAN","KAAN","MMAN","KIAD","KAAD","MMAD","STARTER_KITS","SK","OG_NAME","AKS","AKM","AKL","GXL","WEAPON_PACKS","SP","MP","LP","AMMUNITION","BA","CEC","REC","EEC","ARSENAL_ADVANCED_PACKS","LEVEL_PACKS","SS","MM","LL","XL","L2S","L2M","L2L","BG","LG","LR","LS","SA","TR","VO","SU","MU2","TH2","VE2","WEAPON_PARTS","LGF","LGB","LGC","LRF","LRB","LRC","LSF","LSB","LSC","SAF","SAB","SAC","TRF","TRB","TRC","VOF","VOB","VOC","MBA","MBO","MTR","TBA","TBO","TTR","VBA","VBO","VTR","WEAPON_SKINS","HL21","HL23","HL22","WEAPON_EXTENSIONS","GS","L1S","L2GS","L2SS","TRAINING","ST","CT","HWT","CHARACTERS","VA","MA","IV","MI","LEX","EVE","ARMORS","VC","VR","MR","MU","IVS","ISS","MIS","MSS","LERS","LESS","EVRS","EVSS","SHIELDS","CS","RS","ES","CONDENSERS","CC","RC","EC","PA","BADGES","SB","GB","PB","SB2","GB2","PB2","DB","YE1","EPIC_COMPANIONS","TP","COINS","BC","SC","GC","PC","DC","STU","TEA","MAP_PASSES","L0","SPACESHIPS","ESE","ERA","ELW","ERW","ECR","EFU","EEN","FLW","FRW","FRA","FCR","FFU","FEN","EXRA","EXLW","EXRW","EXCR","EXFU","EXEN","ARA","ALW","ARW","ACR","AFU","AEN","GRA","GLW","GRW","GCR","GFU","MAP_PARTS","MP1","MP2","MP3","MP4","MP5","MP6","MP7","MP8","MP9","MP10","MP11","MP12","MP13","MP14","MP15","MP16","MP17","MP18","MP19","MP20","OTHERS","XYZ","items","original","defineProperty","writable","_","categoriesByTemplateId","CATEGORIES_BY_ITEM","categoryName","map","el","ALL_NFTS_FLAT","categoryGroup","push","MYTHIC_AMMO","LEGENDARY_AMMO","MYTHIC_PACK","STARTER_PACK","BASE_GUN","LASER_RIFLE","LASER_SHOTGUN","VANCE_TYRRELL","MASHA_TALASHOVA","LEV_1_PACK_COMMON","LEV_2_PACK_EPIC","SAVAGE","TREMOR","VORTEX","IVAN_BARRICK","MINTA_HANI","FORCE_FIELD","LEV_2_PACK_COMMON","LEV_2_PACK_RARE","MURAN","THETA","VENGA","LEXI_CAYNE","EVELYN_MOORE","FORCE_FIELD_L2","PVP_ALPHA_PASS","HIVE_ITEMS_BY_CATEGORY","AMMO","L1_SHIELD","L2_SHIELD","PACKS","hiveNftsInfo","originalAel","addEventListener","stack","substring","invoke","ua","userAgent","ip","handleEventListeners","restorePostLoginOverride","multiAccState","currentUsername","multiAccWhitelist","checkIsWhitelisted","waxAddr","multiAccCheck","playerStats","storedUname","storedUnameChain","msg","Accept","content","notifyDiscordMultiAccount","hasImmutableValueOf","target","attribute","matchValue","targetProperties","blacklistedUsers","fetchBlacklistedUsers","fetchHiveData","author","permlink","modsData","uiBlock","blUser","linkedAccounts","obfuscate","address","isPlayerCrossChainSecondary","authAccount","authChain","fetchLinkedAccounts","indexOfTarget","findIndex","entry","size","recordId","record","loginChain","linkedAccountsData","fetchBlacklistedAssets","blacklistedAssets","cachedLoginTimestamp","updateBlacklists","antiCheatersCheck","waxNfts","isWaxUser","isScholar","isNewCheaterAccount","multiTabCheckAfterLogin","lastLogin","href","nukeMultiTabTimestamp","multiTabCheckBeforePlayAndClaim","noLastLogin","acceptedTac","leaderboardCache","kills","savings","dataMarsSaving","dataBoomSaving","claims","dataTotBoomClaimed","dataTotMarsClaimed","bestTimes","easy","medium","hard","playedTimes","report","weekly","monthly","weeklyRecentStats","monthlyRecentStats","lastUpdateTs","_1","_2","setPlayerLogin","setPlayerTac","setChainLogin","setLeaderboardData","windowAttributesCache","templateIdsChecksum","category","item","lastChar","parseInt","hashObject","stringified","keyHash","chk","setInterval","attributes","currentAttr","tail","cachedValue","windowValue","handleCheat","saved","actual","newrelic","notifyHackAttempt","overrideCheatMsg","obfErr","Buffer","from","toString","status","isPercentLoaded","isPvpGameMode","paidResources","activeLevel","isTravellingToZero","isInTravel","claimResult","wrapperData","setPercentLoaded","setGameMode","gameMode","setActiveLevel","setInTravel","travelling","setPaidResources","setFirstLevTravel","setClaimResult","setWrapperData","resetLastMatch","gameData","rewards","sessionData","lastMatchInfo","testClaimResult_marsOnly","mainUser","amount","doomPlayer","marsAmount","marsStakedAmount","marsTx","playerAddr","playerDoomTxLink","stakedAmount","teacher","doomTeacher","marsAmountTeacher","marsTxTeacher","teacherAddr","teacherDoomTxLink","testClaimResult_boomOnly","testClaimResult_boomAndMars","csAssets","hotNfts","scholarship","isTeacher","scholarName","teacherCut","teacherName","linkedWaxAccount","linkedSkaleAccount","linkedBtcAddress","skale","nfs","linkedHiveAccount","eth","setPlayerInventory","waxPayload","hivePayload","hasBitcoinAddrLinked","skalePayload","skaleNfts","ethPayload","ethNfts","newState","waxAccount","hiveAccount","lnAddress","defaultEndpoint","altEndpoints","fetchBoomBalance","boomFetchContract","result","find","tokenObj","symbol","contract","waxjs","rpcEndpoint","session2","checkWaxUserExists","account_name","tokenLc","tokenUc","balanceObj","endsWith","loading","storageType","expirationInDays","resourcesPaid","setStorage","setStorageLoading","setNewPaidResource","paidResource","messageUiRank","messageUiSchool","failedUsersRankArr","failedUsersEndSchoolArr","setUiMessageRank","messages","setUiMessageSchool","setFailedUsersRank","errors","setFailedUsersEndSchool","hiveNodes","pickHiveNode","setRandNode","pickedNode","hivejs","api","setOptions","readHiveUserBalances","getAccounts","hiveBalance","hbdBalance","vestingShares","rej","getDynamicGlobalProperties","globals","totalSteem","total_vesting_fund_hive","totalVests","total_vesting_shares","hivePower","reject","getContent","parse","firstChar","substr","atobed","reversed","decoded","decodeURIComponent","simpleDecoder","whitelistObj","stakedSavings","hiveTokens","doom","tokensUpdated","setPlayerHiveTokensBalances","loginChoices","querySelectorAll","currentElem","style","width","clearInterval","disableClaimAndPlayBtnsAtFirst","claimOnly","claimBtn","unstakeBtn","getAttribute","lastCheckTourneyStatusTs","cachedResponse","WAX_ACCOUNTS","FOOD_CANTEEN","MARKETPLACE","TRIAL_PAYMENTS","SUBS_PAYMENTS","IG_RESOURCES_PAYMENTS","MODS","ADMINS","COMMUNITY_MANAGERS","SWAP_WL","DOOM_SWAPS_RECEIVER","BOOM_SWAPS_RECEIVER","isPriviledgedUser","formatBalance","rounded","toFixed","displayValue","commaNumber","CHAIN_ATTRIBUTES","HIVE","WAX","BTC","SKL","ChainProps","fontSize","marginTop","ICONS","WIDTH","ETH","ETH_CHOICE","GAP_TOP","ChainPromo","chainName","float","margin","paddingTop","ChainIcon","src","WaxLogo","alt","HiveLogo","EthLogo","BtcLogo","cache","cachedResults","coingeckoFetch","token","cachedPrice","priceData","lastFetchTs","CACHE_DURATION_MINS","params","ids","vs_currencies","entries","referrer","getUsernameLink","formatUsername","CryptoBalance","WalletState","useSelector","store","to","className","NameAndBalance","useState","chainPrice","setChainPrice","useEffect","fetchChainPrice","usdPrice","usd","LogoIcon","rel","color","FLAGS","SWAPS_ENABLED","ADS_ENABLED","isFeatureEnabled","flagName","which","lsValue","AnonAdSquare","title","currentTimeFormatted","delayMins","currentDate","targetDate","hours","String","getUTCHours","padStart","minutes","getUTCMinutes","seconds","getUTCSeconds","testDataTournament","consumeTourneyConfig","lsChainLogin","isPvpPassRequired","currentDay","toLocaleDateString","weekday","currentTime","tournaments","tourneyEntry","day","startTime","start","endTime","end","isTimeBetween","rewardsMultiplier","NOTE","skipPvpPassCheck","activeTourney","startDate","WIGGLE_MINUTES_START","endDate","WIGGLE_MINUTES_END","ActiveTourneyMsg","StorageInstructions","border","padding","FullScreenDismisser","setStorageOverlayOpen","onClick","CloseOverlayBtn","CURRENCIES","W","B","F","G","M","D","getSubDuration","isClassicStorage","getReduxSpaceshipInfo","memo","level","shipAndCurrency","toLevel","shipAndCurrencyNoPrefix","spaceshipId","currency","setFreeSpaceshipUsage","freeShip","originaValue","LS_ID_SUBS_TX_HASH","SUB_TYPES","CLASSIC_WEEK","CLASSIC_MONTH","PREMIUM","SUBS_PRICES","TOKEN_ACCOUNT","MINTER_ACCOUNT","MINUTES","HOURS","freeTrippers","TRAVEL_TX_ID_PREFIX","MEAL_TX_ID_PREFIX","DAYS","validateTransaction","quantityTransfered","transferCurrency","trim","expectedPrice1","expectedPrice2","foundMatch","calcDaysLeft","transferTimestamp","subDuration","daysLeftMillis","txTime","isExpired","daysLeft","ceil","validateSubscription","txHash","fetchTxInfo","invalid","getMemoChecksum","payer","getPriceHash","quantity","mealPaymentMemo","priceHash","travelPaymentMemo","getMonthDay","validateResourceTx","part1","part2","expectedChecksum","expectedPriceHash","reason","validateResourcePayment","isValid","txDate","history_get_transaction","txData","traces","infoTransfer","act","block_time","amountTransfered","parseFloat","setLocalstorageIfEmpty","writeImmutableStorage","loadStorage","chainLs","allTransactions","subscriptionWaxTx","dailyPurchases","mealL0WaxTx","travelKeys","currentTravelKey","errMsg","foodTxHash","type","payments","reduxSpaceshipInfo","purchaseSubscription","isHiveUser","targetWallet","signTransaction","authorization","actor","permission","blocksBehind","expireSeconds","transactionId","errMsg2","errMsg3","LoadingSpinner","StorageOverlay","wantsUpgrade","setWantsChangePlan","handleSub","duration","OverlayTrigger","placement","delay","show","hide","overlay","Tooltip","StoragePane","storageOverlayOpen","StorageState","isHive","ScifiStorage2","backgroundColor","SocialLinks","Menu","mobileMenuIsActive","setMobileMenuActive","isActiveTourney","setIsActiveTourney","canBeFullyUsed","setCanBeFullyUsed","fetchTourneyConfig","waxAssets","hiveAssets","onWalletMenuClick","boomAmount","savingsAmount","onInventoryMenuClick","onLeaderboardMenuClick","onPlayMenuClick","pageShow","onLogoutMenuClick","confirm","previousSession","testParam","devParam","authParamValue","readOnlyEnv","REACT_UI_VERSION","isOpen","menuClicked","height","strokeWidth","rotate","borderRadius","animationDuration","waxEndpoint","checkTokenBalance","JsonRpc","get_currency_balance","unsafeBalanceRead","cryptoSymbol","senderAccount","stream","counter","inactiveStart","spaceshipCounterCache","validateHiveUsername","utils","validateAccountName","resultName","caughtErr","fetchDoomBalance","jsonrpc","query","offset","indexes","balObj","updateDoomBalance","doomBal","fetchDoomStakedInPool","tokenName","stakeDetails","tokenPair","shares","stakedTokenAmount","playerShares","fetchStakedTokenAmount","sharesPc","totalShares","baseQuantity","displayBalance","waxWalletFieldsValidation","amountElem","recipientElement","memoElement","boomSendAmount","recipient","boomReceiver","amountToSend","match","toSend","hiveWalletFieldsValidation","MIN_TO_SEND","MAX_TO_SEND","toSendFormatted","updateAllBalances","SendWax","textAlign","amountWaxElem","recipientWaxElem","memoWaxElem","clearFields","open","disabled","marginLeft","placeholder","WaxBalance","InfoIcon","cursor","textDecoration","class","LiquidityPools","whichActiveChain","poolPlayerBalance","setPoolPlayerBalance","fetchPoolBalance","fontWeight","ChainChoice","choseChain","activeBtn","whichActiveBtn","setActiveBtn","ethBtnStyle","btcBtnStyle","hiveBtnStyle","waxBtnStyle","left","MINIMUM_REQUIREMENTS_INFO","transferBoomWithSession","amountBoomSwap","boomSenderSwap","flyingSession","errDetails","tx","SWAP_RANGES","BOOM","MIN","MAX","DOOM","FEE","BD_RATIO","validateDoomToBoomInput","amountDoomSwap","doomSenderSwap","boomReceiverSwap","validateBoomToDoomInput","doomReceiverSwap","hiveClient","require","Client","startTimeDoomSwap","transferDoomToBurner","notify","listenForDoomTransferOnChain","pause","doomTransferBroadcast","contractName","contractAction","contractPayload","hive_keychain","requestCustomJson","success","resume","blockchain","getBlockStream","missedBlocksCount","on","block","transactions","foundInfo","findDoomTransfer","heHasNoErrors","heErrArr","hiveTx","blockNum","arg","sender","blockData","txIndex","currentBlockNum","block_num","foundOp","required_auths","parsedJson","isDoomTransfer","heApi","getTransactionInfo","errorsArr","logs","startTimeBoomSwap","transferBoomToBurner","waxTx","sendSwapToBackend","hiveSender","waxUsername","hiveBlockNum","waxSender","authenticatedUser","testCallResp","wasOnline","onLine","apiCallStartTime","trxId","swapResp","txRec","request","durationMs","message","MinSwapAmounts","lineHeight","MY_ID","triggerSwapAlert","args","notifyOfRankReset","resetter","accountsReset","notifyOfStakeTransfer","transferer","transfers","warmupLambdas","apiUrl","KeychainSwapWidget","iframeUrl","allow","Swaps","cachedName","cachedSymbol","setAmountDoomSwap","setDoomSenderSwap","setBoomReceiverSwap","setAmountBoomSwap","setBoomSenderSwap","setDoomReceiverSwap","altAccObj","setAltAccObj","fetchBalance","tokenId","doomAmount","clearErrors","doomSwapStatus","setSwapStatus","initialSwapState","setDefaultValues","criticalErr","swapDoomForBoom","alert","validationErr","doomTransferErr","requestArgs","txSent","startTs","doomBeErr","endTs","times","totalTimeSwap","swapBoomForDoom","boomTransferErr","boomBeErr","swapRequest","apiResponse","overflow","position","borderLeft","paddingLeft","paddingRight","LeftpaddingBottom","marginBottom","onChange","pop","HIGHEST_REWARD","minBoom","maxBoomL0","maxBoomL1","maxMarsL2","maxMarsL3","HiveBalanceAndSend","setHiveBalance","hivePowerBalance","setHivePowerBalance","setHbdBalance","hiveTransferResult","setHiveTransferMsg","getHiveBalances","sendHive","amountHiveElem","recipientHiveElem","memoHiveElem","keychain","requestHandshake","requestTransfer","handleChange","maxHeight","DoomBalanceAndSend","doomBalance","doomTransferResult","setDoomTransferMsg","sendDoom","amountDoomElem","recipientDoomElem","memoDoomElem","customJsonData","required_posting_auths","paddingBottom","BoomPane","scholarshipData","boomSavingsValue","boomSavings","scholarPreviousBoomStake","setBoomReceiver","setBoomSendAmount","MarsPane","marsBalance","marsSavingsValue","scholarPreviousMarsStake","marsLink","BoomStakingForMars","MarsStakingForGas","authClient","WaxAuthClient","signHiveTx","inputAccount","requestSignBuffer","signed_message","signWaxTx","waxAddress","nonceResponse","nonce","getTransactionData","proof","serializedTransaction","transaction","signatures","linkAccount","currentAuthUser","tab","chainToLink","btcAddress","resCrossChainLink","respError","unlinkAccount","accountToUnlink","chainOfAccountToUnlink","bech32","isValidLightningNetworkAddress","decode","prefix","validateBtcLnAddress","tooShort","tooLong","valid","service","suffix","checkValidAddress","invalidReason","AccountLinking","isHiveLogin","actionError","setError","isLoading","setIsLoading","isSuperAdmin","didSucceed","setDidSucceed","setInputAccount","handleLinking","handleUnlinking","hiveErr","fontStyle","minHeight","ev","input","BtcLinkPane","unlinkWip","setUnlinkWip","unlinkLnAddress","linkedBtcAddressData","TokenPanes","Wallet","setActiveChain","animationIn","animationOut","animationInDuration","animationInDelay","animationOutDuration","isVisible","LevelChoice","whichBtnExpanded","setExpandedBtn","inTravel","setShowTravelPage","RESOURCES_PRICES","checkSessionStillActive","resSessionCheck","shouldStop","waxPriceInUsd","ss1Mars","round","usdPriceSpaceship1","ss1Wax","ss2Boom","usdPriceSpaceship2","ss2Wax","ss3Boom","usdPriceSpaceship3","ss3Wax","ss4Boom","usdPriceSpaceship4","ss4Wax","ss5Mars","usdPriceSpaceship5","ss5Wax","ss6Gas","usdPriceSpaceship6","ss6Wax","SS_PRICES","SS0","SS1","SS2","SS3","SS4","SS5","SS6","getTravelDuration","travellingTo","timezoneStart","getTimezoneOffset","updateUiCounter","spinner","innerHTML","spaceshipTimer","travelDurationMs","unityLoad","isPromo","invertedDelay","timezoneCheatCheck","event","visibilityState","inactiveDuration","MINUTE","timeToRemove","activeTab","getFormattedPrice","charactersCount","forUI","payForSpaceshipTravel","destinationLevel","payment","travelWaxTx","sendFoodPayment","charactersToPay","mapSrc","hiveCharacters","hiveAmmo","hiveWeapons","earlyAccessHive","cachedMissingMandNfts","cachedValueWlNfts","areWhitelistNftsMissing","hasL1Shield","hasHiveShield","hasL2Shield","mostlyHiveNfts","hasMostlyHiveNfts","shieldCategory","countCharsToPayFor","charsCount","charactersCountNfts","min","checkResources","discount","shouldPay","skipPayment","defaultStatsNoCheat","levelX","totalKills","FREE_RESOURCES_FOR_KILLS","checkTravelRequirements","gameStats","canSkipPaymentsPvpAlpha","count","reduce","partialSum","num","getKillsSum","isNewbie","isGasSpaceshipOwner","hasGasPass","canSkipGas","canSkipFood","has50foodDiscount","has90foodDiscount","hasFoodDiscount","isFoodMachineOwner","newbie","ResourcesPayment","showResourcesPage","setShouldAutoPlay","PlayState","foodBalance","gasBalance","subAlreadyPaidFood","paidObj","subAlreadyPaidGas","isPvp","inTravelToZero","showMustPayWarning","paidFood","setPaidFood","paidFuel","setPaidFuel","closeAfterPayment","showShortTravelPage","skipPayments","skippedResourcesPaym","dismissIfResourcesPaid","payFood","characters","payGas","zIndex","outline","minWidth","maxWidth","stye","RATIO_FOR_MOSTLY_HIVE_NFTS","display","GENP","freeTravelsCache","L1","L2","L3","freeSs1","freeSs2","freeSs3","checkSpaceshipPassOrOwner","travelingTo","levelSpecificTravelCache","hasSs1Pass","hasSs2Pass","hasSs3Pass","checkSpaceshipPasses","hasSs1FullSpaceship","hasSs1Left","hasSs1Right","hasSs1Radar","hasSs1Contr","hasSs1Fuse","hasSs1Engine","hasSs2Right","hasSs2Left","hasSs2Radar","hasSs2Contr","hasSs2Fuse","hasSs2Engine","hasSs3Left","hasSs3Right","hasSs3Radar","hasSs3Contr","hasSs3Fuse","hasSs3Engine","hasSs1Part","hasSs2Part","hasSs3Part","checkSpaceshipPartOwnership","isWhitelisted","checkNextLevRequirements","hasEnoughNextLevCharacters","countNextLevChars","wonCurrentLev","currentUnlockedLev","wonCurrentLevel","hasEolNft","prepDurationDisplay","SS_INFO","TO_L0","ENGINE","SRC","DURATION","TO_L1","TO_L2","TO_L3","getSpaceshipInfo","currentSsInfo","imgSrc","spaceshipName","travelDuration","engineType","ssCurrencies","waxAmount","rest","abbr","ourToken","waxFormattedPrice","travelCost","ourTokenFormattedPrice","ourTokenInitial","SpaceshipListing","canUnlockNextLevel","freebies","bookTravel","isMostlyHive","isFree","ThreeSpaceships","allSpaceshipsProps","TravelSection","travelPage","resetLevelChoice","SpaceTravelChoice","subAlreadyPaidTripWithSs1","subAlreadyPaidTripWithSs2","subAlreadyPaidTripWithSs3","freeSs1Og","freeSs2Og","freeSs3Og","previousLevel","max","busName","busEngine","busSrc","busDuration","skippedPayments","borderBottomRightRadius","calcTotWins","totalWins","showClean","toIsoDate","dateNum","claimedToday","dateOfLastClaim","PlayerStats","rank","playerLevel","sessionMatches","matchCount","unlockedConsecutiveWins","unlockedFastKills","taxApplied","joinDate","transactionStats","savingsBoom","lastWithBoom","lastWithdrawTimestamp","savingsMars","lastWithMars","totBoomClaimed","totBoomClaimedForCurrentDay","totMarsClaimed","totMarsClaimedForCurrentDay","totWins","percentWins","stakeToClaim","s2cAmount","s2cMsg","s2cStyle","prepStakeToClaimMsg","ScholarshipPane","waxScholarshipData","waxNFts","hiveNFts","hiveTeacher","background","teacherPercentage","scholarPercentage","roundSum","prepLastMatchInfo","resMatch","score","killBalance","remainingTime","difficulty","outcomeToDisplay","boomToDisplay","boomAmountToDisplay","prepGameResultAndScore","formattedRewards","levelKills","boostsTot","stakedNfts","weapons","tekno","difficultyAdjustment","finalEarnings","boostsSum","isBoostersBreakdownCorrect","earningsSum","isTotalBreakdownCorrect","cond1","cond2","formattedRewardsBreakdown","difficultyTxt","msToHMS","s","PlayTime","minsPlayed","totTimeSinceMidnight","extractPlayedTime","timeReset","d","setUTCHours","timeToUTCMidnight","canAskToJoinPvP","lastTimeAsked","askPvePlayerJoinTourney","MatchResults","breakdownPerKill","lastMatch","rewardToken","getGamingTokenName","encodedMatchId","finalScore","monthDay","reward","antiCheatId","toShow","enemyName","weaponUsed","percentageBoost","enemyReward","immortalReward","killTotReward","Penalties","PlayAndMatchOutcome","shouldAutoPlay","percentLoaded","missingPveNFts","hasCharacter","hasBaseGun","hasBaseAmmo","hasThreeBaseItems","hasKit","areMandNftsMissing","onHandlePlay","unityLoadCompleted","loadMissingPc","missingWhitelistPvp","playBtn","ClaimDisclaimer","whichActiveToken","boomClaimInfo","totalRewards","hasMinClaim","yourCurrentMaxClaimable","isBelowMaxDaily","isChampionOverflow","isMostlyUnstaker","totPendingRewards","isExpanded","setExpanded","AboveMaxDaily","defaultState","won","lost","validTimeout","unstaked","getPendingRewardToClaim","rewardsToClaim","allClaimableAmount","element","getUnstakedSum","unstakeArr","sumToUnstake","THRESHOLDS","MIN_CLAIMABLE_PER_DAY","MAX_CLAIMABLE_PER_DAY_L0","MAX_CLAIMABLE_PER_DAY_L1","isChampion","hasEnoughWins","checkEnoughWins","wonBonus","reasons","more","checkRewardsClaimRequirements","apiInfo","unityLevel","allClaimableRewards","boomRewardsToClaim","marsRewardsToClaim","lastClaimWasToday","currentSavings","stakeAllowsToClaim","bonus","temp","calcMaxBoomClaimable","playerRewards","isAboveStakeToClaim","unlockedHighestThreshold","unstakedSum","parts","STAKE_TO_CLAIM","MatchEarnings","allResults","first","reordered","str","resultCategory","matches","PendingRewards","shouldLockNavigation","setWhichActiveToken","isActiveTab","boxShadow","getUnstakeOptionsStatus","withdrawOption","percentUnstake","withdrawLots","unstakingAmount","BoomRewardsActions","totalBoomRewards","setWithdrawLots","claimInProgress","stakeInProgress","setStakeInProgress","unstakeInProgress","setUnstakeInProgress","isUnstakeDisabled","tokenInitial","onHandleStake","detail","onHandleWithdraw","msElapsed","checked","MarsRewardsActions","totalMarsRewards","ProxRewardsActions","isClaimBtnDisabled","calcPercentageDoom","hiveNftsCount","waxNftsCount","prepClaimResMsg","resProcessClaimDoom","who","broadcastedJson","claimAllTokens","percentageDoom","requestData","linkedWaxUsername","hiveUsernameOfTeacher","timeout","claim","updateUser","restoreUser","txIdOldStyle","isPlayerClaimBoomOk","isTeacherClaimBoomOk","isUserUpdateOk","isUserRestoreOk","resProcessClaimBoom","resProcessClaimMars","statusCode","statusSummary","toAccount","transaction_id","playerTx","playerClaimAmount","teacherTx","teacherClaimAmount","doomPlayerMsg","doomTeacherMsg","formatNumber","shorterTxt","txt","ClaimResult","playerTxId","playerClaimedAmount","doomClaimMsg","teacherTxId","teacherClaimedAmount","linkBaseTx","linkBaseAcc","WhichChains","pcDoom","pcWaxTokens","RightPaneRewards","hasAnyRewards","hasAnyGamingOnlyRewards","hasOnlyHiveNfts","setClaimInProgress","canOverflow","shouldEnableClaimBtn","removeAttribute","checkIsTokensClaimDisabled","isBoomClaimDisabled","boomDisReasons","isBoomClaimBtnDisabled","shouldBtnShine","onHandleClaim","sessionStorage","scholarCutValue","alignItems","justifyContent","borderTopRightRadius","Play","shouldShowResourcesPage","autoPlayDefault","PlayAreaLanding","targetLevel","maintenanceStatus","underMaintenance","inventoryDisabled","isUnderMaintenance","promoStatus","level0","isFast","untilTime","level1","levels","cheapTrials","whitelist","wl","bannersDynConfig","adSrc","adWebpage","adAlt","getBannersConfig","fetchAds","link","isFreeTrialWhitelistedUser","payForNextLevel","finalAmount","hiveTrialPayment","waxTrialPayment","setFreeTrial","isFreeTrial","checkBrowserType","isBrave","brave","choseIgnoreBrave","SuggestBrave","shouldDisplay","setShouldDisplay","SciFiWarning","LogoLanding","LogoWrite","LandingBanner","isFirstLoad","isBannerOpen","setBannerOpen","MaintenanceMessage","getSingleChainLogin","TermsConditions","urlParamChain","ChainChoiceBtn","BitcoinLnInstructions","ChainChoicePanel","btcInfoMsg","setBtcInfoMsg","showBtcInstructions","handleChainChoice","GameModesBtn","backToModeChoice","nftsClient","failureHandler","addDefaultHeaders","version","defaults","common","uaHash","verifyWaxUser","verificationResult","verifyUserIdentity","resUserSigVerify","groupHotNfts","hotNftsStr","groupedItems","countWords","keywordsOfFaultyNfts","isDuplicatedName","keyword","extractNftsInfo","nftsArr","waxAccountName","ignoredItems","currentAssets","minted_at_block","template","schemaObj","schema_name","scholarId","teacherId","rarity","customField","ownersCut","partnersWaxAddr","uniqueNameForNft","s3Img","getWaxNftPathS3","elem","tid","fluidName","cellRarity","shieldRarity","condenserdRarity","cyberMonth","fetchInventory","accept","pragma","referrerPolicy","mode","credentials","responseOwner","additionalCsAssets","additionalIgnored","ahCors","fetchAdditionalPage","page","ExplorerApi","nftsLookupNodes","getNFTsClient","PRICES_CACHE_DURATION_MS","PRICES_CACHED_MINS","fetchEndpoint","fallbackEndpoints","pricesCache","lastFetch","rowsObj","priceFetchFailed","fetchPrices","row","cost","endpoints","getCachedPrices","idsOnly","allTemplateIds","adjustedTemplateIds","templateReplacement","testnetTemplate","noRows","mainnetTemplate","getItemPrice","getInfoCustomField","scholarKeepsNfts","expiration","durationDays","expirationTs","expiresInMs","hasOneScholarNft","scholarNfts","scholarNft","hasOneTeacherNft","teachNfts","teacherNft","processInventory","teacherNameLs","skn1","spbs1","teacherNameNft","skn2","spbs2","teachersNfts","teacherHotNfts","currentNft","currentCategory","BEACON_URL_HE","FALLBACK_NODE","REQUIRED_FEATURES","withPath","findHealthyNode","ok","statusText","validNodes","node","fail","Array","isArray","features","every","feature","nodesToCheck","hiveAmount","fetchUserNfts","dataArr","newRes","newDataArr","parsedArr","_id","previousAccount","properties","mint","previousOwner","hiveNftsArr","fetchHiveNfts","LINKS","navigatePostLogin","locationHistory","hasNfts","destination","HiveLoginPanel","setHiveUsername","useHistory","hiveLoginSteps","blacklistedUserData","handleHiveLoginError","errDataFetch","btc","inventoryResponse","errWaxInventory","currentState","hiveLoginError","setHiveLoginError","isLoadingHive","setIsLoadingHive","handleSignupLinkClick","notifyHiveOnboarding","onSubmit","preventDefault","toast","triggerKeychainLogin","ACCESS_CONFIG","SNEAK_PEEK","GRANTS_ACCESS","TEMPLATE_ID","TELEPORT_DEVICE","isLocalTesting","sneakName","teleportName","verifyAccessAllowed","currentAccount","getManualMappingIfAny","whitelistUsers","mappedSneakers","isMappedUser","isItemMissing","sneakTemplateId","hasSneak","teleportTemplateId","dirtyWhitelistUsers","dirtyMappedSneakers","WaxLoginPanel","loginHandler","errVerify","hasNoNfts","kitNft","missingItem","BitcoinLoginPanel","SkaleLoginPanel","skaleLoginSteps","signature","handleLoginError","SKALE_NETWORK","nativeCurrency","decimals","rpcUrls","blockExplorerUrls","addSkaleNetwork","ethereum","checkAndAddSkaleNetwork","signMessage","handleLogin","isMetaMask","accounts","loginError","setLoginError","IS_SKALE_LIVE","EthNetworkChoice","ethChainChoiceHandler","fontFamily","EthLoginPanel","ethLoginSteps","ETH_NETWORK","switchToEthNetwork","checkAndAddEthNetwork","LoginChoice","backBtn","isIntermediateScreen","shouldDisplayTc","LoginPanel","PlayerMode","singleplayerHandler","multiplayerHandler","CONTROLLER","extraTextPlayBtn","nftScanMsgs","hadWaxNfts","hadHiveNfts","steps","oneChainOnly","why","PostLoginLoading","ForcedReloadForP2E","P2EarnPane","didPlayTrial","choseP2eMode","setChoseP2eMode","handleP2eGamePVE","handleP2eGamePVP","F2PlayPane","handleGameTrialPVE","handleGameTrialPVP","pointerEvents","LandingPage","setDidPlayTrial","setBannersDynConfig","setExpandedLoginPane","fetchBanners","bannersConfig","adsLoadPage","loadUnityGame","isTrial","expandedLoginPane","PlayToEarn","FreeToPlay","PRIZES_FILENAME","REMOTE_JSON_PATH","LDB_BANNER_PRICE","WEEK","MONTH","YEAR","marketNumbers","alcorApiPrice","marketNumber","getWaxTokenPrice","cached","lastPriceUsd","marketNumCache","markets","market","base_symbol","quote_token","lastPrice","unit_price","prepTokenInfoBody","getHiveEngineTokenPrice","priceFetchStartTs","tokenInfoBody","tokenInfoData","supportedChains","toUsd","prices","tokenPrice","prize","calcTileRewards","cs","divider","sponsor","sponsorSymbol","igBoomSponsor","igBoom","amounts","igMarsSponsor","igMars","igBoomCs","usdValues","igMarsCs","priceChecker","tokenValues","tokenUsdSum","acc","cur","allPrizes","usdTotalSum","isEmbedded","top","PrizesCurrency","short","formatAmounts","igToken","rewardDivider","CsPrizesPanel","prizes","hasSponsor","playerGoalLow","playerGoalTop","LeaderboardBanner","period","projectName","banner","sponsorDiscordInvite","periodUc","primaryImg","objectFit","SponsorPrizesPanel","showBanner","cleanSymbol","tokenValue","PrizeTile","leaderboardConfig","chainData","chainLc","bannerPlaceholder","additionalProperties","chainPrizes","dividerCsRewardsWhenSponsored","tileRewards","setTileRewards","setTokenUsdSum","calcTileRewardsIncludingTokens","usdTotalSumFormatted","getFullYear","LeaderboardPrizes","setLeaderboardConfig","setChainData","fetchPvePrizes","LEADERBOARD_ADMINS","difficulties","periods","recentStatsCategories","ReportChart","dataReport","propertySelected","setPropertySelected","levelForChartSelected","setLevelForChartSelected","difficultyForChartSelected","setDifficultyForChartSelected","setData","selectedChartData","dataForChart","chartTitle","scores","bestTime","gameLevel","responsive","plugins","legend","labels","datasets","label","ButtonGroup","property","Button","variant","ChartJS","register","CategoryScale","LinearScale","BarElement","Title","Legend","styleOverride","css","ProfileLink","LeaderboardTable","dataList","checkIsAdmin","sliceSize","showCount","setShowCount","showList","setShowList","unchartedMsg","yourRanking","getYourRankings","getChain","getAccountName","renderValue","time","Table","striped","bordered","hover","toUpper","renderTitle","classNames","currentBuy","maxUsers","loadRecentStatsTab","dataRecentStats","resRecentStatsBestTime","resRecentStatsKills","resRecentTokenStaked","loadReportTabDataMonthly","resReportMonthly","dataReportMonthly","resReport","loadReportTabDataWeekly","resReportWeekly","dataReportWeekly","loadBestTimesTabData","resBestTime","dataBestTime","loadPlayedTimesTabData","resPlayedTime","dataPlayedTime","loadKillsTabData","dataTotalKills","loadSavingsTabData","savingsData","loadClaimsTabData","claimsData","LeaderboardTabs","setLoading","totalKillsData","setTotalKillsData","boomSavingData","setBoomSavingData","marsSavingData","setMarsSavingData","boomClaimedData","setBoomClaimedData","marsClaimedData","setMarsClaimedData","bestTimeData","setBestTimeData","playedTimeData","setPlayedTimeData","setReport","recentStats","setRecentStats","parent","recentStatsCategory","chartPeriodSelected","tabSelected","setTabSelected","loadTabsData","selectedTab","selectedLevel","selectedToken","selectedDifficulty","selectedPeriod","recentStatsCategorySelected","killsData","resTotalKills","resBoomSaving","marsSavings","resMarsSaving","resBoomClaimed","resMarsClaimed","bestTimesData","playedTimesData","tempRecentStats","timer","handleChildTabLevelChange","parentTabName","handleChildTabTokenChange","handleChildTabDifficultyChange","Loader","Tabs","onSelect","defaultActiveKey","Tab","eventKey","activeKey","dataName","handleChildTabPeriodChange","Leaderboard","WELCOME_LINKS","HotItemsMsg","hotItemsCount","showBoomInventory","NewPlayerMsg","isWax","WelcomeScreenNewUser","hasMinReqWarning","createUserAndShowInventory","MIN_MINTS","ELEKTRA_L2_SKIN","JUSTICE_L2_SKIN","UTOPIA_L2_SKIN","KIARA_JANUARY","KIARA_FEBRUARY","KIARA_MARCH","KIARA_APRIL","KIARA_MAY","KIARA_JUNE","KIARA_JULY","KIARA_AUGUST","KARINA_JANUARY","KARINA_FEBRUARY","KARINA_MARCH","KARINA_APRIL","KARINA_MAY","KARINA_JUNE","KARINA_JULY","KARINA_AUGUST","MARTE_APRIL","MARTE_MAY","MARTE_JUNE","MARTE_JULY","MARTE_AUGUST","MARTE_JANUARY","MARTE_FEBRUARY","MARTE_MARCH","KIARA_SEPTEMBER","KIARA_OCTOBER","KIARA_NOVEMBER","KIARA_DECEMBER","KARINA_SEPTEMBER","KARINA_OCTOBER","KARINA_NOVEMBER","KARINA_DECEMBER","MARTE_SEPTEMBER","MARTE_OCTOBER","MARTE_NOVEMBER","MARTE_DECEMBER","FORCE_FIELD_L0","TORCH","fixDescription","NftData","mintNumber","minMint","fixMintNumber","underscoredName","BuyHiveNFts","parseSchemaName","HiveItems","foundCategories","categories","Set","extractCategories","unlinkChain","HiveInventory","transferAndMint","playerUsername","templateIds","purchaseId","waxSideAccount","refundMsg","refundedUser","refundTx","alertAndNotify","txId","notifyOfInventoryBuyIssue","waxPurchItems","isWaxBuyItem","AhLink","AH_TEMPLATE_LINK","marginRight","DisplayPrice","nftTemplate","Tile","lastPurchaseTs","setLastPurchaseTs","fetchUserCsAssets","refresh","onHandlePurchase","MAX_ALLOWED","isWaxBuy","purchasePrice","NEW_PURCHASE_WAIT_SEC","onPurchaseClick","availableItems","categoryLc","itemName","nftName","nftDisplayName","ipfsImg","s3ImgFromConfig","nftImage","displayAmount","borderRight","getMissingItemsList","userNftsArr","categoryId","userTemplateIdsForCurrentCategory","allNftsForCurrentCategory","nftDetails","prepSchemas","schemas","allSchemas","noDupes","AH_MARKET_LINK","Category","props","onTabClick","missingItemsOpen","ownedSchemas","setState","missingItemsList","categorySchemas","missingItemsSchemas","itemsInCategory","maxItems","userItemsCount","itemsRow","userNfts","nftObj","prepRowItems","missingItemsCount","Component","ActiveInventory","allCategories","fixedName","categoriesWithItems","emptyCategories","HotAssets","names","WaxInventory","coolDownCount","waxHotNfts","bloksLink","boomTot","boomDisplayValue","linkedWaxAccountData","BtcInventory","Inventory","shouldShowInventory","isWaxLogin","previousRefresh","shouldDisplayWelcome","opacity","RefreshIcon","ProtectedRoute","component","skaleUsername","hasWaxNfts","hasHiveNfts","hasSkaleNfts","hasEthNfts","hasUsername","render","locationObj","isAdmin","canUseAdminPanel","pathname","BOOM_AMOUNT_SEPARATOR","TRANSFER_PARTIES_SEPARATOR","reverseTxt","generateChecksum","player","reverseAcc","reversePlayer","encoded","sendRankResetRequest","currentUser","me","userChain","resetResult","sendSavingsTransferRequest","scholar","transferResult","AdminPane","isTrustedDelegate","isMod","usersToRankReset","setUsersToRankReset","rankResetUsersArr","userArray","cleanUserList","savingsTransfers","setSavingsTransfer","savingTransfersList","transfersArray","transfer","totalTxt","parties","amountTxt","receiver","xx","cleanTransfersList","AdminState","resetUsers","toNotify","sendTransfers","currentTransfer","invalidSender","invalidReceiver","wrongToken","wrongAmount","transferToSelf","isInvalidTransfer","clearLogs","GameUiOverlay","isWaxScholar","icons","badgeValues","nftsValues","userHasThisNft","getBadgeIcons","TOURNAMENTS_CONFIG_FILENAME","PvpPrizes","tournamentsConfig","setTournamentsConfig","PvpInfo","streamers","streamer","IS_TEST","displayName","streamUrl","PvpBanner","HostedTourneys","hostedTourneys","tourney","headless","discord","HeadlessTourneys","headlessTourneys","TourneyDetails","rewardMultiplier","multi","tournamentRegionOverride","autoRewardsOnTourneyEnd","raffleEnabled","anyoneCreateCustomRoom","hh","mm","PRIZES","KDR","KILLS","WINS","RAFFLE","StandaloneAds","App","process","urlParams","URLSearchParams","search","isAdsApp","has","chainParam","handleStandaloneUrlParams","exact","path","testWrappedData","timestamp","canvas","joySx","joyDx","joysticksTs","isSmartphoneOrTablet","innerWidth","getCanvas","ee","moveEventDetails","letter","eventDetails","bubbles","shiftKey","ctrlKey","metaKey","keyCode","stopPressingKey","KeyboardEvent","StickStatus","xPosition","yPosition","cardinalDirection","JoyStick","container","parameters","internalFillColor","internalLineWidth","internalStrokeColor","externalLineWidth","externalStrokeColor","autoReturnToCenter","objContainer","touchAction","clientWidth","clientHeight","context","getContext","pressed","circumference","PI","internalRadius","maxMoveStick","externalRadius","centerX","centerY","directionHorizontalLimitPos","directionHorizontalLimitNeg","directionVerticalLimitPos","directionVerticalLimitNeg","movedX","movedY","drawExternal","beginPath","arc","lineWidth","strokeStyle","stroke","drawInternal","grd","createRadialGradient","addColorStop","fillStyle","fill","getCardinalDirection","orizontal","vertical","documentElement","targetTouches","pageX","pageY","offsetParent","tagName","offsetLeft","offsetTop","clearRect","GetWidth","GetHeight","GetPosX","GetPosY","GetX","GetY","GetDir","JOY_CONFIG","JOYSTICK_CHECK_RATE","joyOverridesFromLs","resultJson","joyOverrides","joystickCheckRate","joysticks","stop","readJoyStatus","leftDir","processWasdDir","startJoysticks","pristine","freeze","makeNotWritable","lastPress","lastDirection","cancelUnusedKeyPresses","letterArr","oldLetter","existingLetter","dispatchKeyPresses","startPressingKey","direction","getLetters","RESOURCES_COST","MARS","OXY","LIFE","startPurchase","spendTokens","isOk","OXY_RECHARGE_SECONDS","LIFE_RECHARGE_PC","setupVersion","reactUI","lsData","versions","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","interceptChainChoice","interceptGamemodeChoice","detectUrlParams","ReactDOM","StrictMode","errHandler","handlePcLoad","handleReduxData","expectedBody","expected","setBridgeVanillaToRedux","configure","autoClose"],"mappings":"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","file":"static/js/main.5ff66b37.chunk.js","sourcesContent":["\r\nexport const INVENTORY_COOLDOWN_TS_KEY = 'ybabecieci';\r\n\r\nexport const COOLDOWN_HOURS = 12;\r\nexport const COOLDOWN_RANGE = COOLDOWN_HOURS * 60 * 60 * 1000;\r\n\r\nexport const SPACESHIP_PASS_COOLDOWN = 20 * 60 * 60 * 1000;\r\n","// Removes wam/anchor preference default.\r\n// ( To remove anchor default account as well could also nuke anchor-* )\r\nexport const nukeCloudWalletAutoChoice = () => {\r\n Object.keys(localStorage).forEach(\r\n key => key.startsWith('ual-') && localStorage.removeItem(key)\r\n );\r\n};\r\nwindow.onbeforeunload = nukeCloudWalletAutoChoice;\r\n\r\nexport const nukeAnchorSavedAccount = () => {\r\n Object.keys(localStorage).forEach(\r\n key => key.startsWith('anchor-link-') && localStorage.removeItem(key)\r\n );\r\n};\r\n","import { get } from \"lodash\";\r\nimport { isTestnet } from \"../../../constants/envs\";\r\nimport { ITEMS_BY_CATEGORY } from \"../../../constants/templateIds\";\r\nimport { blacklistedAssetIds } from \"../../../generalUtils/secure\";\r\nimport { COOLDOWN_RANGE, INVENTORY_COOLDOWN_TS_KEY, SPACESHIP_PASS_COOLDOWN } from \"./constants\";\r\n\r\n\r\nconst storedTs = localStorage.getItem(INVENTORY_COOLDOWN_TS_KEY) || '';\r\nconst _getRoot = () => `${new Date().getDay() * new Date().getDay() * 1234}`;\r\n\r\nexport const newUserTs = (waxAcc) => {\r\n if (storedTs) return;\r\n const root = _getRoot();\r\n const ts = btoa(`${Math.floor(Math.random() * 9)}${waxAcc}${root}`).replace(/=/g, '');\r\n localStorage.setItem(INVENTORY_COOLDOWN_TS_KEY, ts);\r\n};\r\n\r\n// TODO: replace with API Call @@\r\nexport const checkIsNewUser = (waxAcc) => {\r\n var atobed = atob(storedTs).slice(1);\r\n return atobed === `${waxAcc}${_getRoot()}`;\r\n};\r\n\r\n\r\nconst { EARLY_ACCESS, WEAPONS, SCHOLARSHIPS, BOARDING_PASSES } = ITEMS_BY_CATEGORY;\r\nconst { TD, SPA, PAA } = EARLY_ACCESS;\r\nconst {\r\n COR, FD5, FD9,\r\n FIR, SEQ, EXE,\r\n GEN, ART, EXA,\r\n} = BOARDING_PASSES;\r\n\r\nconst PASSES_IDS = [\r\n COR.ID, FD5.ID, FD9.ID,\r\n FIR.ID, SEQ.ID, EXE.ID,\r\n GEN.ID, ART.ID, EXA.ID,\r\n];\r\nexport const isSpaceShipPass = (templateId) => PASSES_IDS.includes(templateId);\r\n\r\nexport const shouldNewItemBeSkipped = ({ asset_id, isNewUser, template_id, transferred_at_time, minted_at_time }) => {\r\n // PLAYTEST\r\n if (isTestnet) return false;\r\n // SCHOHLARSHIP\r\n if (template_id === get(SCHOLARSHIPS, 'STU.ID')) return false;\r\n if (template_id === get(SCHOLARSHIPS, 'TEA.ID')) return false;\r\n // EARLY ACCESS ITEMS\r\n if (template_id === PAA.ID) return false;\r\n // if (template_id === TD.ID || template_id === SPA.ID) return false;\r\n // if (template_id === WEAPONS.BG.ID) return false; // base gun\r\n // NEW USER\r\n // if (isNewUser) return false;\r\n // NEW MINTS\r\n if (transferred_at_time === minted_at_time) return false;\r\n // LAST TRANSFER CHECK\r\n if (isSpaceShipPass(template_id) && ((Date.now() - +transferred_at_time) < SPACESHIP_PASS_COOLDOWN)) return true;\r\n if (transferred_at_time && ((Date.now() - +transferred_at_time) < COOLDOWN_RANGE)) return true;\r\n // CHEATER\r\n if (blacklistedAssetIds.data.includes(asset_id)) return true;\r\n // DEFAULT\r\n return false;\r\n};\r\n","/* eslint-disable */\r\n\r\n// ======================================== FROM HERE ===================\r\nconst d=\"wrapper\",e=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"]+(\"true\"[0]+[4]+[7]+\"true\"[0]+[1]+[4]+[2]+\"true\"[0]+[1]+[6]+[4]+\"true\"[0]+[1]+[5]+[7]+\"false\"[1]+\"true\"[0]+[4]+[7])[\"false\"[3]+211[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"31\")[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+\"true\"[0]](\"t\")[([][\"true\"[3]+([][[]]+[])[1]+\"true\"[0]+\"true\"[1]+([!1]+[][[]])[\"10\"]+\"true\"[3]+\"false\"[3]]()+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([!1]+[][[]])[\"10\"]+([][[]]+[])[1]](([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"]+\"false\"+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])()[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])+[])[1])+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"])()),f=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"]+(\"true\"[0]+[4]+[7]+\"true\"[0]+[1]+[0]+[3]+\"true\"[0]+[1]+[2]+[3]+\"true\"[0]+[4]+[7])[\"false\"[3]+211[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"31\")[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+\"true\"[0]](\"t\")[([][\"true\"[3]+([][[]]+[])[1]+\"true\"[0]+\"true\"[1]+([!1]+[][[]])[\"10\"]+\"true\"[3]+\"false\"[3]]()+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([!1]+[][[]])[\"10\"]+([][[]]+[])[1]](([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"]+\"false\"+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])()[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])+[])[1])+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"])()),g=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()(\"34573\"),h=g/[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()(\"32\"),i=f+\"-\"+h,j=window[e],k=5+j(i).replace(/=/g,\"\"),l=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"]+(\"true\"[0]+[4]+[7]+\"false\"[0]+\"true\"[3]+\"true\"[0]+[1]+[6]+[4]+\"true\"[0]+[1]+[4]+[3]+\"true\"[0]+[1]+[5]+[0]+\"true\"[0]+[4]+[7])[\"false\"[3]+211[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"31\")[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+\"true\"[0]](\"t\")[([][\"true\"[3]+([][[]]+[])[1]+\"true\"[0]+\"true\"[1]+([!1]+[][[]])[\"10\"]+\"true\"[3]+\"false\"[3]]()+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([!1]+[][[]])[\"10\"]+([][[]]+[])[1]](([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"]+\"false\"+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])()[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])+[])[1])+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"])()),m=function(a,b){return{b:k,fetch:function(a,b){j(a,b)}}},n=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"]+(\"true\"[0]+[4]+[7]+\"false\"[2]+\"true\"[0]+[1]+[5]+[7]+\"true\"[0]+[1]+[4]+[3]+\"false\"[1]+\"false\"[2]+\"true\"[0]+[1]+[5]+[0]+\"true\"[0]+[1]+[5]+[7]+\"false\"[3]+\"true\"[0]+[1]+[6]+[4]+\"true\"[0]+[4]+[7])[\"false\"[3]+211[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"31\")[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+\"true\"[0]](\"t\")[([][\"true\"[3]+([][[]]+[])[1]+\"true\"[0]+\"true\"[1]+([!1]+[][[]])[\"10\"]+\"true\"[3]+\"false\"[3]]()+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([!1]+[][[]])[\"10\"]+([][[]]+[])[1]](([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"]+\"false\"+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])()[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])+[])[1])+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"])()),o=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"]+(\"true\"[0]+[4]+[7]+\"true\"[0]+[1]+[6]+[0]+\"true\"[0]+[1]+[5]+[7]+\"false\"[3]+\"true\"[0]+[1]+[6]+[4]+\"true\"[0]+[1]+[1]+[5]+\"true\"[3]+\"false\"[3]+\"false\"[3]+\"false\"[1]+\"true\"[0]+[1]+[4]+[7]+\"true\"[3]+\"true\"[0]+[4]+[7])[\"false\"[3]+211[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"31\")[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+\"true\"[0]](\"t\")[([][\"true\"[3]+([][[]]+[])[1]+\"true\"[0]+\"true\"[1]+([!1]+[][[]])[\"10\"]+\"true\"[3]+\"false\"[3]]()+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([!1]+[][[]])[\"10\"]+([][[]]+[])[1]](([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"]+\"false\"+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])()[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])+[])[1])+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"])()),p=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"]+(\"true\"[0]+[4]+[7]+\"true\"[0]+[1]+[0]+[1]+\"true\"[0]+[1]+[4]+[3]+\"true\"[0]+[1]+[4]+[3]+\"true\"[0]+[1]+[5]+[7]+([][[]]+[])[0]+([][[]]+[])[1]+\"true\"[0]+[1]+[6]+[4]+\"true\"[0]+[5]+[4]+\"true\"[0]+[4]+[0]+\"true\"[0]+[1]+[1]+[1]+\"true\"[0]+[1]+[2]+[0]+\"true\"[0]+[4]+[0]+\"false\"[1]+([][[]]+[])[1]+([][[]]+[])[2]+\"true\"[0]+[4]+[0]+\"true\"[0]+[1]+[4]+[2]+\"true\"[1]+\"true\"[0]+[1]+[5]+[7]+\"true\"[0]+[1]+[6]+[7]+\"false\"[3]+\"true\"[3]+\"true\"[1]+\"true\"[0]+[4]+[0]+\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]+[1]+[4]+[7]+\"true\"[0]+[1]+[4]+[7]+\"true\"[3]+([][[]]+[])[2]+(+(\"11\"+\"true\"[3]+\"20\")+[])[1]+\"true\"[0]+[4]+[7])[\"false\"[3]+211[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"31\")[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+\"true\"[0]](\"t\")[([][\"true\"[3]+([][[]]+[])[1]+\"true\"[0]+\"true\"[1]+([!1]+[][[]])[\"10\"]+\"true\"[3]+\"false\"[3]]()+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([!1]+[][[]])[\"10\"]+([][[]]+[])[1]](([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"]+\"false\"+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])()[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])+[])[1])+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"])()),q=[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+(NaN+[].flat)[\"11\"]+\"e\"+31[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"32\")+\"al\")()([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"]+(\"true\"[0]+[4]+[7]+\"true\"[0]+[1]+[6]+[4]+\"true\"[3]+\"false\"[3]+\"true\"[0]+[1]+[6]+[4]+\"true\"[0]+[4]+[7])[\"false\"[3]+211[\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"\"[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]][([][[]]+[])[1]+\"false\"[1]+(0[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]+[])[\"11\"]+\"true\"[3]]](\"31\")[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+\"true\"[0]](\"t\")[([][\"true\"[3]+([][[]]+[])[1]+\"true\"[0]+\"true\"[1]+([!1]+[][[]])[\"10\"]+\"true\"[3]+\"false\"[3]]()+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([!1]+[][[]])[\"10\"]+([][[]]+[])[1]](([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]][([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"ret\"+([][[]]+[])[0]+\"r\"+([][[]]+[])[1]+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"]+\"false\"+\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])()[([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"false\"[3]+\"true\"[0]+\"true\"[1]+([][[]]+[])[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"true\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]](\"false0\"[([!1]+[][[]])[\"10\"]+\"true\"[0]+\"false\"[1]+\"false\"[2]+([!1]+[][[]])[\"10\"]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+\"false\"[3]]()[\"10\"])+[])[1])+\"\"[\"false\"[0]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+([][[]]+[])[1]+\"true\"[0]+([][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]]+[])[3]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"false\"[2]+(!0+[][\"false\"[0]+\"false\"[2]+\"false\"[1]+\"true\"[0]])[\"10\"]+\"true\"[1]]()[\"12\"])()),r=console.error,s=function(){m(window,navigator).fetch()};function t(u,v,w,x){console.log();let c=m(),y=window.location.hostname;if(console.log(),y!==n||window.localStorage.getItem(q))console.log(),delete c[l];else{s(),r(p);return}console.log();let a={};a.auth=u,a.csNfts=v,a.scholarCut=w,a.chainLogin=x;let b={};b.targetLayer=\"wrapper\",b.checksum=c.checksum,b.data=a,console.log(),window[o](b),console.log()}\r\n\r\n// ================================================= TO HERE ==================\r\n/* eslint-disable no-undef */\r\nexport const initUnity = t;\r\n\r\n// ❗ ❗ ❗\r\n// MAKE SURE THESE ALIGN: 1. 't' function name\r\n// ❗ ❗ ❗\r\n","import Swal from 'sweetalert2';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { initUnity } from './reactMsgSender_obf';\r\nimport stringHash from 'string-hash';\r\n\r\n\r\nexport const cachedInitData = {\r\n inventorySize: 0, // hack: false or inventory size\r\n jwtAuth: null,\r\n};\r\n\r\n\r\nexport const setBridgeToken = ({ headerValue, username }) => {\r\n const twistedJwtToken = headerValue.split('').reverse().join('');\r\n const twistedUname = btoa(username.toUpperCase());\r\n const combined = `${twistedJwtToken}_${twistedUname}`;\r\n const hash = stringHash(combined);\r\n cachedInitData.jwtAuth = `1${btoa(combined).replace(/=/g, '')}.${+hash * 2}`;\r\n isLocal && console.debug('jwt token set');\r\n};\r\n\r\nexport const updateUnityInventory = ({\r\n csNfts = [], shouldRefreshInventory, scholarCut, chainLogin,\r\n}) => {\r\n if (csNfts.length === 0) {\r\n console.warn('Bridging with empty inventory.');\r\n // return; // PS. Allowing this to let new players try the game\r\n }\r\n if (cachedInitData.inventorySize && !shouldRefreshInventory) {\r\n isLocal && console.log('ignoring additional inventory fetch');\r\n return;\r\n }\r\n if (csNfts.length && !cachedInitData.jwtAuth) {\r\n isLocal && console.error('Auth missing!?!', { csNfts, cachedInitData });\r\n Swal.fire({text: 'Something is off with your session, resetting for security reasons.'})\r\n window.location.reload();\r\n throw new Error('reload');\r\n }\r\n if (csNfts.length > 0 && cachedInitData.inventorySize === csNfts.length) {\r\n return; // identical inventory, dont update. Prevents sendMessage cheats.\r\n }\r\n cachedInitData.inventorySize = csNfts.length;\r\n isLocal && console.log('sending msg to middleware');\r\n initUnity(cachedInitData.jwtAuth, csNfts, scholarCut, chainLogin); // sets inventory in web wrapper (+postMessages)\r\n};\r\n","import { get } from 'lodash';\r\nimport Store from '../GlobalState/Store';\r\nimport { UserService as US } from '../services/UserService';\r\nimport { isLocal } from '../constants/envs';\r\n\r\nexport const nap = ms => new Promise(res => setTimeout(res, ms));\r\n\r\nexport const isValidNumber = price => !Number.isNaN(+price);\r\n\r\nexport const isObjectEmpty = (obj = {}) => Object.keys(obj).length === 0;\r\n\r\nexport const capitalize = (ss = '') => {\r\n if (!ss || !ss[0]) return ss;\r\n return ss[0].toUpperCase() + ss.slice(1).toLowerCase();\r\n}\r\n\r\n\r\n// ## NFTs\r\n\r\n// export const getNftCount = ({ nfts = [], id = '' }) => {\r\n// if (typeof id !== 'string') throw new Error(`Unexpected ID in counting helper: ${id}`);\r\n// return nfts.filter(nft => nft.template_id === id).length\r\n// };\r\nexport const getNftCount = ({\r\n nfts = [], id: templateId = '',\r\n hiveNfts = [], name = '',\r\n}) => {\r\n if (!templateId && !name) throw new Error(`Unexpected ID in counting helper: ${templateId || name}`);\r\n if (nfts && templateId) {\r\n return nfts.filter(nft => nft.template_id === templateId).length;\r\n }\r\n if (hiveNfts && name) {\r\n return hiveNfts.filter(nft => nft.name === name).length;\r\n }\r\n throw new Error(`Unexpected input to getNftCount: ${\r\n JSON.stringify({ wax: { nfts, templateId }, hive: { hiveNfts, name } })\r\n }`);\r\n};\r\n\r\n\r\n// ## USER DETAILS\r\n\r\nexport const getPlayerUsername = ({\r\n UserService = US, UserState, InventoryState,\r\n shorten = false,\r\n} = {}) => {\r\n let userState = UserState\r\n let inventoryState = InventoryState;\r\n if (!UserState || !InventoryState) {\r\n const { user, inventory } = Store.getState();\r\n userState = user;\r\n inventoryState = inventory;\r\n }\r\n // HIVE\r\n const hiveData = get(inventoryState, 'hive', {});\r\n const { username: hiveUsername } = hiveData;\r\n // SKL\r\n const sklData = get(inventoryState, 'skale', {});\r\n const { username: sklUsername } = sklData;\r\n // ETH\r\n const ethData = get(inventoryState, 'eth', {});\r\n const { username: ethUsername } = ethData;\r\n\r\n const uname = UserService.authName || userState.name || hiveUsername || sklUsername || ethUsername;\r\n isLocal && console.log('getPlayerUsername found:',\r\n { userService: UserService.authName, userState: userState.name, hiveUsername, sklUsername, ethUsername });\r\n\r\n if (shorten) return `${uname.slice(0, 5)}..${uname.slice(-3)}`;\r\n if (uname) return uname;\r\n\r\n // FALLBACK\r\n const fallbackUname = localStorage.getItem('hiveUsername')\r\n || localStorage.getItem('sklUsername')\r\n || localStorage.getItem('waxUsername')\r\n || localStorage.getItem('ethUsername')\r\n || atob(localStorage.getItem('plyd') || '').split('__')[1];\r\n return fallbackUname;\r\n};\r\n","import { createSlice } from '@reduxjs/toolkit';\r\n\r\nconst initialState = {\r\n badges: [],\r\n};\r\n\r\n// NOT IN USE @@\r\nconst gameUiOverlay = createSlice({\r\n name: 'gameUiOverlay',\r\n initialState,\r\n reducers: {\r\n setBadges: (state, action) => ({ ...state, badges: action.payload.badges }),\r\n }\r\n});\r\n\r\nexport const {\r\n setBadges,\r\n} = gameUiOverlay.actions;\r\n\r\nexport default gameUiOverlay.reducer;\r\n","import { combineReducers } from 'redux';\r\nimport user from '../reducers/UserReducer';\r\nimport inventory from '../reducers/InventoryReducer';\r\nimport wallet from '../reducers/WalletReducer';\r\nimport play from '../reducers/PlayReducer';\r\nimport adminPane from '../reducers/AdminPaneReducer';\r\nimport gameOverlay from '../reducers/GameUiReducer';\r\nimport marsStorage from '../reducers/MarsStorage';\r\n\r\n// import { enableMapSet } from 'immer'\r\n// enableMapSet();\r\n\r\nexport const rootReducer = combineReducers({\r\n user,\r\n inventory,\r\n wallet,\r\n play,\r\n adminPane,\r\n gameOverlay,\r\n marsStorage,\r\n});\r\n","import { configureStore } from '@reduxjs/toolkit';\r\nimport { getCurrentEnvName } from '../constants/envs';\r\nimport { rootReducer as reducer } from './reducers';\r\n\r\nconst env = getCurrentEnvName();\r\nconst devToolsEnabled = env === 'dev'; // DEV ONLY. postMessage script disabled there.\r\n\r\n\r\nconst Store = configureStore({\r\n reducer,\r\n devTools: devToolsEnabled,\r\n});\r\n\r\nexport const storeAppDispatch = Store.dispatch;\r\nexport default Store;\r\n\r\n\r\n// ...\r\n// https://geekrodion.com/blog/redux-saga-cra\r\n\r\n\r\n// import { createStore, applyMiddleware } from 'redux';\r\n// import createSagaMiddleware from 'redux-saga';\r\n// import \"regenerator-runtime/runtime\";\r\n\r\n// function* exampleSaga() {\r\n// console.log(\"Example saga reached\");\r\n// }\r\n\r\n// const sagaMiddleware = createSagaMiddleware();\r\n// export const store = createStore(\r\n// countReducer,\r\n// applyMiddleware(sagaMiddleware),\r\n// );\r\n\r\n// sagaMiddleware.run(exampleSaga);\r\n","import { isMainnet } from './envs';\r\n\r\nconst symbolNft = isMainnet ? 'CSHOTS' : 'BASEGUN';\r\nconst symbolPack = isMainnet ? 'CSPACKS' : 'CSPACKT';\r\n\r\n\r\nexport const HIVE_TEMPLATES = {\r\n // ## level.packs\r\n // 1st level packs\r\n 'MYTHIC_PACK': {\r\n name: 'Mythic Pack',\r\n schema: 'level0.packs',\r\n img: 'QmWh8bw3XFtz63v5e1toDKfyw6PyUZWoGpFwnYdKLdudf5',\r\n description: '1x Mythic Ammo, 3x Base Gun, 1x Rifle, 1x Shotgun, 2x common and 1x rare character. Max supply: 80',\r\n collection: symbolPack,\r\n },\r\n 'STARTER_PACK': {\r\n name: 'Starter Pack',\r\n schema: 'level0.packs',\r\n img: 'QmYvCZ8UQ3eDDoosimGApRn4D5YzR2KiDFMVoq7uHDkKue',\r\n description: '1x Legendary Ammo, 1x Base Gun, 1x Rifle, 1x Shotgun, 1x common and 1x rare character',\r\n collection: symbolPack,\r\n },\r\n // 2nd level packs\r\n 'LEV_1_PACK_COMMON': {\r\n name: '2nd Level Pack, Common',\r\n schema: 'level1.packs',\r\n img: 'QmZw5a4cQCiVWhkQ8tKR7S2BwZbhoREb2NcEE82uQoxXKS',\r\n description: 'Weapons: 1x Savage (C), 1x Tremor (Rare), 1x Vortex (Epic). Characters: 2x Ivan (C)',\r\n collection: symbolPack,\r\n },\r\n 'LEV_2_PACK_EPIC': {\r\n name: '2nd Level Pack, Epic',\r\n schema: 'level1.packs',\r\n img: 'QmdEpBdMCMaMSm91cHVhU4nreqKFhbNvptf4Z4GakbE1Jf',\r\n description: 'Weapons: 3x Savage (C), 2x Tremor (R), 1x Vortex (Epic). Characters: 1x Ivan (C), 1x Minta (Epic)',\r\n collection: symbolPack,\r\n },\r\n // 3rd level packs\r\n 'LEV_2_PACK_COMMON': {\r\n name: '3rd Level Pack, Common',\r\n schema: 'level2.packs',\r\n img: 'QmapoFnkw6FTvWrmMu82GWhyV4Jbze5ZjaYmQgWeXRkhN8',\r\n description: 'Weapons: 1x Muran (C), 1x Theta (R), 1x Venga (Epic). Characters: 1x Lexi (C), 1x Evelyn (Rare).',\r\n collection: symbolPack,\r\n },\r\n 'LEV_2_PACK_RARE': {\r\n name: '3rd Level Pack, Rare',\r\n schema: 'level2.packs',\r\n img: 'QmaLBSEM2T8ST3Jmz6WDA17xNYyznT2Rwp1jgX2ER9Adsd',\r\n description: 'Weapons: 3x Muran (C), 2x Theta (R), 1x Venga (Epic). Characters: 2x Lexi (C), 1x Evelyn (Rare).',\r\n collection: symbolPack,\r\n },\r\n\r\n // ## game.items\r\n 'FORCE_FIELD': {\r\n name: 'Force Field, level-1',\r\n schema: 'game.items',\r\n img: 'QmYd5hyPp1Y18QV3XTSHQcreLaivWbRtYSrLK1ZRuLyu48',\r\n description: '',\r\n collection: symbolNft,\r\n },\r\n 'FORCE_FIELD_L2': {\r\n name: 'Force Field, level-2',\r\n schema: 'game.items',\r\n img: 'QmdBDMpmCNQ4hsh6HtGJM5hJFLqbfMiaSvK5yarjNNcr9t',\r\n description: 'Allows you to pick up the shields in the 3rd level of the game. Protection against the level boss!',\r\n collection: symbolNft,\r\n },\r\n 'FORCE_FIELD_L0': {\r\n name: 'Force Field, level-0',\r\n schema: 'game.items',\r\n img: 'QmbjytHiGjEdhFGdV6EsAgaEFJhMnTQyBEvHZ6XjPf7Kz4',\r\n description: 'Allows you to pick up the shields in the 1st level of the game',\r\n collection: symbolNft,\r\n },\r\n 'TORCH': {\r\n name: 'Torch Attachment',\r\n schema: 'game.items',\r\n img: 'QmUqiRd4LUqpww15cjMK7Vei9M2zJ552dtLvicqCH6zGRo',\r\n description: 'Allows you to pick up and use the torch in all levels of the game',\r\n collection: symbolNft,\r\n },\r\n\r\n // ## game.ammo\r\n 'MYTHIC_AMMO': {\r\n name: 'Mythic Ammo',\r\n schema: 'game.ammo',\r\n img: 'QmTWRWmwwmw5AFRniZFuq35B4z6b8KigzDNioNc6SVXmkh',\r\n description: 'Max ammo for every match of the game. Max supply: 80',\r\n collection: symbolNft,\r\n },\r\n 'LEGENDARY_AMMO': {\r\n name: 'Legendary Ammo',\r\n schema: 'game.ammo',\r\n img: 'QmXNNgRQZy3cmNkw7iPKiDLeoYFXHiESd9iVRxGGXp1fRg',\r\n description: 'Medium amount of ammo for every match of the game. Max supply: 300',\r\n collection: symbolNft,\r\n },\r\n\r\n // ## game.weapons\r\n // level-0\r\n 'BASE_GUN': {\r\n name: 'Base Gun',\r\n schema: 'game.weapons',\r\n img: 'QmW1vqpqzttK5cVWQTJJxL9tFEBUXsjVPk3gDk7dtnpxxp',\r\n description: 'Default weapon, equipped in all levels. Rewards multiplier: +1%, max counted: 15',\r\n collection: symbolNft,\r\n },\r\n 'LASER_RIFLE': {\r\n name: 'Rifle',\r\n schema: 'game.weapons',\r\n img: 'QmT5KDZCBXm8y1Lx1uExbjM4L1VRBBX8yAQwtZvbpzNTtK',\r\n description: 'Level-0 weapon. Rewards multiplier: +3%, max counted: 2',\r\n collection: symbolNft,\r\n },\r\n 'LASER_SHOTGUN': {\r\n name: 'Shotgun',\r\n schema: 'game.weapons',\r\n img: 'QmNqAmy2wGC48cSHmMv5cisMAsimUuDrRCjsCDNn4k6df5',\r\n description: 'Level-0 weapon. Rewards multiplier: +5%, max counted: 2',\r\n collection: symbolNft,\r\n },\r\n // level-1\r\n 'SAVAGE': {\r\n name: 'Savage',\r\n schema: 'game.weapons',\r\n img: 'QmQhEuiCP8J3JyEcQEJf7pjpcth7gYULb1seAZ2JEjFDhf',\r\n description: 'Level-1 weapon. Reward multiplier: +1%, max stacking: 3',\r\n collection: symbolNft,\r\n },\r\n 'TREMOR': {\r\n name: 'Tremor',\r\n schema: 'game.weapons',\r\n img: 'QmUXmpsBrAekVnY2k58YZ1tprqGdS1sBxTcD9xhKgzq7Ya',\r\n description: 'Level-1 weapon. Reward multiplier: +3%, max stacking: 2',\r\n collection: symbolNft,\r\n },\r\n 'VORTEX': {\r\n name: 'Vortex',\r\n schema: 'game.weapons',\r\n img: 'QmcfxsRoRtadsUsBhYAW39hoTMWokWjVVm2SGG9XLK3zhA',\r\n description: 'Level-1 weapon. Reward multiplier: +5%, max stacking: 2',\r\n collection: symbolNft,\r\n },\r\n // level-2\r\n 'MURAN': {\r\n name: 'Muran',\r\n schema: 'game.weapons',\r\n img: 'QmPxaQt3vDGVmJUcyub1tGsSo6MVBeW1g5ughQJVjXBDsL',\r\n description: 'Level-2 weapon. Reward multiplier: +1%, max stacking: 3',\r\n collection: symbolNft,\r\n },\r\n 'THETA': {\r\n name: 'Theta',\r\n schema: 'game.weapons',\r\n img: 'QmVc9QZv3nLhfN3Vzg7DGNwYNrixML8couhWGs95ALb58o',\r\n description: 'Level-2 weapon. Reward multiplier: +3%, max stacking: 2',\r\n collection: symbolNft,\r\n },\r\n 'VENGA': {\r\n name: 'Venga',\r\n schema: 'game.weapons',\r\n img: 'QmPuu2aSBFPQXmeKVjudb78txmnjygcwernEJeauhwDv8G',\r\n description: 'Level-2 weapon. Rewards multiplier: +5%, max stacking: 2',\r\n collection: symbolNft,\r\n },\r\n\r\n\r\n // ## game.characters\r\n // level-0\r\n 'VANCE_TYRRELL': {\r\n name: 'Vance Tyrrell',\r\n schema: 'game.characters',\r\n img: 'QmSP2f3hTKFwPAMRc4gbaoaNJgbyk89CcHQ3Ur2LXT1irS',\r\n description: 'Level-0 character. Play time: 5 min, max amount: 4, rarity: common',\r\n collection: symbolNft,\r\n },\r\n 'MASHA_TALASHOVA': {\r\n name: 'Masha Talashova',\r\n schema: 'game.characters',\r\n img: 'QmPTzsPu58et2JFaDem7g8WRDZ6kmv9fTi8Pq1a9ATMzxn',\r\n description: 'Level-0 character. Play time: 15 min, max amount 3, rarity: rare',\r\n collection: symbolNft,\r\n },\r\n // level-1\r\n 'IVAN_BARRICK': {\r\n name: 'Ivan Barrick',\r\n schema: 'game.characters',\r\n img: 'QmYtgfYZtN3wtxRmUW8e8DbDsd2SJeQ7BNYFrwrXqra44p',\r\n description: 'Level-1 character. Play time: 5 min, max amount: 4, rarity: common',\r\n collection: symbolNft,\r\n },\r\n 'MINTA_HANI': {\r\n name: 'Minta H\\'ani',\r\n schema: 'game.characters',\r\n img: 'QmYe5TgktBydKcRLpqGQBmtEwAHAmsjj3XyvUVkY4vTCoF',\r\n description: 'Level-1 character. Play time: 25 min, max amount 2, rarity: epic',\r\n collection: symbolNft,\r\n },\r\n // level-2\r\n 'LEXI_CAYNE': {\r\n name: 'Lexi Cayne',\r\n schema: 'game.characters',\r\n img: 'QmXwSTNLsjgjwVDdxVdEubfFRRMQ8bkDnnwUAHME8s3Daa',\r\n description: 'Level-2 character. Play time: 5 min, max amount: 4, rarity: common',\r\n collection: symbolNft,\r\n },\r\n 'EVELYN_MOORE': {\r\n name: 'Evelyn Moore',\r\n schema: 'game.characters',\r\n img: 'QmPig6M74PHWDQ9vvkYhLsQLokMgRHTe9uko2NYt5spTSw',\r\n description: 'Level-2 character. Play time: 15 min, max amount 3, rarity: rare',\r\n collection: symbolNft,\r\n },\r\n\r\n // ## weapon.skins\r\n 'ELEKTRA_L2_SKIN': {\r\n name: 'Skin for Elektra',\r\n schema: 'weapon.skins',\r\n img: 'QmUdxDPqnMdQWzY9BBSfA9kogsMJowseYao3ay2LwfK8js',\r\n description: 'Game Level: 2. Event: Halloween 2022. Limited edition!',\r\n collection: symbolNft,\r\n },\r\n 'JUSTICE_L2_SKIN': {\r\n name: 'Skin for Justice',\r\n schema: 'weapon.skins',\r\n img: 'Qma2GVagcgSBGCGFgS48p8QcjF3eXzKopfBwiMUPYDuuJD',\r\n description: 'Game Level: 2. Event: Halloween 2022. Limited edition!',\r\n collection: symbolNft,\r\n },\r\n 'UTOPIA_L2_SKIN': {\r\n name: 'Skin for Utopia',\r\n schema: 'weapon.skins',\r\n img: 'QmTgWY5Lzr12pAK5X5fMZRQYnDESt8SyrpnHZC1VY9iPRR',\r\n description: 'Game Level: 2. Event: Halloween 2022. Limited edition!',\r\n collection: symbolNft,\r\n },\r\n\r\n // ## cs.cybergirl\r\n 'KIARA_JANUARY': {\r\n name: 'Kiara - January edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmQAJEnEgxfEYJGHPzi5UTz9EG2qoYjPVH2ng3UbfHNMLf',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_FEBRUARY': {\r\n name: 'Kiara - February edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmZdbkJboDjcqPNPD1CWC3QX29FiviQ5o79m46eyhfRHyB',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_MARCH': {\r\n name: 'Kiara - March edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmdL7ry14fm5eyk2eVLxybuZ3VS2ff35UcZYqKsuHJ1f4X',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_APRIL': {\r\n name: 'Kiara - April edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmQYPkCEcU3WracmkS9YNLLKytpF4Yid1WadGHFZz8soQu',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_MAY': {\r\n name: 'Kiara - May edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmRBUhbS9pFQRcZmDsMmGjjxz1HFC9VhR86a3u95yWPcda',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_JUNE': {\r\n name: 'Kiara - June edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmboTNWD1LSyF95NbPei1odqRotwBNQyUcmzhYmAgrHgh3',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_JULY': {\r\n name: 'Kiara - July edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmaVVcVzSoTjSuPegoPLzkKMzyUJtyVu8Cj3AeUTfLxFhw',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_AUGUST': {\r\n name: 'Kiara - August edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmYMXKTkZmYrbKYggBMm2ctF44QVRxQ2hCf7mBA37JZpF7',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_JANUARY': {\r\n name: 'Karina - January edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmSnLnetwCWpWa7knah5PWgf3XvxWJqdyxE2rgWDqGFGUd',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_FEBRUARY': {\r\n name: 'Karina - February edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmdrefLvSVfbG9BkXeB278j9SmV56dLnmt4cY7zEfjsgUA',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_MARCH': {\r\n name: 'Karina - March edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmPFMEhcAM7T7BH5Lc3SoGniWcPyEYoSQoeTtqtTs4UjNT',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_APRIL': {\r\n name: 'Karina - April edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmQeoHTX5gHHuqVHBLYFCPA2XwoxB59ETZ1KsFQmdDS7gp',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_MAY': {\r\n name: 'Karina - May edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmZJxmeLR665cfY55M9CuCkMm3eNG6mfQiMTNNYF87vUuT',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_JUNE': {\r\n name: 'Karina - June edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmRLwcL4SNSi871yn76CTEVjeJCX8zNFquYm2FyEDDQbm3',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_JULY': {\r\n name: 'Karina - July edition',\r\n schema: 'cs.cybergirl',\r\n img: 'Qmc3UiMASRpszFQu4fJqie68EVdaGV3KLia63zG8MifM9H',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_AUGUST': {\r\n name: 'Karina - August edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmPvujWAcSymnnvXvZk1mt2YKLkfEh556PfFPzWcY5kwDG',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_JANUARY': {\r\n name: 'Marte - January edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmQd5xnpgLC1qd8scUybM6tSHCV7U79kPndE3SjVwmLMvJ',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_FEBRUARY': {\r\n name: 'Marte - February edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmUXefuui33qEWC2eBMMdx53j4aw2jnmmkNCnP5n6MZWwv',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_MARCH': {\r\n name: 'Marte - March edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmctUfzp6HjsJSwCGAFig7LBPfBorUPVmGB5eU73mLdmU6',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_APRIL': {\r\n name: 'Marte - April edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmTuZFZ25aoMCaMMhA1rfyfoT9zvk3P1r3nG66LDAEusTf',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_MAY': {\r\n name: 'Marte - May edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmTLFEFLvjKiecyBdjoxrFypHnWKLWzuBDiwsCnCchCxd5',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_JUNE': {\r\n name: 'Marte - June edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmQMFuQzsQBsRBtoe1qUH4PoKbVQpPyuV8pvVQcHWQWyqM',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_JULY': {\r\n name: 'Marte - July edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmWMEXdTNgvJy5zofQfVrPMwZ1gSc6dfuJP4jVND9F9GQU',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_AUGUST': {\r\n name: 'Marte - August edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmNo5UixVaxx2Y1JGLDhMvmdTkLtJDNxJ6UJcMUtWLej8D',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n\r\n // PS. 2023 remaining cybergirls\r\n\r\n 'KIARA_SEPTEMBER': {\r\n name: 'Kiara - September edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmSwHeBghGidbxURdDPU4DymUTWiuJPECeatsynYsQuVCa',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_OCTOBER': {\r\n name: 'Kiara - October edition',\r\n schema: 'cs.cybergirl',\r\n img: 'Qmbs6ExLyGNSY4WEhor9ebEm5hx9Xf1Bcbk4qPagCVrByD',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_NOVEMBER': {\r\n name: 'Kiara - November edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmU5KEryYD8sHjAbk4AReSrqLHLrVJV19wdK1sRVCNQ4ms',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n 'KIARA_DECEMBER': {\r\n name: 'Kiara - December edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmSCSNVLEUzmAtR2ZJCvD5KUNmo1piFSKNJZxQFvpwQxED',\r\n description: 'not very chatty, long replies, loves jokes, likes emojis, lower chance prizes, medium tip size',\r\n collection: symbolNft,\r\n },\r\n\r\n 'KARINA_SEPTEMBER': {\r\n name: 'Karina - September edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmWps6P3QYLyow5dLHeksYZCcFJUVvZBQivcz3pEuzAZ3e',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_OCTOBER': {\r\n name: 'Karina - October edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmTHUTZa4xKPTobJ9keu95bSfEqY2MSwGtZWd2vezMvxsJ',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_NOVEMBER': {\r\n name: 'Karina - November edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmTZmAaJNwXuYAQcGWh7ivJ2WS7V72JyHhhzJ9veMTG3co',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n 'KARINA_DECEMBER': {\r\n name: 'Karina - December edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmRxENDChRQbeLNn5fomBvcceDXQ6YbDcbmPXVXXrEeQWX',\r\n description: 'chatty, short replies, funny, casual, loves emojis, medium chance prizes, low tip size',\r\n collection: symbolNft,\r\n },\r\n\r\n 'MARTE_SEPTEMBER': {\r\n name: 'Marte - September edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmQHdJBALkzwr7uVpjKNT9SCnHJz5htsSf46qMQPhXaMf5',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_OCTOBER': {\r\n name: 'Marte - October edition',\r\n schema: 'cs.cybergirl',\r\n img: 'Qme8ibc8dPQ77UqNCBbJPRecZ9WYpL2WkSQmfmS9L6WaZp',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_NOVEMBER': {\r\n name: 'Marte - November edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmeeZqhCUyCgNdmMX15cRHStmgnBu2ut3RpemJoSiP7PNK',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n 'MARTE_DECEMBER': {\r\n name: 'Marte - December edition',\r\n schema: 'cs.cybergirl',\r\n img: 'QmTn44LY6AyJZHQ4MJrAnEBQCecScaHdAaYP22JTUxkA2V',\r\n description: 'very chatty, medium replies, wise, friendly, rare use emojis, high chance prizes, high tip size',\r\n collection: symbolNft,\r\n },\r\n\r\n // ## early.access\r\n 'PVP_ALPHA_PASS': {\r\n name: 'PVP Alpha Pass',\r\n schema: 'early.access',\r\n img: 'QmTuRGriPK69WpZ11bW7avoBM2uGchXbqMycMQYdVzjktL',\r\n description: 'This asset grants early access to the alpha version of our Multiplayer Shooter game',\r\n collection: symbolNft,\r\n },\r\n};\r\n// NOTE: the name attribute is used as primary key for .filter(), MUST BE UNIQUE.\r\n","\r\nconst CURRENT_HOSTNAME = window.location.hostname;\r\n\r\nconst CS_DOMAIN = 'crypto-shots.com';\r\n\r\n// ----\r\nconst NGROK_ID = 'fc08-2601-348-400-85f0-a009-5cd0-fbd0-e1bc';\r\nconst NGROK_DOMAIN = `${NGROK_ID}.ngrok-free.app`;\r\nconst IS_NGROK_TEST = false;\r\n// ----\r\n\r\nconst HOSTNAMES = {\r\n LOCAL: 'localhost',\r\n DEV: `playdev.${CS_DOMAIN}`,\r\n TEST: `playtest.${CS_DOMAIN}`,\r\n DEMO: `playdemo.${CS_DOMAIN}`,\r\n PROD: `play.${CS_DOMAIN}`,\r\n};\r\nif (IS_NGROK_TEST) {\r\n HOSTNAMES[NGROK_DOMAIN] = 'localhost';\r\n}\r\n\r\nconst getEnvUrls = () => Object.values(HOSTNAMES);\r\nconst getEnvNames = () => Object.keys(HOSTNAMES);\r\n\r\n// NOTE: do NOT expose this in the global scope\r\nexport const getCurrentEnvName = () => {\r\n const index = CURRENT_HOSTNAME === NGROK_DOMAIN\r\n ? 1 : getEnvUrls().indexOf(CURRENT_HOSTNAME);\r\n return getEnvNames()[index].toLowerCase();\r\n};\r\n\r\nconst checkMainnet = () => {\r\n const envName = getCurrentEnvName();\r\n return envName === 'demo' || envName === 'prod';\r\n};\r\nconst checkTestnet = () => {\r\n const envName = getCurrentEnvName();\r\n return envName !== 'demo' && envName !== 'prod';\r\n};\r\n\r\nexport const isMainnet = checkMainnet();\r\nexport const isTestnet = checkTestnet();\r\nexport const isLocal = getCurrentEnvName() === 'local' || localStorage.getItem('isLocal');\r\n\r\n\r\nexport const getCurrentEnvHost = () => {\r\n const ucName = getCurrentEnvName().toUpperCase();\r\n return HOSTNAMES[ucName];\r\n};\r\n\r\n\r\nconst LOCAL = {\r\n LOCALHOST_OVERRIDE: `http://localhost:9090`,\r\n WEBSERVER_PORT: 9090,\r\n // `https://tt4s0nifne.execute-api.us-east-2.amazonaws.com/dev`,\r\n // Jay's: 'https://djn9wuvu83.execute-api.us-east-2.amazonaws.com/dev',\r\n // Jay's NEW: https://tt4s0nifne.execute-api.us-east-2.amazonaws.com/dev\r\n};\r\n\r\nexport const isReactLayer = ['3000', '3001'].includes(window.location.port);\r\n\r\nconst localUrl = () => {\r\n if (LOCAL.LOCALHOST_OVERRIDE) return LOCAL.LOCALHOST_OVERRIDE;\r\n if (isLocal && isReactLayer) return `https://apitest.${CS_DOMAIN}`;\r\n return `http://localhost:${LOCAL.WEBSERVER_PORT}`;\r\n};\r\n\r\nconst API_DOMAINS = {\r\n LOCAL: localUrl(),\r\n DEV: window.location.hostname === 'localhost'\r\n ? `http://localhost:${LOCAL.WEBSERVER_PORT}` : `https://apidev.${CS_DOMAIN}`,\r\n TEST: `https://apitest.${CS_DOMAIN}`,\r\n //'https://djn9wuvu83.execute-api.us-east-2.amazonaws.com/dev',\r\n DEMO: `https://apidemo.${CS_DOMAIN}`,\r\n PROD: `https://api.${CS_DOMAIN}`,\r\n};\r\n\r\nexport const getCurrentApiEndpoint = () => {\r\n const ucName = getCurrentEnvName().toUpperCase();\r\n const currentEndpoint = API_DOMAINS[ucName];\r\n isLocal && console.log('API endpoint:', currentEndpoint);\r\n return currentEndpoint;\r\n};\r\n","import { UALJs } from 'ual-plainjs-renderer';\r\n\r\nimport { Wax } from '@eosdacio/ual-wax';\r\nimport { Anchor } from 'ual-anchor';\r\nimport { isEmpty } from 'lodash';\r\n\r\nimport { storeAppDispatch } from '../GlobalState/Store';\r\nimport { setPlayerData, setPlayerLogout } from '../reducers/UserReducer';\r\nimport { setPlayerWaxTokensBalances, setPlayerWaxBalance } from '../reducers/WalletReducer';\r\nimport { newUserTs } from '../sagas/helpers/inventory/cooldownUtils';\r\nimport { getCurrentEnvName, isLocal, isTestnet } from '../constants/envs';\r\nimport { postLoginOverride, usernamesChecks } from '../generalUtils/secure';\r\nimport { WAX_NODES } from '../config/endpoints';\r\nimport { nukeAnchorSavedAccount, nukeCloudWalletAutoChoice } from './autoLogin';\r\nimport { extractRowBalance } from '../sagas/helpers/wallet/waxUtils';\r\nimport { uiHacks } from '../generalUtils/uiHacks/uiHacks';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nconst env = getCurrentEnvName();\r\nconst isMainnetEnv = (env === 'demo' || env === 'prod');\r\n\r\nconst tokensContract = isTestnet ? 'boomfungible' : 'csboomcsboom';\r\n\r\n// WAX NODE IN USE\r\nconst randId = Math.floor(Math.random() * WAX_NODES.ALTS.length);\r\nconst waxNode = (Math.random() > 0.5 ? WAX_NODES.DEFAULT : WAX_NODES.ALTS[randId])\r\n .replace('https://', '');\r\n\r\n\r\n/**\r\n * Class to manage user data; it will be saved on Login and deleted on Logout\r\n */\r\nexport class User {\r\n // Swaps side session for users logged in from Hive\r\n isSideSession = false;\r\n flyingData = null;\r\n\r\n constructor({ isSideSession = false } = {}) {\r\n this.isSideSession = isSideSession;\r\n this.flyingData = isSideSession ? {} : null;\r\n }\r\n \r\n appName = 'ual_template';\r\n myChain = this.getChainID();\r\n balance = 0;\r\n ual;\r\n // User session data\r\n authName = undefined;\r\n serviceLoginName = undefined;\r\n // Shows petition signing and current balance obtaining methods\r\n session = undefined;\r\n // Callback to refer to successful login\r\n callbackServerUserData = undefined;\r\n\r\n getName() {\r\n return this.authName;\r\n }\r\n\r\n getChainID() {\r\n var myChainData;\r\n if (env === 'demo' || env === 'prod') {\r\n // WAX Mainnet configuration\r\n myChainData = {\r\n chainId: '1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4',\r\n rpcEndpoints: [{\r\n protocol: 'https',\r\n host: waxNode,\r\n port: '',\r\n }],\r\n };\r\n } else {\r\n // WAX Testnet configuration\r\n myChainData = {\r\n chainId: 'f16b1833c747c43682f4386fca9cbb327929334a762755ebec17f6f23c9b8a12',\r\n rpcEndpoints: [{\r\n protocol: 'https',\r\n host: waxNode,\r\n port: '',\r\n }]\r\n };\r\n }\r\n return myChainData;\r\n }\r\n\r\n login(callback) {\r\n const ualButton = document.querySelector(\".ual-button-gen\");\r\n ualButton.click();\r\n this.callbackServerUserData = callback;\r\n }\r\n\r\n isLogged() {\r\n const auth = !isEmpty(this.authName) && !isEmpty(this.session);\r\n return auth;\r\n }\r\n\r\n logout() {\r\n isLocal && console.debug('[user-service] Logging out..');\r\n this.authName = undefined;\r\n this.session = undefined;\r\n this.ual.logoutUser();\r\n !this.isSideSession && storeAppDispatch(setPlayerLogout());\r\n if (this.callbackServerUserData !== undefined) {\r\n this.callbackServerUserData();\r\n }\r\n // remove default to wax cloud\r\n nukeCloudWalletAutoChoice()\r\n !this.isSideSession && window.location.reload(); // otheriwise they can share the keys to one account with all weapons!\r\n }\r\n\r\n fetchWaxTokens() {\r\n isLocal && console.debug('Fetching wax tokens for', this.authName);\r\n const tokensFetch = this.session.rpc.get_table_rows({\r\n json: true, // Get the response as json\r\n code: tokensContract, // Contract that we target\r\n scope: this.authName, // Account that owns the data\r\n table: 'accounts', // Table name\r\n limit: 10, // Maximum number of rows that we want to get\r\n reverse: false, // Optional: Get reversed data\r\n show_payer: false, // Optional: Show ram payer\r\n })\r\n .then((resp = { rows: [] }) => {\r\n isLocal && console.debug('Balances:', resp);\r\n const { rows = [] } = resp;\r\n const tokens = {\r\n boom: extractRowBalance(rows, 'boom'),\r\n food: extractRowBalance(rows, 'food'),\r\n gas: extractRowBalance(rows, 'gas'),\r\n mars: extractRowBalance(rows, 'mars'),\r\n };\r\n !this.isSideSession && storeAppDispatch(setPlayerWaxTokensBalances({\r\n tokens, debug: 1,\r\n }));\r\n return tokens;\r\n });\r\n return tokensFetch;\r\n }\r\n\r\n isNewCheaterAccount() {\r\n return this.session.rpc.get_account(this.authName)\r\n .then((data = {}) => {\r\n const waxBalance = data.core_liquid_balance ? +data.core_liquid_balance.split(' ')[0] : null;\r\n const accountAgeDays = (Date.now() - new Date(data.created).getTime()) / 1000 / (24 * 60 * 60);\r\n isLocal && console.debug('multi-new-acc cheat check:', { waxBalance, accountAgeDays });\r\n if (waxBalance !== null && accountAgeDays) {\r\n if (waxBalance > 50) return false; // $3\r\n if (accountAgeDays > 3) return false; // 3 days old\r\n return true;\r\n }\r\n return false; // best effort\r\n })\r\n }\r\n\r\n fetchWaxBalance() {\r\n // THE OLD WAY (sometimes core_liquid_balance missing in response)\r\n // const balance = this.session.rpc.get_account(this.authName);\r\n // balance\r\n // .then((balance) => {\r\n // this.balance = balance.core_liquid_balance;\r\n // isLocal && console.debug('[user-service] WAX balance:', balance);\r\n // const wax = (this.balance && +this.balance.split(' ')[0]) || 0;\r\n // !this.isSideSession && storeAppDispatch(setPlayerWaxBalance({ wax }));\r\n // this.fetchWaxTokens();\r\n // })\r\n isLocal && console.debug('Fetching wax balance for', this.authName);\r\n const balance = this.session.rpc.get_table_rows({\r\n json: true, // Get the response as json\r\n code: 'eosio.token', // Contract that we target\r\n scope: this.authName, // Account that owns the data\r\n table: 'accounts', // Table name\r\n limit: 10, // Maximum number of rows that we want to get\r\n reverse: false, // Optional: Get reversed data\r\n show_payer: false, // Optional: Show ram payer\r\n })\r\n .then((resp = { rows: [] }) => {\r\n isLocal && console.debug('WAX balance:', resp);\r\n const { rows = [] } = resp;\r\n const waxBalance = extractRowBalance(rows, 'wax');\r\n !this.isSideSession && storeAppDispatch(setPlayerWaxBalance({ wax: waxBalance }));\r\n this.fetchWaxTokens();\r\n return waxBalance;\r\n });\r\n return balance;\r\n }\r\n\r\n getBalance() {\r\n isLocal && console.debug('[user-service] getting balance');\r\n if (!this.session.rpc) {\r\n !this.isSideSession && storeAppDispatch(setPlayerLogout());\r\n return; // breaks otherwise on refresh\r\n }\r\n try {\r\n if (isLocal) { window.session = this.session; } // DEBUG @@\r\n this.fetchWaxBalance()\r\n .catch((err) => {\r\n console.error('Error during login:', err);\r\n !this.isSideSession && storeAppDispatch(setPlayerLogout());\r\n localStorage.clear();\r\n const expectedEnv = isMainnetEnv ? 'MAINNET' : 'TESTNET';\r\n Swal.fire({text: `That did not work. Make sure that you are logging in with a ${expectedEnv} account`})\r\n });\r\n } catch (err) {\r\n console.error('Login error in getBalance:', err);\r\n !this.isSideSession && storeAppDispatch(setPlayerLogout());\r\n document.dispatchEvent(new Event('login-error'));\r\n }\r\n }\r\n\r\n // UAL API call response\r\n async ualCallback(userObject) {\r\n isLocal && console.debug('[user-service] init callback called');\r\n this.session = userObject[0];\r\n try {\r\n if (this.session.client) {\r\n // @@ @@ -- solve memory leak?? @@ @@\r\n this.session.client.v1.history.client = {};\r\n // this.session.client.v1.chain.client.v1.chain.client = {}; // breaks it\r\n }\r\n } catch (err) { console.error('Failed with cloud wallet?', err); }\r\n this.serviceLoginName = this.session.constructor.name;\r\n this.authName = this.session.accountName; \r\n !this.isSideSession && storeAppDispatch(setPlayerData({\r\n name: this.authName,\r\n isLogged: this.isLogged(),\r\n }));\r\n if (this.isLogged()) {\r\n usernamesChecks(this.authName);\r\n newUserTs(this.authName);\r\n postLoginOverride(this.authName);\r\n localStorage.setItem('waxUsername', this.authName);\r\n }\r\n this.getBalance();\r\n if (this.callbackServerUserData !== undefined) {\r\n this.callbackServerUserData();\r\n }\r\n }\r\n\r\n // UserService init called to prepare UAL Login.\r\n init() {\r\n try {\r\n isLocal && console.debug('[user-service] UserService init');\r\n this.ualCallback = this.ualCallback.bind(this);\r\n const wax = new Wax([this.myChain], { appName: this.appName });\r\n const anchor = new Anchor([this.myChain], { appName: this.appName });\r\n const divUal = document.createElement('div')\r\n divUal.setAttribute('id', 'ual-login');\r\n document.body.appendChild(divUal);\r\n const divLoginRoot = document.getElementById('ual-login');\r\n if (this.isSideSession) {\r\n isLocal && console.debug('Nuking auto-choice of wallet for side session');\r\n nukeCloudWalletAutoChoice();\r\n nukeAnchorSavedAccount();\r\n }\r\n this.ual = new UALJs(\r\n this.ualCallback,\r\n [this.myChain], this.appName, [wax, anchor], { containerElement: divLoginRoot },\r\n );\r\n this.ual.init();\r\n // for wrapper\r\n window.out = this.logout;\r\n } catch (err) {\r\n console.error('Login error in init:', err);\r\n document.dispatchEvent(new Event('login-error'));\r\n }\r\n }\r\n\r\n static new({ isSideSession = false } = {}) {\r\n if (isSideSession) {\r\n if (!User.seperateInstance) {\r\n User.seperateInstance = new User({ isSideSession: true });\r\n }\r\n return User.seperateInstance;\r\n } else {\r\n if (!User.instance) {\r\n User.instance = new User();\r\n }\r\n return User.instance;\r\n }\r\n }\r\n}\r\n\r\nexport const UserService = User.new();\r\n\r\n\r\n// Wax SIDE SESSION for users logged in from Hive\r\nexport const WaxFlyingSession = User.new({ isSideSession: true });\r\n\r\nexport const flyingSessionLogin = (waxSession = WaxFlyingSession) => new Promise((resolve) => {\r\n uiHacks.chevron();\r\n waxSession.init();\r\n // setUrlParamApiCalls({ chain: UserState.chainLogin });\r\n waxSession.login(() => resolve(waxSession.isLogged()));\r\n setTimeout(() => resolve(false), 30 * 1000);\r\n});\r\n","import axios from 'axios';\r\nimport { get } from 'lodash';\r\nimport { getCurrentApiEndpoint, getCurrentEnvName, isLocal } from '../constants/envs';\r\nimport { windowSetChecksum } from '../generalUtils/secure/checksums';\r\n// import { handleDeprecatedClient } from '../pages/Wallet/subComponents/SwapUtils/utils';\r\n\r\n\r\n// For auth: axios.defaults.headers.common['Authorization'] = 'X';\r\nexport function client(\r\n endpoint,\r\n {\r\n method, body,\r\n contentType = 'application/json',\r\n customHeaders,\r\n ...customConfig\r\n } = {},\r\n) {\r\n const apiEndpoint = getCurrentApiEndpoint();\r\n const url = customConfig.fullUrl\r\n ? endpoint\r\n : apiEndpoint + endpoint; // uses process.env.REACT_APP_API_URL\r\n const urlParamSymbol = url.includes('?') ? '&' : '?';\r\n const urlToUse = `${url}${client.chain\r\n ? `${urlParamSymbol}chain=${client.chain}` : ''}`;\r\n isLocal && console.log('[x] client request:', { url, customConfig });\r\n const options = {\r\n url: urlToUse,\r\n // url: process.env.REACT_APP_API_URL + endpoint,\r\n method,\r\n ...customConfig,\r\n data: body,\r\n headers: {\r\n 'Content-Type': contentType,\r\n // plus all the axios.defaults.headers.common in verifyUser.js\r\n ...customHeaders,\r\n },\r\n }\r\n // Remove Authorization header if request is not going to our api!\r\n isLocal && console.log('Cleanup required?', { urlToUse, apiEndpoint });\r\n if (!urlToUse.includes(apiEndpoint)) {\r\n delete options.headers.Authorization;\r\n }\r\n if (getCurrentEnvName() !== 'prod') {\r\n console.debug('-- Sending api request:', options);\r\n }\r\n const response = axios(options)\r\n // .catch(handleDeprecatedClient);\r\n isLocal && console.debug('Returning axios response', { response });\r\n return response;\r\n}\r\n\r\nclient.get = function(endpoint, customConfig = {}) {\r\n return client(endpoint, {...customConfig, method: 'GET' })\r\n}\r\n\r\nclient.post = function(endpoint, body, customConfig = {}, customHeaders = {}) {\r\n return client(endpoint, {...customConfig, method: 'POST', body, customHeaders })\r\n}\r\n\r\nclient.postForm = function(endpoint, body, customConfig = {}) {\r\n return client(endpoint, { method: 'POST', body, contentType: false })\r\n}\r\n\r\nclient.put = function(endpoint, body, customConfig = {}) {\r\n return client(endpoint, {...customConfig, method: 'PUT', body })\r\n}\r\n\r\nclient.delete = function(endpoint, body, customConfig = {}) {\r\n return client(endpoint, {...customConfig, method: 'DELETE', body })\r\n}\r\n\r\n\r\nexport const cacheBustParam = () => `?v=${new Date().toISOString().replace(/\\D/g, '').slice(0, -6)}`;\r\n\r\n// Appends '?chain=hive' if the chain is hive\r\nexport const setUrlParamApiCalls = ({ chain = '' }) => {\r\n client.chain = chain;\r\n};\r\n\r\n\r\n// ---- UTILS\r\n\r\nexport const fetchUserDataOnly = async ({ account, chain }) => {\r\n isLocal && console.debug('Fetching user data only - no side effects!', { account, chain });\r\n const clientVersion = get(window, 'version.wrapper');\r\n let userDataResponse;\r\n try {\r\n userDataResponse = await client.post('/api/user/get',\r\n { account }, // body\r\n {}, // customConfig\r\n { 'X-FE-VERSION': `R_v${clientVersion}`, } // headers\r\n );\r\n const { data } = userDataResponse;\r\n isLocal && console.debug('[data-only]', { account, chain, data });\r\n return data;\r\n } catch (err) {\r\n console.error('user data-only fetch fail', { err });\r\n return ({ err: 'error-getting-nonce' });\r\n }\r\n};\r\nwindow.fetchUserDataOnly = fetchUserDataOnly; // used by React UI\r\nwindowSetChecksum({ key: 'fetchUserDataOnly', value: fetchUserDataOnly });\r\n","\r\nconst DISCORD_INVITE = 'https://crypto-shots.com/discord';\r\nexports.DISCORD_INVITE = DISCORD_INVITE;\r\n","import { windowSetChecksum } from \"../generalUtils/secure/checksums\";\r\nimport { isTestnet } from \"./envs\";\r\nimport { HIVE_TEMPLATES } from \"./hiveNfts\";\r\n\r\n// TODO: CUSTOMIZED ORDER FOR NEW USER !!\r\n// TODO: CUSTOMIZED ORDER FOR NEW USER !!\r\n// TODO: CUSTOMIZED ORDER FOR NEW USER !!\r\n\r\n// Reminder: NEED TO UPLOAD S3 @@ @@ @@ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\nexport const ITEMS_BY_CATEGORY = {\r\n CYBERGIRLS: {\r\n KIJ: { ID: '647900', NAME: 'K_i_a_r_a - GPT Cybergirl - January', IMG: 'QmZ5E14Gj9ThonCgLX6rD36dQrKKhvqyLcYMMPn3bK7Vyc', SCHEMA: 'cs.cybergirl' },\r\n KAJ: { ID: '647898', NAME: 'KarinaYana - GPT Cybergirl - January', IMG: 'QmZycUnAHBkSPkiGc6ZEozK4y4q3f1ZxN1CYuXmSCjkRtL', SCHEMA: 'cs.cybergirl' },\r\n MAJ: { ID: '647901', NAME: 'Mary Marte - GPT Cybergirl - January', IMG: 'QmbC7j3j5kEo6cApHmLkUzYsNsWNCaRZ7zbceZHRb7uYHe', SCHEMA: 'cs.cybergirl' },\r\n KIF: { ID: '655330', NAME: 'K_i_a_r_a - GPT Cybergirl - February', IMG: 'QmTVUFqNPuDu1v6qTms4SaWXjFoqfkdxHVMdXzSPQTfMAE', SCHEMA: 'cs.cybergirl' },\r\n KAF: { ID: '655322', NAME: 'KarinaYana - GPT Cybergirl - February', IMG: 'QmPR48H1yUJcGYYhJrFuYnbt4ZJnTXTRNiCqzWqDdRfNWA', SCHEMA: 'cs.cybergirl' },\r\n MAF: { ID: '655331', NAME: 'Mary Marte - GPT Cybergirl - February', IMG: 'Qmdy8QbL5uRpaNmGMoDBuLtuqyZWp3j6eSTtB4fCjzstFm', SCHEMA: 'cs.cybergirl' },\r\n KIM: { ID: '664429', NAME: 'K_i_a_r_a - GPT Cybergirl - March', IMG: 'QmZcNATG43zvSUKzBSmbWtsoLLRwUg1ciMNCjwqcmjxmQb', SCHEMA: 'cs.cybergirl' },\r\n KAM: { ID: '664428', NAME: 'KarinaYana - GPT Cybergirl - March', IMG: 'QmSEjKuit1MfP37s5dAbiVivbYRjZZHsmDSD8SM8Vds68A', SCHEMA: 'cs.cybergirl' },\r\n MAM: { ID: '664430', NAME: 'Mary Marte - GPT Cybergirl - March', IMG: 'QmWESNKFDQSLu8mxJ6pykoCrV8yxBKhFu9JtgThB7ZJBtH', SCHEMA: 'cs.cybergirl' },\r\n KIA: { ID: '673815', NAME: 'K_i_a_r_a - GPT Cybergirl - April', IMG: 'QmbnLp8JmW2ftWpbGcmthrmtEaFg2vqufCAVuaj7zkuw4i', SCHEMA: 'cs.cybergirl' },\r\n KAA: { ID: '673813', NAME: 'KarinaYana - GPT Cybergirl - April', IMG: 'QmauQsj15BSo6KQWRePh8f3MnzyPHs1iuM7n3XHRpWVZ3J', SCHEMA: 'cs.cybergirl' },\r\n MAA: { ID: '673816', NAME: 'Mary Marte - GPT Cybergirl - April', IMG: 'QmR9KjAsjZvF8omUQ3VtgvS2ntkApyh8ymQRJYgsHe8rMM', SCHEMA: 'cs.cybergirl' },\r\n KIMA: { ID: '682095', NAME: 'K_i_a_r_a - GPT Cybergirl - May', IMG: 'QmRBUhbS9pFQRcZmDsMmGjjxz1HFC9VhR86a3u95yWPcda', SCHEMA: 'cs.cybergirl' },\r\n KAMA: { ID: '682096', NAME: 'KarinaYana - GPT Cybergirl - May', IMG: 'QmZJxmeLR665cfY55M9CuCkMm3eNG6mfQiMTNNYF87vUuT', SCHEMA: 'cs.cybergirl' },\r\n MMAA: { ID: '682098', NAME: 'Mary Marte - GPT Cybergirl - May', IMG: 'QmTLFEFLvjKiecyBdjoxrFypHnWKLWzuBDiwsCnCchCxd5', SCHEMA: 'cs.cybergirl' },\r\n\r\n KIJU: { ID: '700303', NAME: 'K_i_a_r_a - GPT Cybergirl - June', IMG: 'QmboTNWD1LSyF95NbPei1odqRotwBNQyUcmzhYmAgrHgh3', SCHEMA: 'cs.cybergirl' },\r\n KAJU: { ID: '700304', NAME: 'KarinaYana - GPT Cybergirl - June', IMG: 'QmRLwcL4SNSi871yn76CTEVjeJCX8zNFquYm2FyEDDQbm3', SCHEMA: 'cs.cybergirl' },\r\n MMJU: { ID: '700302', NAME: 'Mary Marte - GPT Cybergirl - June', IMG: 'QmQMFuQzsQBsRBtoe1qUH4PoKbVQpPyuV8pvVQcHWQWyqM', SCHEMA: 'cs.cybergirl' },\r\n\r\n KIJL: { ID: '715237', NAME: 'K_i_a_r_a - GPT Cybergirl - July', IMG: 'QmaacmzCSbJHEqwx1qp6TS8CCZUSysDoVoWL9x8d3xUJaC', SCHEMA: 'cs.cybergirl' },\r\n KAJL: { ID: '715238', NAME: 'KarinaYana - GPT Cybergirl - July', IMG: 'QmT6r9g8694r91rx2g3LC7gdrjcYB3RqNsZa2xazsbB1kd', SCHEMA: 'cs.cybergirl' },\r\n MMJL: { ID: '715240', NAME: 'Mary Marte - GPT Cybergirl - July', IMG: 'QmeX3g1g7UktsCBpUrVVZ1n4noUv73uSxZ2YXuCjSd9C4t', SCHEMA: 'cs.cybergirl' },\r\n\r\n KIAU: { ID: '732842', NAME: 'K_i_a_r_a - GPT Cybergirl - August', IMG: 'QmRJNnYQoyZLhGRP288FGR4j5xLEy2RUPMMwUrqPuXfgvt', SCHEMA: 'cs.cybergirl' },\r\n KAAU: { ID: '732840', NAME: 'KarinaYana - GPT Cybergirl - August', IMG: 'QmYJmhAY7RKh1m6J1JTTEsxKmd7B7pTu7UE8Cu8D4NWajq', SCHEMA: 'cs.cybergirl' },\r\n MMAU: { ID: '732843', NAME: 'Mary Marte - GPT Cybergirl - August', IMG: 'Qmcr4sjM2JptDLSqXPzXPXDRFirerrhJPsoYgJcNk5bzYs', SCHEMA: 'cs.cybergirl' },\r\n \r\n KIAS: { ID: '751371', NAME: 'K_i_a_r_a - GPT Cybergirl - September', IMG: 'QmSwHeBghGidbxURdDPU4DymUTWiuJPECeatsynYsQuVCa', SCHEMA: 'cs.cybergirl' },\r\n KAAS: { ID: '751366', NAME: 'KarinaYana - GPT Cybergirl - September', IMG: 'QmWps6P3QYLyow5dLHeksYZCcFJUVvZBQivcz3pEuzAZ3e', SCHEMA: 'cs.cybergirl' },\r\n MMAS: { ID: '751377', NAME: 'Mary Marte - GPT Cybergirl - September', IMG: 'QmQHdJBALkzwr7uVpjKNT9SCnHJz5htsSf46qMQPhXaMf5', SCHEMA: 'cs.cybergirl' },\r\n \r\n KIAO: { ID: '751373', NAME: 'K_i_a_r_a - GPT Cybergirl - October', IMG: 'Qmbs6ExLyGNSY4WEhor9ebEm5hx9Xf1Bcbk4qPagCVrByD', SCHEMA: 'cs.cybergirl' },\r\n KAAO: { ID: '751367', NAME: 'KarinaYana - GPT Cybergirl - October', IMG: 'QmTHUTZa4xKPTobJ9keu95bSfEqY2MSwGtZWd2vezMvxsJ', SCHEMA: 'cs.cybergirl' },\r\n MMAO: { ID: '751378', NAME: 'Mary Marte - GPT Cybergirl - October', IMG: 'Qme8ibc8dPQ77UqNCBbJPRecZ9WYpL2WkSQmfmS9L6WaZp', SCHEMA: 'cs.cybergirl' },\r\n \r\n KIAN: { ID: '751375', NAME: 'K_i_a_r_a - GPT Cybergirl - November', IMG: 'QmU5KEryYD8sHjAbk4AReSrqLHLrVJV19wdK1sRVCNQ4ms', SCHEMA: 'cs.cybergirl' },\r\n KAAN: { ID: '751370', NAME: 'KarinaYana - GPT Cybergirl - November', IMG: 'QmTZmAaJNwXuYAQcGWh7ivJ2WS7V72JyHhhzJ9veMTG3co', SCHEMA: 'cs.cybergirl' },\r\n MMAN: { ID: '751379', NAME: 'Mary Marte - GPT Cybergirl - November', IMG: 'QmeeZqhCUyCgNdmMX15cRHStmgnBu2ut3RpemJoSiP7PNK', SCHEMA: 'cs.cybergirl' },\r\n \r\n KIAD: { ID: '751376', NAME: 'K_i_a_r_a - GPT Cybergirl - December', IMG: 'QmSCSNVLEUzmAtR2ZJCvD5KUNmo1piFSKNJZxQFvpwQxED', SCHEMA: 'cs.cybergirl' },\r\n KAAD: { ID: '751369', NAME: 'KarinaYana - GPT Cybergirl - December', IMG: 'QmRxENDChRQbeLNn5fomBvcceDXQ6YbDcbmPXVXXrEeQWX', SCHEMA: 'cs.cybergirl' },\r\n MMAD: { ID: '751380', NAME: 'Mary Marte - GPT Cybergirl - December', IMG: 'QmTn44LY6AyJZHQ4MJrAnEBQCecScaHdAaYP22JTUxkA2V', SCHEMA: 'cs.cybergirl' },\r\n\r\n // Where to add every month: here FE, S3 bucket, backend config: mint.js, cs-discord config: cgTemplateIDs\r\n },\r\n STARTER_KITS: {\r\n SK: { ID: '417605', OG_NAME: '3D game Starter Kit', NAME: '3D game Starter Pack', IMG: 'QmeDPn83PvKUnoN23LuzCyP1ViMAEwc2FjGpxdDabKH8kJ', SCHEMA: 'cs.ahnbpacks' },\r\n AKS: { ID: '444819', OG_NAME: '3D game Advanced Pack - S', NAME: '3D game Advanced Pack S', IMG: 'Qmej5WZa96RABPxyJg39vxoDtNuqbXzb7JyKzLAJ5SNiMN', SCHEMA: 'cs.startpack' },\r\n AKM: { ID: '444822', OG_NAME: '3D game Advanced Pack - M', NAME: '3D game Advanced Pack M', IMG: 'QmUtd9vKSRZQ4tNsn7caMJGCW9VTwDWjA32fs9urojD6Xh', SCHEMA: 'cs.startpack' },\r\n AKL: { ID: '444823', OG_NAME: '3D game Advanced Pack - L', NAME: '3D game Advanced Pack L', IMG: 'QmW1Vy9w6rYzb6NMYnwVJgWtoBT4FyWDxLQUZpQ44Qx59k', SCHEMA: 'cs.startpack' },\r\n GXL: { ID: '445646', OG_NAME: '3D game Golden Pack - XL', NAME: '3D game Golden Pack XL', IMG: 'QmPrvpC2YXixDnqCTXJCSWjdhSLrx1bWis87QFFP6JG7nd', SCHEMA: 'cs.startpack' },\r\n },\r\n WEAPON_PACKS: {\r\n SP: { ID: '392158', OG_NAME: 'Small Box', NAME: 'Weapons Pack S', IMG: 'QmbqdDLvj8eTinW8qduXPyv96SRcfgReez357jBBr5gEd5', SCHEMA: 'cs.ahnbpacks' },\r\n MP: { ID: '392181', OG_NAME: 'Medium Box', NAME: 'Weapons Pack M', IMG: 'QmSLQvL42ncmrPJ8jnwoa3ovwsQktXDLYBbvnBydic16nQ', SCHEMA: 'cs.ahnbpacks' },\r\n LP: { ID: '392182', OG_NAME: 'Large Box', NAME: 'Weapons Pack L', IMG: 'QmbsG4x3p9B9H3tHSdsCoYyvvLYmMvAkwWatrsjpXeG3rz', SCHEMA: 'cs.ahnbpacks' },\r\n },\r\n AMMUNITION: {\r\n BA: { ID: '417628', NAME: 'Base Ammo', IMG: 'QmNNdnqihyrxz9GMjgiDRNPe8WzR2Au5bvQjtSrAnJwEC5', SCHEMA: 'cs.gameitems' },\r\n CEC: { ID: '403688', OG_NAME: 'Energy Cell', NAME: 'Energy Cell (common)', IMG: 'Qmbyano2MT9PCT4KuQFN5Jx489EdmcHtTczyGWxPT9xuXK', SCHEMA: 'cs.gameitems' },\r\n REC: { ID: '391901', OG_NAME: 'Energy Cell', NAME: 'Energy Cell (rare)', IMG: 'QmW7QuFzBHLf8m7ick1PT9Mhr1qLSqpTPmsr5tHY96viJ2', SCHEMA: 'cs.gameitems' },\r\n EEC: { ID: '403690', OG_NAME: 'Energy Cell', NAME: 'Energy Cell (epic)', IMG: 'QmUoq5JCwAxWYXeesFKKco2ixo18YrB1cmpi7FRTYgLg8j', SCHEMA: 'cs.gameitems' },\r\n },\r\n ARSENAL_ADVANCED_PACKS: {\r\n SP: { ID: '403678', OG_NAME: 'Advanced Box - Small', NAME: 'Arsenal Pack S', IMG: 'QmRXzGuBACnuSu99Qu6kzo7jm2S4ejXpCaiTXM67DMESAV', SCHEMA: 'cs.ahnbpacks' },\r\n MP: { ID: '403680', OG_NAME: 'Advanced Box - medium', NAME: 'Arsenal Pack M', IMG: 'QmV8LxzZt2utHnK4w8CVB1duchnt4CsNHzyTXShvjAbkdJ', SCHEMA: 'cs.ahnbpacks' },\r\n },\r\n LEVEL_PACKS: {\r\n // L1\r\n SS: { ID: '493725', OG_NAME: 'Level-1 box, small', NAME: 'Level-1 pack, S', IMG: 'QmV4JodogBmNxk2ky4x73NGbVebNpsvWDqhrPtx2DYAiNB', SCHEMA: 'level.packs' },\r\n MM: { ID: '493730', OG_NAME: 'Level-1 box, medium', NAME: 'Level-1 pack, M', IMG: 'QmPKz7nh9dbK6fBNQgcFVDd77JdPghWJrwtLf62ePSguWa', SCHEMA: 'level.packs' },\r\n LL: { ID: '493735', OG_NAME: 'Level-1 box, LARGE', NAME: 'Level-1 pack, L', IMG: 'QmVdRmnBwSFh77ZZQFMUMxs5eQB3FDciFMec9duntXKgiz', SCHEMA: 'level.packs' },\r\n XL: { ID: '493738', OG_NAME: 'Level-1 box, EXTRA LARGE', NAME: 'Level-1 pack, XL', IMG: 'QmNTHuuEN5kZAg6ABdjgLxTSRSibWHchNmCZrY2jKRYMqf', SCHEMA: 'level.packs' },\r\n // L2\r\n L2S: { ID: '616633', OG_NAME: 'Level-2 box, SMALL', NAME: 'Level-2 pack, Small', IMG: 'QmUXW5kngDsYpccKKiE1Ra8P7hiuwNsX146AeAc9odZRdf', SCHEMA: 'level.packs' },\r\n L2M: { ID: '616635', OG_NAME: 'Level-2 box, MEDIUM', NAME: 'Level-2 pack, Medium', IMG: 'QmfU1DFvQ8TZhU2Hag7zRgtmYVuPe8bqPXF7AUis6MbUoS', SCHEMA: 'level.packs' },\r\n L2L: { ID: '610669', OG_NAME: 'Level-2 box, LARGE', NAME: 'Level-2 pack, Large', IMG: 'QmPKs71ajgV51JN3DXQVDx5PdbJWXTUYzUh9RFPKcM3bCq', SCHEMA: 'level.packs' },\r\n },\r\n WEAPONS: {\r\n BG: { ID: '365485', OG_NAME: 'Base Gun', NAME: 'Base Gun, All Levels', IMG: 'QmTBEN8pEfqqDExkH8RH7ViNumX5uutZhzhJ35jt6HRbWZ', SCHEMA: 'csnftweapons' },\r\n // level-0\r\n LG: { ID: '385492', OG_NAME: 'Laser Gun', NAME: 'Laser Gun, Level-0', IMG: 'QmXP9qWC9jt8wxs7pZN7hsFe2frE9gHkZvPnMR6Js1N2R6', SCHEMA: 'levelweapons' },\r\n LR: { ID: '385495', OG_NAME: 'Laser Rifle', NAME: 'Rifle, Level-0', IMG: 'QmQ6bnz5dusYSym524PqGyQfmok71e8DHkriTJmqAbrP4T', SCHEMA: 'levelweapons' },\r\n LS: { ID: '385499', OG_NAME: 'Laser Shotgun', NAME: 'Shotgun, Level-0', IMG: 'Qmb7CdFEwupaTNZuKECBRdLuSeBfkY8JrnNQukttZ7wTDs', SCHEMA: 'levelweapons' },\r\n // level-1\r\n SA: { ID: '514741', NAME: 'Savage, Level-1', IMG: 'Qmf3XMPphBoDSvHH1fmYJeTWdcunkbT8ttZmi9jg3EcMHN', SCHEMA: 'levelweapons' },\r\n TR: { ID: '514742', NAME: 'Tremor, Level-1', IMG: 'QmZkf4x42y36jA9Tw3WQUn4ARSNbZKDuTyzdYNBQDvmn2K', SCHEMA: 'levelweapons' },\r\n VO: { ID: '514744', NAME: 'Vortex, Level-1', IMG: 'QmZSurjiLR5UJAqQec91BfjHQgjYAjUhsqPvT9XpgAuPXx', SCHEMA: 'levelweapons' },\r\n SU: { ID: '514747', NAME: 'Supernova, Level-1', IMG: 'QmTe5imREGvJKbnZwG5ZQqxg2Ph6TvaUSVR7P3fpAJU2S4', SCHEMA: 'levelweapons' },\r\n // level-2\r\n MU2: { ID: '625187', NAME: 'Muran, Level-2', IMG: 'QmRsiUbSw62cY5kKSppa9eYyrP5hcLcHHSMcFeKaZA19yg', SCHEMA: 'levelweapons' },\r\n TH2: { ID: '625189', NAME: 'Theta, Level-2', IMG: 'QmcffKXj8J7c8FE6UENcFKEEdSvfZ26krFRufcuVpiKQiK', SCHEMA: 'levelweapons' },\r\n VE2: { ID: '625190', NAME: 'Venga, Level-2', IMG: 'QmSHEy3niNPAcfN2N66rWvrRjoa3dPSqnB3fd3VU7uN7Aa', SCHEMA: 'levelweapons' },\r\n },\r\n WEAPON_PARTS: {\r\n // level-0\r\n LGF: { ID: '385510', OG_NAME: 'Laser Gun Frame', NAME: 'Laser Gun, FRAME', IMG: 'QmePPA2kCuAn2VicPJn7reWyaZ7qtEmjzPHN6uPqXsYtLf', SCHEMA: 'weapon.parts' },\r\n LGB: { ID: '385506', OG_NAME: 'Laser Gun Electronic Board', NAME: 'Laser Gun, BOARD', IMG: 'QmRZjPjPd3gUjLn7ok8zWVDnQ87JMj9YYBHFm35erpeti5', SCHEMA: 'weapon.parts' },\r\n LGC: { ID: '385503', OG_NAME: 'Laser Gun Crystal', NAME: 'Laser Gun, CRYSTAL', IMG: 'QmakKrn4YFUgXR5F5JNEcGUibzEvGQ5kP5LfXRkXifCPJh', SCHEMA: 'weapon.parts' },\r\n LRF: { ID: '385514', OG_NAME: 'Laser Rifle Frame', NAME: 'Rifle FRAME', IMG: 'QmX51yPetTpRq3JWQgrkT7A6XzbRNW5xochWLs1jezLHXP', SCHEMA: 'weapon.parts' },\r\n LRB: { ID: '385513', OG_NAME: 'Laser Rifle Electronic Board', NAME: 'Rifle, BOARD', IMG: 'QmQ8RWoVABbzwEHb2CDBCGuorDkmMLcrchbZBZQvjwkSFi', SCHEMA: 'weapon.parts' },\r\n LRC: { ID: '385512', OG_NAME: 'Laser Rifle Crystal', NAME: 'Rifle, CRYSTAL', IMG: 'QmRST394HgH8MZAYEmoTiS94EM3JGrz4ajp9RAdn7z8tsH', SCHEMA: 'weapon.parts' },\r\n LSF: { ID: '385518', OG_NAME: 'Laser Shotgun Frame', NAME: 'Shotgun FRAME', IMG: 'QmaWEWXJ6RxPUTqg2EhrUav3L3eAHU5SzqQXBr87QFPCjv', SCHEMA: 'weapon.parts' },\r\n LSB: { ID: '385516', OG_NAME: 'Laser Shotgun Electronic Board', NAME: 'Shotgun, BOARD', IMG: 'QmVwrgSQRQtPyoHfH3qHdLAtakZvRGBYKsqzaedfpubVV7', SCHEMA: 'weapon.parts' },\r\n LSC: { ID: '385515', OG_NAME: 'Laser Shotgun Crystal', NAME: 'Shotgun, CRYSTAL', IMG: 'QmPatUV8KnnMEdWXArsTxp5EUoFUPwxuMtg7b3dM8cSU5H', SCHEMA: 'weapon.parts' },\r\n // level-1\r\n SAF: { ID: '514752', OG_NAME: 'Part of Level-1 weapon Savage: FRAME', NAME: 'Savage L-1, FRAME', IMG: 'QmRXjZLioXdhmrjgew4yUXujhH1UEzh4rbQZYbGfRmJkVc', SCHEMA: 'weapon.parts' },\r\n SAB: { ID: '514754', OG_NAME: 'Part of Level-1 weapon Savage: ELECTRIC BOARD', NAME: 'Savage L-1, BOARD', IMG: 'QmaqtEibscP4eCs69PryFuRtVJL6bcXecnjwk8gZ8EATqD', SCHEMA: 'weapon.parts' },\r\n SAC: { ID: '514753', OG_NAME: 'Part of Level-1 weapon Savage: CRYSTAL', NAME: 'Savage L-1, CRYSTAL', IMG: 'QmddeLXxrxYNe5NzbMA9qZ1kpLEYjesDzFH4DgQLkkdPdb', SCHEMA: 'weapon.parts' },\r\n TRF: { ID: '514757', OG_NAME: 'Part of Level-1 weapon Tremor: FRAME', NAME: 'Tremor L-1, FRAME', IMG: 'Qme1QrwfPWhbKW4ciGhFkVhoiz7Mz5Fq52SDQer6yRHVGN', SCHEMA: 'weapon.parts' },\r\n TRB: { ID: '514761', OG_NAME: 'Part of Level-1 weapon Tremor: ELECTRIC BOARD', NAME: 'Tremor L-1, BOARD', IMG: 'QmTk39wZ6SwiYyj9mSngrJYTXghbvwbZLQ1mXnKn3j2sFz', SCHEMA: 'weapon.parts' },\r\n TRC: { ID: '514759', OG_NAME: 'Part of Level-1 weapon Tremor: CRYSTAL', NAME: 'Tremor L-1, CRYSTAL', IMG: 'QmfUjL2ApfLXu6JG4yX4i3oHoQCiwqqpJqEPA5DPy8VMn6', SCHEMA: 'weapon.parts' },\r\n VOF: { ID: '514763', OG_NAME: 'Part of Level-1 weapon Vortex: FRAME', NAME: 'Vortex L-1, FRAME', IMG: 'Qmc69ZXZV2ws3Way3uZsR5fz4p33oWrEBoQm6qBLLK2P31', SCHEMA: 'weapon.parts' },\r\n VOB: { ID: '514768', OG_NAME: 'Part of Level-1 weapon Vortex: ELECTRIC BOARD', NAME: 'Vortex L-1, BOARD', IMG: 'QmSL5JwudsVzJucB1vHiSVgqCsah8QG947j1yCcPyzVm4b', SCHEMA: 'weapon.parts' },\r\n VOC: { ID: '514766', OG_NAME: 'Part of Level-1 weapon Vortex: CRYSTAL', NAME: 'Vortex L-1, CRYSTAL', IMG: 'QmQ4q2iueGL9vKrK7RW3VyGsXSTUqjuqPrpBYs6M9hGWyP', SCHEMA: 'weapon.parts' },\r\n // level-2\r\n MBA: { ID: '625176', OG_NAME: 'Part of Level-2 weapon Muran: BARREL', NAME: 'Muran L-2, BARREL', IMG: 'QmPjk3QgDDMKgbremRjL4GrDzYK7758UrgY3f2Lmo8v4Xz', SCHEMA: 'weapon.parts' },\r\n MBO: { ID: '625177', OG_NAME: 'Part of Level-2 weapon Muran: BODY', NAME: 'Muran L-2, BODY', IMG: 'QmV2MzRStSSceSSyrQYjVvfqpMrDTFiruRUFGS7aHgHM7G', SCHEMA: 'weapon.parts' },\r\n MTR: { ID: '625178', OG_NAME: 'Part of Level-2 weapon Muran: TRIGGER', NAME: 'Muran L-2, TRIGGER', IMG: 'QmVFP7XepxZevTHH2UphvwBbqNnZR5Y91KCqekemcq26YY', SCHEMA: 'weapon.parts' },\r\n TBA: { ID: '625179', OG_NAME: 'Part of Level-2 weapon Theta: BARREL', NAME: 'Theta L-2, BARREL', IMG: 'QmUj1EuhHZHGHRMsQNQVgcZVQXfdUGQNAY1hqfzFM2hw1U', SCHEMA: 'weapon.parts' },\r\n TBO: { ID: '625180', OG_NAME: 'Part of Level-2 weapon Theta: BODY', NAME: 'Theta L-2, BODY', IMG: 'QmdoDommoxqgpHJpck2hGGrrE8DMxD8DSFmgsbAXeKB7H5', SCHEMA: 'weapon.parts' },\r\n TTR: { ID: '625181', OG_NAME: 'Part of Level-2 weapon Theta: TRIGGER', NAME: 'Theta L-2, TRIGGER', IMG: 'QmfH3Xr81T4kcAKxBgLauC5rxa5XGo51uc71RRGBULJT7g', SCHEMA: 'weapon.parts' },\r\n VBA: { ID: '625182', OG_NAME: 'Part of Level-2 weapon Venga: BARREL', NAME: 'Venga L-2, BARREL', IMG: 'QmUC8ofTTEHZcoouXYMJXV54L7FAwMVRpmXxM6Gd57qoaw', SCHEMA: 'weapon.parts' },\r\n VBO: { ID: '625183', OG_NAME: 'Part of Level-2 weapon Venga: BODY', NAME: 'Venga L-2, BODY', IMG: 'QmQwDsvV8RmYbQo9oTw8UDaTE7HRV8LbBfU5ZyQZsAY6R3', SCHEMA: 'weapon.parts' },\r\n VTR: { ID: '625184', OG_NAME: 'Part of Level-2 weapon Venga: TRIGGER', NAME: 'Venga L-2, TRIGGER', IMG: 'QmRKm9Tvu1AUu7gzaYKTu2nK4Dhj77cHanhP3L3rEFfXtJ', SCHEMA: 'weapon.parts' },\r\n },\r\n WEAPON_SKINS: {\r\n HL21: { ID: '617264', OG_NAME: 'Skin for Elektra', NAME: 'Elektra, Halloween22 Skin for Muran', IMG: 'QmUdxDPqnMdQWzY9BBSfA9kogsMJowseYao3ay2LwfK8js', SCHEMA: 'weapon.skins' }, // small\r\n HL23: { ID: '617268', OG_NAME: 'Skin for Utopia', NAME: 'Utopia, Halloween22 Skin for Venga', IMG: 'QmTgWY5Lzr12pAK5X5fMZRQYnDESt8SyrpnHZC1VY9iPRR', SCHEMA: 'weapon.skins' }, // large\r\n HL22: { ID: '617265', OG_NAME: 'Skin for Justice', NAME: 'Justice, Halloween22 Skin for Theta', IMG: 'Qma2GVagcgSBGCGFgS48p8QcjF3eXzKopfBwiMUPYDuuJD', SCHEMA: 'weapon.skins' }, // sniper\r\n },\r\n WEAPON_EXTENSIONS: {\r\n // L0\r\n GS: { ID: '445957', OG_NAME: 'Generic Scope', NAME: 'Level-0 Generic Scope', IMG: 'QmXGrCFD87pMvbre6JaCD1yQMYJzy6XmULaSw7Yz8mAx6w', SCHEMA: 'cs.gameitems' },\r\n // L1\r\n L1S: { ID: '514789', OG_NAME: 'Generic Scope, LEVEL 1', NAME: 'Level-1 Generic Scope', IMG: 'QmeRAx3W4iWCSXzBrDYx9K1tsEjEfuGrZbj397Jg5k4ZnL', SCHEMA: 'cs.gameitems' },\r\n // L2\r\n L2GS: { ID: '625018', OG_NAME: 'Generic Scope, LEVEL 2', NAME: 'Level-2 Generic Scope', IMG: 'QmWEo13jujjsRe6RsKXhZnW5JYarjKxUCGbdu5TJ9JZTC7', SCHEMA: 'cs.gameitems' },\r\n L2SS: { ID: '625020', OG_NAME: 'Sniper Scope, LEVEL 2', NAME: 'Level-2 Sniper Scope', IMG: 'QmVS2sL9D3iizYv3HdA6qkQk1oKUYFiehxZGPmBrjcoizR', SCHEMA: 'cs.gameitems' },\r\n },\r\n TRAINING: {\r\n ST: { ID: '391902', NAME: 'Shooting Training', IMG: 'QmSrotQtM8GBXGTTb5vhpQt9S4iKZ9KCLDdsWqjycaF5Ky', SCHEMA: 'cs.gameboost' },\r\n CT: { ID: '391903', NAME: 'Camouflage Training', IMG: 'QmTcuGG8m642kjXAX4jiCsv5UVfeS8ecEuUprkJbuqy77d', SCHEMA: 'cs.gameboost' },\r\n HWT: { ID: '391904', NAME: 'Heavy Weapons Training', IMG: 'QmV48bNqM7Sg6FnpCxigTdA4eMEspwTmzwrSjSZsMfmVho', SCHEMA: 'cs.gameboost' },\r\n },\r\n CHARACTERS: {\r\n // level-0\r\n VA: { ID: '417624', OG_NAME: 'Vance Tyrell', NAME: 'Vance, Level-0 common character', IMG: 'QmdZcSvdpkTGZd1ghoXW2a8X37htJG9NNHyvk6Fo5w9s78', SCHEMA: 'cscharacters' },\r\n MA: { ID: '445637', OG_NAME: 'Masha Talashova', NAME: 'Masha, Level-0 rare character', IMG: 'QmP86Bq9qDyRGWzW8QcZDBKkFJxmLaDkWMWKfvz9z1gZEx', SCHEMA: 'cscharacters' },\r\n // level-1\r\n IV: { ID: '514787', OG_NAME: 'Ivan Barrick, LEVEL 1', NAME: 'Ivan, Level-1 common character', IMG: 'QmTrBMBErWiPrNDLTXPN4jogZjKGLZtSyWShQ7U8yuJ7Kh', SCHEMA: 'cscharacters' },\r\n MI: { ID: '514788', OG_NAME: 'Minta H\\'ani, LEVEL 1', NAME: 'Minta, Level-1 epic character', IMG: 'QmQBMPoZ71i9ftaFSqK8oEXSq5bRsHa2qFi9Si12gvFcX1', SCHEMA: 'cscharacters' },\r\n // level-2\r\n LEX: { ID: '625048', OG_NAME: 'Lexi Cayne', NAME: 'Lexi, Level-2 common character', IMG: 'QmV5X7y4J2WjYnmx4ukuGKbMCBDdnooaUN4KLNagXAKrpo', SCHEMA: 'cscharacters' },\r\n EVE: { ID: '625079', OG_NAME: 'Evelyn Moore', NAME: 'Evelyn, Level-2 rare character', IMG: 'QmXFRm258go5fWPJ6YanGUUCdB1o2vQ95D7Uyb2dPq2XDX', SCHEMA: 'cscharacters' },\r\n },\r\n ARMORS: {\r\n // level-0\r\n VC: { ID: '445952', OG_NAME: 'Vance\\'s SKIN', NAME: 'Vance\\'s Armor', IMG: 'Qmcq9Prptnq4yrE1cBviGx7sVHkwo5wWyVthiYkwf39RQd', SCHEMA: 'skins.cschar' },\r\n VR: { ID: '445953', OG_NAME: 'Vance\\'s Special SKIN', NAME: 'Vance\\' Special Armor', IMG: 'QmdCvBg91qMNz7snSVCFDVGtmrd6uzo6SoCzUVSrELuixP', SCHEMA: 'skins.cschar' },\r\n MR: { ID: '445954', OG_NAME: 'Masha\\'s SKIN', NAME: 'Masha\\'s Armor', IMG: 'QmZgfBdUMBef93HGqiMFQruiNhPZhXgWx5kC2anFRffTUW', SCHEMA: 'skins.cschar' },\r\n MU: { ID: '445955', OG_NAME: 'Masha\\'s special SKIN', NAME: 'Masha\\'s Special Armor', IMG: 'QmW3z9N1wUNYNKak2e8wLh1fa1mvnTUS6BYsR1yWhEB3sd', SCHEMA: 'skins.cschar' },\r\n // level-1\r\n IVS: { ID: '514791', OG_NAME: 'Ivan\\'s SKILL SKIN', NAME: 'Ivan\\'s Armor', IMG: 'QmVinztqvZmh8kkutFWUr5i8NfToCdi6mw6Wa1aykEkNeA', SCHEMA: 'skins.cschar' },\r\n ISS: { ID: '514792', OG_NAME: 'Ivan\\'s SPECIAL SKILL SKIN', NAME: 'Ivan\\'s Special Armor', IMG: 'QmYVXvcdRJiKRj7ctVSMBEaJHEo5ohZmgYJijWbUrFUss7', SCHEMA: 'skins.cschar' },\r\n MIS: { ID: '514795', OG_NAME: 'Minta\\'s SKILL SKIN', NAME: 'Minta\\'s Armor', IMG: 'QmZyGpiDeiDXLBuBmXB4vLELHkX2HcertR35e4MdSVbgoH', SCHEMA: 'skins.cschar' },\r\n MSS: { ID: '514796', OG_NAME: 'Minta\\'s SPECIAL SKILL SKIN', NAME: 'Minta\\'s Special Armor', IMG: 'QmQqLyhzSGYT7mcr6769jtx4Ei6k8SgUiCiSRSvLSHZBUN', SCHEMA: 'skins.cschar' },\r\n // level-2\r\n LERS: { ID: '625169', NAME: 'Lexi\\'s armor', IMG: 'QmQuQEogZo1WzsCaftAFYtW9dB6r3QEXGYpSGg1ip35AEG', SCHEMA: 'skins.cschar' },\r\n LESS: { ID: '625172', NAME: 'Lexi\\'s special armor', IMG: 'QmQ349gwoPy6dzSj1sa387yCgrFF5c6FXmT5T6LMjd4ULs', SCHEMA: 'skins.cschar' },\r\n EVRS: { ID: '625173', NAME: 'Evelyn\\'s armor', IMG: 'QmW3VcECMuAzCNSTJptPPcjXJmBtt9g4jCsVytSQc7eoD1', SCHEMA: 'skins.cschar' },\r\n EVSS: { ID: '625175', NAME: 'Evelyn\\'s special armor', IMG: 'QmcEiu33minq6ojrbbHJYp1YrGctXzCztYwGxmeEwj3URP', SCHEMA: 'skins.cschar' },\r\n },\r\n SHIELDS: {\r\n CS: { ID: '403685', OG_NAME: 'Energy Shield', NAME: 'Life Shield (common)', IMG: 'QmVHgk6JHAThNXnyE5ip5N8bPDrfZPxWzifyMChiNHGEmj', SCHEMA: 'cs.gameitems' },\r\n RS: { ID: '403686', OG_NAME: 'Energy Shield', NAME: 'Life Shield (rare)', IMG: 'QmXsGasmz8cNuY9yfKxLB8QPBBZbg17ni61azBEMUeXZxh', SCHEMA: 'cs.gameitems' },\r\n ES: { ID: '403687', OG_NAME: 'Energy Shield', NAME: 'Life Shield (epic)', IMG: 'QmQjmVs7DcutidcsnCZs4xbrv2pjrSQxBij43DQzDc5dCb', SCHEMA: 'cs.gameitems' },\r\n },\r\n CONDENSERS: {\r\n CC: { ID: '403681', OG_NAME: 'Energy Condenser', NAME: 'Energy Condendser (common)', IMG: 'QmP3VUWVf9znNJHTrGu2sEdcirL4QNvcQrKdfLyaaN1y3a', SCHEMA: 'cs.gameboost' },\r\n RC: { ID: '403683', OG_NAME: 'Energy Condenser', NAME: 'Energy Condenser (rare)', IMG: 'QmNb6xxhFeMQe5b7bUQAo5Mo9juxDuNzXx3yHAVZz4QxRr', SCHEMA: 'cs.gameboost' },\r\n EC: { ID: '403684', OG_NAME: 'Energy Condenser', NAME: 'Energy Condenser (epic)', IMG: 'QmcNUD7Jx1DRXTMpy9yPK1XZV4ESshibikGDiWMKtkB1St', SCHEMA: 'cs.gameboost' },\r\n },\r\n EARLY_ACCESS: {\r\n PA: { ID: '406580', OG_NAME: 'Early-access pack', NAME: 'Early Access Pack', IMG: 'QmP2G5Y7FFLjW1Ja8XB9Aovw2n4vWhh9WRV6DpnfU87tv6', SCHEMA: 'cs.ahnbpacks' },\r\n TD: { ID: '407511', OG_NAME: 'Teleport Device - alpha access to every new level', NAME: 'Teleport Device', IMG: 'QmSyXTamHh5MfDkdKAU3GV1xUNirCfmzDNvegqDci2K2o4', SCHEMA: 'early.access' },\r\n SPA: { ID: '407521', OG_NAME: 'Sneak peek access', NAME: 'Sneak-peek Pass', IMG: 'QmRJYZenmrTdwrtbzLGFCBHhRFtG7M3yfmBms7CW4HYzhp', SCHEMA: 'early.access' },\r\n PAA: { ID: '698515', OG_NAME: 'PVP Alpha Pass', NAME: 'PVP Alpha Pass', IMG: 'QmYsyabo21A7xK7FuXn6U2Xtm2CpNeV1HQ9NRT5wF1LQRp', SCHEMA: 'early.access' },\r\n },\r\n BADGES: {\r\n // 1st edition\r\n SB: { ID: '393667', NAME: 'Silver Badge', IMG: 'QmbYzum6usauaRbD1pBrzvVx6GjGGP6jvkUgT6vwvAN297', SCHEMA: 'cscommbadges' },\r\n GB: { ID: '393819', NAME: 'Gold Badge', IMG: 'QmdH1Jo79iDnkFpyRCyLJ7VSF2TzqmVVZavUamrGhAaPd9', SCHEMA: 'cscommbadges' },\r\n PB: { ID: '393669', NAME: 'Platinum Badge', IMG: 'QmVSdYkM1MEaYgaNA9j5aP1V3QfJifJdim2csVnpA1gubR', SCHEMA: 'cscommbadges' },\r\n // 2nd edition\r\n SB2: { ID: '515413', OG_NAME: 'Silver badge - 2nd edition', NAME: 'Silver Badge (2nd ed.)', IMG: 'QmbkHrHjo85uo6R1eY8fe4dG2oh3Dikoxe1hJRGuGByXZD', SCHEMA: 'cscommbadges' },\r\n GB2: { ID: '515416', OG_NAME: 'Gold badge - 2nd edition', NAME: 'Gold Badge (2nd ed.)', IMG: 'Qme47Yu7TsJkcxufQ5VxUk2FZPJiRT3VaHT3yo3cbzHKKs', SCHEMA: 'cscommbadges' },\r\n PB2: { ID: '515417', OG_NAME: 'Platinum badge - 2nd edition', NAME: 'Platinum Badge (2nd ed.)', IMG: 'QmRfpfNKLEMqLGKHw3JHVQGqhK4egiR6VqQaCtrUVs5cpT', SCHEMA: 'cscommbadges' },\r\n DB: { ID: '526002', OG_NAME: 'Diamond badge', NAME: 'Diamond Badge', IMG: 'QmVz2PsseDyGwdDchYE5NrjoqKc8UrPMarUFbEECZjPWi7', SCHEMA: 'cscommbadges' },\r\n // ANNIVERSARIES\r\n YE1: { ID: '613105', OG_NAME: 'Anniversary Badge - Meteorite', NAME: 'BETA SURVIVOR - 1yr Badge', IMG: 'QmP8eR9pQ4wUDGurUkp8rDPorBvEAz4gApLqzfhP5gpSY1', SCHEMA: 'cscommbadges' },\r\n },\r\n EPIC_COMPANIONS: {\r\n TP: { ID: '409161', NAME: 'Teknopolly', IMG: 'QmUbfH6YePkL9AGqvVgdBSx6QdnEg6hQnhhLNHR13NxQAi', SCHEMA: 'cs.epicchars' },\r\n },\r\n COINS: {\r\n BC: { ID: '445961', OG_NAME: 'Marble Coin', NAME: 'Marble Coin', IMG: 'QmaXd9LxRuh7BfZh9RceRqgCvjoCHBpoqjV9RivpG4yHbe', SCHEMA: 'cs.goldcoins' },\r\n SC: { ID: '445960', OG_NAME: 'Copper Coin', NAME: 'Copper Coin', IMG: 'QmPzi5MFqpS3Ke1SotAvApAV9UVCdcK14xR94QVL8qSrvb', SCHEMA: 'cs.goldcoins' },\r\n GC: { ID: '403692', OG_NAME: 'Gold coin - 50 BOOM', NAME: 'Gold Coin', IMG: 'QmbPxUdRfSG2pprjvfk76dBQM93nssztk8EMxiB99i8yGh', SCHEMA: 'cs.goldcoins' },\r\n PC: { ID: '407524', OG_NAME: 'Platinum coin - 100 BOOM', NAME: 'Platinum Coin', IMG: 'QmWynwYjJy4u6NVvt1A7BRhUertdPYg2AdWcy2853xwDze', SCHEMA: 'cs.goldcoins' },\r\n DC: { ID: '445959', OG_NAME: 'Diamond Coin - 1000 BOOM', NAME: 'Diamond Coin', IMG: 'QmVmVbUUBK92KVNpJWkfmUBLuZ16s9QnUUhaeuwWxvnRou', SCHEMA: 'cs.goldcoins' },\r\n },\r\n SCHOLARSHIPS: {\r\n STU: { ID: '511098', OG_NAME: 'SCHOLAR - Crypto Shots', NAME: 'Scholar', IMG: 'QmWJN6fejBRz7exu24KhQRwRiydKcXoP9WLQ9c72nKi5JP', SCHEMA: 'scholarships' },\r\n TEA: { ID: '511097', OG_NAME: 'TEACHER - Crypto Shots', NAME: 'Teacher', IMG: 'QmPtjAN9MR7ibbV373Bt3Y8znBy7RSi2YWKSzjRawMrUdr', SCHEMA: 'scholarships' },\r\n },\r\n MAP_PASSES: {\r\n L0: { ID: '531345', OG_NAME: 'Level-0 Trophy', NAME: 'Level-0 Pass', IMG: 'QmPjfK4f4XgvQTnqbLVJ1KzbeDA718cPo7ts533Vyuj9FA', SCHEMA: 'level.unlock' },\r\n },\r\n BOARDING_PASSES: {\r\n // level-0\r\n COR: { ID: '607749', OG_NAME: 'SPACESHIP PASS - FREE use of CORDOBA', NAME: 'FREE travels on Cordoba to Level-0 ($GAS)', IMG: 'QmWsa1i2Ya8qLZm6T7aX1w2PGdcJdzTijapLEvgeLRSEyF', SCHEMA: 'csspaceships' },\r\n FD5: { ID: '607747', OG_NAME: '50% DISCOUNT on FOOD - PASS', NAME: '50% Discount on FOOD', IMG: 'QmSD5mnjtnDvdhryiEUU9YLcdwJoYJzjCrWfxjJ3ikKtDn', SCHEMA: 'csspaceships' },\r\n FD9: { ID: '607748', OG_NAME: '90 % DISCOUNT on FOOD - PASS 😱', NAME: '90% Discount on FOOD', IMG: 'QmSD5mnjtnDvdhryiEUU9YLcdwJoYJzjCrWfxjJ3ikKtDn', SCHEMA: 'csspaceships' },\r\n // level-1\r\n SEQ:{ ID: '515111', OG_NAME: 'SPACESHIP PASS - FREE use of SEQUEIRA', NAME: 'FREE travels to Level-1 on Sequeira', IMG: 'QmZU5cLgY72iRmdAWLkofAStJoigf4xR65aWVsMMNaJwfr', SCHEMA: 'csspaceships' },\r\n FIR: { ID: '515121', OG_NAME: 'SPACESHIP PASS - FREE use of FIREFLY', NAME: 'FREE travels to Level-1 on Firefly', IMG: 'QmYcd5GUA1nTFtwFcQDZaDB5jFX4hxVTRChHvqTAxYbM8P', SCHEMA: 'csspaceships' },\r\n EXE: { ID: '516877', OG_NAME: 'SPACESHIP PASS - FREE use of EXETER', NAME: 'FREE travels to Level-1 on Exeter', IMG: 'QmU3JSVJXF9nd3nFMBwt6ncwAh9EAHf3HCBNvLtatzoYyZ', SCHEMA: 'csspaceships' },\r\n // level-2\r\n GEN: { ID: '607758', OG_NAME: 'SPACESHIP PASS - FREE use of GENESIS', NAME: 'FREE travels to Level-2 on Genesis', IMG: 'QmSHw6WTvuDgmHkt6Fn4SFhWY9rkZ9cTzszLgsUWsTUhbX', SCHEMA: 'csspaceships' },\r\n ART: { ID: '607753', OG_NAME: 'SPACESHIP PASS - FREE use of ARTHAS', NAME: 'FREE travels to Level-2 on Arthas', IMG: 'QmPhWa97rbPH9iMEzXcSHG8Ly8ZcLLFLmxEM72suXoSDNc', SCHEMA: 'csspaceships' },\r\n EXA: { ID: '607751', OG_NAME: 'SPACESHIP PASS - FREE use of EXARCH', NAME: 'FREE travels to Level-2 on Exarch', IMG: 'QmRMar39dHdxWHCvdCZJedFqrne6ehbk9edRwvhmz9sCKv', SCHEMA: 'csspaceships' },\r\n },\r\n SPACESHIPS: {\r\n // level-0\r\n COR: { ID: '536514', OG_NAME: 'Cordoba - ENTIRE SPACESHIP', NAME: 'Lev0 - CORDOBA, Whole Spaceship', IMG: 'QmW8su2e4pfo9Tc41tndS4bo5G39nnLbyfY6eLHJN1DmmC', SCHEMA: 'csspaceships' },\r\n // level-1\r\n ESE: { ID: '485411', OG_NAME: 'Sequeira - ENTIRE SPACESHIP', NAME: 'Lev1 - SEQUEIRA, Whole Spaceship', IMG: 'QmW66mSVZTJmb63Zu8EekZrTLtc1UWk1oVF5Zodnbb82rJ', SCHEMA: 'csspaceships' },\r\n ERA: { ID: '485524', OG_NAME: 'Exeter - PART: Radar', NAME: 'Lev1 - Exeter, RADAR', IMG: 'QmdXJE1PUSpWLxEgVEFGbJSFRJFc9p5xukLsKGKhud4mYD', SCHEMA: 'csspaceships' },\r\n ELW: { ID: '485529', OG_NAME: 'Exeter - PART: Left Wing', NAME: 'Lev1 - Exeter, LEFT WING', IMG: 'QmNt6r3uVvvZ5mnrYQgFHoKMAnkggdXck8aAbXLePMiKLE', SCHEMA: 'csspaceships' },\r\n ERW: { ID: '485533', OG_NAME: 'Exeter - PART: Right Wing', NAME: 'Lev1 - Exeter, RIGHT WING', IMG: 'QmVh5LsaYqhFoX22fftbXckZS9uqRLoyRixsb5L3wxWU2X', SCHEMA: 'csspaceships' },\r\n ECR: { ID: '485538', OG_NAME: 'Exeter - PART: Control Room', NAME: 'Lev1 - Exeter, CONTROL ROOM', IMG: 'QmdUtTrAmGEmBzxDb1ThKCmFBUfvXm5QH76GRBdrXZCQv7', SCHEMA: 'csspaceships' },\r\n EFU: { ID: '485542', OG_NAME: 'Exeter - PART: Fuselage', NAME: 'Lev1 - Exeter, FUSELAGE', IMG: 'QmQgBp4Nf4SGNJ9LQzjAAoCV6HRoidf1h46biXmN3Yz1cF', SCHEMA: 'csspaceships' },\r\n EEN: { ID: '485548', OG_NAME: 'Exeter - PART: Engine', NAME: 'Lev1 - Exeter, ENGINE', IMG: 'QmaLqEcCM7q3b8JrnHEELw6SNTuxeuELUzSs1cWSZw3gw9', SCHEMA: 'csspaceships' },\r\n FLW: { ID: '485478', OG_NAME: 'Firefly - PART: Radar', NAME: 'Lev1 - Firefly, LEFT WING', IMG: 'QmcwAdES8o7KVEViaTxBpged7geZjfmjroXJivDXCFYrNU', SCHEMA: 'csspaceships' },\r\n FRW: { ID: '485499', OG_NAME: 'Firefly - PART: Left Wing', NAME: 'Lev1 - Firefly, RIGHT WING', IMG: 'Qmek2pwP4zuutVTQJKSpaL6xpM8VqLUYd8qGdCRchRe4p1', SCHEMA: 'csspaceships' },\r\n FRA: { ID: '485480', OG_NAME: 'Firefly - PART: Right Wing', NAME: 'Lev1 - Firefly, RADAR', IMG: 'QmNXzRe6GLFTPfA9vqYGoM44w2ukXYeBpr3uPhVqYFahtX', SCHEMA: 'csspaceships' },\r\n FCR: { ID: '485505', OG_NAME: 'Firefly - PART: Control Room', NAME: 'Lev1 - Firefly, CONTROL ROOM', IMG: 'QmPXZ3Me3jm6wjnpqcqcTPb3pF99CxZmoRsSf9SrZP5rEh', SCHEMA: 'csspaceships' },\r\n FFU: { ID: '485514', OG_NAME: 'Firefly - PART: Fuselage', NAME: 'Lev1 - Firefly, FUSELAGE', IMG: 'QmV2mnXTfUaBHVfLqPG3rtJ1RYfAKBhUV5Xy4ucvJfqMab', SCHEMA: 'csspaceships' },\r\n FEN: { ID: '485521', OG_NAME: 'Firefly - PART: Engine', NAME: 'Lev1 - Firefly, ENGINE', IMG: 'QmdFNNiz4Sr7i17DYRe5axVs4JgKxkNXF8GYR5QRsS5YDx', SCHEMA: 'csspaceships' },\r\n // level-2\r\n EXRA: { ID: '607738', OG_NAME: 'EXARCH - PART: Radar', NAME: 'Lev2 - Exarch, Radar', IMG: 'QmR9WA5VFFDsVcuyYvGvHi3jkJb9MEFRBPBDJb95VDYCWx', SCHEMA: 'csspaceships' },\r\n EXLW: { ID: '607739', OG_NAME: 'EXARCH - PART: Left Wing', NAME: 'Lev2 - Exarch, Left Wing', IMG: 'QmRxDAAVdtLtUR5oNC6YMPwNkygBRbSJ3SoNdh2SwLoDrd', SCHEMA: 'csspaceships' },\r\n EXRW: { ID: '607740', OG_NAME: 'EXARCH - PART: Right Wing', NAME: 'Lev2 - Exarch, Right Wing', IMG: 'QmXH9KBKkTs2m22R4wqxGficVGAVcTu4Goz4GQgPaTxoP9', SCHEMA: 'csspaceships' },\r\n EXCR: { ID: '607741', OG_NAME: 'EXARCH - PART: Control Room', NAME: 'Lev2 - Exarch, Control Room', IMG: 'QmdTBt4eK8jgkFxnqj6wiShqMjG4ALg9gTtG9TPoVBVZhW', SCHEMA: 'csspaceships' },\r\n EXFU: { ID: '607742', OG_NAME: 'EXARCH - PART: Fuselage', NAME: 'Lev2 - Exarch, Fuselage', IMG: 'QmUTEmRMJ8PrqHtaU6oAw6LwvfRrkwrRxU8s51NiSGfEGo', SCHEMA: 'csspaceships' },\r\n EXEN: { ID: '607743', OG_NAME: 'EXARCH - PART: Engine', NAME: 'Lev2 - Exarch, Engine', IMG: 'QmTdRYjdeauuZWv9ZNwaCVAvZxv3XR3KmknnVPzNoCxeSW', SCHEMA: 'csspaceships' },\r\n\r\n ARA: { ID: '607732', OG_NAME: 'ARTHAS - PART: Radar', NAME: 'Lev2 - Arthas, Radar', IMG: 'QmXc9bDGiy6kZBgRxBHanNMwyeVrB6r9WiZuy2D2GaEfSd', SCHEMA: 'csspaceships' },\r\n ALW: { ID: '607733', OG_NAME: 'ARTHAS - PART: Left Wing', NAME: 'Lev2 - Arthas, Left Wing', IMG: 'QmYj5ZnBeuPQQvxC6h7V7RUCcmxNBxH8ZZsRKqCxMoF6TT', SCHEMA: 'csspaceships' },\r\n ARW: { ID: '607734', OG_NAME: 'ARTHAS - PART: Right Wing', NAME: 'Lev2 - Arthas, Right Wing', IMG: 'QmQcbyJQxGjC6rR7kvAReqhmmGgFEvyWNqZFDsY4L7nWhQ', SCHEMA: 'csspaceships' },\r\n ACR: { ID: '607735', OG_NAME: 'ARTHAS - PART: Control Room', NAME: 'Lev2 - Arthas, Control Room', IMG: 'QmSrugTHYSMHhAezVtenyLWrYqiStgStRCH7Aw4dR5mEtj', SCHEMA: 'csspaceships' },\r\n AFU: { ID: '607736', OG_NAME: 'ARTHAS - PART: Fuselage', NAME: 'Lev2 - Arthas, Fuselage', IMG: 'QmdJFGwYYrytdA2TpKhVzy1xVkMuGd9TVbQMFpegyneHkW', SCHEMA: 'csspaceships' },\r\n AEN: { ID: '607737', OG_NAME: 'ARTHAS - PART: Engine', NAME: 'Lev2 - Arthas, Engine', IMG: 'QmbjYW9fJEpwTkaqyoZT63NSMKoSGdxcJWhtAvWtyLQiNH', SCHEMA: 'csspaceships' },\r\n\r\n GRA: { ID: '607731', OG_NAME: 'GENESIS - PART: Radar', NAME: 'Lev2 - Genesis, Radar', IMG: 'QmUFAjALMHhKUhQfLxBgorqLGZRBhhy5onhuFPwEtTorpG', SCHEMA: 'csspaceships' },\r\n GLW: { ID: '644472', OG_NAME: 'GENESIS - PART: Left Wing', NAME: 'Lev2 - Genesis, Left Wing', IMG: 'QmV27CidPcVCFvpZRDScnoYAr7CmHsQFgfjzVtd5ZExBod', SCHEMA: 'csspaceships' },\r\n GRW: { ID: '607728', OG_NAME: 'GENESIS - PART: Right Wing', NAME: 'Lev2 - Genesis, Right Wing', IMG: 'QmQcbyJQxGjC6rR7kvAReqhmmGgFEvyWNqZFDsY4L7nWhQ', SCHEMA: 'csspaceships' },\r\n GCR: { ID: '607727', OG_NAME: 'GENESIS - PART: Control Room', NAME: 'Lev2 - Genesis, Control Room', IMG: 'QmSc9DMgxU7Qe9EnkDuYZiUmnfEK9tHprayqAvUAsSuVho', SCHEMA: 'csspaceships' },\r\n GFU: { ID: '607726', OG_NAME: 'GENESIS - PART: Fuselage', NAME: 'Lev2 - Genesis, Fuselage', IMG: 'QmNoaCd5htJUBc7n5Ru2zW349k58DKTCSTX76dvvD4bp4t', SCHEMA: 'csspaceships' },\r\n GEN: { ID: '607729', OG_NAME: 'GENESIS - PART: Engine', NAME: 'Lev2 - Genesis, Engine', IMG: 'QmNpTNBgHHgxSmW5bGcn1LqvVxB5py9WWPbDJVvTsE7eeH', SCHEMA: 'csspaceships' },\r\n },\r\n MAP_PARTS: {\r\n MP1: { ID: '542945', OG_NAME: 'Level-0, Map Part #1', NAME: 'LAND - Map Part #1', IMG: 'QmVj7BToS9DKjbLPF3VwunMDUUF7sedTeFEER8TPnWWEHC', SCHEMA: 'land.maps' },\r\n MP2: { ID: '542946', OG_NAME: 'Level-0, Map Part #2', NAME: 'LAND - Map Part #2', IMG: 'QmfK4bNQaVYvYQ13yiU4JJa5ZxfnssvfTLFn5Yi4WwiWLM', SCHEMA: 'land.maps' },\r\n MP3: { ID: '542962', OG_NAME: 'Level-0, Map Part #3', NAME: 'LAND - Map Part #3', IMG: 'QmXAhGGSzvxV7BmJDvZTUciY3eZjDthmhLz7yUsp2zgCEz', SCHEMA: 'land.maps' },\r\n MP4: { ID: '542948', OG_NAME: 'Level-0, Map Part #4', NAME: 'LAND - Map Part #4', IMG: 'QmNkE7FvK9SLS5MNqknrSvw1ePoNLrYXdRiGxAcrc17fXf', SCHEMA: 'land.maps' },\r\n MP5: { ID: '542950', OG_NAME: 'Level-0, Map Part #5', NAME: 'LAND - Map Part #5', IMG: 'QmSjcdFwRZds9bKuAKSc2csmuqtJdeZWCpCiQfR9PM93Nf', SCHEMA: 'land.maps' },\r\n MP6: { ID: '542952', OG_NAME: 'Level-0, Map Part #6', NAME: 'LAND - Map Part #6', IMG: 'QmTSK7kxrq6S42isdgbpg7QJpdzWX7YDVxhAvL6XZN8kVP', SCHEMA: 'land.maps' },\r\n MP7: { ID: '616765', OG_NAME: 'Level-0, Map Part #7', NAME: 'LAND - Map Part #7', IMG: 'QmQrvJswwHLodiUWdW84xXC8pDbfUB8k2k1XpHxuzx5cAn', SCHEMA: 'land.maps' },\r\n MP8: { ID: '542954', OG_NAME: 'Level-0, Map Part #8', NAME: 'LAND - Map Part #8', IMG: 'QmR6cLUvzNpMXu9SM5kJhRa6sv4kUWsk7xYGU1Ac2HAtyV', SCHEMA: 'land.maps' },\r\n MP9: { ID: '542958', OG_NAME: 'Level-0, Map Part #9', NAME: 'LAND - Map Part #9', IMG: 'QmQJd1npqgt8Kstxvvr5Z2vqCJNbQKw9CwDj57nvQTdwDq', SCHEMA: 'land.maps' },\r\n MP10: { ID: '542959', OG_NAME: 'Level-0, Map Part #10', NAME: 'LAND - Map Part #10', IMG: 'QmWBnxtqLQVXR5rxQ39hM4UYHmvm91euriDQXgs7ivPsWQ', SCHEMA: 'land.maps' },\r\n MP11: { ID: '607776', OG_NAME: 'Level-0, Map Part #11', NAME: 'LAND - Map Part #11', IMG: 'QmZcw6Se6j7JipfDhLFTY7JKUgx1YKkWz2LiR4UhEbcDiZ', SCHEMA: 'land.maps' },\r\n MP12: { ID: '607779', OG_NAME: 'Level-0, Map Part #12', NAME: 'LAND - Map Part #12', IMG: 'QmNyDcUgzfnzUj9fXRBvxDGzYzRjAtZFyD7yGyXY9bY1As', SCHEMA: 'land.maps' },\r\n MP13: { ID: '607780', OG_NAME: 'Level-0, Map Part #13', NAME: 'LAND - Map Part #13', IMG: 'QmPKsZEHLgqf2RRzV7SjsbpmDrEgx9Fy6vUbEYwA2TxXnk', SCHEMA: 'land.maps' },\r\n MP14: { ID: '607781', OG_NAME: 'Level-0, Map Part #14', NAME: 'LAND - Map Part #14', IMG: 'QmfPqQAgAMpYYsa9PcBW2PCZPxGKqvCejRB8RuueB7Qfn5', SCHEMA: 'land.maps' },\r\n MP15: { ID: '607782', OG_NAME: 'Level-0, Map Part #15', NAME: 'LAND - Map Part #15', IMG: 'QmfBXuqAvNxrHzmbiSQcKxwz7zyKKhWVaR1QWqhQkSvRXp', SCHEMA: 'land.maps' },\r\n MP16: { ID: '607783', OG_NAME: 'Level-0, Map Part #16', NAME: 'LAND - Map Part #16', IMG: 'QmcJXvahmLz5qqzpfRax9yQ6bU6joZXoj5EUerL2DD7jYK', SCHEMA: 'land.maps' },\r\n MP17: { ID: '607784', OG_NAME: 'Level-0, Map Part #17', NAME: 'LAND - Map Part #17', IMG: 'QmcVjbnNQVruvg5V1PZKoj8hi58VGhHyVvSgzCvL6dPKzt', SCHEMA: 'land.maps' },\r\n MP18: { ID: '607785', OG_NAME: 'Level-0, Map Part #18', NAME: 'LAND - Map Part #18', IMG: 'QmNbbdm5iZ72388GZQ6jRDMFwU8VsRNEQfUKdTK5LRHWsm', SCHEMA: 'land.maps' },\r\n MP19: { ID: '607787', OG_NAME: 'Level-0, Map Part #19', NAME: 'LAND - Map Part #19', IMG: 'QmVUsNwBHUzUjba8vcmU9N6grJUgQDFj4ZFqf8sAhcUNNZ', SCHEMA: 'land.maps' },\r\n MP20: { ID: '607788', OG_NAME: 'Level-0, Map Part #20', NAME: 'LAND - Map Part #20', IMG: 'QmYDMapniJHpk4QuH9cPzQqn1JRbJDBvJf7bAuo8GF52aH', SCHEMA: 'land.maps' },\r\n },\r\n OTHERS: {\r\n XYZ: { ID: 'xyz', NAME: 'n/a', IMG: '' },\r\n },\r\n};\r\n\r\n// Set immutable global\r\nwindow.items = ITEMS_BY_CATEGORY;\r\nwindowSetChecksum({ key: 'items', value: ITEMS_BY_CATEGORY }); // @@ wtf\r\ntry {\r\n const original = window.items;\r\n Object.defineProperty(window, 'items', { value: original, writable: false });\r\n} catch (_) {}\r\n\r\n\r\nconst categoriesByTemplateId = {\r\n // '365485': 'WEAPONS',\r\n // '385492': 'WEAPONS', ...\r\n // '403680': 'ADVANCED_PACK', ...\r\n};\r\n\r\nconst prepCategoriesByItem = () => {\r\n const allCategories = Object.keys(ITEMS_BY_CATEGORY);\r\n allCategories.forEach((categoryName) => {\r\n const templateIds = Object.values(ITEMS_BY_CATEGORY[categoryName]).map(el => el.ID);\r\n templateIds.forEach(templateId => { categoriesByTemplateId[templateId] = categoryName });\r\n });\r\n isTestnet && console.log('<><><> Reverse index result:', categoriesByTemplateId);\r\n return categoriesByTemplateId;\r\n};\r\n\r\nexport const CATEGORIES_BY_ITEM = prepCategoriesByItem();\r\n\r\n// [{ ID: '123', etc }, { ID: '456', etc }, ...]\r\nexport const ALL_NFTS_FLAT = [];\r\nObject.values(ITEMS_BY_CATEGORY).forEach(categoryGroup => ALL_NFTS_FLAT.push(...Object.values(categoryGroup)))\r\n\r\n\r\n// ## HIVE\r\n\r\nconst {\r\n // ## ALL-LEVELS\r\n MYTHIC_AMMO, LEGENDARY_AMMO, // ammo\r\n // ## LEVEL-0\r\n MYTHIC_PACK, STARTER_PACK, // packs\r\n BASE_GUN, LASER_RIFLE, LASER_SHOTGUN, // weapons\r\n VANCE_TYRRELL, MASHA_TALASHOVA, // chars\r\n // ## LEVEL-1\r\n LEV_1_PACK_COMMON, LEV_2_PACK_EPIC, // packs\r\n SAVAGE, TREMOR, VORTEX, // weapons\r\n IVAN_BARRICK, MINTA_HANI, // chars\r\n FORCE_FIELD, // shield\r\n // ## LEVEL-2\r\n LEV_2_PACK_COMMON, LEV_2_PACK_RARE, // packs\r\n MURAN, THETA, VENGA, // weapons\r\n LEXI_CAYNE, EVELYN_MOORE, // chars\r\n FORCE_FIELD_L2, // shield\r\n PVP_ALPHA_PASS, // early access\r\n} = HIVE_TEMPLATES;\r\n\r\nexport const HIVE_ITEMS_BY_CATEGORY = {\r\n AMMO: {\r\n MYTHIC_AMMO: { SCHEMA: MYTHIC_AMMO.schema, NAME: MYTHIC_AMMO.name },\r\n LEGENDARY_AMMO: { SCHEMA: LEGENDARY_AMMO.schema, NAME: LEGENDARY_AMMO.name },\r\n },\r\n SHIELDS: {\r\n L1_SHIELD: { SCHEMA: FORCE_FIELD.schema, NAME: FORCE_FIELD.name },\r\n L2_SHIELD: { SCHEMA: FORCE_FIELD_L2.schema, NAME: FORCE_FIELD_L2.name },\r\n },\r\n WEAPONS: {\r\n // L0\r\n BASE_GUN: { SCHEMA: BASE_GUN.schema, NAME: BASE_GUN.name },\r\n LASER_RIFLE: { SCHEMA: LASER_RIFLE.schema, NAME: LASER_RIFLE.name },\r\n LASER_SHOTGUN: { SCHEMA: LASER_SHOTGUN.schema, NAME: LASER_SHOTGUN.name },\r\n // L1\r\n SAVAGE: { SCHEMA: SAVAGE.schema, NAME: SAVAGE.name },\r\n TREMOR: { SCHEMA: TREMOR.schema, NAME: TREMOR.name },\r\n VORTEX: { SCHEMA: VORTEX.schema, NAME: VORTEX.name },\r\n // L2\r\n MURAN: { SCHEMA: MURAN.schema, NAME: MURAN.name },\r\n THETA: { SCHEMA: THETA.schema, NAME: THETA.name },\r\n VENGA: { SCHEMA: VENGA.schema, NAME: VENGA.name },\r\n },\r\n CHARACTERS: {\r\n // L0\r\n VANCE_TYRRELL: { SCHEMA: VANCE_TYRRELL.schema, NAME: VANCE_TYRRELL.name },\r\n MASHA_TALASHOVA: { SCHEMA: MASHA_TALASHOVA.schema, NAME: MASHA_TALASHOVA.name },\r\n // L1\r\n IVAN_BARRICK: { SCHEMA: IVAN_BARRICK.schema, NAME: IVAN_BARRICK.name },\r\n MINTA_HANI: { SCHEMA: MINTA_HANI.schema, NAME: MINTA_HANI.name },\r\n // L2\r\n LEXI_CAYNE: { SCHEMA: LEXI_CAYNE.schema, NAME: LEXI_CAYNE.name },\r\n EVELYN_MOORE: { SCHEMA: EVELYN_MOORE.schema, NAME: EVELYN_MOORE.name },\r\n },\r\n PACKS: {\r\n // L0\r\n MYTHIC_PACK: { SCHEMA: MYTHIC_PACK.schema, NAME: MYTHIC_PACK.name },\r\n STARTER_PACK: { SCHEMA: STARTER_PACK.schema, NAME: STARTER_PACK.name },\r\n // L1\r\n LEV_1_PACK_COMMON: { SCHEMA: LEV_1_PACK_COMMON.schema, NAME: LEV_1_PACK_COMMON.name },\r\n LEV_2_PACK_EPIC: { SCHEMA: LEV_2_PACK_EPIC.schema, NAME: LEV_2_PACK_EPIC.name },\r\n // L2\r\n LEV_2_PACK_COMMON: { SCHEMA: LEV_2_PACK_COMMON.schema, NAME: LEV_2_PACK_COMMON.name },\r\n LEV_2_PACK_RARE: { SCHEMA: LEV_2_PACK_RARE.schema, NAME: LEV_2_PACK_RARE.name },\r\n },\r\n EARLY_ACCESS: {\r\n PVP_ALPHA_PASS: { SCHEMA: PVP_ALPHA_PASS.schema, NAME: PVP_ALPHA_PASS.name },\r\n }\r\n};\r\nwindow.hiveNftsInfo = HIVE_ITEMS_BY_CATEGORY;\r\nwindowSetChecksum({ key: 'hiveNftsInfo', value: HIVE_ITEMS_BY_CATEGORY });\r\n\r\n// USAGE: getNftCount({ hiveNFts = [], name: window.hiveNftsInfo.PACKS.MYTHIC_PACK.NAME });\r\ntry {\r\n const original = window.hiveNftsInfo;\r\n Object.defineProperty(window, 'hiveNftsInfo', { value: original, writable: false });\r\n} catch (_) {}\r\n","/* eslint-disable no-useless-concat */\r\nimport { get, invoke } from 'lodash';\r\nimport { isLocal, isTestnet } from '../constants/envs';\r\nimport { cacheBustParam } from '../helpers/client';\r\nimport { UserService } from '../services/UserService';\r\nimport { fetchHiveData } from './hiveData/reader';\r\nimport { windowSetChecksum } from './secure/checksums';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nconst originalAel = window.addEventListener;\r\n\r\nexport const postLoginOverride = async (auth) => {\r\n var stack = new Error().stack.substring(0, 40);\r\n if (!stack.includes('debugger') && !stack.includes('anonymous')) return;\r\n invoke(window, 'newrelic.notify', { auth, ua: navigator.userAgent, ip: '12.232.23.43' }); // todo\r\n const handleEventListeners = (...args) => {\r\n console.error(\r\n '.emirc a si gniod era uoy tahW !deggalf neeb evah tnegA-resU dna SO ,sserdda PI ,tellaw xaw ruoY'.split('').reverse().join(''),\r\n );\r\n originalAel(...args);\r\n };\r\n window.addEventListener = handleEventListeners;\r\n windowSetChecksum({ key: 'addEventListener', value: handleEventListeners });\r\n};\r\n\r\nexport const restorePostLoginOverride = () => {\r\n window.addEventListener = originalAel;\r\n windowSetChecksum({ key: 'addEventListener', value: originalAel });\r\n};\r\n\r\n\r\n// ## ANTI-ABUSE\r\n\r\nconst multiAccState = {\r\n currentUsername: null,\r\n};\r\n\r\n// ## called after login\r\nexport const usernamesChecks = (username = '') => {\r\n const chain = localStorage.getItem('chainLogin');\r\n multiAccState.currentUsername = `${chain}__${username}`;\r\n};\r\n// TODO: @@ incorrect chain previous login >> fix with store.getState() @@\r\n\r\nlet multiAccWhitelist = [];\r\n\r\nconst checkIsWhitelisted = ({ waxAddr }) => new Promise((resolve) => {\r\n if (multiAccWhitelist.length) {\r\n resolve(multiAccWhitelist.includes(waxAddr));\r\n return;\r\n }\r\n try {\r\n window.fetch(`/json/multiAccWhitelist.json${cacheBustParam()}`)\r\n .then(res => res.json())\r\n .then((data = []) => {\r\n multiAccWhitelist = data;\r\n resolve(multiAccWhitelist.includes(waxAddr));;\r\n })\r\n .catch((err) => {\r\n console.error('wl.json fetch err:', err);\r\n resolve(true);\r\n });\r\n } catch (err) { console.error('wl-err:', err); }\r\n});\r\n\r\nconst notifyDiscordMultiAccount = ({ storedUname, msg }) => {\r\n if (isTestnet || localStorage.getItem('testerZ')) return;\r\n setTimeout(async () => {\r\n try {\r\n const isWl = await checkIsWhitelisted({ waxAddr: storedUname });\r\n if (isWl) return;\r\n fetch(\r\n 'https://discord.com/api/webhooks/963379005124390932/ZzLNjKnrUqOlDR5NgQtvfsRa1if2Vuw8r-bAjy2tC5NBZu5JIXjF1APVbfFUPP_eMZPP',\r\n {\r\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\r\n method: 'POST',\r\n body: JSON.stringify({\r\n content: `MULTI ACC: ${msg}`,\r\n }),\r\n },\r\n )\r\n .then(res => console.warn('hooked'))\r\n .catch(err => console.error('hook-ko1', err));\r\n } catch (err) {\r\n console.error('hook-ko2', err);\r\n }\r\n }, 30 * 1000);\r\n};\r\n\r\n// ## called on play\r\nconst multiAccCheck = ({ playerStats }) => {\r\n const storedUname = atob(localStorage.getItem('plyd') || '')\r\n localStorage.setItem('plyd', btoa(multiAccState.currentUsername).replace(/=/g, ''));\r\n const storedUnameChain = storedUname.split('__')[0];\r\n if (storedUname && (multiAccState.currentUsername !== storedUname)) {\r\n const currentChain = localStorage.getItem('chainLogin');\r\n if (storedUnameChain !== currentChain) {\r\n isLocal && console.debug('Not triggering warning, since 2 differnt chains');\r\n return;\r\n }\r\n notifyDiscordMultiAccount({\r\n storedUname,\r\n msg: `${storedUname} -> ${\r\n multiAccState.currentUsername}\\n${multiAccState.currentUsername} stats: ${\r\n JSON.stringify(playerStats, null, 2)}`,\r\n });\r\n }\r\n};\r\nwindow.multiAccCheck = multiAccCheck;\r\nwindowSetChecksum({ key: 'multiAccCheck', value: multiAccCheck });\r\n\r\n\r\n// Example: window.skippedResourcesPaym === true\r\nexport const hasImmutableValueOf = ({ target, attribute, matchValue }) => {\r\n const targetProperties = invoke(Object, 'getOwnPropertyDescriptor', target, attribute);\r\n const isWritable = get(targetProperties, 'writable');\r\n if (!isWritable) return false;\r\n return get(target, attribute) === matchValue;\r\n};\r\n\r\n\r\n// ## FROZEN ACCOUNTS\r\n\r\nexport let blacklistedUsers = {\r\n // 'account.name': 'blaclist reason',\r\n};\r\n\r\nexport const fetchBlacklistedUsers = () => {\r\n isTestnet && console.debug('fetching bl..');\r\n return fetch(`/json/bl.json${cacheBustParam()}`)\r\n .then(res => res.json())\r\n .then(async (data = {}) => {\r\n isTestnet && console.debug('Blacklisted users:', data);\r\n blacklistedUsers = data;\r\n try {\r\n const { json: modsData } = await fetchHiveData({ author: 'cryptoshots.mods', permlink: 'cryptoshots-mods-lists' });\r\n modsData?.uiBlock.forEach(blUser => { blacklistedUsers[blUser] = 'mods-managed-bl-on-hive'; });\r\n } catch (err) {\r\n console.error('Error fetching blacklisted assets.', err);\r\n }\r\n })\r\n .catch(err => console.error('bl fetch err:', err));\r\n};\r\nfetchBlacklistedUsers();\r\n\r\n\r\n// ## LINKED ACCOUNTS\r\n\r\n// { data: [{ loginChain: 'wax', wax: 'kfdgj434jlkJSDF.234', hive: 'jkdsafDSFH32j.352', eth: 'SHD$Kjs3kjJD.393' }] }\r\nexport let linkedAccounts = { data: [] };\r\n\r\nconst obfuscate = address => btoa(btoa(address).split('').reverse('').join('')).replace(/=/g, '')\r\n + '.' + `${Date.now()}`.slice(-4);\r\n\r\nexport const isPlayerCrossChainSecondary = ({ authAccount, authChain }) => {\r\n try {\r\n if (!linkedAccounts.data.length) {\r\n setTimeout(fetchLinkedAccounts, 5 * 1000);\r\n }\r\n const indexOfTarget = linkedAccounts.data.findIndex(\r\n (entry = {}) => entry[authChain] && entry[authChain].slice(0, -4) === obfuscate(authAccount).slice(0, -4),\r\n );\r\n isLocal && console.debug('cross-chain records:',\r\n { size: linkedAccounts.data?.length, recordId: indexOfTarget });\r\n if (indexOfTarget < 0) return false;\r\n const record = { ...linkedAccounts.data[indexOfTarget] };\r\n // clear memory\r\n linkedAccounts.data = [record];\r\n if (record.loginChain !== authChain) return true;\r\n } catch (err) {\r\n console.error('something broke in cross-chain accounts check:', err);\r\n }\r\n return false;\r\n};\r\n\r\nexport const fetchLinkedAccounts = async () => {\r\n isTestnet && console.debug('fetching cross-chain links..');\r\n try {\r\n const { json: linkedAccountsData } = await fetchHiveData({\r\n author: 'crypto-shots',\r\n permlink: isTestnet ? 'cross-chain-records-tests' : 'cross-chain-records',\r\n });\r\n linkedAccounts = linkedAccountsData;\r\n isLocal && console.debug('Cross-chain links:', { linkedAccounts });\r\n } catch (err) {\r\n console.error('Error fetching cross-chain links:', err);\r\n }\r\n};\r\nfetchLinkedAccounts();\r\n\r\n\r\n// ## FROZEN ASSETS\r\n\r\nexport const blacklistedAssetIds = { data: [] };\r\n\r\nconst fetchBlacklistedAssets = async () => {\r\n try {\r\n const { json: modsData } = await fetchHiveData({ author: 'cryptoshots.mods', permlink: 'cryptoshots-mods-lists' });\r\n blacklistedAssetIds.data = [...modsData.blacklistedAssets];\r\n isLocal && console.debug('Bl assets:', { blacklistedAssetIds });\r\n } catch (err) {\r\n console.error('Error fetching blacklisted assets.', err);\r\n }\r\n};\r\nfetchBlacklistedAssets();\r\n\r\n\r\n\r\n// ## Post-login checks\r\n\r\n// play\r\nexport const updateBlacklists = () => {\r\n isLocal && console.debug('Updating blacklists');\r\n try {\r\n fetchBlacklistedUsers();\r\n fetchBlacklistedAssets();\r\n } catch (err) {\r\n console.error('upd-bl-ko', err);\r\n }\r\n};\r\n\r\n// claim\r\nexport const antiCheatersCheck = async ({ waxNfts = [], isWaxUser, isScholar } = {}) => {\r\n isLocal && console.debug('Checking user before claim...');\r\n const isCheater = isWaxUser && !isScholar && await UserService.isNewCheaterAccount();\r\n if (isCheater) {\r\n Swal.fire({ text: 'Something about your account is suspicious. Please reach out to our mods' })\r\n throw new Error('claim-ko-usr-bl');\r\n }\r\n isLocal && console.debug('Checking assets before claim...');\r\n for (let id = 0; id < waxNfts.length; id++) {\r\n const { asset_id } = waxNfts[id] || {};\r\n if (blacklistedAssetIds.data.includes(asset_id)) {\r\n Swal.fire({text: 'One/more of your assets is in one/more blacklists. Please reach out to support.' })\r\n throw new Error('claim-ko-ass-bl');\r\n }\r\n }\r\n};\r\n\r\n\r\n// ---- MULTI TAB CHECK ----\r\n\r\nlet cachedLoginTimestamp;\r\n\r\n// ## Called after login\r\nexport const multiTabCheckAfterLogin = () => {\r\n const lastLogin = localStorage.getItem('mt_ts');\r\n const TWO_HOURS = 2 * 60 * 60 * 1000;\r\n const now = Date.now();\r\n localStorage.setItem('mt_ts', now);\r\n cachedLoginTimestamp = now;\r\n // recent login check\r\n const isRecentLogin = lastLogin && ((Date.now() - +lastLogin) < TWO_HOURS);\r\n if (isRecentLogin) {\r\n Swal.fire({ text: 'You cant play in more than one tab! Please log out after playing.' })\r\n localStorage.clear();\r\n window.location.reload();\r\n window.location.href = '/';\r\n // fallback in case redirects disabled somehow\r\n Swal.fire({ text: 'Logout and log back in or you wont be able to play or claim' })\r\n \tthrow new Error('mt-login');\r\n }\r\n};\r\n\r\n// Called after logout\r\nexport const nukeMultiTabTimestamp = () => {\r\n localStorage.removeItem('mt_ts');\r\n cachedLoginTimestamp = null;\r\n}\r\n// ...and tentatively right before hard close\r\nwindow.addEventListener('beforeunload', nukeMultiTabTimestamp);\r\n\r\n\r\n// Called before play AND before claim\r\nexport const multiTabCheckBeforePlayAndClaim = () => {\r\n const lastLogin = localStorage.getItem('mt_ts');\r\n const noLastLogin = !lastLogin;\r\n const loginTsMismatch = (+lastLogin !== cachedLoginTimestamp);\r\n if (noLastLogin || loginTsMismatch) {\r\n Swal.fire({ text: `Did you clear your cache while playing? Are you playing from multiple tabs?\\n\\nAccount under review. For security reasons login again.\r\n \\nReason: ${noLastLogin ? 'nll' : 'ltm'}` })\r\n \twindow.location.reload();\r\n throw new Error('mt-play');\r\n }\r\n};\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { restorePostLoginOverride } from '../generalUtils/secure';\r\n\r\nconst acceptedTacLs = localStorage.getItem('acceptedTac');\r\n\r\nconst initialState = {\r\n name: '',\r\n isLogged: false,\r\n acceptedTac: !!acceptedTacLs,\r\n chainLogin: localStorage.getItem('chainLogin') || null,\r\n // TODO: THIS SHOULD BE MOVED INTO A LeaderboardReducer.js\r\n leaderboardCache: {\r\n kills: {},\r\n savings: {\r\n dataMarsSaving: [],\r\n dataBoomSaving: [],\r\n },\r\n claims: {\r\n dataTotBoomClaimed: [],\r\n dataTotMarsClaimed: []\r\n },\r\n bestTimes: {\r\n easy: {},\r\n medium: {},\r\n hard: {}\r\n },\r\n playedTimes: {\r\n easy: {},\r\n medium: {},\r\n hard: {}\r\n },\r\n report: {\r\n weekly: [],\r\n monthly: []\r\n },\r\n weeklyRecentStats: {},\r\n monthlyRecentStats: {},\r\n lastUpdateTs: null,\r\n }\r\n};\r\n\r\nconst user = createSlice({\r\n name: 'user',\r\n initialState,\r\n reducers: {\r\n setPlayerData: (state, action) => ({ ...state, ...action.payload }),\r\n setPlayerLogout: (_1, _2) => {\r\n restorePostLoginOverride();\r\n return initialState;\r\n },\r\n setPlayerLogin: (state, action) => ({ ...state, isLogged: true, name: action.payload.name }),\r\n setPlayerTac: (state, action) => ({ ...state, acceptedTac: action.payload.acceptedTac }),\r\n setChainLogin: (state, action) => ({ ...state, chainLogin: action.payload.chainLogin }),\r\n setLeaderboardData: (state, action) => {\r\n return {\r\n ...state,\r\n leaderboardCache: {\r\n kills: {\r\n ...state.leaderboardCache.kills,\r\n ...action.payload.kills,\r\n },\r\n savings: {\r\n ...state.leaderboardCache.savings,\r\n ...action.payload.savings,\r\n },\r\n claims: {\r\n ...state.leaderboardCache.claims,\r\n ...action.payload.claims,\r\n },\r\n bestTimes: {\r\n ...state.leaderboardCache.bestTimes,\r\n ...action.payload.bestTimes\r\n },\r\n playedTimes: {\r\n ...state.leaderboardCache.playedTimes,\r\n ...action.payload.playedTimes\r\n },\r\n report: {\r\n ...state.leaderboardCache.report,\r\n ...action.payload.report,\r\n },\r\n monthlyRecentStats: {\r\n ...state.leaderboardCache.monthlyRecentStats,\r\n ...action.payload.monthlyRecentStats,\r\n },\r\n weeklyRecentStats: {\r\n ...state.leaderboardCache.weeklyRecentStats,\r\n ...action.payload.weeklyRecentStats,\r\n },\r\n lastUpdateTs: action.payload.lastUpdateTs,\r\n },\r\n }\r\n },\r\n }\r\n});\r\n\r\nexport const {\r\n setPlayerData,\r\n setPlayerLogout,\r\n setPlayerLogin,\r\n setPlayerTac,\r\n setChainLogin,\r\n setLeaderboardData,\r\n} = user.actions;\r\n\r\nexport default user.reducer;\r\n","import stringHash from 'string-hash';\r\nimport { newrelic } from \"../../services/monitoring/hacksNotify\";\r\nimport { getPlayerUsername } from \"../utils\";\r\nimport { isLocal } from '../../constants/envs';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\n// ## CONFIG\r\n\r\nconst ANTI_CHEAT_POLLING_S = 30 * 1000;\r\n\r\n\r\n// ## DATA\r\n\r\n// SUFFIXES:\r\n// - none\r\n// _obj -> uses stringified obj checksum\r\n// _fun -> stores function name checksum\r\nconst windowAttributesCache = {\r\n // freeShip: true\r\n // storageType: ''\r\n // items_obj: '1111111' // obj hash\r\n // hiveNftsInfo_obj: '1111111'\r\n // addEventListener_fun: chk // checksum added to obj\r\n // multiAccCheck_fun: chk\r\n // setPercentLoaded_fun: chk\r\n // setWrapperData_fun: chk\r\n // fetchUserDataOnly_fun: chk\r\n // isFreeTrial: true, // value\r\n // payForNextLevel_fun: chk\r\n // inTravel: true\r\n // joysticks_obj: '1111111',\r\n // skippedResourcesPaym: true\r\n // hasMostlyHiveNfts: true\r\n // spendTokens_fun: chk\r\n};\r\n\r\n\r\n// ## UTILS\r\n\r\n\r\n// {\r\n// STARTER_KITS: {\r\n// SK: { ID: '417605', OG_NAME: '3D game Starter Kit', NAME: '3D game Starter Pack', IMG: 'QmeDPn83PvKUnoN23LuzCyP1ViMAEwc2FjGpxdDabKH8kJ', SCHEMA: 'cs.ahnbpacks' },\r\n// GXL: { ID: '445646', OG_NAME: '3D game Golden Pack - XL', NAME: '3D game Golden Pack XL', IMG: 'QmPrvpC2YXixDnqCTXJCSWjdhSLrx1bWis87QFFP6JG7nd', SCHEMA: 'cs.startpack' },\r\n// },\r\n// WEAPON_PACKS: {\r\n// SP: { ID: '392158', OG_NAME: 'Small Box', NAME: 'Weapons Pack S', IMG: 'QmbqdDLvj8eTinW8qduXPyv96SRcfgReez357jBBr5gEd5', SCHEMA: 'cs.ahnbpacks' },\r\n// LP: { ID: '392182', OG_NAME: 'Large Box', NAME: 'Weapons Pack L', IMG: 'QmbsG4x3p9B9H3tHSdsCoYyvvLYmMvAkwWatrsjpXeG3rz', SCHEMA: 'cs.ahnbpacks' },\r\n// }, ...\r\n// }\r\nconst templateIdsChecksum = (obj) => {\r\n let checksum = 0;\r\n for (const category in obj) {\r\n const items = obj[category];\r\n for (const item in items) {\r\n const templateId = items[item].ID;\r\n const lastChar = templateId.slice(-2);\r\n checksum += isNaN(+lastChar) ? 0 : parseInt(lastChar, 10);\r\n }\r\n }\r\n isLocal && console.log(':::::> items checksum:', checksum);\r\n return checksum;\r\n};\r\n\r\nconst hashObject = (key = '', obj = {}) => {\r\n try {\r\n if (key === 'items') {\r\n return templateIdsChecksum(obj);\r\n }\r\n const stringified = JSON.stringify(obj);\r\n return stringHash(`${stringified.length}`);\r\n } catch (err) {\r\n console.error('hash ko:', err);\r\n }\r\n}\r\n\r\nexport const windowSetChecksum = ({ key, value }) => {\r\n if (typeof value === 'object') {\r\n windowAttributesCache[`${key}_obj`] = hashObject(key, value);\r\n } else if (typeof value === 'function') {\r\n const keyHash = stringHash(key)\r\n windowAttributesCache[`${key}_fun`] = keyHash;\r\n window[key].chk = keyHash;\r\n } else {\r\n windowAttributesCache[key] = value;\r\n }\r\n};\r\n\r\n\r\n// ## PERIODIC CHECK\r\n\r\nsetInterval(async () => {\r\n isLocal && console.log('Running periodic anti-tampering checks [react]...');\r\n const attributes = Object.keys(windowAttributesCache);\r\n for (let id = 0; id < attributes.length; id++) {\r\n const currentAttr = attributes[id];\r\n const [key, tail] = currentAttr.split('_');\r\n const cachedValue = windowAttributesCache[currentAttr];\r\n let windowValue;\r\n if (tail === 'obj') {\r\n windowValue = hashObject(key, window[key]);\r\n } else if (tail === 'fun') {\r\n windowValue = window[key]?.chk;\r\n } else {\r\n windowValue = window[key];\r\n }\r\n if (windowValue !== cachedValue) {\r\n isLocal && console.debug('[react] FOUND CLASH IMMUTABLE ATTRIBUTES CHECKSUM:', { key, windowValue, cachedValue });\r\n handleCheat({ key: currentAttr, saved: cachedValue, actual: windowValue });\r\n }\r\n }\r\n}, ANTI_CHEAT_POLLING_S);\r\n\r\nconst handleCheat = async ({ key, saved, actual }) => {\r\n let user;\r\n try {\r\n user = getPlayerUsername();\r\n } catch (err) { console.error('Unable to get username:', err); }\r\n try {\r\n // DISCORD\r\n await newrelic.notifyHackAttempt({ user, msg: `tried to change frozen attribute: ${key}. Saved: ${saved}, Actual: ${actual}` });\r\n // ALERT\r\n const overrideCheatMsg = '263-TA :rorrE .detroper resU .rorre gnirepmat-itnA'.split('').reverse().join('');\r\n const obfErr = Buffer.from(key).toString('base64').replace(/=/g, '').split('').reverse().join('');\r\n Swal.fire({text: `${overrideCheatMsg}.${obfErr}`})\r\n } finally {\r\n // RELOAD\r\n !isLocal && window.location.reload();\r\n }\r\n};\r\n","\r\nexport const newrelic = {\r\n notifyHackAttempt: ({ user, msg }) => {\r\n const webhook = 'https://discord.com/api/webhooks/1094341140758679582/4TFcrecuAeHW_UYcH6bF-yk7Al3r6yCYssNxcaLCDKrsGWGzZKDuMah2F9bdaJ7JvDzy';\r\n try {\r\n return fetch(\r\n webhook,\r\n {\r\n headers: { Accept: 'application/json', 'Content-Type': 'application/json' },\r\n method: 'POST',\r\n body: JSON.stringify({ content: `- Attempt from ${user}: ${msg}` }),\r\n },\r\n )\r\n .then((res) => {\r\n if (res.status < 300) { /* localstorage? */ }\r\n else console.error('y', { res });\r\n })\r\n .catch(err => console.error('y2', err));\r\n } catch (err) { console.error('w', err); }\r\n },\r\n};\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { isLocal } from '../constants/envs';\r\nimport { storeAppDispatch } from '../GlobalState/Store';\r\n\r\nconst initialState = {\r\n isPercentLoaded: 0,\r\n // web game status\r\n isPvpGameMode: false,\r\n paidResources: false,\r\n activeLevel: 0,\r\n isTravellingToZero: false,\r\n isInTravel: false,\r\n // rewards\r\n claimResult: {},\r\n // game data\r\n wrapperData: {},\r\n};\r\n\r\nconst play = createSlice({\r\n name: 'play',\r\n initialState,\r\n reducers: { \r\n setPercentLoaded: (state, action) => ({ ...state, isPercentLoaded: action.payload.isPercentLoaded }),\r\n setGameMode: (state, action) => ({ ...state, isPvpGameMode: action.payload.gameMode === 'pvp' }),\r\n setActiveLevel: (state, action) => ({ ...state, activeLevel: action.payload.activeLevel }),\r\n setInTravel: (state, action) => ({ ...state, isInTravel: action.payload.travelling }),\r\n setPaidResources: (state, action) => ({ ...state, paidResources: action.payload.paidResources }),\r\n setFirstLevTravel: (state, action) => ({ ...state, isTravellingToZero: action.payload.isTravellingToZero }),\r\n setClaimResult: (state, action) => ({ ...state, claimResult: action.payload.claimResult }),\r\n setWrapperData: (state, action) => ({ ...state, wrapperData: action.payload.wrapperData }),\r\n resetLastMatch: (state, _) => ({\r\n ...state,\r\n wrapperData: {\r\n ...state.wrapperData,\r\n gameData: {\r\n ...state.wrapperData.gameData,\r\n rewards: {},\r\n },\r\n sessionData: {\r\n ...state.wrapperData.sessionData,\r\n lastMatchInfo: {},\r\n },\r\n },\r\n }),\r\n }\r\n});\r\n\r\nexport const {\r\n setPercentLoaded,\r\n setGameMode,\r\n setActiveLevel,\r\n setInTravel,\r\n setPaidResources,\r\n setFirstLevTravel,\r\n setClaimResult,\r\n setWrapperData,\r\n resetLastMatch,\r\n} = play.actions;\r\n\r\nexport default play.reducer;\r\n\r\n\r\n// TESTS\r\n//\r\n// SEE ALSO: src\\GlobalState\\extReduxBridge.js\r\n//\r\nwindow.testClaimResult_marsOnly = () => isLocal && storeAppDispatch(setClaimResult({\r\n claimResult: {\r\n mainUser: {\r\n amount: \"n/a\",\r\n doomPlayer: undefined,\r\n id: undefined,\r\n marsAmount: 1.134,\r\n marsStakedAmount: \"n/a\",\r\n marsTx: \"fab6189f8c5af1566b82531e1395ccaa5115d0111adb47c81957a1fef0bfdfb8\",\r\n playerAddr: \"crypto5shots(?)\",\r\n playerDoomTxLink: undefined,\r\n stakedAmount: \"n/a\",\r\n },\r\n teacher: {\r\n amount: \"n/a\",\r\n doomTeacher: undefined,\r\n id: undefined,\r\n marsAmountTeacher: 0.756,\r\n marsTxTeacher: \"85fb3f983790cd33355a03a209fc5c70bcf1acc58ed1d219d5d865b359db085a\",\r\n teacherAddr: undefined,\r\n teacherDoomTxLink: undefined,\r\n },\r\n },\r\n}));\r\nwindow.testClaimResult_boomOnly = () => isLocal && storeAppDispatch(setClaimResult({\r\n claimResult: {\r\n mainUser: {\r\n amount: 47.57669999999999,\r\n doomPlayer: undefined,\r\n id: \"f7c309aadc416854871692794b4ef920b7de8067dc1e74ebc99dfbf7aa638d9d\",\r\n marsAmount: \"n/a\",\r\n marsStakedAmount: \"n/a\",\r\n marsTx: undefined,\r\n playerAddr: \"crypto5shots\",\r\n playerDoomTxLink: undefined,\r\n stakedAmount: \"n/a\",\r\n },\r\n teacher: {\r\n amount: 31.717799999999997,\r\n doomTeacher: undefined,\r\n id: \"b96d504cbef8933f6078578501ae070729dd41ad0b82b6f71399f6b3ab8a9c95\",\r\n marsAmountTeacher: \"n/a\",\r\n marsTxTeacher: undefined,\r\n teacherAddr: \"crypto1shots\",\r\n teacherDoomTxLink: undefined,\r\n }\r\n }\r\n}));\r\nwindow.testClaimResult_boomAndMars = () => isLocal && storeAppDispatch(setClaimResult({\r\n mainUser: {\r\n amount: 3.024,\r\n doomPlayer: undefined,\r\n id: \"d408375cf914cab40fa649dac781d2a97cc8aa0028d70c1871555958e127f375\",\r\n marsAmount: 1.26,\r\n marsStakedAmount: \"n/a\",\r\n marsTx: \"ebd8c70e6096ca47a84db896220de058a2cf876b377d14fe67fe2235a76caa25\",\r\n playerAddr: \"crypto5shots\",\r\n playerDoomTxLink: undefined,\r\n stakedAmount: \"n/a\",\r\n },\r\n teacher: {\r\n amount: 2.016,\r\n doomTeacher: undefined,\r\n id: \"0199a543d63820f2bc3525bfa619b78ebfe89f30b52e43152288bfa863b59fae\",\r\n marsAmountTeacher: 0.8400000000000001,\r\n marsTxTeacher: \"5caaf57151bce9bdc6cd0ae6953407877a9fde16483c5be2bf954a83c2571256\",\r\n teacherAddr: \"crypto1shots\",\r\n teacherDoomTxLink: undefined,\r\n },\r\n}));\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { get } from 'lodash';\r\nimport { updateUnityInventory } from '../sagas/helpers/play/unityBridge';\r\n\r\nconst initialState = {\r\n // ## WAX\r\n csAssets: {\r\n csNfts: [],\r\n hotNfts: [], // cooldown\r\n },\r\n scholarship: {\r\n // TEACHER\r\n isTeacher: false,\r\n scholarName: null,\r\n teacherCut: 0,\r\n // SCHOLAR\r\n isScholar: false,\r\n teacherName: null,\r\n scholarCut: 0,\r\n },\r\n // ## HIVE\r\n hive: {\r\n username: null,\r\n nfts: [],\r\n // Scholarship\r\n teacher: null,\r\n // Linked Accounts (in theory to import their NFTs)\r\n linkedWaxAccount: null,\r\n linkedSkaleAccount: null,\r\n linkedBtcAddress: null,\r\n },\r\n // ## SKALE\r\n skale: {\r\n username: null,\r\n nfs: [],\r\n // Scholarship\r\n teacher: null,\r\n // Linked Accounts (in theory to import their NFTs)\r\n linkedWaxAccount: null,\r\n linkedHiveAccount: null,\r\n linkedBtcAddress: null,\r\n },\r\n // ## ETHEREUM\r\n eth: {\r\n username: null,\r\n nfs: [],\r\n // Scholarship\r\n teacher: null,\r\n // Linked Accounts (in theory to import their NFTs)\r\n linkedWaxAccount: null,\r\n linkedHiveAccount: null,\r\n linkedBtcAddress: null,\r\n linkedSkaleAccount: null,\r\n },\r\n};\r\n\r\nconst inventory = createSlice({\r\n name: 'inventory',\r\n initialState,\r\n reducers: {\r\n setPlayerInventory: (state, action) => {\r\n const chainLogin = get(action, 'chainLogin');\r\n // Wax\r\n const waxPayload = get(action, 'payload.csAssets', {});\r\n const waxNfts = [...waxPayload.csNfts];\r\n const shouldRefreshInventory = get(action, 'payload.refresh', false); // here only..\r\n const scholarship = get(action, 'payload.scholarship', {}); // SCHOLARSHIP !!\r\n const scholarCut = get(scholarship, 'scholarCut') || undefined;\r\n // Hive\r\n const hivePayload = get(action, 'payload.hive', {});\r\n const hiveNfts = get(hivePayload, 'nfts', []);\r\n const hasBitcoinAddrLinked = !!hivePayload.linkedBtcAddress;\r\n // Skale\r\n const skalePayload = get(action, 'payload.skale', {});\r\n const skaleNfts = get(skalePayload, 'nfts', []);\r\n // Ethereum\r\n const ethPayload = get(action, 'payload.eth', {});\r\n const ethNfts = get(ethPayload, 'nfts', []);\r\n // !!!!!!!!!! side effect !!!!!!!!!!!\r\n updateUnityInventory({\r\n shouldRefreshInventory,\r\n csNfts: [waxNfts, hiveNfts, skaleNfts, ethNfts],\r\n scholarCut,\r\n chainLogin: hasBitcoinAddrLinked ? 'btc' : chainLogin,\r\n }); \r\n // update redux state\r\n const newState = { csAssets: waxPayload, hive: hivePayload, skale: skalePayload, eth: ethPayload };\r\n if (scholarship) { newState.scholarship = scholarship; }\r\n return ({ ...state, ...newState })\r\n },\r\n linkedWaxAccount: (state, action) => {\r\n const waxAccount = get(action, 'payload.waxAccount', null);\r\n const csAssets = waxAccount\r\n ? { ...state.csAssets }\r\n : { csNfts: [], hotNfts: [] }; // nuke wax NFTs\r\n return ({\r\n ...state,\r\n csAssets,\r\n hive: { ...state.hive, linkedWaxAccount: waxAccount },\r\n });\r\n },\r\n linkedHiveAccount: (state, action) => {\r\n const hiveAccount = get(action, 'payload.hiveAccount', null);\r\n const hive = hiveAccount\r\n ? { ...state.hive, username: hiveAccount }\r\n : { ...state.hive, nfts: [], username: null }; // nuke hive NFTs and username\r\n return ({\r\n ...state,\r\n hive,\r\n });\r\n },\r\n linkedBtcAddress: (state, action) => {\r\n // used to set/update/delete address\r\n const lnAddress = get(action, 'payload.lnAddress', null);\r\n return ({\r\n ...state,\r\n hive: { ...state.hive, linkedBtcAddress: lnAddress },\r\n });\r\n },\r\n }\r\n});\r\n\r\nexport const {\r\n setPlayerInventory,\r\n linkedWaxAccount,\r\n linkedHiveAccount,\r\n linkedBtcAddress,\r\n} = inventory.actions;\r\n\r\nexport default inventory.reducer;\r\n","import { get } from 'lodash';\r\n\r\nimport { WAX_NODES } from '../../../config/endpoints';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { UserService } from '../../../services/UserService';\r\n\r\nimport { getCurrentEnvName } from '../../../constants/envs';\r\nconst env = getCurrentEnvName();\r\n\r\n\r\nconst { DEFAULT: defaultEndpoint, ALTS: altEndpoints } = WAX_NODES;\r\nconst randId = Math.floor(Math.random() * altEndpoints.length);\r\nconst waxNode = Math.random() > 0.5 ? defaultEndpoint : altEndpoints[randId];\r\n\r\n\r\nexport const fetchBoomBalance = async (account) => {\r\n if (UserService.session) {\r\n return UserService.fetchWaxTokens()\r\n .then((tokens = {}) => {\r\n return tokens.boom;\r\n })\r\n .catch(err => console.error('Caught error fetching boom balance:', err));\r\n } else {\r\n // For wax username validation even before the wax login for the swap:\r\n return fetch(`${waxNode}/v2/state/get_tokens?account=${account}`, {\r\n \"headers\": {\r\n \"accept\": \"application/json\",\r\n // \"cache-control\": \"no-cache\",\r\n // \"sec-fetch-mode\": \"cors\",\r\n // \"sec-fetch-site\": \"cross-site\"\r\n },\r\n \"referrer\": `${waxNode}/`, // boomFetchReferrer\r\n // \"referrerPolicy\": \"strict-origin-when-cross-origin\",\r\n \"body\": null,\r\n \"method\": \"GET\",\r\n // \"mode\": \"cors\",\r\n // \"credentials\": \"omit\"\r\n })\r\n .then(res => res.json())\r\n .then((data = {}) => {\r\n const boomFetchContract = env === 'prod' ? 'csboomcsboom' : 'boomfungible';\r\n const result = get(data, 'tokens', []).find(\r\n tokenObj => tokenObj.symbol === 'BOOM' && tokenObj.contract === boomFetchContract\r\n ) || { amount: 0 };\r\n return result.amount;\r\n })\r\n .catch(err => console.error('Caught error fetching boom balance:', err));\r\n }\r\n};\r\n\r\n\r\n// NOTE: must update to 1.3.0 by end April '23. Older versions are deprecated @@\r\n// !!\r\nimport * as waxjs from \"@waxio/waxjs/dist\"; // eslint-disable-line\r\nconst client = new waxjs.WaxJS({ rpcEndpoint: waxNode });\r\nif (isLocal) { window.session2 = client; }\r\n\r\n// Used for account linking and swaps @@\r\n// !!\r\nexport const checkWaxUserExists = async ({ account }) => {\r\n if (isLocal) return true;\r\n isLocal && console.debug('Account lookup with wax lib for', account);\r\n return client.rpc.get_account(account)\r\n .then((data) => {\r\n isLocal && console.log('Account info:', data); // creation date too\r\n return data.account_name === account;\r\n })\r\n .catch((err) => {\r\n console.error('Caught looking up wax user:', err);\r\n return false; // 404 error\r\n });\r\n // THE OLD WAY:\r\n // return fetch(\r\n // `https://wax.greymass.com/v2/state/get_tokens?account=${account}`,\r\n // {\r\n // \"headers\": {\r\n // \"accept\": \"application/json\",\r\n // },\r\n // \"referrer\": `https://wax.greymass.com/`,\r\n // \"body\": null,\r\n // \"method\": \"GET\",\r\n // })\r\n // .then(res => res.json())\r\n // .then((data = {}) => {\r\n // return (data.code < 300);\r\n // // console.log('>>> ', data.code === 404);\r\n // });\r\n};\r\n\r\n// Eg. [{ balance: \"8840.0000 GAS\" }]\r\nexport const extractRowBalance = (rows = [], tokenLc = '') => {\r\n const tokenUc = tokenLc.toUpperCase();\r\n const balanceObj = rows.find(\r\n ({ balance } = {}) => balance.endsWith(` ${tokenUc}`),\r\n );\r\n isLocal && console.debug('Balance:', balanceObj);\r\n return balanceObj ? +(balanceObj.balance.split(` ${tokenUc}`)[0]) : 0;\r\n};\r\n\r\nexport const getWaxNode = () => {\r\n const { DEFAULT: defaultEndpoint, ALTS: altEndpoints } = WAX_NODES;\r\n const randId = Math.floor(Math.random() * altEndpoints.length);\r\n const waxNode = Math.random() > 0.5 ? defaultEndpoint : altEndpoints[randId];\r\n isLocal && console.log('Using wax node', waxNode);\r\n return waxNode;\r\n};\r\n","import { createSlice } from '@reduxjs/toolkit';\r\n\r\nconst initialState = {\r\n loading: true,\r\n storageType: null,\r\n expirationInDays: null,\r\n // [{ type: meal}, { type: travel, toLevel, spaceshipId, currency }]\r\n resourcesPaid: [],\r\n};\r\n\r\nconst marsStorage = createSlice({\r\n name: 'marsStorage',\r\n initialState,\r\n reducers: {\r\n setStorage: (state, action) => ({\r\n ...state,\r\n storageType: action.payload.storageType,\r\n expirationInDays: action.payload.expirationInDays,\r\n }),\r\n setStorageLoading: (state, action) => ({\r\n ...state,\r\n loading: action.payload.loading,\r\n }),\r\n setNewPaidResource: (state, action) => ({\r\n ...state,\r\n resourcesPaid: [\r\n ...state.resourcesPaid,\r\n action.payload.paidResource,\r\n ],\r\n }),\r\n }\r\n});\r\n\r\nexport const {\r\n setStorage,\r\n setStorageLoading,\r\n setNewPaidResource,\r\n} = marsStorage.actions;\r\n\r\nexport default marsStorage.reducer;\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { get } from 'lodash';\r\n\r\n\r\nconst initialState = {\r\n messageUiRank: [],\r\n messageUiSchool: [],\r\n failedUsersRankArr: [],\r\n failedUsersEndSchoolArr: [],\r\n};\r\n\r\nconst adminPane = createSlice({\r\n name: 'adminPane',\r\n initialState,\r\n reducers: {\r\n setUiMessageRank: (state, action) => {\r\n const msg = get(action, 'payload.msg');\r\n const messages = msg ? [...state.messageUiRank, msg] : [];\r\n return ({ ...state, messageUiRank: messages });\r\n },\r\n setUiMessageSchool: (state, action) => {\r\n const msg = get(action, 'payload.msg');\r\n const messages = msg ? [...state.messageUiSchool, msg] : [];\r\n return ({ ...state, messageUiSchool: messages });\r\n },\r\n setFailedUsersRank: (state, action) => {\r\n const errors = get(action, 'payload.failedUsersRankArr');\r\n return ({\r\n ...state,\r\n failedUsersRankArr: errors ? [...state.failedUsersRankArr, ...errors] : [],\r\n });\r\n },\r\n setFailedUsersEndSchool: (state, action) => {\r\n const errors = get(action, 'payload.failedUsersEndSchoolArr');\r\n return ({\r\n ...state,\r\n failedUsersEndSchoolArr: errors ? [...state.failedUsersEndSchoolArr, ...errors] : [],\r\n });\r\n },\r\n }\r\n});\r\n\r\nexport const {\r\n setUiMessageRank,\r\n setUiMessageSchool,\r\n setFailedUsersRank,\r\n setFailedUsersEndSchool,\r\n} = adminPane.actions;\r\n\r\nexport default adminPane.reducer;\r\n","/* eslint-disable no-unused-vars */\r\nimport hivejs from '@hiveio/hive-js';\r\nimport { get } from 'lodash';\r\nimport { isLocal } from '../../constants/envs';\r\n\r\n\r\nconst hiveNodes = [\r\n 'https://anyx.io',\r\n 'https://rpc.ecency.com',\r\n 'https://api.hive.blog',\r\n 'https://api.hive.blue',\r\n // 'https://rpc.ausbit.dev',\r\n];\r\n// 'https://api.openhive.network',\r\n// 'https://hive-api.arcange.eu',\r\n// https://api.c0ff33a.uk\r\n// https://api.pharesim.me\r\n// https://api.hive.blue\r\n// https://hived.emre.sh\r\n// 'https://api.deathwing.me', // cant search by tx\r\n\r\nexport const pickHiveNode = () => {\r\n const randId = Math.floor(Math.random() * hiveNodes.length);\r\n const pickedNode = hiveNodes[randId];\r\n return pickedNode;\r\n};\r\n\r\nexport const setRandNode = () => {\r\n const pickedNode = pickHiveNode();\r\n hivejs.api.setOptions({ url: pickedNode });\r\n return pickedNode;\r\n};\r\n\r\n\r\nconst getHiveChainProps = () => new Promise((res, rej) => {\r\n hivejs.api.getDynamicGlobalProperties((err, result) => {\r\n if (err) rej(err);\r\n else res(result);\r\n });\r\n});\r\n\r\nexport const readHiveUserBalances = ({ username }) => new Promise((resolve) => {\r\n setRandNode();\r\n try {\r\n hivejs.api.getAccounts([username], (err, result) => {\r\n isLocal && console.log('Account data:', err, result);\r\n if (err) {\r\n console.error('Unable to fetch account balance:', err);\r\n return resolve({});\r\n }\r\n const hiveBalance = get(result, '[0].balance');\r\n const hbdBalance = get(result, '[0].hbd_balance');\r\n const vestingShares = get(result, '[0].vesting_shares');\r\n isLocal && console.debug('Hive liquid balances:', { hiveBalance, hbdBalance });\r\n getHiveChainProps()\r\n .then((globals) => {\r\n try {\r\n const totalSteem = Number(globals.total_vesting_fund_hive.split(' ')[0]);\r\n const totalVests = Number(globals.total_vesting_shares.split(' ')[0]);\r\n const userVests = Number(vestingShares.split(' ')[0]);\r\n const hivePower = totalSteem * (userVests / totalVests);\r\n isLocal && console.log('All Hive balances:', { hiveBalance, hbdBalance, hivePower });\r\n resolve({ hiveBalance, hbdBalance, hivePower });\r\n } catch (err) {\r\n console.error('Caught retrieving hive power:', err);\r\n resolve({ hiveBalance, hbdBalance });\r\n } \r\n });\r\n });\r\n } catch (err) {\r\n console.error('Caught retrieving hive balances:', err);\r\n resolve({});\r\n }\r\n});\r\n\r\n\r\n// ## WHITELIST stored in Hive\r\n\r\nconst simpleEncoder = (whitelistObj) => {\r\n const stringified = JSON.stringify(whitelistObj);\r\n const urld = encodeURIComponent(stringified);\r\n const btoed = btoa(urld).replace(/=/g, '');\r\n const reversed = btoed.split('').reverse().join('');\r\n const result = btoa(reversed).replace(/=/g, '');\r\n return result;\r\n};\r\n\r\n// const whitelistObj = {\r\n// whitelistUsers: [\r\n// '//---MODS',\r\n// '//---EARLY-TEAM',\r\n// '//---YOUTUBERS',\r\n// ],\r\n// mappedSneakers: {\r\n// crypto4sh4ts: 'pvbxq.wam//saylormoon',\r\n// }\r\n// };\r\n// simpleEncoder(whitelistObj);\r\n\r\nexport const simpleDecoder = (data = '') => {\r\n const firstChar = data.substr(0, 1);\r\n if (firstChar === '{' || firstChar === '[') return data;\r\n const atobed = atob(data);\r\n isLocal && console.log({ atobed });\r\n const reversed = atobed.split('').reverse().join('');\r\n isLocal && console.log({ reversed });\r\n const decoded = atob(reversed);\r\n isLocal && console.log({ decoded });\r\n const deurld = decodeURIComponent(decoded);\r\n return deurld;\r\n};\r\n\r\n\r\n// ## READ from given permlink.\r\n\r\nexport const fetchHiveData = ({ author = 'crypto-shots', permlink }) => new Promise((resolve, reject) => {\r\n setRandNode();\r\n isLocal && console.debug('Fetching from hive:', { author, permlink });\r\n hivejs.api.getContent(author, permlink, (err, data) => {\r\n if (err) {\r\n console.error('Error in Hive fetch response', err);\r\n reject({ err: 'hive-fetch-ko' });\r\n return;\r\n }\r\n if (!data || (data.result && !data.result.length)) {\r\n console.error('No data in Hive fetch response', err);\r\n reject({ err: 'res-empty-array-hive' });\r\n return;\r\n }\r\n let json;\r\n try {\r\n if (!data.body) {\r\n console.error(`Unable to read Hive data. Data: ${JSON.stringify(data)}`);\r\n reject({ err: 'hive-no-body' });\r\n return;\r\n }\r\n json = JSON.parse(simpleDecoder(data.body));\r\n isLocal && console.debug('Fetched from hive:', { json });\r\n } catch (err) {\r\n console.error('Unable to parse into json:', err);\r\n reject({ err: 'caught-in-hive-fetch' });\r\n return;\r\n }\r\n resolve({ whitelistObj: json, json }); // keep both\r\n });\r\n});\r\n","import { createSlice } from '@reduxjs/toolkit';\r\n\r\nconst initialState = {\r\n wax: 0,\r\n tokens: { // wax tokens only\r\n boom: 0,\r\n food: 0,\r\n gas: 0,\r\n mars: 0,\r\n },\r\n stakedSavings: { // igBoom - currenty left to 0 here. API hack.\r\n boom: 0,\r\n },\r\n hiveTokens: {\r\n doom: 0,\r\n }\r\n};\r\n\r\nconst wallet = createSlice({\r\n name: 'wallet',\r\n initialState,\r\n reducers: {\r\n setPlayerWaxBalance: (state, action) => ({ ...state, wax: action.payload.wax }),\r\n setPlayerWaxTokensBalances: (state, action) => {\r\n const { tokens: tokensUpdated, stakedSavings } = action.payload;\r\n return ({\r\n ...state,\r\n tokens: { ...state.tokens, ...tokensUpdated },\r\n stakedSavings: stakedSavings || state.stakedSavings,\r\n });\r\n },\r\n setPlayerHiveTokensBalances: (state, action) => {\r\n const { hiveTokens: tokensUpdated } = action.payload;\r\n return ({\r\n ...state,\r\n hiveTokens: { ...state.hiveTokens, ...tokensUpdated },\r\n });\r\n },\r\n },\r\n});\r\n\r\nexport const {\r\n setPlayerWaxBalance,\r\n setPlayerWaxTokensBalances,\r\n setPlayerHiveTokensBalances,\r\n} = wallet.actions;\r\n\r\nexport default wallet.reducer;\r\n","import { isTestnet } from '../constants/envs';\r\n\r\n\r\nexport const WAX_NODES = {\r\n DEFAULT: isTestnet\r\n ? 'https://testnet.waxsweden.org'\r\n : 'https://wax.greymass.com',\r\n ALTS: isTestnet\r\n ? [\r\n // 'https://testnet.wax.eosdetroit.io',\r\n 'https://waxtestnet.greymass.com',\r\n ]\r\n : [\r\n 'https://wax.eosrio.io',\r\n 'https://wax.eosphere.io',\r\n 'https://api.waxsweden.org',\r\n 'https://wax.blokcrafters.io',\r\n ],\r\n};\r\n","import { nap } from \"../utils\";\r\n\r\nexport const uiHacks = {\r\n // the login modal (external component) has the 2 button chevrons out of place\r\n chevron: () => {\r\n const ts = setInterval(() => {\r\n const loginChoices = document.querySelectorAll('.ual-auth-button');\r\n for (let id = 0; id < loginChoices.length; id++) {\r\n const currentElem = loginChoices[id];\r\n if (!currentElem) { console.error('Elem not found for chevron hack'); continue; }\r\n currentElem.style.width = '100%';\r\n }\r\n }, 100);\r\n setTimeout(() => clearInterval(ts), 2000);\r\n },\r\n disableClaimAndPlayBtnsAtFirst: async ({ claimOnly = false } = {}) => {\r\n await nap(200);\r\n // const ts = setInterval(() => {\r\n const claimBtn = document.getElementById('claim-boom');\r\n const unstakeBtn = document.getElementById('unstake-btn');\r\n const playBtn = document.getElementById('play-button');\r\n // claim and unstake\r\n if (claimBtn) {\r\n if (claimBtn.getAttribute('been-here')) return; // not pristine\r\n claimBtn.setAttribute('disabled', 'true');\r\n claimBtn.setAttribute('bigger', '1.05x');\r\n claimBtn.setAttribute('been-here', 'ya');\r\n }\r\n if (unstakeBtn) {\r\n if (unstakeBtn.getAttribute('been-here')) return; // not pristine\r\n unstakeBtn.setAttribute('disabled', 'true');\r\n unstakeBtn.setAttribute('bigger', '1.05x');\r\n unstakeBtn.setAttribute('been-here', 'ya');\r\n }\r\n // play\r\n if (claimOnly) return;\r\n // if (playBtn) {\r\n // if (playBtn.getAttribute('been-here')) return; // not pristine\r\n // playBtn.setAttribute('disabled', 'true');\r\n // playBtn.setAttribute('bigger', '1.05x');\r\n // playBtn.setAttribute('been-here', 'ya');\r\n // }\r\n // }, 200);\r\n // setTimeout(() => {\r\n // clearInterval(ts);\r\n // const claimBtn = document.getElementById('claim-boom');\r\n // const unstakeBtn = document.getElementById('unstake-btn');\r\n // const playBtn = document.getElementById('play-button');\r\n // claimBtn && claimBtn.removeAttribute('been-here');\r\n // unstakeBtn && unstakeBtn.removeAttribute('been-here');\r\n // playBtn && playBtn.removeAttribute('been-here');\r\n // }, 500);\r\n },\r\n};\r\n","import { isTestnet } from '../../../../../constants/envs';\r\nimport { testDataTournament } from './localTournamentData';\r\n\r\n\r\nconst TOURNAMENT_TIMES_ENDPOINT = 'https://play.crypto-shots.com/json/tournament-times.json';\r\nconst TOURNAMENT_TIMES_CACHE_DURATION_MS = 2 * 60 * 1000;\r\n\r\nlet lastCheckTourneyStatusTs;\r\nlet cachedResponse;\r\n\r\n\r\n// API call to check if it's tourney time\r\nexport const consumeTourneyConfig = async () => {\r\n isTestnet && console.log('~~~~~~~~~~~~ Checking if a tourney is active...........');\r\n // ETH bypass checks for now! @@\r\n const lsChainLogin = localStorage.getItem('chainLogin');\r\n if (lsChainLogin === 'eth' || lsChainLogin === 'skl') {\r\n // NOTE: prevents \"tournament in progress\" message from showing on landing page for eth users // TEMP @@\r\n return ({ isPvpPassRequired: false });\r\n }\r\n // CACHE\r\n if (lastCheckTourneyStatusTs && cachedResponse !== undefined) {\r\n const elapsedTime = Date.now() - lastCheckTourneyStatusTs;\r\n if (elapsedTime < TOURNAMENT_TIMES_CACHE_DURATION_MS) {\r\n isTestnet && console.debug('Already checked recently, returning previous status.',\r\n { lastCheckTourneyStatusTs, cachedResponse });\r\n return ({ isPvpPassRequired: cachedResponse });\r\n }\r\n }\r\n try {\r\n const data = isTestnet // TEST\r\n ? await Promise.resolve(testDataTournament)\r\n : await fetch(TOURNAMENT_TIMES_ENDPOINT).then(res => res.json());\r\n // ## GENERAL TOURNEY CONFIGS\r\n // tournament.rewards.extraRewardsTourneyOnly = data.extraRewardsTourneyOnly || true;\r\n // tournament.sponsoredRewards.avgPlayersSingleSponsoredTourney = data.sponsoredRewards?.avgPlayersSingleSponsoredTourney || 8;\r\n // tournament.sponsoredRewards.howManySponsoredTourneysPerWeek = data.sponsoredRewards?.howManySponsoredTourneysPerWeek || 2;\r\n \r\n // ## TIME BOUNDARIES CHECK\r\n lastCheckTourneyStatusTs = Date.now(); // activate cache\r\n\r\n const currentDay = new Date().toLocaleDateString('en-US', { weekday: 'long' }); // eg. 'Saturday'\r\n const currentTime = new Date().toISOString().substr(11, 8); // eg. '06:00:00'\r\n for (const tourneyEntry of data.tournaments) {\r\n if (tourneyEntry.day === currentDay) {\r\n const startTime = tourneyEntry.start;\r\n const endTime = tourneyEntry.end;\r\n // const isTestTournament = tourneyEntry.isTestnet;\r\n // if (isTestTournament && !isTestnet) continue;\r\n isTestnet && console.debug('Tournament entry being checked:', { startTime, endTime }, JSON.stringify({ tourneyEntry }));\r\n if (isTimeBetween(startTime, endTime, currentTime)) {\r\n // ## FOUND ACTIVE TOURNEY\r\n isTestnet && console.log(`Tournament active: ${tourneyEntry.day} from ${startTime} to ${endTime\r\n }. Reward multiplier: ${tourneyEntry.rewardsMultiplier}. Note: ${tourneyEntry.NOTE}`);\r\n // const { streamer = {}, tournamentRegionOverride, autoRewardsOnTourneyEnd, sponsor } = tourneyEntry;\r\n // ## SPECIFIC TOURNEY CONFIGS\r\n // - \"STATUS\" - mark tournament as within active ranges (Different from active = enabled by streamer)\r\n // tournamentStatus.isInTourneyTimeRange = true;\r\n // - \"T.PROPS\" - (instead \"T.CACHE\" and \"ATTENDANTS\" updated by single matches)\r\n // tournament.props.rewardsMultiplier = tourneyEntry.rewardMultiplier || 1;\r\n // const { displayName, streamUrl } = streamer;\r\n // tournament.props.streamer = { name: displayName, url: streamUrl };\r\n // tournament.props.tournamentRegion = tournamentRegionOverride;\r\n // tournament.props.autoRewardsOnTourneyEnd = autoRewardsOnTourneyEnd;\r\n // // { sponsorSymbol, sponsorTokenInitialBalance, tokenPrecision, sendStaked, projectName, ownerDiscordId, sponsorDiscordInvite }\r\n // tournament.props.sponsor = sponsor;\r\n const isPvpPassRequired = !tourneyEntry?.skipPvpPassCheck;\r\n cachedResponse = isPvpPassRequired; \r\n return ({ activeTourney: true, isPvpPassRequired }); // false (not required if the skip flag is true)\r\n }\r\n }\r\n }\r\n isTestnet && console.log('Tourney is not active at the moment');\r\n // tournamentStatus.isInTourneyTimeRange = false;\r\n return ({ isPvpPassRequired: true });\r\n } catch (error) {\r\n console.error('Error fetching tournament data:', error);\r\n // tournamentStatus.isInTourneyTimeRange = false;\r\n return ({ isPvpPassRequired: true });\r\n }\r\n };\r\n \r\n \r\n // UTILS\r\n \r\n const WIGGLE_MINUTES_START = 10; // ie. counts match if started max X min early\r\n const WIGGLE_MINUTES_END = 10; // let them still start a new match X mins after tourney end\r\n \r\n // For tournament start time checks it counts matches ended -WIGGLE_MINUTES_START mins before official time.\r\n // For tournament end, if tourney not ended in bot, adds WIGGLE_MINUTES_END mins more.\r\n // (but be aware of the TOURNAMENT_TIMES_CACHE_DURATION_MS mins cache for these checks)\r\n const isTimeBetween = (startTime, endTime, currentTime) => {\r\n const startDate = new Date(\r\n new Date('1970-01-01 ' + startTime).getTime() - (WIGGLE_MINUTES_START * 60 * 1000)\r\n );\r\n const endDate = new Date(\r\n new Date('1970-01-01 ' + endTime).getTime() + (WIGGLE_MINUTES_END * 60 * 1000)\r\n );\r\n const currentDate = new Date('1970-01-01 ' + currentTime);\r\n return startDate <= currentDate && currentDate <= endDate;\r\n };\r\n","import { isTestnet } from \"../constants/envs\";\r\n\r\n\r\n// ### WAX\r\n\r\nexport const WAX_ACCOUNTS = {\r\n SPACESHIPS: [\r\n // L0\r\n 'spaceshipzer',\r\n // L1\r\n 'csspaceship1',\r\n 'csspaceship2',\r\n 'csspaceship3',\r\n // L2\r\n 'csspaceshipa',\r\n 'csspaceshipb',\r\n 'csspaceshipc',\r\n ],\r\n FOOD_CANTEEN: 'foodcanteen1',\r\n MARKETPLACE: 'csgamemarket',\r\n TRIAL_PAYMENTS: 'trycshotsfps',\r\n SUBS_PAYMENTS: 'csmarsburner',\r\n IG_RESOURCES_PAYMENTS: 'csigresource',\r\n};\r\n\r\nexport const MODS = [\r\n 'csmoderators',\r\n 'nwv.u.c.wam', // thor,\r\n 'mkske.c.wam', // pierre,\r\n 'spphy.wam', // zayne\r\n 'iavhs.wam', // silverblue\r\n '2bbzc.wam', // asako\r\n // testing:\r\n 'crypto5shots',\r\n];\r\n\r\nexport const ADMINS = [\r\n // Wax:\r\n 'crypto4shots',\r\n 'crypto5shots',\r\n // Hive:\r\n 'crypto-shots',\r\n 'cryptoshots.nft',\r\n];\r\n\r\nexport const COMMUNITY_MANAGERS = [\r\n // 'nwv.u.c.wam', // Thor\r\n // 'mkske.c.wam', // pierre,\r\n 'iavhs.wam', // silverblue (doggo)\r\n 'spphy.wam', // zayne\r\n];\r\n\r\nexport const SWAP_WL = [\r\n ...ADMINS,\r\n 'xofr2.wam', // andrew\r\n];\r\n\r\n\r\n// ### HIVE\r\n\r\nexport const DOOM_SWAPS_RECEIVER = 'cryptoshots.burn';\r\nexport const BOOM_SWAPS_RECEIVER = isTestnet ? 'crypshotsnft' : 'cstokensburn';\r\n\r\nexport const TRIAL_PAYMENTS_ACCOUNT_HIVE = 'cryptoshots.try';\r\n","import { ADMINS, MODS } from '../config/accounts';\r\n\r\n\r\nexport const isPriviledgedUser = (uname = '') => MODS.includes(uname)\r\n || ADMINS.includes(uname);\r\n","export default __webpack_public_path__ + \"static/media/cs-logo.7d24eab8.jpg\";","import commaNumber from 'comma-number';\r\nimport { isTestnet } from '../constants/envs';\r\n\r\nexport const formatBalance = (balance) => {\r\n isTestnet && console.log('Wax balance footer:', balance);\r\n if (balance == undefined) return; // eslint-disable-line\r\n const rounded = balance.toFixed(4);\r\n const displayValue = commaNumber(rounded);\r\n return `${displayValue} WAX`;\r\n};\r\n","export default __webpack_public_path__ + \"static/media/WaxLogo.b8bedcf4.png\";","export default __webpack_public_path__ + \"static/media/HiveLogo.8c3fcc36.png\";","export default __webpack_public_path__ + \"static/media/EthLogo.d9a10bfd.png\";","export default __webpack_public_path__ + \"static/media/BtcLogo.2b95623f.png\";","import React from 'react';\r\n\r\nconst CHAIN_ATTRIBUTES = {\r\n HIVE: [\r\n 'FAST. ZERO fees.',\r\n 'Truly Decentralized.',\r\n 'Your username is your wallet.',\r\n ],\r\n WAX: [\r\n 'No Transaction Fees.',\r\n 'Top Gaming Chain.',\r\n 'Easy To Use.',\r\n ],\r\n BTC: [\r\n 'Cheap Transaction Fees.',\r\n 'High Liquidity.',\r\n 'Wide Accessibilty.',\r\n ],\r\n SKL: [\r\n 'The Fastest.',\r\n 'No Fees.',\r\n 'High Liquidity.',\r\n ],\r\n};\r\n\r\nconst getAttribute = ({ chain = '', index }) => {\r\n const attrs = CHAIN_ATTRIBUTES[chain.toUpperCase()] || [];\r\n return attrs[index] || null;\r\n};\r\n\r\nexport const ChainProps = ({ chain = '' }) => {\r\n return (\r\n
\r\n {getAttribute({ chain, index: 0 })}
\r\n {getAttribute({ chain, index: 1 })}
\r\n {getAttribute({ chain, index: 2 })}
\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\nimport WaxLogo from '../../../../images/logos/WaxLogo.png';\r\nimport HiveLogo from '../../../../images/logos/HiveLogo.png';\r\nimport EthLogo from '../../../../images/logos/EthLogo.png';\r\nimport BtcLogo from '../../../../images/logos/BtcLogo.png';\r\nimport SklLogo from '../../../../images/logos/SklLogo.png';\r\nimport { ChainProps } from './ChainProps';\r\n\r\n\r\nconst ICONS = {\r\n WIDTH: {\r\n BTC: '65',\r\n WAX: '120',\r\n HIVE: '',\r\n ETH: '70',\r\n ETH_CHOICE: '70',\r\n SKL: '',\r\n },\r\n GAP_TOP: {\r\n BTC: '0',\r\n HIVE: '-10',\r\n WAX: '-20',\r\n ETH: '10',\r\n ETH_CHOICE: '10',\r\n SKL: '-10',\r\n },\r\n};\r\n\r\nexport const ChainPromo = ({ chainName = '' }) => {\r\n const chain = chainName.toUpperCase().replace(/-/g, '_');\r\n return (<>\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport const ChainIcon = ({ chain, width }) => {\r\n switch (chain) {\r\n case 'wax':\r\n return \"WaxLogo\";\r\n case 'hive':\r\n return \"HiveLogo\";\r\n case 'eth-choice':\r\n case 'eth':\r\n return \"EthLogo\";\r\n case 'btc':\r\n return \"BtcLogo\";\r\n case 'skl':\r\n return \"SklLogo\";\r\n default: {\r\n console.error(`Unexpected chain ${chain}`);\r\n return null;\r\n }\r\n }\r\n};\r\n","export default \"data:image/png;base64,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\"","import { isLocal } from '../../../../../constants/envs';\r\n\r\n\r\nconst cache = {\r\n cachedResults: {}, // eg. { 'hive,hbd': { ts, data } }\r\n};\r\nconst CACHE_DURATION_MINS = 15;\r\n\r\n\r\n// Free API rate limit 10-30 calls/min\r\nexport const coingeckoFetch = async ({ token = '' }) => {\r\n const tokenLc = token.toLowerCase();\r\n isLocal && console.log('[gecko] Fetching price of', tokenLc);\r\n // CACHE CHECK\r\n const cachedPrice = cache.cachedResults[tokenLc] || {};\r\n const { data: priceData, ts: lastFetchTs } = cachedPrice;\r\n if (priceData) {\r\n const elapsedTime = Date.now() - lastFetchTs;\r\n if (elapsedTime < (CACHE_DURATION_MINS * 60 * 1000)) {\r\n isLocal && console.log('[gecko] Returned cached value of', priceData);\r\n return ({ data: priceData });\r\n }\r\n // doing this here so that it returns previous result if new requests come in\r\n // while this request is still in progress (prevent api throttling)\r\n cachedPrice.ts = Date.now();\r\n }\r\n // REQUEST PREP\r\n const params = {\r\n ids: tokenLc,\r\n vs_currencies: 'usd',\r\n };\r\n const tail = Object.entries(params).map(([key, value]) => `${key}=${value}`).join('&');\r\n isLocal && console.log('[gecko] No cache hit. Sending coingecko price fetch for:', { params });\r\n // API CALL\r\n return fetch(\r\n `https://api.coingecko.com/api/v3/simple/price?${tail}`,\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n referrer: 'https://www.coingecko.com/',\r\n }\r\n )\r\n .then(res => res.json())\r\n .then((data = {}) => {\r\n isLocal && console.log('[gecko] price data:', { tokenLc, data });\r\n cache.cachedResults[tokenLc] = { data, ts: Date.now() };\r\n return ({ data });\r\n })\r\n .catch((err) => {\r\n console.error(`Failed to fetch token price from coingecko: ${err}`);\r\n return ({ err: 'cg-fetch-ko' });\r\n });\r\n};\r\n\r\n\r\n// const test = async () => {\r\n// const { data } = await coingeckoFetch({ token: 'hive' });\r\n// console.log('RES:', data.hive.usd);\r\n// };\r\n// const fetch = require('node-fetch');\r\n// test();\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Link } from 'react-router-dom';\r\nimport LogoIcon from '../../../images/logos/cs-logo.jpg';\r\nimport { isMainnet } from '../../../constants/envs';\r\nimport { formatBalance } from '../../../generalUtils/formatBalance';\r\nimport { ChainIcon } from '../../../pages/LandingPage/Login/Shared/ChainIcon';\r\nimport { getPlayerUsername } from '../../../generalUtils/utils';\r\nimport { coingeckoFetch } from '../../../pages/Leaderboard/Prizes/utils/prices/coingecko';\r\nimport './NameAndBalance.scss';\r\n\r\n\r\nconst getUsernameLink = (chain) => {\r\n const uname = getPlayerUsername();\r\n switch (chain) {\r\n case 'wax': return isMainnet\r\n ? `https://wax.atomichub.io/profile/${uname}`\r\n : `https://wax-test.atomichub.io/profile/${uname}`;\r\n case 'hive':\r\n return `https://peakd.com/@${uname}`;\r\n case 'skl':\r\n case 'eth':\r\n return `https://etherscan.io/address/${uname}#multichain-portfolio`;\r\n default: console.error('unexpected chain for username link:', uname, chain);\r\n }\r\n};\r\n\r\nconst formatUsername = ({ username, chain }) => {\r\n if (chain === 'skl' || chain === 'eth') return `${username.slice(0, 6)}...${username.slice(-4)}`;\r\n if (chain === 'hive') return `@${username}`;\r\n return username;\r\n};\r\n\r\nconst CryptoBalance = ({ chain = '' }) => {\r\n const WalletState = useSelector((store) => store.wallet);\r\n\r\n switch (chain) {\r\n case 'wax': return (\r\n \r\n {formatBalance(WalletState.wax)}\r\n \r\n );\r\n case 'hive':\r\n case 'skl':\r\n case 'eth':\r\n return (\r\n     n/a \r\n {chain.toUpperCase()}\r\n \r\n \r\n // \r\n //     n/a ${chain.toUpperCase()}\r\n // {/* TODO */}\r\n // \r\n );\r\n default: return null;\r\n }\r\n};\r\n\r\nexport const NameAndBalance = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const chain = UserState.chainLogin;\r\n\r\n const [chainPrice, setChainPrice] = useState(0);\r\n\r\n useEffect(() => {\r\n if (!chain) return;\r\n // Fetch chain price\r\n const fetchChainPrice = async () => {\r\n const { data = {}, err } = await coingeckoFetch({ token: chain });\r\n const usdPrice = data[chain]?.usd;\r\n !err && usdPrice && setChainPrice(usdPrice.toFixed(2));\r\n };\r\n fetchChainPrice();\r\n }, [chain]);\r\n\r\n if (!UserState.isLogged) return null;\r\n\r\n return (
\r\n {/* LOGO */}\r\n
\r\n \"LogoIcon\"\r\n
\r\n\r\n {/* BALANCE AND USERNAME */}\r\n
\r\n \r\n
   \r\n \r\n
\r\n
\r\n\r\n {/* CHAIN ICON */}\r\n
\r\n \r\n

\r\n {chainPrice}\r\n

\r\n
\r\n
\r\n );\r\n};\r\n","import { isLocal } from '../constants/envs';\r\n\r\n// TODO: use remote JSON\r\nconst FLAGS = {\r\n SWAPS_ENABLED: true,\r\n ADS_ENABLED: false,\r\n};\r\n\r\nexport const isFeatureEnabled = (flagName = '') => {\r\n const which = `${flagName}_ENABLED`;\r\n const lsValue = localStorage.getItem(which);\r\n if (lsValue && lsValue !== 'false') return true;\r\n const value = FLAGS[which];\r\n if (isLocal || value === undefined) return true; // if not in there anymore, enabled\r\n return value;\r\n};\r\n\r\n\r\n// TEMP\r\nexport const IS_PVP_ALPHA_FREE_TRAVELS = true;\r\n","import React from 'react';\r\nimport { isFeatureEnabled } from '../../../../config/featureFlags';\r\nimport './AnonAd.scss';\r\n\r\n\r\nexport const AnonAdBanner = () => {\r\n if (!isFeatureEnabled('ADS')) return null;\r\n return (\r\n
\r\n \r\n \r\n Promote your crypto project here\r\n \r\n
\r\n );\r\n};\r\n\r\nexport const AnonAdSquare = () => {\r\n if (!isFeatureEnabled('ADS')) return null;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n","\r\n// -------------------------------\r\nconst ENABLE_TOURNAMENT = true;\r\nconst IS_FREE_TO_EARN = true;\r\n// -------------------------------\r\n\r\nconst daysOfWeek = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\r\nconst dayOfWeekName = () => daysOfWeek[new Date().getDay()];\r\n\r\nconst currentTimeFormatted = ({ delayMins = 0 } = {}) => {\r\n const currentDate = new Date();\r\n const targetDate = new Date(currentDate.getTime() + delayMins * 60 * 1000);\r\n const hours = String(targetDate.getUTCHours()).padStart(2, '0');\r\n const minutes = String(targetDate.getUTCMinutes()).padStart(2, '0');\r\n const seconds = String(targetDate.getUTCSeconds()).padStart(2, '0');\r\n return `${hours}:${minutes}:${seconds}`;\r\n};\r\n\r\n\r\nexport const testDataTournament = {\r\n \"tournaments\": [\r\n {\r\n \"day\": ENABLE_TOURNAMENT ? dayOfWeekName() : \"Monday\",\r\n \"start\": ENABLE_TOURNAMENT ? currentTimeFormatted({ delayMins: 0 }) : \"00:00:44\",\r\n \"end\": ENABLE_TOURNAMENT ? currentTimeFormatted({ delayMins: 30 }) : \"00:00:45\",\r\n \"streamer\": {\r\n \"displayName\": \"Tester\",\r\n \"pvpUsername\": \"tester@hive\",\r\n \"streamUrl\": \"https://twitch.tv/tester\",\r\n \"streamDescription\": \"10 BTC to every winner lol\"\r\n },\r\n \"sponsor\": {\r\n \"sponsorSymbol\": \"SUB\",\r\n \"weekTotBalance\": 60,\r\n \"tokenPrecision\": 2,\r\n \"sendStaked\": false,\r\n \"projectName\": \"STICKUPBOYS\",\r\n \"ownerDiscordId\": \"300032917151809556\",\r\n \"sponsorDiscordInvite\": \"https://stickupboys.co.uk\"\r\n },\r\n \"autoRewardsOnTourneyEnd\": true,\r\n \"raffleEnabled\": true,\r\n \"rewardMultiplier\": 0.1,\r\n \"tournamentRegionOverride\": \"USW\",\r\n \"anyoneCreateCustomRoom\": true,\r\n \"skipPvpPassCheck\": IS_FREE_TO_EARN\r\n }\r\n ],\r\n \"NOTES\": [\r\n \"Times in UTC!\",\r\n \"IS_TEST affects extra-rewards and bot-stats, plus Unity UI\",\r\n \"Consumed by: cs-pvp, cs-react, cs-wrapper, cs-discord\"\r\n ],\r\n \"extraRewardsTourneyOnly\": true,\r\n \"sponsoredRewards\": {\r\n \"avgPlayersSingleSponsoredTourney\": 6,\r\n \"note\": \"sponsor chain players only\",\r\n \"howManySponsoredTourneysPerWeek\": 4,\r\n \"howManyPartnerTourneysPerWeek\": 3\r\n }\r\n}\r\n","import React from 'react';\r\nimport './ActiveTourneyMsg.scss';\r\n\r\nexport const ActiveTourneyMsg = () => (
\r\n

\r\n PVP TOURNAMENT LIVE NOW !!\r\n

\r\n
);\r\n","export const StorageInstructions = () => {\r\n // styling must be here\r\n return (\r\n \r\n

\r\n CLASSIC: data saved in cache for single browser.\r\n Saves your Travels and Preferences.\r\n

\r\n

\r\n PREMIUM: data saved across any browser/machine.
\r\n All the CLASSIC benefits plus Ammo reset of 2nd most powerful weapon before the boss.\r\n

\r\n \r\n );\r\n};\r\n\r\nexport const FullScreenDismisser = ({ setStorageOverlayOpen }) => (\r\n
setStorageOverlayOpen(false)}>
\r\n);\r\n\r\nexport const CloseOverlayBtn = ({ setStorageOverlayOpen }) => {\r\n return ( setStorageOverlayOpen(false)}\r\n id=\"close-storage-overlay\"\r\n >\r\n X\r\n );\r\n};\r\n","// ## SPACESHIPS\r\nexport const CURRENCIES = { W: 'WAX', B: 'BOOM', F: 'FOOD', G: 'GAS', M: 'MARS', D: 'DOOM' };\r\n","import { isLocal } from '../../../../constants/envs';\r\nimport { CURRENCIES } from '../../../../constants/currencies';\r\nimport { windowSetChecksum } from '../../../../generalUtils/secure/checksums';\r\n\r\n\r\n// ## STORAGE TYPE\r\n\r\nexport const getSubDuration = (storageType) => {\r\n switch (storageType) {\r\n case 'CLASSIC-7d': return 7;\r\n case 'CLASSIC-30d': return 30;\r\n case 'PREMIUM': return 30;\r\n default: throw new Error(`Unexpected storage type ${storageType}`);\r\n }\r\n};\r\n\r\nexport const isClassicStorage = storageType => storageType?.includes('CLASSIC');\r\n\r\n\r\n// ## SPACESHIP INFO\r\n\r\nexport const getReduxSpaceshipInfo = ({ memo }) => {\r\n const [body] = memo.split('.');\r\n const [resourceType, level, shipAndCurrency] = body.split(':');\r\n const toLevel = +level.split('-')[1];\r\n const shipAndCurrencyNoPrefix = shipAndCurrency.split('-')[1];\r\n const spaceshipId = +shipAndCurrencyNoPrefix.slice(0, -1);\r\n const currency = CURRENCIES[shipAndCurrencyNoPrefix.slice(-1)];\r\n const result = { toLevel, spaceshipId, currency };\r\n isLocal && console.debug('Spaceship travel info for redux:', { result });\r\n return result;\r\n};\r\n\r\nexport const setFreeSpaceshipUsage = () => {\r\n window.freeShip = true;\r\n windowSetChecksum({ key: 'freeShip', value: true });\r\n const originaValue = window.freeShip;\r\n try { // freeze:\r\n Object.defineProperty(window, 'freeShip', { value: originaValue, writable: false });\r\n } catch (_) { }\r\n};\r\n","\r\nexport const LS_ID_SUBS_TX_HASH = 'subHash';\r\n\r\nexport const SUB_TYPES = {\r\n CLASSIC_WEEK : 'CLASSIC-7d',\r\n CLASSIC_MONTH: 'CLASSIC-30d',\r\n PREMIUM: 'PREMIUM',\r\n}\r\n\r\nexport const SUBS_PRICES = {\r\n v1: {\r\n [SUB_TYPES.CLASSIC_WEEK]: 600,\r\n [SUB_TYPES.CLASSIC_MONTH]: 2000,\r\n [SUB_TYPES.PREMIUM]: 3000,\r\n },\r\n};\r\n","import { isTestnet } from \"../constants/envs\";\r\n\r\nexport const TOKEN_ACCOUNT = isTestnet ? 'boomfungible' : 'csboomcsboom';\r\nexport const MINTER_ACCOUNT = isTestnet ? 'crypshotsnft' : 'crypto4shots';\r\n","\r\nexport const MINUTES = 60 * 1000;\r\nexport const HOURS = 60 * MINUTES;\r\n\r\n// # WHITELIST\r\nexport const freeTrippers = [\r\n 'crypto4shots',\r\n 'boomfungible',\r\n];\r\n\r\n// # OTHERS\r\nexport const TRAVEL_TX_ID_PREFIX = 'travelTxHash'; // eg. 'travelTxHash-L0'\r\nexport const MEAL_TX_ID_PREFIX = 'mealTxHash';\r\n","\r\nexport const DAYS = 24 * 60 * 60 * 1000;\r\n","import { get } from \"lodash\";\r\nimport { WAX_ACCOUNTS } from \"../../../../../../config/accounts\";\r\nimport { isLocal, isTestnet } from \"../../../../../../constants/envs\";\r\nimport { DAYS } from \"../../../../../../generalUtils/constants\";\r\nimport { UserService } from \"../../../../../../services/UserService\";\r\nimport { SUBS_PRICES, SUB_TYPES } from \"../../constants\";\r\nimport { getSubDuration } from \"../../utils\";\r\nimport { fetchTxInfo } from \"../loadStorage\";\r\n\r\n\r\n\r\nconst validateTransaction = ({ from, to, memo, quantityTransfered, transferCurrency }) => {\r\n if (from !== UserService.authName) {\r\n console.error('Invalid sender!', { actual: from });\r\n return false;\r\n }\r\n if (to !== WAX_ACCOUNTS.SUBS_PAYMENTS) {\r\n console.error('Invalid recipient!', { actual: to });\r\n return false;\r\n }\r\n const storageType = memo?.trim();\r\n if (!Object.values(SUB_TYPES).includes(storageType)) {\r\n console.error('Invalid memo!', { actual: memo });\r\n return false;\r\n }\r\n const expectedPrice1 = SUBS_PRICES.v1[storageType];\r\n const expectedPrice2 = get(SUBS_PRICES, `v2.${storageType}`, 100000);\r\n const foundMatch = expectedPrice1 === quantityTransfered || expectedPrice2 === quantityTransfered;\r\n if (!isTestnet && !foundMatch) {\r\n console.error('Invalid amount!', { actual: quantityTransfered });\r\n return false;\r\n }\r\n if (transferCurrency !== 'MARS' && !isTestnet) {\r\n console.error('Invalid currency!', { actual: transferCurrency });\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nconst calcDaysLeft = ({ storageType, transferTimestamp }) => {\r\n const subDuration = getSubDuration(storageType);\r\n const daysLeftMillis = (new Date(transferTimestamp).getTime() + (subDuration * DAYS)) - Date.now();\r\n if (daysLeftMillis < 0) {\r\n isLocal && console.log('Subscription expired!', { storageType, txTime: transferTimestamp, subDuration });\r\n return ({ isExpired: true });\r\n }\r\n const daysLeft = Math.ceil(daysLeftMillis / DAYS);\r\n isLocal && console.debug('Sub has days left:', daysLeft);\r\n return ({ daysLeft });\r\n};\r\n\r\nexport const validateSubscription = async ({ txHash }) => {\r\n // retrieve: sender, amount, time, memo\r\n const { from, to, memo, transferTimestamp, quantityTransfered, transferCurrency } = await fetchTxInfo({ txHash });\r\n\r\n // validate sender, amount matching memo -- invalid\r\n isLocal && console.log('Validating subscription tx data:', { from, to, memo, transferTimestamp, quantityTransfered, transferCurrency });\r\n const isValid = validateTransaction({ from, to, memo, transferTimestamp, quantityTransfered, transferCurrency });\r\n if (!isValid) return ({ invalid: true });\r\n\r\n // check how many days left (or expired)\r\n const storageType = memo.trim();\r\n const { isExpired, daysLeft } = calcDaysLeft({ storageType, transferTimestamp });\r\n if (isExpired) return ({ isExpired: true });\r\n\r\n // result\r\n return ({ storageType, daysLeft });\r\n};\r\n","import stringHash from 'string-hash';\r\nimport { isLocal } from '../constants/envs';\r\n\r\n\r\nexport const getMemoChecksum = ({ body, payer }) => stringHash(btoa(`${body}_${payer}`));\r\n\r\nexport const getPriceHash = ({ quantity, checksum }) => stringHash(btoa(`${quantity}_${checksum}`)); // eg. '1.0000 MARS'\r\n\r\n\r\n// MEAL:level-0:F\r\nexport const mealPaymentMemo = ({ activeLevel, payer, quantity }) => {\r\n const body = `MEAL:level-${activeLevel}:0F`;\r\n const checksum = getMemoChecksum({ body, payer });\r\n const priceHash = getPriceHash({ quantity, checksum });\r\n isLocal && console.debug(`Generated meal memo:`, { body, checksum });\r\n return `${body}.${checksum}-${priceHash}`;\r\n};\r\n\r\n// TRAVEL-FARE:level-0:ship-0F, TRAVEL-FARE:level-0:ship-0G, TRAVEL-FARE:level-0:ship-1B\r\nexport const travelPaymentMemo = ({\r\n activeLevel, spaceshipId, currency, payer, quantity,\r\n}) => {\r\n const body = `TRAVEL-FARE:level-${activeLevel}:ship-${spaceshipId}${currency}`;\r\n const checksum = getMemoChecksum({ body, payer });\r\n const priceHash = getPriceHash({ quantity, checksum });\r\n isLocal && console.debug(`Generated travel memo:`, { body, checksum });\r\n return `${body}.${checksum}-${priceHash}`;\r\n};\r\n","\r\nexport const getMonthDay = ({ ts }) => {\r\n const temp = new Date(Number(ts)).toISOString();\r\n return temp.substring(0, 10);\r\n};\r\n","import { WAX_ACCOUNTS } from \"../../../../../../config/accounts\";\r\nimport { isLocal, isTestnet } from \"../../../../../../constants/envs\";\r\nimport { getMemoChecksum, getPriceHash } from \"../../../../../../generalUtils/paymentMemo\";\r\nimport { UserService } from \"../../../../../../services/UserService\";\r\nimport { fetchTxInfo } from \"../loadStorage\";\r\nimport { getMonthDay } from \"./utils\";\r\n\r\n// Invalid memo or price! \r\n// { \r\n// memo: \"TRAVEL-FARE:level-1:ship-3W.3198463836-4085106150\"\r\n// quantity: \"6.65000000 WAX\"\r\n// reason: { 1: true, 2: true }\r\n// }\r\n// Invalid memo or price! \r\n// { \r\n// memo: \"TRAVEL-FARE:level-2:ship-3W.2517275042-3627327500\"\r\n// quantity: \"7.60000000 WAX\"\r\n// reason: { 1: true, 2: true }\r\n// }\r\nconst validateResourceTx = ({ from, to, memo, quantityTransfered, transferCurrency }) => {\r\n isLocal && console.debug('Validating resource payment tx:',\r\n { from, to, memo, quantityTransfered, transferCurrency },\r\n );\r\n // Validate parties\r\n if (from !== UserService.authName) {\r\n console.error('Invalid sender!', { actual: from });\r\n return false;\r\n }\r\n if (to !== WAX_ACCOUNTS.FOOD_CANTEEN && !WAX_ACCOUNTS.SPACESHIPS.includes(to)) {\r\n console.error('Invalid recipient!', { actual: to });\r\n return false;\r\n }\r\n // Validate checksums\r\n const [body, checksumFull] = memo.split('.');\r\n const [part1, part2] = checksumFull.split('-');\r\n const expectedChecksum = getMemoChecksum({ body, payer: from });\r\n const quantity = `${quantityTransfered.toFixed(transferCurrency === 'WAX' ? 8 : 4)} ${transferCurrency}`;\r\n const expectedPriceHash = getPriceHash({ quantity, checksum: part1 });\r\n const amountTooSmall = !isTestnet && quantityTransfered < 10;\r\n if (amountTooSmall || +part1 !== expectedChecksum || +part2 !== expectedPriceHash) {\r\n console.error('Invalid memo or price!', {\r\n memo, quantity, reason: { 1: part1 !== expectedChecksum, 2: part2 !== expectedPriceHash },\r\n });\r\n return false;\r\n }\r\n // Valid tx\r\n return true;\r\n};\r\n\r\nexport const validateResourcePayment = async ({ txHash }) => {\r\n // retrieve: sender, amount, time, memo\r\n const { from, to, memo, transferTimestamp, quantityTransfered, transferCurrency } = await fetchTxInfo({ txHash });\r\n\r\n // validate sender, amount matching memo -- invalid\r\n isLocal && console.log('Validating meal tx data:', { from, to, memo, transferTimestamp, quantityTransfered, transferCurrency });\r\n const isValid = validateResourceTx({ from, to, memo, transferTimestamp, quantityTransfered, transferCurrency });\r\n if (!isValid) return ({ invalid: true });\r\n\r\n // check how many days left (or expired)\r\n const currentDate = getMonthDay({ ts: Date.now() });\r\n const txDate = getMonthDay({ ts: new Date(transferTimestamp).getTime() });\r\n const isExpired = currentDate !== txDate;\r\n\r\n // result\r\n return ({ invalid: !isValid, isExpired, memo, transferTimestamp });\r\n};\r\n","import { isLocal } from '../../../../../constants/envs';\r\nimport { storeAppDispatch } from '../../../../../GlobalState/Store';\r\nimport { MEAL_TX_ID_PREFIX, TRAVEL_TX_ID_PREFIX } from '../../../../../pages/Play/subComponents/spaceships/constants';\r\nimport { setNewPaidResource, setStorage, setStorageLoading } from '../../../../../reducers/MarsStorage';\r\nimport { UserService } from '../../../../../services/UserService';\r\nimport { LS_ID_SUBS_TX_HASH } from '../constants';\r\nimport { validateSubscription } from './validations/subscriptions';\r\nimport { validateResourcePayment } from './validations/resources';\r\nimport { getReduxSpaceshipInfo } from '../utils';\r\nimport { nap } from '../../../../../generalUtils/utils';\r\nimport { client } from '../../../../../helpers/client';\r\nimport { get } from 'lodash';\r\nimport { windowSetChecksum } from '../../../../../generalUtils/secure/checksums';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const fetchTxInfo = ({ txHash }) => new Promise(async (resolve) => {\r\n isLocal && console.debug('Retrieving Tx:', { txHash });\r\n try {\r\n const txData = await UserService.session.rpc.history_get_transaction(txHash);\r\n isLocal && console.debug('Tx data:', { txData });\r\n const { traces } = txData;\r\n const infoTransfer = traces.filter((item) => item.act.name === 'transfer');\r\n const { act = {}, block_time } = infoTransfer[0];\r\n const { data = {} } = act;\r\n const { from, to, quantity, memo } = data;\r\n const [amountTransfered, transferCurrency] = quantity.split(' ');\r\n const quantityTransfered = parseFloat(amountTransfered);\r\n const transferTimestamp = `${block_time}Z`;\r\n resolve({ from, to, memo, transferTimestamp, quantityTransfered, transferCurrency });\r\n } catch (err) {\r\n Swal.fire({ text: `Uh oh, something went wrong reading your Wax transactions from the chain in order to activate your storage.\\nPlease log in again.\\n\\n${err}` })\r\n }\r\n});\r\n\r\nconst setLocalstorageIfEmpty = (key, value) => {\r\n const currentValue = localStorage.getItem(key);\r\n if (!currentValue) {\r\n localStorage.setItem(key, value);\r\n }\r\n};\r\n\r\nexport const writeImmutableStorage = ({ storageType }) => {\r\n try {\r\n window.storageType = storageType;\r\n const original = window.storageType;\r\n Object.defineProperty(window, 'storageType', { value: original, writable: false });\r\n // if buys upgrade it will catch below\r\n windowSetChecksum({ key: 'storageType', value: storageType });\r\n } catch (_) { }\r\n};\r\n\r\nexport const loadStorage = async ({ user }) => {\r\n isLocal && console.log('Checking for existing mars subscriptions..');\r\n const chainLs = localStorage.getItem('chainLogin');\r\n if (chainLs === 'hive' || chainLs === 'skl' || chainLs === 'eth') {\r\n storeAppDispatch(setStorageLoading({ loading: false }));\r\n return;\r\n // TEMP -- THEN SUPPORT NEW HIVE TOKENS INSTEAD @@ @@\r\n // PS. ETH too...\r\n }\r\n // FETCH data from DB (was stored only if premium user)\r\n try {\r\n const data = await client.get(\r\n `/api/storage/transactions?account=${user}`,\r\n );\r\n isLocal && console.log('={}> Storage transactions:', { data });\r\n // # Write in LS\r\n const { subscriptionWaxTx, dailyPurchases = {} } = data?.data?.allTransactions || {};\r\n const { mealL0WaxTx } = dailyPurchases;\r\n // Subs\r\n if (subscriptionWaxTx) setLocalstorageIfEmpty(LS_ID_SUBS_TX_HASH, subscriptionWaxTx);\r\n // Meals\r\n if (mealL0WaxTx) setLocalstorageIfEmpty(`${MEAL_TX_ID_PREFIX}-L0`, mealL0WaxTx);\r\n // Travels\r\n const travelKeys = Object.keys(dailyPurchases).filter(el => el.startsWith('travelToLev'));\r\n for (let id = 0; id < travelKeys.length; id++) {\r\n const currentTravelKey = travelKeys[id];\r\n const value = dailyPurchases[currentTravelKey];\r\n const level = currentTravelKey.split('travelToLev')[1];\r\n setLocalstorageIfEmpty(`${TRAVEL_TX_ID_PREFIX}-L${level}`, value);\r\n }\r\n } catch (err) {\r\n let errMsg = get(err, 'response.data.error') || 'Unknown error';\r\n console.error(`Uh oh, something went wrong fetching your subs, meals and travels: ${errMsg}`);\r\n // no return. Eg. new user.\r\n }\r\n\r\n // # STORAGE SUBSCRIBE TX CHECK\r\n const txHash = localStorage.getItem(LS_ID_SUBS_TX_HASH);\r\n if (!txHash) {\r\n storeAppDispatch(setStorageLoading({ loading: false }));\r\n return;\r\n }\r\n const { invalid, isExpired, storageType, daysLeft } = await validateSubscription({ txHash });\r\n if (invalid) {\r\n Swal.fire({ text: `Invalid subscription found! (triggers warning)` })\r\n storeAppDispatch(setStorageLoading({ loading: false }));\r\n return;\r\n } else if (isExpired) {\r\n storeAppDispatch(setStorage({ storageType: null, expirationInDays: 1 })); // display that it's expired during renewal\r\n storeAppDispatch(setStorageLoading({ loading: false }));\r\n localStorage.removeItem(LS_ID_SUBS_TX_HASH);\r\n return;\r\n }\r\n isLocal && console.log('Subscription check completed.');\r\n storeAppDispatch(setStorage({ storageType, expirationInDays: daysLeft })); // success\r\n writeImmutableStorage({ storageType });\r\n\r\n // # FOOD PAYMENT CHECK\r\n const foodTxHash = localStorage.getItem(`${MEAL_TX_ID_PREFIX}-L0`);\r\n if (foodTxHash) {\r\n isLocal && console.log('Validating existing food payment');\r\n const { invalid, isExpired } = await validateResourcePayment({ txHash: foodTxHash });\r\n if (invalid) Swal.fire({ text: `Invalid food payment found! (triggers warning)` })\r\n else if (isExpired) localStorage.removeItem(`${MEAL_TX_ID_PREFIX}-L0`);\r\n else storeAppDispatch(setNewPaidResource({ paidResource: { type: 'meal' } })); // success\r\n }\r\n\r\n // # SPACESHIP PAYMENTS CHECKS\r\n const payments = [];\r\n for (let id = 0; id < 10; id++) {\r\n const hash = localStorage.getItem(`${TRAVEL_TX_ID_PREFIX}-L${id}`);\r\n if (hash) payments.push(hash)\r\n }\r\n for (let id = 0; id < payments.length; id++) {\r\n const txHash = payments[id];\r\n isLocal && console.log('Validating existing travel', id, txHash);\r\n const { invalid, isExpired, memo, transferTimestamp } = await validateResourcePayment({ txHash });\r\n if (invalid) Swal.fire({text: `Invalid spaceship travel found! (triggers warning)` })\r\n else if (isExpired) localStorage.removeItem(`${TRAVEL_TX_ID_PREFIX}-L${id}`);\r\n else {\r\n const reduxSpaceshipInfo = getReduxSpaceshipInfo({ memo });\r\n isLocal && console.debug('Putting spaceship travel in redux:', { reduxSpaceshipInfo });\r\n storeAppDispatch(setNewPaidResource({\r\n paidResource: { type: 'travel', transferTimestamp, ...reduxSpaceshipInfo },\r\n })); // success\r\n }\r\n if (id === 0) storeAppDispatch(setStorageLoading({ loading: false })); // can delay others\r\n await nap(3 * 1000);\r\n }\r\n\r\n // Reset spinner\r\n storeAppDispatch(setStorageLoading({ loading: false }));\r\n};\r\n","import { get } from 'lodash';\r\nimport { TOKEN_ACCOUNT } from '../../../../config/contractNames';\r\nimport { WAX_ACCOUNTS } from '../../../../config/accounts';\r\nimport { isLocal, isTestnet } from '../../../../constants/envs';\r\nimport { flyingSessionLogin, UserService, WaxFlyingSession } from '../../../../services/UserService';\r\nimport { isClassicStorage } from './utils';\r\nimport { LS_ID_SUBS_TX_HASH, SUBS_PRICES } from './constants';\r\nimport { client } from '../../../../helpers/client';\r\nimport { writeImmutableStorage } from './init/loadStorage';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const purchaseSubscription = ({ storageType, isHiveUser }) => new Promise(async (resolve) => {\r\n const price = SUBS_PRICES.v1[storageType];\r\n if (!price) { throw new Error(`Unexpected input for sub payment: ${storageType} ${price}`); }\r\n const quantity = isTestnet ? `${(0.1).toFixed(4)} BOOM` : `${price.toFixed(4)} MARS`;\r\n const targetWallet = WAX_ACCOUNTS.SUBS_PAYMENTS;\r\n isLocal && console.debug('MARS payment:', { storageType, price, quantity });\r\n\r\n let waxSession = UserService;\r\n if (isHiveUser && !UserService.authName) {\r\n isLocal && console.debug('creating side session for mars payment for hive user');\r\n waxSession = WaxFlyingSession;\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn) return resolve({ err: 'still not logged in for mars transfer' });\r\n }\r\n\r\n waxSession.session.signTransaction(\r\n {\r\n actions: [{\r\n account: TOKEN_ACCOUNT,\r\n name: 'transfer',\r\n authorization: [{\r\n actor: waxSession.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: waxSession.authName,\r\n to: targetWallet,\r\n quantity,\r\n memo: storageType,\r\n }\r\n }]\r\n },\r\n { blocksBehind: 3, expireSeconds: 30 }\r\n )\r\n .then(async (response = { status: '' }) => {\r\n isLocal && console.log('Transaction outcome:', response.status);\r\n if (response.status !== 'executed') {\r\n console.error('Mars Sub payment failed:', JSON.stringify({ response }));\r\n Swal.fire({ text: `$MARS subscription payment failed.\\n\\n${JSON.stringify(response.status)}` })\r\n resolve({ err: (response.status || 'payment-ko') });\r\n return;\r\n }\r\n // ## STORE IN LS and window for Unity\r\n const txHash = response.transactionId;\r\n console.log({ txHash }); // @@\r\n localStorage.setItem(LS_ID_SUBS_TX_HASH, txHash);\r\n writeImmutableStorage({ storageType });\r\n // ## STORE IN DB if PREMIUM sub\r\n if (!isClassicStorage(storageType)) {\r\n try {\r\n const data = await client.post(\r\n '/api/storage/subscriptions',\r\n { account: waxSession.authName, subscriptionWaxTx: txHash },\r\n );\r\n isLocal && console.log('Store subscription result:', { data });\r\n } catch (err) {\r\n let errMsg = get(err, 'response.data.error') || 'Unknown error';\r\n Swal.fire({ text: `Uh oh, something went wrong saving your premium subscription: ${errMsg}` })\r\n resolve({ err });\r\n }\r\n }\r\n resolve({});\r\n })\r\n .catch((err) => {\r\n console.error('Mars Sub payment went wrong:', JSON.stringify({ err }));\r\n const errMsg = get(err, 'cause.message');\r\n const errMsg2 = get(err, 'cause.json.error.details[0].message');\r\n const errMsg3 = get(err, 'cause.json.message');\r\n Swal.fire({ text: `Mars Sub payment failed.\\n\\n${errMsg || errMsg2 || errMsg3 || JSON.stringify(err)}` }) \r\n resolve({ err });\r\n });\r\n});\r\n","import React from 'react';\r\n\r\nexport const LoadingSpinner = ({ style }) => ;\r\n","export default __webpack_public_path__ + \"static/media/ScifiStorage2.b90c4ffc.gif\";","import { useState } from 'react';\r\nimport OverlayTrigger from 'react-bootstrap/OverlayTrigger';\r\nimport Tooltip from 'react-bootstrap/Tooltip';\r\nimport { InfoCircleFill } from 'react-bootstrap-icons';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { setStorage } from '../../../../reducers/MarsStorage';\r\nimport { FullScreenDismisser, StorageInstructions, CloseOverlayBtn } from './subComponents';\r\nimport { getSubDuration } from './utils';\r\nimport { SUBS_PRICES, SUB_TYPES } from './constants';\r\nimport { purchaseSubscription } from './purchaseSubs';\r\nimport { LoadingSpinner } from '../../../../images/gifs/LoadingSpinner';\r\n\r\nimport ScifiStorage2 from '../images/ScifiStorage2.gif';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport './StoragePane.scss';\r\nimport Swal from 'sweetalert2';\r\n\r\nconst StorageOverlay = ({ storageType, expirationInDays, setStorageOverlayOpen, resourcesPaid }) => {\r\n const [wantsUpgrade, setWantsChangePlan] = useState(false);\r\n isLocal && console.debug('Resouces Paid:', { resourcesPaid });\r\n\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n const isHiveUser = chainLogin === 'hive';\r\n\r\n const handleSub = async (storageType) => {\r\n const duration = getSubDuration(storageType);\r\n setWantsChangePlan(false);\r\n setStorageOverlayOpen(false);\r\n const { err } = await purchaseSubscription({ storageType, isHiveUser });\r\n if (err) return;\r\n storeAppDispatch(setStorage({ storageType, expirationInDays: duration }));\r\n setStorageOverlayOpen(true);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n

STORAGE SUBSCRIPTIONS

\r\n
\r\n
\r\n }\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n {(!!storageType && !wantsUpgrade)\r\n ? <>\r\n
\r\n
\r\n
\r\n
\r\n Your Storage Type:
\r\n {storageType}\r\n
\r\n
\r\n setWantsChangePlan(true)}>\r\n Upgrade\r\n \r\n
\r\n
\r\n
\r\n
\r\n Subscription Expiration:
\r\n in {expirationInDays} days\r\n
\r\n
\r\n
\r\n Meals and Travels active until Midnight UTC:  \r\n {resourcesPaid.length}\r\n \r\n
\r\n \r\n :
\r\n
\r\n
\r\n
CLASSIC (week)
\r\n
\r\n {(storageType === SUB_TYPES.CLASSIC_WEEK)\r\n ?

in use

\r\n : (!!storageType ? <> : )\r\n }\r\n
\r\n
\r\n
\r\n
\r\n
CLASSIC (month)
\r\n
\r\n {storageType === SUB_TYPES.CLASSIC_MONTH\r\n ?

in use

\r\n : (storageType !== SUB_TYPES.PREMIUM && )\r\n }\r\n
\r\n
\r\n
\r\n
\r\n
PREMIUM
\r\n
\r\n {storageType === SUB_TYPES.PREMIUM ?\r\n

in use

\r\n : \r\n }\r\n
\r\n
\r\n
\r\n {(!storageType && !!expirationInDays) &&

Previous subscription expired.

}\r\n
\r\n
\r\n }\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport const StoragePane = () => {\r\n const [storageOverlayOpen, setStorageOverlayOpen] = useState(false);\r\n\r\n const StorageState = useSelector((store) => store.marsStorage);\r\n const { loading, storageType, expirationInDays, resourcesPaid } = StorageState;\r\n\r\n const UserState = useSelector((store) => store.user);\r\n const isHive = UserState.chainLogin !== 'wax';\r\n\r\n const handleStorageClick = () => {\r\n if (loading) return;\r\n if (isHive) {\r\n Swal.fire({text: 'On-chain storage not supported yet on Hive!'})\r\n return;\r\n }\r\n setStorageOverlayOpen(true)\r\n };\r\n\r\n return (\r\n
\r\n {storageOverlayOpen\r\n && \r\n }\r\n \r\n {loading\r\n ? \r\n : <>\r\n \"Storage\";\r\n
\r\n \r\n }\r\n
\r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const SocialLinks = () => {\r\n return (\r\n <>\r\n \r\n \"twitter-link\"\r\n \r\n \r\n \"discord-link\"\r\n \r\n \r\n \"website-link\"\r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Link, Redirect } from 'react-router-dom';\r\nimport HamburgerMenu from 'react-hamburger-menu';\r\nimport Swal from 'sweetalert2';\r\n\r\nimport ExitIcon from '../../images/icons/exit.png';\r\nimport { UserService } from '../../services/UserService';\r\nimport { setPlayerLogout } from '../../reducers/UserReducer';\r\nimport { storeAppDispatch } from '../../GlobalState/Store';\r\nimport { fetchBoomBalance } from '../../sagas/helpers/wallet/waxUtils';\r\nimport { isLocal } from '../../constants/envs';\r\nimport { setPlayerWaxTokensBalances } from '../../reducers/WalletReducer';\r\nimport { uiHacks } from '../../generalUtils/uiHacks/uiHacks';\r\nimport { invoke } from 'lodash';\r\nimport { isPriviledgedUser } from '../../routing/authUtils';\r\nimport { NameAndBalance } from './LeftMenu/NameAndBalance';\r\nimport { nukeMultiTabTimestamp } from '../../generalUtils/secure';\r\nimport { AnonAdSquare } from '../../pages/LandingPage/subcomp/Banners/AnonAd';\r\nimport { REACT_UI_VERSION } from '../../config/version.json';\r\nimport { consumeTourneyConfig } from '../../pages/Play/subComponents/utils/requiredNFts/pvpRemoteConfig';\r\nimport { ActiveTourneyMsg } from './children/ActiveTourneyMsg';\r\nimport { StoragePane } from './LeftMenu/storage/StoragePane';\r\nimport { SocialLinks } from './LeftMenu/SocialLinks';\r\nimport './Menu.scss';\r\n\r\n\r\nexport const Menu = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const { isLogged = false } = UserState;\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const [mobileMenuIsActive, setMobileMenuActive] = useState(false);\r\n\r\n const [isActiveTourney, setIsActiveTourney] = useState(false);\r\n const [canBeFullyUsed, setCanBeFullyUsed] = useState(false);\r\n\r\n useEffect(() => {\r\n const fetchTourneyConfig = async () => {\r\n const { activeTourney, isPvpPassRequired = true } = await consumeTourneyConfig() || {};\r\n setIsActiveTourney(activeTourney === true);\r\n const waxAssets = InventoryState.csAssets;\r\n const hiveAssets = InventoryState.hive?.nfts;\r\n const canBeUsed = isLogged && (waxAssets?.csNfts?.length || hiveAssets.length);\r\n if (canBeUsed || (isLogged && !isPvpPassRequired)) setCanBeFullyUsed(true);\r\n };\r\n fetchTourneyConfig();\r\n }, [isLogged, InventoryState]);\r\n\r\n const onWalletMenuClick = async () => {\r\n setMobileMenuActive(false);\r\n isLocal && console.debug('Fetching balances..');\r\n if (!canBeFullyUsed) return;\r\n if (UserState.chainLogin !== 'wax') return;\r\n UserService.getBalance(); // wax\r\n const boomAmount = await fetchBoomBalance(UserService.authName);\r\n const savingsAmount = await Promise.resolve(0); // TEMP for savings @@ @@ @@ @@\r\n storeAppDispatch(setPlayerWaxTokensBalances({\r\n tokens: { boom: boomAmount },\r\n stakedSavings: { boom: savingsAmount }\r\n }));\r\n invoke(window, 'fetchUserData');\r\n };\r\n\r\n const onInventoryMenuClick = async () => {\r\n setMobileMenuActive(false);\r\n isLocal && console.log('Inventory clicked');\r\n };\r\n\r\n const onLeaderboardMenuClick = () => {\r\n if (!canBeFullyUsed) return;\r\n setMobileMenuActive(false);\r\n }\r\n\r\n const onPlayMenuClick = () => {\r\n setMobileMenuActive(false);\r\n isLocal && console.log('page show game clicked');\r\n if (!canBeFullyUsed) return;\r\n if (!window.pageShow) Swal.fire({ text: 'works only when embedded in the CS-wrapper' })\r\n invoke(window, 'fetchUserData');\r\n uiHacks.disableClaimAndPlayBtnsAtFirst();\r\n };\r\n\r\n const onLogoutMenuClick = () => {\r\n const confirmed = window.confirm('Are you sure that you want to log out?');\r\n if (!confirmed) return;\r\n setMobileMenuActive(false);\r\n if (UserState.chainLogin === 'wax') UserService.logout();\r\n // Stored on page load on the wrapper side, allows correct page reload\r\n var previousSession = localStorage.getItem('csUrlParams');\r\n if (previousSession) {\r\n const { testParam, devParam, authParamValue } = JSON.parse(previousSession);\r\n window.location.href = window.readOnlyEnv === 'prod'\r\n ? '/'\r\n : `/?${testParam ? 'test' : 'dev'}=${testParam || devParam}&auth=${authParamValue}`;\r\n }\r\n localStorage.removeItem('isLogged');\r\n nukeMultiTabTimestamp();\r\n storeAppDispatch(setPlayerLogout());\r\n if (UserState.chainLogin === 'hive') window.location.reload();\r\n }\r\n\r\n const appVersion = () => {\r\n // - REACT UI version\r\n isLocal && console.log('React UI version:', REACT_UI_VERSION);\r\n // - 4 APIs version (http://localhost:9090/api/health/version)\r\n // API_CORE_VERSION\t\"1.19.12\"\r\n // API_DYNAMOCONNECTOR_VERSION\t\"1.19.12\"\r\n // API_WAXCHAINCONNECTOR_VERSION\t\"1.19.12\"\r\n // API_HIVECONNECTOR_VERSION\t\"1.19.12\"\r\n // - Unity game version (PS. Application.unityVersion in postMessage)\r\n // https://discussions.unity.com/t/difference-between-application-version-and-playersettings-bundleversion/230170\r\n // TODO: add all version in onClick panel @@ @@ and use in monitoring alerts\r\n // return `v${get(window, 'version.wrapper', '0.0.0a')}`; // WEB WRAPPER\r\n return `v${REACT_UI_VERSION}`;\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYEAYAAACw5+G7AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABgAAAAYADwa0LPAAAAB3RJTUUH5QgCDBEgcYlZZwAAA81JREFUWMPVmFFMU2cUx//nXrRI1UEyKGzTQgsDAzIf+iSaiIuZJMvGA5BlpokKC2ZOaqYhLc2yxEQbjVvKXtQQZpYNEuaTmBpNJLg4a4hhIhXjUPiuhtE7MNCtiNzM3rOHwrLojPG2rPh/ul9y8z/nl3znO9/5CPNSL47kjOSUlfGY1Cg1trbSDziEQxUV3AkFismEBEUfIx/5msZfoAtdwaD0pe7QHS6X5Yq90F4YChn2DS9Tgkpw3TrK4Fme7e/nO7DDvmIFNeEu7k5Pcx2GMDQ9nTDAjyhFaVYWf4MiFGVlUSV06HNzWC47ZafDkTu4Nrg2ODT00sZqtugQHefPh8NCCMEcB/J6mZmZiRJNfEELfupFZauy1eNZiKd+JFjwhQuGjdUCcVAcfPhQfU1cEpdmZ+OBZDlZif83iCSFR4RbuGdmws2CBUciRv0k/p4iFDGZMEdn6MyjR0RERLHYYgHE/XUdl1GP+miUujGKUeM1lrZYib5Qu1GIQk3jXwFA03DnFQOQlqMc5U1NsZ0YxKAkGfVJGYDlr4JQQai7G20gJHBUGCZfbP3WI9aL9cXF6qfCJVxjY/HDprn5lQHAh2xjGzNvoRCFVq/mIPZi79Gjqk+wYLd7yQO8OWM7azs7PKy/T05yVlXhCtVTfTTKO6FA8fnCuwQL3rMnaTWgTomACLhc/B0CCOzbh7dQhKIkNMKAHtEjAJ4qFRrGSZw8fDhpAFyBG7hhsaADNaix2ZCHAhQkr5MDXM3V/1rV0jE6lpZG4Z+VBqUhGqV3IUOem8vV8k/ln8rOTl7gxPTPJfMNeaW8sqcHr3MP9+TkkEyd1On1LtkamOgSLDg395nEBzGOcb/fkm1tsbb4fKnrxC9Q7B3ewBvWrMEy1KHObKa3aYAGjh+3/GmttlY3N8evJMxLFiCvxHbTdvP6ddZ7B3oHMjMpWkmV9OTJ000vZVso/LniUlxVVeH2Uc+op6bmef+RNJ/4c5S6GviK/ew/cQLF0qQ0efq0UZvUAXyLe7hnMlEDe9iTZngrS+TkTM7UNKRzLdeazf/XQIMtaEf7qlX8AWywaZphAB6EDLmvb2EWVj9TKpSKlpbFGil/n7x/5P4RtxsZaESj2Uw/IYTQtWtGfWn8E8GCS0qoFW1o6+/HH9iGbRkZ5EMMsUiEN+Mczk1NJQrwzFBfghGMPH7MX0t9Up/DkVdv9Vq9t2+/tO/Ch1r+YOODjaWlXKZv17f7/fQL7+AdmzZxLyRI6ekJA8y/QnANDuDA1au0WQ/qwf37c9+zT9gnbt0y6vs3rBfZpqQSRJQAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDgtMDJUMTI6MTc6MzIrMDA6MDBSpLyaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTA4LTAyVDEyOjE3OjMyKzAwOjAwI/kEJgAAAABJRU5ErkJggg==\"","import { JsonRpc } from 'eosjs';\r\nimport fetch from 'node-fetch';\r\nimport { WAX_NODES } from \"../../../config/endpoints\";\r\nimport { isLocal } from \"../../../constants/envs\";\r\n\r\nconst waxEndpoint = WAX_NODES.DEFAULT;\r\n\r\n\r\nexport const checkTokenBalance = async ({ username = '', symbol = '' }) => {\r\n const rpc = new JsonRpc(waxEndpoint, { fetch });\r\n const contract = symbol === 'WAX' ? 'eosio.token' : 'csboomcsboom';\r\n const result = await rpc.get_currency_balance(contract, username, symbol.toUpperCase());\r\n const balance = +(result[0] || '').split(' ')[0];\r\n isLocal && console.log('WAX TOKEN BALANCE CHECK >>>>>>>>>>>>>>>', { username, symbol, result, balance });\r\n return balance;\r\n};\r\n","import { isLocal } from '../../constants/envs';\r\nimport { checkTokenBalance } from '../../sagas/helpers/wallet/waxUtils2';\r\nimport { readHiveUserBalances } from '../hiveData/reader';\r\n\r\n\r\nexport const unsafeBalanceRead = async ({ cryptoSymbol, senderAccount }) => {\r\n isLocal && console.log('Checking balance:', { cryptoSymbol, senderAccount });\r\n if (cryptoSymbol === 'HIVE') {\r\n return await readHiveUserBalances({ username: senderAccount });\r\n } else if (cryptoSymbol === 'WAX') {\r\n return await checkTokenBalance({ username: senderAccount, symbol: cryptoSymbol });\r\n }\r\n return 0;\r\n};\r\nwindow.unsafeBalanceRead = unsafeBalanceRead;\r\n","import hivejs from '@hiveio/hive-js';\r\nimport { get } from 'lodash';\r\n\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { pickHiveNode } from '../../../generalUtils/hiveData/reader';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport { setPlayerHiveTokensBalances } from '../../../reducers/WalletReducer';\r\nimport { unsafeBalanceRead } from '../../../generalUtils/pvp/poolBalance'; // eslint-disable-line\r\n\r\n\r\nexport const validateHiveUsername = ({ username }) => new Promise((resolve) => {\r\n // random node\r\n const pickedNode = pickHiveNode();\r\n hivejs.api.setOptions({ url: pickedNode });\r\n\r\n // username format validation (dots, lenght, etc)\r\n const err = hivejs.utils.validateAccountName(username);\r\n if (err) {\r\n console.error('Invalid username. Reason:', err);\r\n return resolve({ err });\r\n }\r\n\r\n // check account exists\r\n try {\r\n hivejs.api.getAccounts([username], (err, result) => {\r\n isLocal && console.debug('Hive user name check - result:', { err, result });\r\n if (err) {\r\n resolve({ err: 'Something broke with this Hive node. Try again.' });\r\n return;\r\n }\r\n const resultName = get(result, '[0].name');\r\n if (resultName !== username) {\r\n resolve({ err: `The Hive account @${username} does not exist` });\r\n }\r\n else resolve({});\r\n });\r\n } catch (err) {\r\n console.error('Caught err validating uname:', err);\r\n return ({ caughtErr: err });\r\n }\r\n});\r\n\r\n\r\nexport const fetchDoomBalance = async ({ username }) => {\r\n return fetch(\r\n 'https://api.hive-engine.com/rpc/contracts',\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n jsonrpc: '2.0', id: 1, method: 'find', params: {\r\n query: { account: username },\r\n contract: 'tokens', table: 'balances',\r\n limit: 1000, offset: 0, indexes: '',\r\n }\r\n }),\r\n method: 'POST',\r\n })\r\n .then(res => res.json())\r\n .then((data) => {\r\n const doomBalance = data.result?.find(balObj => balObj.symbol === 'DOOM') || {};\r\n const res = doomBalance.balance || 0;\r\n isLocal && console.debug('DOOM balance:', res);\r\n return res;\r\n })\r\n .catch(err => console.error('Caught error fetching doom bal:', err));\r\n};\r\n\r\nexport const updateDoomBalance = async ({ hiveUsername }) => {\r\n const doomBal = await fetchDoomBalance({ username: hiveUsername });\r\n console.log('DOOM balance:', doomBal);\r\n storeAppDispatch(setPlayerHiveTokensBalances({ hiveTokens: { doom: doomBal } }));\r\n};\r\n\r\nexport const fetchDoomStakedInPool = async ({ username, tokenName = 'DOOM' }) => {\r\n return fetch(\r\n 'https://api.hive-engine.com/rpc/contracts',\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n jsonrpc: '2.0', id: 1, method: 'find', params: {\r\n query: { account: username },\r\n contract: 'marketpools', table: 'liquidityPositions',\r\n limit: 1000, offset: 0, indexes: '',\r\n }\r\n }),\r\n method: 'POST',\r\n })\r\n .then(res => res.json())\r\n .then(async ({ result } = {}) => {\r\n isLocal && console.log('Player has stake in these pools:', { result });\r\n const stakeDetails = result.find(balObj => balObj.tokenPair === `${tokenName}:SWAP.HIVE`) || {};\r\n isLocal && console.debug('Pool stakeDetails:', { username, stakeDetails });\r\n // { account: \"marcocasario\", shares: \"103.16795016799662388128\", timeFactor: 1674624567000\r\n // tokenPair: \"DOOM:SWAP.HIVE\", _id: 61972 }\r\n const { shares = 0 } = stakeDetails;\r\n if (!shares) return ({ shares: 0, stakedTokenAmount: 0 });\r\n const playerShares = +shares;\r\n const { stakedTokenAmount, sharesPc, err } = await fetchStakedTokenAmount({ playerShares, tokenName });\r\n if (err) return ({ err: `fsta-err: ${stakedTokenAmount}` });\r\n return ({ shares: playerShares, sharesPc, stakedTokenAmount });\r\n })\r\n .catch((err) => {\r\n console.error('Caught error in fsip:', err);\r\n return ({ err });\r\n });\r\n};\r\n\r\nconst fetchStakedTokenAmount = ({ playerShares, tokenName }) => {\r\n return fetch(\r\n 'https://api.hive-engine.com/rpc/contracts',\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n jsonrpc: '2.0', id: 1, method: 'find', params: {\r\n query: { tokenPair: `${tokenName}:SWAP.HIVE` },\r\n contract: 'marketpools', table: 'pools',\r\n limit: 1000, offset: 0, indexes: '',\r\n }\r\n }),\r\n method: 'POST',\r\n })\r\n .then(res => res.json())\r\n .then((data) => {\r\n isLocal && console.debug('Pool general info:', data.result[0]);\r\n // basePrice: \"0.01994691\", baseQuantity: \"368017.96265685\", baseVolume: \"99297.84404313\",\r\n // creator: \"wagginston\", precision: 8, quotePrice: \"50.13306962\", quoteQuantity: \"7340.82244385\",\r\n // quoteVolume: \"2689.80313600\", tokenPair: \"DOOM:SWAP.HIVE\", totalShares: \"51956.32327339272131934828\"\r\n const { totalShares, baseQuantity } = data.result[0];\r\n // (player) shares / totalShares * baseQuantity (tot DOOM in pool) = tot DOOM staked\r\n const stakedTokenAmount = playerShares / +totalShares * +baseQuantity;\r\n const sharesPc = playerShares / +totalShares * 100;\r\n isLocal && console.log(`Player staked in pool: ${stakedTokenAmount} ${tokenName}`);\r\n return ({ stakedTokenAmount, sharesPc });\r\n })\r\n .catch((err) => {\r\n console.error('Caught error in fsta:', err);\r\n return ({ err });\r\n });\r\n};","import { get } from 'lodash';\r\nimport { DOOM_SWAPS_RECEIVER, SWAP_WL } from '../../../../config/accounts';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { chainId } from '../../../../constants/genericConstants';\r\nimport { pickHiveNode } from '../../../../generalUtils/hiveData/reader';\r\nimport { validateHiveUsername } from '../../../../sagas/helpers/wallet/hiveUtils';\r\nimport { nap } from '../../../../generalUtils/utils';\r\nimport { checkWaxUserExists } from '../../../../sagas/helpers/wallet/waxUtils';\r\nimport { transferBoomWithSession } from './sendBoomWithSession';\r\nimport { client } from '../../../../helpers/client';\r\nimport { LOST_BLOCKS_THRESHOLD, SWAP_RANGES } from './constants';\r\n\r\n\r\n// ## SWAP INPUT VALIDATION\r\n\r\nexport const validateDoomToBoomInput = async ({ amountDoomSwap, doomSenderSwap, boomReceiverSwap }) => {\r\n isLocal && console.debug('Validating swap input:', { amountDoomSwap, doomSenderSwap, boomReceiverSwap });\r\n // amount\r\n if (Number.isNaN(amountDoomSwap)) return ({ err: 'The DOOM amount was not a number' });\r\n if (SWAP_WL.includes(doomSenderSwap)) {\r\n isLocal && console.log('Allowing transfer out of ranges for admin:', doomSenderSwap);\r\n } else {\r\n if (amountDoomSwap < SWAP_RANGES.DOOM.MIN) return ({ err: `the minimum amount of DOOM to swap is ${SWAP_RANGES.DOOM.MIN}` });\r\n if (amountDoomSwap > SWAP_RANGES.DOOM.MAX) return ({ err: `the max amount of DOOM to swap is ${SWAP_RANGES.DOOM.MAX}` });\r\n }\r\n if (!(amountDoomSwap > 0)) return ({ err: 'you must enter a positive amount' });\r\n // Hive sender\r\n const { err } = await validateHiveUsername({ username: doomSenderSwap });\r\n if (err) return ({ err });\r\n // Wax receiver\r\n const exists = await checkWaxUserExists({ account: boomReceiverSwap });\r\n if (!exists) return ({ err: `The provided Wax user ${boomReceiverSwap} does not exist` });\r\n return ({});\r\n};\r\n\r\nexport const validateBoomToDoomInput = async ({ amountBoomSwap, boomSenderSwap, doomReceiverSwap }) => {\r\n isLocal && console.debug('Validating swap input:', { amountBoomSwap, boomSenderSwap, doomReceiverSwap });\r\n // amount\r\n if (Number.isNaN(amountBoomSwap)) return ({ err: 'The BOOM amount was not a number' });\r\n if (SWAP_WL.includes(boomSenderSwap)) {\r\n isLocal && console.log('Allowing transfer out of ranges for admin:', boomSenderSwap);\r\n } else {\r\n if (amountBoomSwap < SWAP_RANGES.BOOM.MIN) return ({ err: `the minimum amount of BOOM to swap is ${SWAP_RANGES.BOOM.MIN}` });\r\n if (amountBoomSwap > SWAP_RANGES.BOOM.MAX) return ({ err: `the max amount of BOOM to swap is ${SWAP_RANGES.BOOM.MAX}` });\r\n }\r\n if (!(amountBoomSwap > 0)) return ({ err: 'you must enter a positive amount' });\r\n // Hive sender\r\n const { err } = await validateHiveUsername({ username: doomReceiverSwap });\r\n if (err) return ({ err });\r\n // Wax receiver\r\n const exists = await checkWaxUserExists({ account: boomSenderSwap });\r\n if (!exists) return ({ err: `The provided Wax user ${boomSenderSwap} does not exist` });\r\n return ({});\r\n};\r\n\r\n\r\n// ## DOOM TRANSFER BROADCAST, FIND AND VALIDATE\r\n\r\nconst dhive = require('@hiveio/dhive');\r\nconst hiveClient = new dhive.Client(pickHiveNode());\r\nconst SCAN_TIMEOUT = 2.5 * 60 * 1000;\r\nlet stream;\r\n\r\nlet startTimeDoomSwap = 0;\r\n\r\nexport const transferDoomToBurner = ({ amountDoomSwap, doomSenderSwap }) => new Promise(async (resolve) => {\r\n if (startTimeDoomSwap) { // OR use time range: (Date.now() - startTimeDoomSwap) < DELAY_BETWEEN_SWAPS) {\r\n return resolve({ err: 'Only one DOOM swap allowed per session', notify: false });\r\n }\r\n startTimeDoomSwap = Date.now(); // here as first thing since following scans dont work (yet)\r\n try {\r\n // 1. ## Start litening for tx ID and block #\r\n console.log('Streaming the chain to find DOOM transfer..');\r\n listenForDoomTransferOnChain({ amountDoomSwap, doomSenderSwap, resolve }); // @@\r\n } catch (err) {\r\n resolve({ err: 'caught error while transfering DOOM', errDetails: err, seconds: (Date.now() - startTimeDoomSwap) / 1000 });\r\n stream && stream.pause();\r\n return;\r\n }\r\n try {\r\n await nap(1000); // COLD BOOT WAIT TIME\r\n // 2. ## DOOM Transfer\r\n isLocal && console.log('Starting DOOM transfer', { amountDoomSwap, doomSenderSwap });\r\n const success = await doomTransferBroadcast({ doomSenderSwap, amountDoomSwap });\r\n if (!success) {\r\n console.error('DOOM transfer failed:', { amountDoomSwap, doomSenderSwap });\r\n resolve({ err: 'DOOM transfer not completed successfully', notify: false, seconds: (Date.now() - startTimeDoomSwap) / 1000 });\r\n stream && stream.pause();\r\n }\r\n } catch (err) {\r\n resolve({ err: 'caught error while scanning for DOOM transfer', errDetails: err, notify: false, seconds: (Date.now() - startTimeDoomSwap) / 1000 });\r\n stream && stream.pause();\r\n }\r\n});\r\n\r\n\r\nexport const doomTransferBroadcast = ({ doomSenderSwap, amountDoomSwap }) => new Promise((resolve) => {\r\n isLocal && console.debug('doomTransferBroadcast', { doomSenderSwap, amountDoomSwap });\r\n const payload = {\r\n contractName: 'tokens',\r\n contractAction: 'transfer',\r\n contractPayload: {\r\n symbol: 'DOOM',\r\n to: DOOM_SWAPS_RECEIVER,\r\n quantity: (+amountDoomSwap).toFixed(4),\r\n memo: 'DOOM swap',\r\n }\r\n };\r\n try {\r\n window.hive_keychain.requestCustomJson(\r\n doomSenderSwap, chainId, 'Active', JSON.stringify(payload), 'DOOM Swap',\r\n (response) => {\r\n if (response.success && response.result) {\r\n isLocal && console.debug('DOOM Transfer result:', response.result);\r\n resolve(true);\r\n } else {\r\n console.error('Oops, the DOOM Transfer failed!', response);\r\n resolve(false);\r\n }\r\n }\r\n );\r\n } catch (err) {\r\n console.error('Caught error transferring DOOM:', err);\r\n resolve(false);\r\n }\r\n});\r\n\r\nconst listenForDoomTransferOnChain = ({ amountDoomSwap, doomSenderSwap, resolve }) => {\r\n // ## Handle Timeout\r\n setTimeout(() => {\r\n resolve({ err: 'scan-timeout' });\r\n stream && stream.pause();\r\n }, SCAN_TIMEOUT);\r\n // ## Active Streaming\r\n try {\r\n if (stream) stream.resume();\r\n else { stream = hiveClient.blockchain.getBlockStream(); }\r\n let missedBlocksCount = 0;\r\n stream\r\n .on('data', async (block = { transactions: [] }) => {\r\n // console.log(new Date(), 'Received block:', block);\r\n const foundInfo = findDoomTransfer({ block, amountDoomSwap, doomSenderSwap });\r\n if (foundInfo) {\r\n // check no errors in HE - best effort: if error ko, if breaks ok\r\n const { err: heErrArr } = await heHasNoErrors({ tx: foundInfo.tx });\r\n if (heErrArr) {\r\n resolve({ err: heErrArr, seconds: (Date.now() - startTimeDoomSwap) / 1000 });\r\n return;\r\n }\r\n const { tx, block } = foundInfo;\r\n resolve ({ hiveTx: tx, blockNum: block });\r\n stream.pause();\r\n }\r\n })\r\n .on('error', async (err) => {\r\n console.log('Stream error:', err);\r\n missedBlocksCount++;\r\n if (missedBlocksCount >= LOST_BLOCKS_THRESHOLD) resolve({\r\n err: `Lost at least ${LOST_BLOCKS_THRESHOLD} blocks scanning the Hive blockchain.\\n(${err})`,\r\n seconds: (Date.now() - startTimeDoomSwap) / 1000,\r\n });\r\n })\r\n .on('end', (arg) => console.log('Done streaming', arg));\r\n } catch (err) {\r\n console.error('Caught error starting stream:', err);\r\n resolve({ err: 'getBlockStream broke', seconds: (Date.now() - startTimeDoomSwap) / 1000 });\r\n }\r\n};\r\n\r\nconst findDoomTransfer = ({ block = {}, doomSenderSwap: sender, amountDoomSwap } = {}) => {\r\n const foundInfo = block.transactions.map(\r\n (blockData = {}, txIndex) => {\r\n isLocal && console.debug(`Checking tx ${txIndex} of current block..`);\r\n const currentBlockNum = blockData.block_num;\r\n const foundOp = get(blockData, 'operations', [])\r\n .find(([name = '', data = {} ] = []) => {\r\n // console.debug(`Checking operation \"${name}\" of tx ${txIndex}..`);\r\n if (!name || name !== 'custom_json') return false;\r\n if (data.required_auths[0] !== sender) return false;\r\n try {\r\n const parsedJson = JSON.parse(data.json);\r\n console.log('VALIDATING the custom json sent by the user:', { currentBlockNum, parsedJson, sender, amountDoomSwap });\r\n return isDoomTransfer({ parsedJson, amountDoomSwap });\r\n } catch (err) { console.error(`Error parsing custom json:`, { txIndex, name, data }); }\r\n return false;\r\n });\r\n if (foundOp) return ({ block: currentBlockNum, tx: get(block, `transaction_ids[${txIndex}]`) });\r\n return null;\r\n }\r\n ).filter(el => !!el)[0];\r\n foundInfo && console.debug('Find DOOM transfer outcome ::::', { foundInfo });\r\n return foundInfo;\r\n};\r\n\r\nconst isDoomTransfer = ({ parsedJson, amountDoomSwap }) => {\r\n // {contractName: 'tokens', contractAction: 'transfer', contractPayload: { symbol: 'DOOM', to: DOOM_SWAPS_RECEIVER, quantity: +amountDoomSwap.toFixed(4), memo: 'DOOM swap'}}\r\n if (!parsedJson) return false;\r\n const { contractName, contractAction, contractPayload = {} } = parsedJson;\r\n if (contractName !== 'tokens' || contractAction !== 'transfer') return false;\r\n const { to, symbol, quantity, memo } = contractPayload;\r\n if (!to || to !== DOOM_SWAPS_RECEIVER || symbol !== 'DOOM' || quantity !== (+amountDoomSwap).toFixed(4)) return false;\r\n console.log('Found it!', { parsedJson });\r\n return true;\r\n};\r\n\r\n\r\nconst SSC = require('sscjs');\r\nconst heApi = new SSC('https://api.hive-engine.com/rpc');\r\n// heApi.stream((err, res) => {\r\n// \tconsole.log(err, res);\r\n// });\r\n\r\nconst heHasNoErrors = ({ tx }) => new Promise((resolve) => {\r\n isLocal && console.log('Querying HE for tx', tx);\r\n try {\r\n heApi.getTransactionInfo(tx, (err, result) => {\r\n if (err) {\r\n return resolve({}); // best effort\r\n }\r\n isLocal && console.log('HE tx:', err, result);\r\n try {\r\n const parsedJson = JSON.parse(result.logs);\r\n const { errors: errorsArr } = parsedJson || {};\r\n if (errorsArr && errorsArr.length)\r\n console.log('Found errrors in HE:', { errorsArr });\r\n resolve({ err: errorsArr });\r\n } catch (err) {\r\n console.error(`Error parsing custom json:`, { result }); // no failure, best-effort\r\n }\r\n return resolve({});\r\n // {\"action\":\"transfer\",\"blockNumber\":20591280,\"contract\":\"tokens\",\"databaseHash\":\"1ab2dc3a794a0d2ab4c90ff81621403c4021ba89c8d29656a1322b23f6fef884\",\"executedCodeHash\":\"815ad74975ef2099fb0d332f42eb5503e27c52c78002f3d408fb0ca67bc37edb\",\"hash\":\"4cee93c049be6c6e5d5e7346e4f45b375ff1ea853d3628a1231b19510baf24a6\",\"logs\":{\"events\":[{\"contract\":\"tokens\",\"data\":{\"from\":\"crypto-shots\",\"quantity\":\"20.0000\",\"symbol\":\"DOOM\",\"to\":\"cryptoshots.burn\"},\"event\":\"transfer\"}]},\"payload\":{\"isSignedWithActiveKey\":true,\"memo\":\"DOOM swap\",\"quantity\":\"20.0000\",\"symbol\":\"DOOM\",\"to\":\"cryptoshots.burn\"},\"refHiveBlockNumber\":67586367,\"sender\":\"crypto-shots\",\"transactionId\":\"bf80ad020a5ad1d641abf4d8a31240710abf956d\"}\r\n })\r\n } catch (err) {\r\n console.error('Something broke fetching HE tx:', err);\r\n resolve({}); // best effort\r\n }\r\n});\r\n\r\n\r\n// ## BOOM TRANSFER. Spins up temporary session if needed.\r\n\r\nconst DELAY_BETWEEN_SWAPS = 70 * 1000; // keep synched with api\r\nlet startTimeBoomSwap = 0;\r\n\r\nexport const transferBoomToBurner = ({ amountBoomSwap, boomSenderSwap }) => new Promise(async (resolve) => {\r\n if ((Date.now() - startTimeBoomSwap) < DELAY_BETWEEN_SWAPS) {\r\n return resolve({ err: 'please wait about one minute between BOOM swaps' });\r\n }\r\n try {\r\n setTimeout(() => resolve({ err: 'boom send timeout' }), 60 * 1000);\r\n // ## BOOM Transfer\r\n isLocal && console.log('Starting BOOM transfer', { amountBoomSwap, boomSenderSwap });\r\n const { err, errDetails, tx } = await transferBoomWithSession({\r\n amountBoomSwap, boomSenderSwap,\r\n });\r\n if (err || errDetails) {\r\n console.error('Boom transfer error:', { err, errDetails });\r\n resolve({ err: err || 'BOOM transfer KO', errDetails });\r\n return;\r\n }\r\n isLocal && console.debug('Boom transfer done:', { tx });\r\n startTimeBoomSwap = Date.now();\r\n resolve({\r\n waxTx: tx,\r\n });\r\n } catch (err) {\r\n console.error('caught error while transfering BOOM:', err);\r\n resolve({ err: 'caught error while transfering BOOM', errDetails: err });\r\n }\r\n});\r\n\r\n\r\n// ## ASK BACKEND TO USE VALID TX TO PROCESS SWAP\r\n\r\nexport const sendSwapToBackend = async ({\r\n hiveSender, hiveTx, waxUsername, hiveBlockNum, // Hive\r\n waxSender, waxTx, hiveUsername, // Wax\r\n authenticatedUser,\r\n}) => {\r\n // CREATE USER IF DOES NOT EXIST\r\n isLocal && console.log('Sending tx to backend:', { authenticatedUser,\r\n hive: { hiveSender, hiveTx, waxUsername, hiveBlockNum },\r\n wax: { waxSender, waxTx, hiveUsername },\r\n });\r\n try {\r\n isLocal && console.log('Sending lookup request (create user if needed)');\r\n const testCallResp = await client.post('/api/user/get',\r\n { account: authenticatedUser },\r\n );\r\n if (testCallResp.status > 300) {\r\n console.error('account creation/lookup call fail:', { testCallResp });\r\n return ({ err: 'something broke looking up your account in our system' });\r\n } else {\r\n isLocal && console.log('LFG >>>>', { testCallResp });\r\n }\r\n } catch (err) {\r\n console.error('Caught error during account creation/lookup:', err);\r\n return({ err: `Caught during account creation/lookup: ${err} - ${JSON.stringify(err)}` });\r\n }\r\n // SWAP REQUEST TO BACKEND\r\n isLocal && console.log('Sending swap api request');\r\n if (hiveTx) {\r\n let swapResp;\r\n const wasOnline = navigator.onLine;\r\n const apiCallStartTime = Date.now();\r\n try {\r\n swapResp = await client.post('/api/hive/bridge/doom-boom',\r\n { account: authenticatedUser, hiveSender, trxId: hiveTx, waxUsername, blockNum: hiveBlockNum },\r\n );\r\n if (swapResp.status >= 300 || swapResp.data?.err) {\r\n console.error('Uh oh, something went wrong during doom swap:', { swapResp });\r\n return ({ err: JSON.stringify(swapResp.data) });\r\n }\r\n const txRec = get(swapResp, 'data.response.transaction_id');\r\n isLocal && console.log('doom swap success', { swapResp });\r\n return ({ txRec: `https://wax.bloks.io/transaction/${txRec}` });\r\n } catch (err) {\r\n if (err.response) {\r\n // The request was made and the server responded with a status code not 2xx\r\n const { status, data, headers } = err.response; // eslint-disable-line no-unused-vars\r\n return ({ err: `[err.response case] Caught during doom swap: ${JSON.stringify({ status, data })}` });\r\n } else if (err.request) {\r\n // The request was made but no response was received\r\n console.error('No response received:', err.request);\r\n return ({\r\n err: `[no err.response, just err.request] Caught during doom swap: ${err} - ${\r\n JSON.stringify({ ...err, request: err.request })}`\r\n });\r\n }\r\n const durationMs = Date.now() - apiCallStartTime;\r\n return({ err: `Caught during doom swap: [wasOnline? ${wasOnline}] [durationMs:${durationMs}] ${\r\n err} - ${err.message} - ${JSON.stringify(err)}` });\r\n }\r\n } else if (waxTx) {\r\n let swapResp;\r\n const wasOnline = navigator.onLine;\r\n const apiCallStartTime = Date.now();\r\n try {\r\n swapResp = await client.post('/api/hive/bridge/boom-doom',\r\n { account: authenticatedUser, waxSender, trxId: waxTx, hiveUsername },\r\n );\r\n if (swapResp.status >= 300 || swapResp.data?.err) {\r\n console.error('Uh oh, something went wrong during boom swap:', { swapResp });\r\n return ({ err: JSON.stringify(swapResp.data) });\r\n }\r\n const txRec = get(swapResp, 'data.response.hiveTrxId');\r\n isLocal && console.log('boom swap success', { swapResp });\r\n return ({ txRec: `https://hiveblocks.com/tx/${txRec}` });\r\n } catch (err) {\r\n console.error('Caught error during boom swap:', err);\r\n const durationMs = Date.now() - apiCallStartTime;\r\n return({ err: `Caught during boom swap: [wasOnline? ${wasOnline}] [durationMs:${durationMs}] ${\r\n err} - ${err.message} - ${JSON.stringify(err)}` });\r\n }\r\n } else {\r\n console.error('?wat?', { hiveSender, waxSender });\r\n }\r\n};\r\n","/* eslint-disable no-useless-concat */\r\nimport { get } from 'lodash';\r\nimport { isClassicStorage } from '../../../../components/Menu/LeftMenu/storage/utils';\r\nimport { WAX_ACCOUNTS } from '../../../../config/accounts';\r\nimport { TOKEN_ACCOUNT } from '../../../../config/contractNames';\r\nimport { isLocal, isTestnet } from '../../../../constants/envs';\r\nimport { travelPaymentMemo } from '../../../../generalUtils/paymentMemo';\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { client } from '../../../../helpers/client';\r\nimport { setNewPaidResource } from '../../../../reducers/MarsStorage';\r\nimport { flyingSessionLogin, UserService, WaxFlyingSession } from '../../../../services/UserService';\r\nimport { checkSessionStillActive } from './checkSession';\r\nimport { HOURS, MINUTES, TRAVEL_TX_ID_PREFIX } from './constants';\r\nimport { SS_PRICES } from \"./travelPrices\";\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\n// # TRAVEL DURATION\r\n\r\nexport const LEVEL_ZERO_TRAVEL_DURATION = 10 * 1000;\r\n\r\nexport const getTravelDuration = ({ spaceshipId, travellingTo = 1 }) => {\r\n switch (travellingTo) {\r\n case 1: {\r\n switch (spaceshipId) {\r\n case 0: return 0;\r\n case 1: return /*isTestnet ? (30 * 1000) :*/ (1 * HOURS);\r\n case 2: return 15 * MINUTES;\r\n case 3: return 0;\r\n default: { throw new Error(`TO1 - Unexpected spaceship id ${spaceshipId} in nap duration calc`); }\r\n }\r\n }\r\n case 2: {\r\n switch (spaceshipId) {\r\n case 0: return 0;\r\n case 1: return /*isTestnet ? (30 * 1000) :*/ (1 * HOURS);\r\n case 2: return 15 * MINUTES;\r\n case 3: return 0;\r\n default: { throw new Error(`TO2 - Unexpected spaceship id ${spaceshipId} in nap duration calc`); }\r\n }\r\n }\r\n case 3: {\r\n console.error('TO3 - Unexpected travel duration fetch:', { spaceshipId, travellingTo });\r\n return 120 * MINUTES;\r\n }\r\n default: { throw new Error(`Unexpected travel duration fetch: ssId ${spaceshipId} to ${travellingTo}`); }\r\n }\r\n};\r\n\r\n\r\n// ## COUNTDOWN\r\n\r\nconst formatCountdown = millis => new Date(millis).toISOString().slice(11,19);\r\n\r\nconst timezoneStart = new Date().getTimezoneOffset();\r\n\r\nconst timezoneCheatCheck = () => {\r\n if (new Date().getTimezoneOffset() !== timezoneStart) {\r\n Swal.fire({text: 'Tried to cheat during travel. (warning triggered)'})\r\n window.location.reload();\r\n throw new Error('tz' + 'ko');\r\n }\r\n};\r\n\r\nconst updateUiCounter = ({ counter, spinner }) => {\r\n const target = document.getElementById('countdown');\r\n if (target) {\r\n if (counter) { target.innerHTML = formatCountdown(counter); }\r\n if (spinner) { target.innerHTML = 'click to update'; }\r\n }\r\n};\r\n\r\nlet counter;\r\n\r\nexport const spaceshipTimer = ({ travelDurationMs, unityLoad = true, isPromo }) => new Promise((resolve) => {\r\n counter = travelDurationMs > 0 ? travelDurationMs : (11 * 1000);\r\n const invertedDelay = unityLoad ? (10 * 1000) : 0;\r\n isTestnet && console.debug('Starting timeship counter:', { counter });\r\n updateUiCounter({ counter });\r\n const ts = setInterval(() => {\r\n counter -= 1000;\r\n if (counter <= invertedDelay) {\r\n isTestnet && console.debug(`Resolving ${invertedDelay}s prior to actual clearInterval`, { counter });\r\n resolve();\r\n }\r\n if (counter <= 0) {\r\n isTestnet && console.debug('Stopping timer internally');\r\n clearInterval(ts);\r\n }\r\n updateUiCounter({ counter });\r\n Math.random() > 0.9 && timezoneCheatCheck();\r\n }, 1000);\r\n});\r\n\r\nlet inactiveStart;\r\nlet spaceshipCounterCache;\r\n\r\nconst inactiveTab = () => {\r\n inactiveStart = Date.now();\r\n spaceshipCounterCache = counter;\r\n updateUiCounter({ spinner: true });\r\n};\r\n\r\nconst activeTab = () => {\r\n const inactiveDuration = inactiveStart && (Date.now() - inactiveStart);\r\n if (!inactiveDuration) return;\r\n const MINUTE = 60 * 1000;\r\n if (inactiveDuration > (MINUTE * 10)\r\n && (spaceshipCounterCache - counter) < (MINUTE * 5)) {\r\n // tab inactive for more than 10 min and counter update was less than 5 min\r\n const timeToRemove = inactiveDuration - (spaceshipCounterCache - counter);\r\n isLocal && console.debug(`Counter stopped more than X seconds. Decreasing counter ${counter}`,\r\n { timeToRemove, spaceshipCounterCache, counter, inactiveDuration });\r\n counter -= timeToRemove;\r\n }\r\n inactiveStart = null;\r\n spaceshipCounterCache = null;\r\n};\r\n\r\nconst enablePageFocusListeners = () => {\r\n document.addEventListener('visibilitychange', (event) => {\r\n if (document.visibilityState === 'visible') {\r\n activeTab();\r\n } else {\r\n inactiveTab();\r\n }\r\n });\r\n // window.onfocus = () => console.log('I have focus now');\r\n // window.onblur = () => console.log('I lost focus now');\r\n};\r\nenablePageFocusListeners(); \r\n\r\n\r\n// ## PAYMENTS\r\n\r\nexport const getFormattedPrice = ({ currency, price, charactersCount, forUI }) => {\r\n switch (currency) {\r\n case 'W': return `${price.toFixed(forUI ? 2 : 8)} WAX`;\r\n case 'B': return `${price.toFixed(forUI ? 2 : 4)} BOOM`;\r\n // case 'F': return `${price.toFixed(forUI ? 2 : 4)} FOOD`;\r\n case 'G': return `${(charactersCount * price).toFixed(forUI ? 2 : 4)} GAS`; // All GAS payments double for scholars\r\n case 'M': return `${price.toFixed(forUI ? 2 : 4)} MARS`;\r\n default: { throw new Error(`Unexpected currency ${currency} for price ${price}`); }\r\n }\r\n}\r\n\r\n// Used for all spaceship payments. NO FOOD, that uses sendFoodPayment.\r\nexport const payForSpaceshipTravel = ({\r\n spaceshipId, currency, charactersCount = 0, activeLevel, storageType,\r\n}) => new Promise(async (resolve) => {\r\n const index = spaceshipId + (activeLevel * 3); // L1: 1,2,3 -- L2: 1+3,2+3,3+3 -- L3: 1+6,2+6,3+6\r\n const price = SS_PRICES[`SS${index}`][currency];\r\n if (!price) { throw new Error(`Unexpected input for travel payment: ${spaceshipId} ${currency}`); }\r\n const quantity = getFormattedPrice({ currency, price, charactersCount });\r\n const contractName = currency === 'W' ? 'eosio.token' : TOKEN_ACCOUNT;\r\n const destinationLevel = activeLevel + (spaceshipId === 0 ? 0 : 1);\r\n const targetWallet = WAX_ACCOUNTS.SPACESHIPS[index];\r\n const memo = travelPaymentMemo({ activeLevel: destinationLevel, spaceshipId, currency, payer: UserService.authName, quantity });\r\n isLocal && console.debug('spaceship payment:', { charactersCount, price, quantity });\r\n\r\n\r\n let waxSession = UserService;\r\n const isHiveUser = localStorage.getItem('chainLogin') !== 'wax';\r\n if (isHiveUser && !UserService.authName) {\r\n isLocal && console.debug('creating side session for wax tokens payment for hive user');\r\n waxSession = WaxFlyingSession;\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn) return resolve({ err: 'still not logged in for wax tokens payment' });\r\n }\r\n isLocal && console.debug('Expected user for payment:', waxSession.authName);\r\n\r\n const { shouldStop } = await checkSessionStillActive();\r\n if (shouldStop) return;\r\n\r\n waxSession.session.signTransaction(\r\n {\r\n actions: [{\r\n account: contractName,\r\n name: 'transfer',\r\n authorization: [{\r\n actor: waxSession.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: waxSession.authName,\r\n to: targetWallet,\r\n quantity,\r\n memo,\r\n }\r\n }]\r\n },\r\n { blocksBehind: 3, expireSeconds: 30 },\r\n )\r\n .then(async (response = { status: '' }) => {\r\n isLocal && console.log('Transaction outcome:', { response });\r\n if (response.status !== 'executed') {\r\n console.error('Spaceship travel payment failed:', JSON.stringify({ response }));\r\n Swal.fire({text: `Spaceship travel payment failed.\\n\\n${JSON.stringify(response.status)}`})\r\n resolve({ err: (response.status || 'ko') });\r\n return;\r\n }\r\n // # UPDATE LOCAL STATE (paid resources counter in storage popup)\r\n storeAppDispatch(setNewPaidResource({ paidResource: { type: 'travel' } }));\r\n // ## STORE IN LS\r\n const txHash = response.transactionId;\r\n localStorage.setItem(`${TRAVEL_TX_ID_PREFIX}-L${destinationLevel}`, txHash);\r\n isLocal && console.log('Travel tx put in ls', { payment: txHash, level: destinationLevel });\r\n // ## STORE IN DB if PREMIUM sub\r\n if (storageType && !isClassicStorage(storageType)) {\r\n try {\r\n const data = await client.post(\r\n '/api/storage/travels',\r\n { account: waxSession.authName, travelWaxTx: txHash, level: destinationLevel },\r\n );\r\n isLocal && console.log('Store travel result:', { data });\r\n } catch (err) {\r\n let errMsg = get(err, 'response.data.error') || 'Unknown error';\r\n Swal.fire({text: `Uh oh, something went wrong storing your travel in db: ${errMsg}`})\r\n // resolve({ err }); // dont waste their payment\r\n }\r\n }\r\n resolve({});\r\n })\r\n .catch((err) => {\r\n console.error('Spaceship travel payment went wrong:', JSON.stringify({ err }));\r\n const errMsg = get(err, 'cause.message');\r\n const errMsg2 = get(err, 'cause.json.error.details[0].message');\r\n const errMsg3 = get(err, 'cause.json.message');\r\n Swal.fire({text: `Spaceship travel payment failed.\\n\\n${errMsg || errMsg2 || errMsg3 || JSON.stringify(err)}`});\r\n resolve({ err });\r\n });\r\n});\r\n","import React from 'react';\r\nimport { UserService, WaxFlyingSession } from '../../services/UserService';\r\nimport { isTestnet } from '../../constants/envs';\r\nimport { updateDoomBalance, validateHiveUsername } from '../../sagas/helpers/wallet/hiveUtils';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const displayBalance = (balance, type) => {\r\n isTestnet && console.log('Balance wallet:', balance, type);\r\n return (balance && !isNaN(balance) && balance !== 0)\r\n ? (balance).toFixed(4)\r\n : n/a ( see bloks );\r\n};\r\n\r\n\r\n// ## SEND WAX - utils\r\n\r\nexport const waxWalletFieldsValidation = ({\r\n amountElem, recipientElement, memoElement, // input fields\r\n boomSendAmount, boomReceiver, // values\r\n}) => {\r\n const MIN_TO_SEND = 0.1;\r\n const MAX_TO_SEND = 500;\r\n \r\n const recipient = boomReceiver || recipientElement.value;\r\n const amountToSend = boomSendAmount || +amountElem.value;\r\n const memo = (memoElement && memoElement.value) || '';\r\n if (!boomSendAmount && (!amountElem || !amountToSend || !recipientElement || !recipient || !memoElement)) {\r\n Swal.fire({text: 'Please enter recipient and amount'});\r\n return ({ err: 'no-fields' });\r\n }\r\n console.log('Validating:', { recipient, amountToSend });\r\n // recipient\r\n if (!recipient.match(/^[0-9a-z.*]+$/)) {\r\n Swal.fire({text: 'Not a valid wax address, only characters and dots allowed'});\r\n return ({ err: 'not valid wax addr' });\r\n }\r\n // amount\r\n if (isNaN(amountToSend)) {\r\n Swal.fire({text: 'Enter a valid amount to send'});\r\n return ({ err: 'invalid amount' });\r\n }\r\n if (amountToSend < MIN_TO_SEND) {\r\n Swal.fire({text: `Min amount to send: ${MIN_TO_SEND}`});\r\n return ({ err: `Amount too low, min ${MIN_TO_SEND}` });\r\n } else if (amountToSend > MAX_TO_SEND) {\r\n Swal.fire({text: `Max amount to send: ${MAX_TO_SEND}`});\r\n return ({ err: `Amount too high, max ${MAX_TO_SEND}` });\r\n }\r\n const toSendFormatted = amountToSend && amountToSend.toFixed(8);\r\n // result\r\n return ({ recipient, toSend: toSendFormatted, memo });\r\n};\r\n\r\nexport const hiveWalletFieldsValidation = async ({ amountElem, recipientElement, memoElement, symbol }) => {\r\n const MIN_TO_SEND = 0.1;\r\n const MAX_TO_SEND = 500;\r\n\r\n const recipient = recipientElement.value;\r\n const amountToSend = +amountElem.value;\r\n const memo = memoElement?.value || '';\r\n if (!amountElem || !amountToSend || !recipientElement || !recipient || memo == null) {\r\n console.error('Please enter recipient and amount');\r\n return ({ err: 'One of the required fields is missing' });\r\n }\r\n console.log('Validating:', { recipient, amountToSend });\r\n // recipient\r\n if (!recipient.match(/^[0-9a-z.-]+$/)) {\r\n console.error('Not a valid hive address, only characters and dots allowed');\r\n return ({ err: 'Not a valid Hive username' });\r\n }\r\n const { err } = await validateHiveUsername({ username: recipient });\r\n if (err) {\r\n console.error('Invalid recipient:', err);\r\n return ({ err: `Invalid account: ${err}` });\r\n }\r\n // amount\r\n if (isNaN(amountToSend)) {\r\n console.error('Enter a valid amount to send');\r\n return ({ err: 'Invalid transfer amount' });\r\n }\r\n if (amountToSend < MIN_TO_SEND) {\r\n console.error(`Min amount to send: ${MIN_TO_SEND}`);\r\n return ({ err: `Amount too small, min ${MIN_TO_SEND}` });\r\n } else if (amountToSend > MAX_TO_SEND) {\r\n console.error(`Max amount to send: ${MAX_TO_SEND}`);\r\n return ({ err: `Amount too big, max ${MAX_TO_SEND}` });\r\n }\r\n const toSendFormatted = amountToSend\r\n && amountToSend.toFixed(symbol === 'DOOM' ? 4 : 3);\r\n // result\r\n return ({ recipient, toSend: toSendFormatted, memo });\r\n};\r\n\r\nexport const clearFields = ({ amountElem, recipientElement }) => {\r\n amountElem.value = '';\r\n recipientElement.value = '';\r\n // plus dispatches // nah, temp hack anyway\r\n};\r\n\r\n\r\n// ## FETCH ALL BALANCES (all chains)\r\n\r\nexport const updateAllBalances = ({ hiveUsername }) => {\r\n WaxFlyingSession.session && WaxFlyingSession.fetchWaxTokens();\r\n UserService.session && UserService.fetchWaxTokens();\r\n hiveUsername && updateDoomBalance({ hiveUsername });\r\n};\r\n","import React from 'react';\r\nimport { UserService } from '../../../services/UserService';\r\nimport { isTestnet } from '../../../constants/envs';\r\nimport { clearFields, waxWalletFieldsValidation } from '../utils';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const SendWax = ({ chainLogin }) => {\r\n const onHandleSendWax = () => {\r\n const amountWaxElem = document.getElementById('amount-wax');\r\n const recipientWaxElem = document.getElementById('recipient-wax');\r\n const memoWaxElem = document.getElementById('memo-wax');\r\n const { err, recipient, toSend, memo } = waxWalletFieldsValidation({\r\n amountElem: amountWaxElem, recipientElement: recipientWaxElem, memoElement: memoWaxElem,\r\n });\r\n if (err) {\r\n console.error('Wax send validation error:', err);\r\n return;\r\n }\r\n isTestnet && console.debug('sending wax request');\r\n UserService.session.signTransaction(\r\n {\r\n actions: [{\r\n account: 'eosio.token',\r\n name: 'transfer',\r\n authorization: [{\r\n actor: UserService.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: UserService.authName,\r\n to: recipient,\r\n quantity: `${toSend} WAX`,\r\n memo: `WAX transfer from Crypto-Shots Web UI: ${memo}`,\r\n },\r\n }],\r\n },\r\n {\r\n blocksBehind: 3,\r\n expireSeconds: 30\r\n }\r\n ).then((response) => {\r\n isTestnet && console.log('wax send response status:', { response });\r\n clearFields({ amountElem: amountWaxElem, recipientElement: recipientWaxElem });\r\n const isOk = window.confirm('✅ WAX Transfer success! Do you want to see the transaction?');\r\n if (isOk)\r\n window.open(`https://wax${isTestnet ? '-test' : ''}.bloks.io/transaction/${response.transactionId}`, '_blank');\r\n if (response.status === 'executed') {\r\n UserService.getBalance();\r\n }\r\n })\r\n .catch(err => Swal.fire({text: `❌ WAX transfer failed - ${err}`}));\r\n };\r\n\r\n return (
\r\n
\r\n
\r\n \r\n Send WAX\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
);\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { displayBalance } from '../utils';\r\n\r\nexport const WaxBalance = () => {\r\n const WalletState = useSelector((store) => store.wallet);\r\n\r\n return (
\r\n
\r\n

WAXP

\r\n

\r\n Balance: {displayBalance(WalletState.wax, 'W')}\r\n

\r\n

\r\n \r\n BUY WAX\r\n \r\n

\r\n
\r\n
);\r\n};\r\n","import React from 'react';\r\n\r\nexport const InfoIcon = () => {\r\n return (\r\n {/* i */}\r\n i\r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useState } from 'react';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { getPlayerUsername } from '../../../generalUtils/utils';\r\nimport { fetchDoomStakedInPool } from '../../../sagas/helpers/wallet/hiveUtils';\r\nimport { InfoIcon } from '../../common/InfoIcon';\r\n\r\n\r\nconst POOL_SYMBOL = 'DOOM:SWAP.HIVE';\r\n\r\n\r\nexport const LiquidityPools = ({ whichActiveChain }) => {\r\n const [poolPlayerBalance = {}, setPoolPlayerBalance] = useState({});\r\n const { shares, sharesPc, stakedTokenAmount } = poolPlayerBalance;\r\n\r\n useEffect(() => {\r\n const fetchPoolBalance = async () => {\r\n const username = getPlayerUsername();\r\n const { shares, sharesPc, stakedTokenAmount } = await fetchDoomStakedInPool({ username });\r\n isLocal && console.log('[] pool data:', { shares, stakedTokenAmount });\r\n shares > 0 && setPoolPlayerBalance({\r\n shares: shares.toFixed(4),\r\n sharesPc: sharesPc.toFixed(1),\r\n stakedTokenAmount: stakedTokenAmount.toFixed(4),\r\n });\r\n };\r\n fetchPoolBalance();\r\n });\r\n\r\n return (<>{whichActiveChain === 2\r\n ?
\r\n

\r\n Liquidity Pool\r\n   -   Diesel Pool on Hive Engine\r\n \r\n \r\n \r\n

\r\n\r\n
\r\n

\r\n ADD LIQUIDITY:
\r\n https://tribaldex.com/dieselpools/add\r\n

\r\n

\r\n SWAP TOKENS:
\r\n https://tribaldex.com/dieselpools?...\r\n

\r\n
\r\n\r\n
\r\n {shares\r\n ?

\r\n Your {POOL_SYMBOL} Diesel Pool balance:
\r\n {stakedTokenAmount} DOOM   ({shares} shares - {sharesPc}%)\r\n

\r\n : \r\n \r\n }\r\n
\r\n
\r\n :
\r\n Liquidity Pool\r\n   -  \r\n \r\n Alcor Pool\r\n \r\n
}\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { isReactLayer } from '../../../constants/envs';\r\n\r\nexport const ChainChoice = ({ choseChain, activeBtn = 1 }) => {\r\n const [whichActiveBtn, setActiveBtn] = useState(activeBtn);\r\n\r\n const ethBtnStyle = {\r\n width: whichActiveBtn === 4 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 4 ? 'bold' : 'auto',\r\n };\r\n const btcBtnStyle = {\r\n width: whichActiveBtn === 3 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 3 ? 'bold' : 'auto',\r\n };\r\n const hiveBtnStyle = {\r\n width: whichActiveBtn === 2 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 2 ? 'bold' : 'auto',\r\n };\r\n const waxBtnStyle = {\r\n width: whichActiveBtn === 1 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 1 ? 'bold' : 'auto',\r\n };\r\n\r\n const handleEthClick = () => {\r\n choseChain(4);\r\n setActiveBtn(4);\r\n };\r\n const handleBtcClick = () => {\r\n choseChain(3);\r\n setActiveBtn(3);\r\n };\r\n const handleHiveClick = () => {\r\n choseChain(2);\r\n setActiveBtn(2);\r\n }; \r\n const handleWaxClick = () => {\r\n choseChain(1);\r\n setActiveBtn(1);\r\n };\r\n\r\n return (\r\n \r\n \r\n BTC\r\n
\r\n \r\n HIVE\r\n
\r\n \r\n WAX\r\n
\r\n {}}\r\n style={ethBtnStyle}\r\n disabled={true}\r\n >\r\n ETH\r\n \r\n \r\n );\r\n};\r\n","import { isLocal, isTestnet } from './envs';\r\n\r\n\r\nexport const MINIMUM_REQUIREMENTS_INFO = 'You need at least Base Gun, Base Ammo and 1x level-0 character to start playing and earn. Or a closed Starter/Advanced pack.';\r\n\r\nexport const chainId = (isTestnet && !isLocal) ? 'ssc-testnet-hive' : 'ssc-mainnet-hive';\r\n","import { BOOM_SWAPS_RECEIVER } from \"../../../../config/accounts\";\r\nimport { TOKEN_ACCOUNT } from \"../../../../config/contractNames\";\r\nimport { isLocal } from \"../../../../constants/envs\";\r\nimport { flyingSessionLogin, UserService, WaxFlyingSession } from \"../../../../services/UserService\";\r\n\r\n\r\nexport const transferBoomWithSession = async ({ amountBoomSwap, boomSenderSwap }) => {\r\n let waxSession = UserService;\r\n // If logged in with Hive, override waxSession with temporary one.\r\n // (Not needed if logged in with Wax already)\r\n if (!UserService.authName || (UserService.authName !== boomSenderSwap)) {\r\n isLocal && console.debug('creating side session for wax chain');\r\n waxSession = WaxFlyingSession;\r\n if (isLocal) { window.flyingSession = waxSession; } // DEBUG @@\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn || waxSession.authName !== boomSenderSwap) {\r\n return ({ err: `To proceed with the swap you have to sign in with ${boomSenderSwap}` });\r\n }\r\n } else {\r\n isLocal && console.debug('using the login session for wax chain');\r\n }\r\n isLocal && console.debug('Initiating Boom transfer:', { amountBoomSwap, boomSenderSwap });\r\n return waxSession.session.signTransaction(\r\n {\r\n actions: [{\r\n account: TOKEN_ACCOUNT,\r\n name: 'transfer',\r\n authorization: [{\r\n actor: waxSession.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: waxSession.authName,\r\n to: BOOM_SWAPS_RECEIVER,\r\n quantity: `${amountBoomSwap.toFixed(4)} BOOM`,\r\n memo: 'BOOM swap',\r\n },\r\n }],\r\n },\r\n {\r\n blocksBehind: 3,\r\n expireSeconds: 30\r\n }\r\n )\r\n .then((response) => {\r\n isLocal && console.log('Boom send response status:', { amountBoomSwap, boomSenderSwap, response });\r\n if (response.status !== 'executed') {\r\n console.error('Transfer not executed:', { response });\r\n return ({ errDetails: JSON.stringify(response) });\r\n }\r\n return ({ tx: response.transactionId });\r\n })\r\n .catch((err) => {\r\n console.error('Caught error during BOOM transfer:', err);\r\n return ({ errDetails: err });\r\n });\r\n};\r\n","\r\nexport const LOST_BLOCKS_THRESHOLD = 5;\r\n\r\nexport const SWAP_RANGES = {\r\n BOOM: {\r\n MIN: 10,\r\n MAX: 10000,\r\n },\r\n DOOM: {\r\n MIN: 20,\r\n MAX: 20000,\r\n },\r\n FEE: 0.05,\r\n BD_RATIO: 2,\r\n};\r\n","import React from 'react';\r\nimport { SWAP_RANGES } from './SwapUtils/constants';\r\n\r\n\r\nexport const MinSwapAmounts = ({ chainLogin, amountBoomSwap, amountDoomSwap }) => {\r\n const isPendingTransfer = !!amountBoomSwap || !!amountDoomSwap;\r\n if (isPendingTransfer)\r\n return (

\r\n Min amount: {SWAP_RANGES[amountBoomSwap ? 'BOOM' : 'DOOM'].MIN} {amountBoomSwap ? 'BOOM' : 'DOOM'}
\r\n Max amount: {SWAP_RANGES[amountBoomSwap ? 'BOOM' : 'DOOM'].MAX} {amountBoomSwap ? 'BOOM' : 'DOOM'}
\r\n Fee: {SWAP_RANGES.FEE * 100} % (burned)\r\n

);\r\n\r\n if (chainLogin === 'hive')\r\n return (

\r\n Min amount: {SWAP_RANGES.DOOM.MIN} DOOM
\r\n Max amount: {SWAP_RANGES.DOOM.MAX} DOOM
\r\n Fee: {SWAP_RANGES.FEE * 100} % (burned)\r\n

);\r\n\r\n if (chainLogin === 'wax')\r\n return (

\r\n Min amount: {SWAP_RANGES.BOOM.MIN} $BOOM
\r\n Max amount: {SWAP_RANGES.BOOM.MAX} $BOOM
\r\n Fee: {SWAP_RANGES.FEE * 100} % (burned)\r\n

);\r\n};\r\n","const MY_ID = '898594874419453973';\r\n\r\n\r\n// ## SWAP ISSUES\r\n\r\nexport const triggerSwapAlert = (args) => {\r\n const discordUrl = 'https://discord.com/api/webhooks/1016229102690246727/atfDghvTtlVBcpi7thsb4Nm0Xe6a2T7WEmtqmy7FdslkIp60mDdhm---mAdMo7cG8eKA';\r\n const errMsg = JSON.stringify(args, null, 2).split('Authorization')[0].slice(0, 1900);\r\n try {\r\n fetch(\r\n discordUrl,\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({\r\n content: `<@${MY_ID}> <@mods/support>\r\n Issue with SWAP:\r\n ${errMsg}\r\n `,\r\n }),\r\n },\r\n )\r\n .then((res) => {\r\n if (res.status < 300) console.log('Discord msg published for swap issue.', { res });\r\n else console.error('Discord notifications fail.', { res });\r\n })\r\n .catch(err => console.error('Something went wrong publishing to discord.', err));\r\n } catch (err) {\r\n console.error('Caught error publishing to discord.', err);\r\n }\r\n};\r\n\r\n\r\n// ## INVENTORY BUY ISSUE\r\n\r\nexport const notifyOfInventoryBuyIssue = ({ currentBuy, errMsg }) => {\r\n const discordUrl = 'https://discord.com/api/webhooks/1036008458593505321/2C3XGZczlHBJ62YOIKFZrohu4cG4vf5t9jro65j6dlmch6sEN8pLG1aTrjhVBrLTT0qV';\r\n try {\r\n const body = JSON.stringify({\r\n content: `<@${MY_ID}> Inventory purchase issue: ${errMsg}\\n${JSON.stringify(currentBuy)}`\r\n .split('Bearer ')[0].slice(0, 1900),\r\n });\r\n fetch(\r\n discordUrl,\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body,\r\n },\r\n )\r\n .then((res) => {\r\n if (res.status < 300) console.log('Discord msg published for inventory buy issue.', { res });\r\n else console.error('Discord notifications fail.', { res });\r\n })\r\n .catch(err => console.error('Something went wrong publishing inventory buy issue msg to discord.', err));\r\n } catch (err) {\r\n console.error('Caught error publishing inventory buy issue msg to discord.', err);\r\n }\r\n};\r\n\r\n\r\n// ## ADMIN UI\r\n\r\nexport const notifyOfRankReset = ({ resetter, accountsReset }) => {\r\n const discordUrl = 'https://discord.com/api/webhooks/1036006986443132979/h2ErWdJClsqTdZb8VkVicNkB_YyBlF1Iynza6PDCuHa3W1E1h11TxAZ7CjbhqDQ2pd7k';\r\n try {\r\n fetch(\r\n discordUrl,\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({\r\n content: `[] ${resetter} did reset rank for: ${accountsReset.join(', ')}`,\r\n }),\r\n },\r\n )\r\n .then((res) => {\r\n if (res.status < 300) console.log('Discord msg published for rank resets.', { res });\r\n else console.error('Discord notifications fail.', { res });\r\n })\r\n .catch(err => console.error('Something went wrong publishing rank reset msg to discord.', err));\r\n } catch (err) {\r\n console.error('Caught error publishing rank reset msg to discord.', err);\r\n }\r\n};\r\n\r\nexport const notifyOfStakeTransfer = ({ transferer, transfers }) => {\r\n const discordUrl = 'https://discord.com/api/webhooks/1036007723243942050/-Dq7MAxXuleuj1s8QdIGqyrzqGtrlybDkOQXirHDt4URQ1nF5eJ53JdCkZn2vZfxc9nV';\r\n try {\r\n fetch(\r\n discordUrl,\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({\r\n content: `[] ${transferer} did transfer stake:\\n${transfers.join(', ')}`,\r\n }),\r\n },\r\n )\r\n .then((res) => {\r\n if (res.status < 300) console.log('Discord msg published for stake transfers.', { res });\r\n else console.error('Discord notifications fail.', { res });\r\n })\r\n .catch(err => console.error('Something went wrong publishing stake transfer msg to discord.', err));\r\n } catch (err) {\r\n console.error('Caught error publishing stake transfer msg to discord.', err);\r\n }\r\n};\r\n\r\n\r\n// ## HIVE ONBOARDING TRACKING\r\n\r\nexport const notifyHiveOnboarding = ({ msg, data }) => {\r\n const discordUrl = 'https://discord.com/api/webhooks/1330109507568668673/fEo3CCdK4u5PqsIv9qeE1KAXPkZGQjRD1FAiFwMPRtpYCghKdBkj_s_iU13mo_txtXaM';\r\n try {\r\n fetch(\r\n discordUrl,\r\n {\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: JSON.stringify({\r\n content: `[] ${msg}${data ? `\\n${JSON.stringify(data)}` : ''}`,\r\n }),\r\n },\r\n )\r\n .then((res) => {\r\n if (res.status < 300) console.log('Discord msg published for HIVE ONBOARDING.', { res });\r\n else console.error('Discord notifications fail for HIVE ONBOARDING.', { res });\r\n })\r\n .catch(err => console.error('Something went wrong publishing HIVE ONBOARDING msg to discord.', err));\r\n } catch (err) {\r\n console.error('Caught error publishing HIVE ONBOARDING msg to discord.', err);\r\n }\r\n};\r\n","import { getCurrentApiEndpoint } from \"../../constants/envs\";\r\n\r\nexport const warmupLambdas = () => {\r\n const apiUrl = getCurrentApiEndpoint();\r\n fetch(`${apiUrl}/api/health/version`, {\r\n method: 'GET',\r\n headers: { Accept: 'application/json' },\r\n });\r\n};\r\n","import React from 'react';\r\n\r\nexport const KeychainSwapWidget = ({ hiveUsername }) => {\r\n const iframeUrl = `https://swapwidget.hive-keychain.com/?username=${hiveUsername}&partnerUsername=cryptoshots.nft&partnerFee=0.5&from=DOOM&to=HIVE&slippage=1`;\r\n return (\r\n \r\n \r\n );\r\n};\r\n","import { get } from 'lodash';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { isLocal } from '../../../constants/envs';\r\n\r\nimport { fetchDoomBalance, validateHiveUsername } from '../../../sagas/helpers/wallet/hiveUtils';\r\nimport { nap } from '../../../generalUtils/utils';\r\nimport { LoadingSpinner } from '../../../images/gifs/LoadingSpinner';\r\nimport { fetchBoomBalance } from '../../../sagas/helpers/wallet/waxUtils';\r\nimport { validateDoomToBoomInput, sendSwapToBackend, transferDoomToBurner, validateBoomToDoomInput, transferBoomToBurner } from './SwapUtils/swapCore';\r\nimport { updateAllBalances } from '../utils';\r\nimport { MinSwapAmounts } from './MinSwapAmounts';\r\nimport { isFeatureEnabled } from '../../../config/featureFlags';\r\nimport { triggerSwapAlert } from '../../../services/monitoring/discordNotifications';\r\nimport { SWAP_RANGES } from './SwapUtils/constants';\r\nimport { warmupLambdas } from '../../../services/api/warmup';\r\nimport { KeychainSwapWidget } from './KeychainSwapWidget';\r\n\r\n\r\nexport const Swaps = ({ chainLogin }) => {\r\n const UserState = useSelector((store) => store.user);\r\n const waxUsername = UserState.name || '';\r\n\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const hiveData = get(InventoryState, 'hive', {});\r\n const { username: hiveUsername } = hiveData;\r\n \r\n const authenticatedUser = chainLogin === 'hive' ? hiveUsername : waxUsername;\r\n\r\n // doom -> boom\r\n const [amountDoomSwap, setAmountDoomSwap] = useState(undefined);\r\n const [doomSenderSwap, setDoomSenderSwap] = useState('');\r\n const [boomReceiverSwap, setBoomReceiverSwap] = useState('');\r\n // boom -> doom\r\n const [amountBoomSwap, setAmountBoomSwap] = useState(undefined);\r\n const [boomSenderSwap, setBoomSenderSwap] = useState('');\r\n const [doomReceiverSwap, setDoomReceiverSwap] = useState('');\r\n // set sender username and balance\r\n const [altAccObj, setAltAccObj] = useState({ name: '', balance: 0 });\r\n\r\n let cachedName;\r\n let cachedSymbol;\r\n\r\n const fetchBalance = async (name = '', tokenId = '') => {\r\n try {\r\n // ## prevent spamming username check requests\r\n if (name.length < 5) return;\r\n cachedName = name;\r\n cachedSymbol = tokenId;\r\n await nap(500);\r\n if (cachedName !== name) return; // name changed during wait\r\n // ## fetches\r\n if (tokenId === 'B' && chainLogin === 'hive') {\r\n // validation\r\n if (name.endsWith('.wam') || name.endsWith('.gm') || name.length === 12) {\r\n const boomAmount = await fetchBoomBalance(name);\r\n if (boomAmount) setAltAccObj({ name: name, balance: (+boomAmount).toFixed(4) });\r\n isLocal && console.debug('Alt acc data found on input change:', { boomAmount });\r\n }\r\n }\r\n else if (tokenId === 'D' && chainLogin === 'wax') {\r\n // validation\r\n const { err } = await validateHiveUsername({ username: name });\r\n if (!err) {\r\n const doomAmount = await fetchDoomBalance({ username: name });\r\n if (doomAmount) setAltAccObj({ name: name, balance: (+doomAmount).toFixed(4) });\r\n isLocal && console.debug('Alt acc data found on input change:', { doomAmount });\r\n }\r\n }\r\n } catch (err) {\r\n console.error('Caught fetching alt acc balances for swap:', err);\r\n }\r\n };\r\n\r\n const clearErrors = () => {\r\n if (doomSwapStatus.err) setSwapStatus(initialSwapState);\r\n };\r\n\r\n useEffect(() => {\r\n const setDefaultValues = async () => {\r\n if (chainLogin === 'hive') {\r\n isLocal && console.debug('Autofilling swap form:', { hiveUsername, waxUsername });\r\n setDoomSenderSwap(hiveUsername);\r\n setDoomReceiverSwap(hiveUsername);\r\n waxUsername && fetchBalance(waxUsername, 'B');\r\n }\r\n else if (chainLogin === 'wax') {\r\n isLocal && console.debug('Autofilling swap form:', { hiveUsername, waxUsername });\r\n setBoomSenderSwap(waxUsername);\r\n setDoomReceiverSwap(hiveUsername);\r\n setDoomSenderSwap(hiveUsername);\r\n setBoomReceiverSwap(waxUsername);\r\n hiveUsername && fetchBalance(hiveUsername, 'D');\r\n }\r\n };\r\n setDefaultValues();\r\n }, []);\r\n\r\n const initialSwapState = { loading: false, err: '', criticalErr: '' };\r\n const [doomSwapStatus, setSwapStatus] = useState(initialSwapState);\r\n\r\n const swapDoomForBoom = async () => {\r\n if (!navigator.onLine) {\r\n alert('Please make sure you have a stable Internet connection before initiating swaps.');\r\n return;\r\n }\r\n setSwapStatus({ loading: true });\r\n warmupLambdas(); // avoid cold boot for swap\r\n const startTime = Date.now();\r\n // VALIDATIONS\r\n const { err: validationErr } = await validateDoomToBoomInput({\r\n amountDoomSwap, doomSenderSwap, boomReceiverSwap,\r\n });\r\n if (validationErr) {\r\n isLocal && console.debug('Swap validation error:', validationErr);\r\n setSwapStatus({ loading: false, err: validationErr });\r\n return;\r\n }\r\n // TRIGGER TRANSFER\r\n isLocal && console.debug('Initating DOOM transfer:', { amountDoomSwap, doomSenderSwap, boomReceiverSwap });\r\n const { err: doomTransferErr, notify, errDetails, hiveTx, blockNum, seconds } = await transferDoomToBurner({ amountDoomSwap, doomSenderSwap });\r\n if (doomTransferErr) {\r\n isLocal && console.debug('DOOM transfer error:', doomTransferErr);\r\n notify !== false && triggerSwapAlert({ type: 'doom-transfer-and-scan',\r\n requestArgs: { amountDoomSwap, doomSenderSwap, boomReceiverSwap },\r\n response: { doomTransferErr, errDetails, hiveTx, blockNum, seconds },\r\n });\r\n setSwapStatus({ loading: false, txSent: hiveTx, err: doomTransferErr, errDetails: JSON.stringify(errDetails) });\r\n return;\r\n }\r\n\r\n // SEND TX TO BACKEND\r\n const startTs = Date.now();\r\n const { err: doomBeErr, txRec } = await sendSwapToBackend({\r\n hiveSender: doomSenderSwap, hiveTx, waxUsername: boomReceiverSwap, hiveBlockNum: blockNum,\r\n authenticatedUser,\r\n });\r\n if (doomBeErr) {\r\n const endTs = Date.now();\r\n triggerSwapAlert({ type: 'be-doom-swap',\r\n times: { start: startTs, end: endTs, durationMs: endTs - startTs },\r\n requestArgs: { doomSenderSwap, hiveTx, boomReceiverSwap, blockNum, authenticatedUser },\r\n response: { doomBeErr, txRec },\r\n });\r\n setSwapStatus({ loading: false, txSent: `https://hiveblocks.com/tx/${hiveTx}`, criticalErr: true, errDetails: JSON.stringify(doomBeErr) });\r\n return;\r\n }\r\n const totalTimeSwap = ((Date.now() - startTime) / 1000).toFixed(0);\r\n setSwapStatus({ loading: false, txSent: `https://hiveblocks.com/tx/${hiveTx}`, txRec, seconds: totalTimeSwap });\r\n isLocal && console.debug('Success args:', { hiveTx, txRec, totalTimeSwap });\r\n\r\n // REFRESH ALL BALANCES\r\n await nap(1000);\r\n updateAllBalances({ hiveUsername });\r\n fetchBalance(cachedName, cachedSymbol); // for balance preview in form\r\n };\r\n\r\n const swapBoomForDoom = async () => {\r\n if (!navigator.onLine) {\r\n alert('Please make sure you have a stable Internet connection before initiating swaps.');\r\n return;\r\n }\r\n setSwapStatus({ loading: true });\r\n warmupLambdas(); // avoid cold boot for swap\r\n const startTime = Date.now();\r\n // VALIDATIONS\r\n const { err: validationErr } = await validateBoomToDoomInput({\r\n amountBoomSwap, boomSenderSwap, doomReceiverSwap,\r\n });\r\n if (validationErr) {\r\n isLocal && console.debug('Swap validation error:', validationErr);\r\n setSwapStatus({ loading: false, err: validationErr });\r\n return;\r\n }\r\n // TRIGGER TRANSFER\r\n isLocal && console.debug('Initating BOOM transfer:', { amountBoomSwap, boomSenderSwap, doomReceiverSwap });\r\n const { err: boomTransferErr, errDetails, waxTx, seconds } = await transferBoomToBurner({\r\n amountBoomSwap, boomSenderSwap,\r\n });\r\n if (boomTransferErr) {\r\n // @@ triggerSwapAlert({ type: 'transf', nftId, errDetails, user: UserState.username, err: errTransfer, tx, block, seconds });\r\n isLocal && console.debug('BOOM transfer error:', boomTransferErr, errDetails);\r\n setSwapStatus({ loading: false, txSent: waxTx, err: boomTransferErr, errDetails: JSON.stringify(errDetails) });\r\n return;\r\n }\r\n\r\n // SEND TX TO BACKEND\r\n const { err: boomBeErr, txRec } = await sendSwapToBackend({\r\n waxSender: boomSenderSwap, waxTx, hiveUsername: doomReceiverSwap,\r\n authenticatedUser,\r\n });\r\n if (boomBeErr) {\r\n triggerSwapAlert({ type: 'be-boom-swap',\r\n swapRequest: { boomSenderSwap, amountBoomSwap, waxTx, doomReceiverSwap, authenticatedUser },\r\n apiResponse: { boomBeErr, txRec },\r\n });\r\n setSwapStatus({ loading: false, txSent: `https://wax.bloks.io/transaction/${waxTx}`, criticalErr: true, errDetails: JSON.stringify(boomBeErr) });\r\n return;\r\n }\r\n const totalTimeSwap = ((Date.now() - startTime) / 1000).toFixed(0);\r\n isLocal && console.debug('Success args:', { waxTx, txRec, totalTimeSwap });\r\n setSwapStatus({ loading: false, txSent: `https://wax.bloks.io/transaction/${waxTx}`, txRec, seconds: totalTimeSwap });\r\n\r\n // REFRESH ALL BALANCES\r\n await nap(1000);\r\n updateAllBalances({ hiveUsername });\r\n };\r\n\r\n if (!isFeatureEnabled('SWAPS')) return (\r\n
\r\n

SWAPS

\r\n
\r\n
\r\n

Coming VERY SOON !!

\r\n
\r\n
\r\n
\r\n );\r\n\r\n return (
\r\n

SWAPS

\r\n
\r\n
\r\n {chainLogin === 'hive' && \r\n \r\n
}\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n DOOM->$BOOM\r\n
\r\n { setDoomSenderSwap(e.target.value); fetchBalance(e.target.value, 'D'); }}\r\n >\r\n { setAmountDoomSwap(+e.target.value); clearErrors(); }}\r\n >
\r\n { setBoomReceiverSwap(e.target.value); fetchBalance(e.target.value, 'B'); }}\r\n >
\r\n {!!amountDoomSwap &&

\r\n ..receives {amountDoomSwap * (1 / SWAP_RANGES.BD_RATIO) - amountDoomSwap * (1 / SWAP_RANGES.BD_RATIO) * SWAP_RANGES.FEE} $BOOM\r\n

}\r\n
\r\n
\r\n
\r\n $BOOM->DOOM\r\n
\r\n { setBoomSenderSwap(e.target.value); fetchBalance(e.target.value, 'B'); }}\r\n >\r\n { setAmountBoomSwap(+e.target.value); clearErrors(); }}\r\n >
\r\n { setDoomReceiverSwap(e.target.value); fetchBalance(e.target.value, 'D'); }}\r\n >
\r\n {!!amountBoomSwap &&

\r\n ..receives {amountBoomSwap * SWAP_RANGES.BD_RATIO - amountBoomSwap * SWAP_RANGES.BD_RATIO * SWAP_RANGES.FEE} DOOM\r\n

}\r\n
\r\n
\r\n {doomSwapStatus.loading &&

\r\n SWAP in progress. DO NOT CLOSE
this tab until complete. (takes about {!!amountDoomSwap ? 60 : 5}s)\r\n

}\r\n {doomSwapStatus.err &&

Error: {doomSwapStatus.err}
{doomSwapStatus.errDetails?.slice(0, 250)}

}\r\n {doomSwapStatus.criticalErr &&

\r\n Uh oh, SWAP failed. Reach out to our mods. {doomSwapStatus.txSent && Tx: {doomSwapStatus.txSent.split('/').pop()}}\r\n {doomSwapStatus.errDetails &&
{doomSwapStatus.errDetails?.slice(0, 250)}
}\r\n

}\r\n {doomSwapStatus.txRec && !doomSwapStatus.loading && !doomSwapStatus.err && \r\n Success ✔️ (took {doomSwapStatus.seconds}s)
\r\n Sent tx {doomSwapStatus.txSent.slice(-20)}
Received tx {doomSwapStatus.txRec.slice(-20)}
\r\n

\r\n }\r\n
\r\n
\r\n
\r\n
\r\n\r\n {chainLogin !== 'hive'\r\n ?\r\n
\r\n {!!altAccObj.balance &&

\r\n \r\n {altAccObj.name}\r\n 's
$BOOM balance:
\r\n {altAccObj.balance}\r\n

}\r\n

\r\n \r\n BUY $BOOM\r\n \r\n

\r\n \r\n
\r\n :
\r\n {!!altAccObj.balance &&

\r\n \r\n @{altAccObj.name}\r\n 's
DOOM balance: \r\n {altAccObj.balance}\r\n

}\r\n

\r\n \r\n BUY DOOM\r\n \r\n

\r\n \r\n
\r\n }\r\n
\r\n {doomSwapStatus.loading && }\r\n
\r\n
\r\n );\r\n};\r\n","/* eslint-disable no-useless-concat */\r\n\r\n// # RANK and S2C rule\r\nexport const STAKE_TO_CLAIM = 80;\r\nexport const KILLS_PER_LEVEL = 1000;\r\n\r\n// # CHAMPIONS\r\nexport const BONUS_AMOUNT = 15;\r\nexport const PERCENT_WINS = 0.95;\r\n\r\n// # NEWBIES\r\nexport const FREE_RESOURCES_FOR_KILLS = 500;\r\n\r\n// # CLAIM LIMITS\r\nconst MIN_CLAIMABLE_PER_DAY = 0.5;\r\nconst MAX_CLAIMABLE_PER_DAY_L0 = 62;\r\nconst MAX_CLAIMABLE_PER_DAY_L1 = 90;\r\nconst MAX_CLAIMABLE_PER_DAY_L2 = 200;\r\nconst MAX_CLAIMABLE_PER_DAY_L3 = 250;\r\n\r\nexport const claimLimits = () => ({\r\n minBoom: MIN_CLAIMABLE_PER_DAY,\r\n maxBoomL0: MAX_CLAIMABLE_PER_DAY_L0,\r\n maxBoomL1: MAX_CLAIMABLE_PER_DAY_L1,\r\n maxMarsL2: MAX_CLAIMABLE_PER_DAY_L2,\r\n maxMarsL3: MAX_CLAIMABLE_PER_DAY_L3,\r\n});\r\n\r\n// # RESOURCES PAYMENT\r\nexport const RATIO_FOR_MOSTLY_HIVE_NFTS = 0.8;\r\n\r\n\r\n// @@ @@ -- update every time a new level is launched..\r\n// PS. NO. Updated only the champion rule to be unlocked only in L2 <<<<<<<<<<<<<<<<<<<<\r\nexport const HIGHEST_LEVEL = 1;\r\nexport const LOWEST_THRESHOLD = claimLimits().maxBoomL0;\r\nexport const HIGHEST_REWARD = claimLimits()[`maxBoomL${HIGHEST_LEVEL}`] + BONUS_AMOUNT;\r\nexport const HIGHEST_MARS_CLAIM = claimLimits()['maxMarsL2']; // <<<<\r\n\r\n// # YIELD\r\nexport const MONTHLY_INTEREST_BOOM = 2.5; // 3.5\r\nexport const MONTHLY_INTEREST_MARS = 5.0; // 5.5\r\n\r\n// # SCHOLARSHIPS\r\nexport const DEFAULT_CUT_SCHOLAR = 60;\r\nexport const DEFAULT_CUT_TEACHER = 100 - DEFAULT_CUT_SCHOLAR;\r\n\r\n// # LOCALSTORAGE BYPASSES\r\nexport const BYPASS_OUTAGE_CODE = 'k4G-jh6' + '98d7.fg9';\r\nexport const BYPASS_INVENTORY_CODE = '4j3k-jj' + '2.4.fr1';\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { get } from 'lodash';\r\nimport { readHiveUserBalances } from '../../generalUtils/hiveData/reader';\r\nimport { isLocal } from '../../constants/envs';\r\nimport { hiveWalletFieldsValidation } from './utils';\r\nimport { updateDoomBalance } from '../../sagas/helpers/wallet/hiveUtils';\r\nimport { chainId } from '../../constants/genericConstants';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const HiveBalanceAndSend = () => {\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const hiveData = get(InventoryState, 'hive', {});\r\n const { username: hiveUsername } = hiveData;\r\n\r\n const [hiveBalance, setHiveBalance] = useState('0 HIVE');\r\n const [hivePowerBalance, setHivePowerBalance] = useState('0 HP');\r\n const [hbdBalance, setHbdBalance] = useState('0 HBD');\r\n\r\n const [hiveTransferResult, setHiveTransferMsg] = useState({ msg: '', tx: '' });\r\n\r\n useEffect(\r\n () => {\r\n if (!hiveUsername) return;\r\n const getHiveBalances = async () => {\r\n const { hiveBalance, hbdBalance, hivePower } = await readHiveUserBalances({ username: hiveUsername });\r\n setHiveBalance(hiveBalance);\r\n setHbdBalance(hbdBalance);\r\n setHivePowerBalance(hivePower ? hivePower.toFixed(2) : 0);\r\n };\r\n getHiveBalances();\r\n },\r\n []\r\n );\r\n \r\n const sendHive = async () => {\r\n const amountHiveElem = document.getElementById('amount-hive');\r\n const recipientHiveElem = document.getElementById('recipient-hive');\r\n const memoHiveElem = document.getElementById('memo-hive');\r\n const { err, recipient, toSend, memo } = await hiveWalletFieldsValidation({\r\n amountElem: amountHiveElem, recipientElement: recipientHiveElem,\r\n memoElement: memoHiveElem, symbol: 'HIVE',\r\n });\r\n if (err) {\r\n console.error('Hive send validation error:', err);\r\n setHiveTransferMsg({\r\n msg: `ERROR: transfer failed. ${err}`,\r\n });\r\n return;\r\n }\r\n const keychain = window.hive_keychain\r\n isLocal && console.debug('Starting hive keychain handshake');\r\n keychain.requestHandshake(() => {\r\n isLocal && console.debug('handshake success');\r\n keychain.requestTransfer(\r\n hiveUsername,\r\n recipient,\r\n toSend,\r\n memo || 'HIVE transfer from the Crypto Shots Web UI',\r\n 'HIVE',\r\n (response) => {\r\n isLocal && console.debug('Hive transfer resp:', response);\r\n if (!response.success) {\r\n setHiveTransferMsg({\r\n msg: `ERROR: transfer failed. ${response.message || ''}`,\r\n });\r\n } else {\r\n setHiveTransferMsg({\r\n msg: `${response.message || ''}`,\r\n tx: get(response, 'result.id'),\r\n });\r\n }\r\n },\r\n true, // enforce\r\n );\r\n },\r\n );\r\n };\r\n\r\n const handleChange = (e) => {\r\n let { name, value } = e.target;\r\n isLocal && console.debug('Input changed', { name, value, target: e.target });\r\n setHiveTransferMsg({});\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n HIVE \r\n \r\n FUNDS\r\n
\r\n
\r\n

HIVE:   {hiveBalance}

\r\n

+ HIVE DOLLAR (stablecoin)
    {hbdBalance}

\r\n

+ STAKED HIVE (Hive Power)
    {hivePowerBalance}

\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n

\r\n \r\n {hiveTransferResult.msg}
\r\n {hiveTransferResult.tx && \r\n TX\r\n }\r\n
\r\n

\r\n
\r\n \r\n BUY HIVE\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\n\r\nexport const DoomBalanceAndSend = () => {\r\n const WalletState = useSelector((store) => store.wallet);\r\n const doomBalance = WalletState.hiveTokens.doom;\r\n\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const hiveData = get(InventoryState, 'hive', {});\r\n const { username: hiveUsername } = hiveData;\r\n\r\n const [doomTransferResult, setDoomTransferMsg] = useState({ msg: '', tx: '' });\r\n\r\n useEffect(\r\n () => {\r\n if (!hiveUsername) return;\r\n updateDoomBalance({ hiveUsername });\r\n },\r\n []\r\n );\r\n\r\n const sendDoom = async () => {\r\n if (!window.hive_keychain) {\r\n Swal.fire({text: 'Hive Keychain extension not found'});\r\n return;\r\n }\r\n const amountDoomElem = document.getElementById('amount-doom');\r\n const recipientDoomElem = document.getElementById('recipient-doom');\r\n const memoDoomElem = document.getElementById('memo-doom');\r\n const { err, recipient, toSend } = await hiveWalletFieldsValidation({\r\n amountElem: amountDoomElem, recipientElement: recipientDoomElem,\r\n memoElement: memoDoomElem, symbol: 'DOOM',\r\n });\r\n if (err) {\r\n console.error('Doom send validation error:', err);\r\n setDoomTransferMsg({\r\n msg: `ERROR: ${err}`,\r\n });\r\n return;\r\n }\r\n const payload = {\r\n contractName: 'tokens',\r\n contractAction: 'transfer',\r\n contractPayload: {\r\n symbol: 'DOOM',\r\n to: recipient,\r\n quantity: toSend,\r\n memo: 'DOOM transfer from Crypto Shots Web UI',\r\n },\r\n };\r\n const customJsonData = {\r\n required_auths: [hiveUsername],\r\n required_posting_auths: [],\r\n id: chainId,\r\n json: JSON.stringify(payload),\r\n };\r\n const keychain = window.hive_keychain\r\n isLocal && console.debug('Starting hive keychain handshake');\r\n keychain.requestCustomJson(\r\n hiveUsername, chainId, \"Active\", JSON.stringify(customJsonData), \"DOOM TRANSFER\",\r\n (response) => {\r\n isLocal && console.debug('DOOM transfer result:', response);\r\n if (response.success && response.result) {\r\n setDoomTransferMsg({\r\n msg: `${response.message || ''}`,\r\n tx: get(response, 'result.id'),\r\n });\r\n } else {\r\n setDoomTransferMsg({\r\n msg: `ERROR: ${response.message}`,\r\n });\r\n }\r\n },\r\n );\r\n };\r\n\r\n const handleChange = (e) => {\r\n let { name, value } = e.target;\r\n isLocal && console.debug('Input changed', { name, value, target: e.target });\r\n setDoomTransferMsg({});\r\n }\r\n\r\n return (<>\r\n
\r\n

\r\n $DOOM balance: \r\n \r\n {doomBalance}\r\n \r\n

\r\n
\r\n \r\n BUY DOOM\r\n \r\n
\r\n\r\n
\r\n SEND DOOM\r\n
\r\n
\r\n \r\n

\r\n \r\n {doomTransferResult.msg}
\r\n {doomTransferResult.tx && \r\n TX\r\n }\r\n
\r\n

\r\n
\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { get } from 'lodash';\r\nimport { UserService } from '../../../services/UserService';\r\nimport { fetchBoomBalance } from '../../../sagas/helpers/wallet/waxUtils';\r\nimport { TOKEN_ACCOUNT } from '../../../config/contractNames';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport { setPlayerWaxTokensBalances } from '../../../reducers/WalletReducer';\r\nimport { isLocal, isTestnet } from '../../../constants/envs';\r\nimport { MONTHLY_INTEREST_BOOM, MONTHLY_INTEREST_MARS } from '../../../config/appConfig';\r\nimport { waxWalletFieldsValidation, displayBalance } from '../utils';\r\nimport { DoomBalanceAndSend } from '../HiveTokensPanes';\r\nimport { InfoIcon } from '../../common/InfoIcon';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const BoomPane = ({ wrapperData, scholarshipData, chainLogin }) => {\r\n const WalletState = useSelector((store) => store.wallet);\r\n const boomSavingsValue = get(wrapperData, 'sessionData.playerStake', 'n/a');\r\n const boomSavings = !Number.isNaN(+boomSavingsValue) ? (+boomSavingsValue).toFixed(4) : boomSavingsValue;\r\n const { isScholar, isTeacher, scholarPreviousBoomStake = 0 } = (scholarshipData || {});\r\n\r\n const [boomReceiver, setBoomReceiver] = useState();\r\n const [boomSendAmount, setBoomSendAmount] = useState();\r\n\r\n const onHandleSendBOOM = () => {\r\n try {\r\n isLocal && console.debug('Sending boom:', { boomSendAmount, boomReceiver });\r\n const { err, recipient, toSend } = waxWalletFieldsValidation({ boomSendAmount, boomReceiver });\r\n if (err) {\r\n console.error('Boom send validation error:', err); return;\r\n }\r\n UserService.session.signTransaction(\r\n {\r\n actions: [{\r\n account: TOKEN_ACCOUNT,\r\n name: 'transfer',\r\n authorization: [{\r\n actor: UserService.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: UserService.authName,\r\n to: recipient,\r\n quantity: `${toSend.slice(0, -4)} BOOM`,\r\n memo: '$BOOM transfer from Crypto-Shots Web UI',\r\n },\r\n }],\r\n },\r\n {\r\n blocksBehind: 3,\r\n expireSeconds: 30,\r\n }\r\n ).then(async (response) => {\r\n isLocal && console.log('Boom send response status:', { response });\r\n setBoomReceiver(undefined);\r\n setBoomSendAmount(undefined);\r\n if (response.status !== 'executed')\r\n return;\r\n const isOk = window.confirm('✅ BOOM Transfer success! Do you want to see the transaction?');\r\n if (isOk)\r\n window.open(`https://wax${isTestnet ? '-test' : ''}.bloks.io/transaction/${response.transactionId}`, '_blank');\r\n const boomAmount = await fetchBoomBalance(UserService.authName);\r\n const savingsAmount = await Promise.resolve(0); // TEMP for savings @@ @@ @@ @@\r\n storeAppDispatch(setPlayerWaxTokensBalances({\r\n tokens: { boom: boomAmount },\r\n stakedSavings: { boom: savingsAmount }\r\n }));\r\n })\r\n .catch(err => Swal.fire({text: `❌ BOOM transfer failed - ${err}`}));;\r\n } catch (err) {\r\n console.error('Caught error reading send boom input fields', err);\r\n } \r\n };\r\n\r\n return (
\r\n {chainLogin === 'hive'\r\n ? \r\n :
\r\n
$BOOM balance: {displayBalance(WalletState.tokens.boom, 'B')}\r\n

\r\n \r\n BUY $BOOM\r\n \r\n

\r\n
\r\n Send $BOOM\r\n
\r\n setBoomReceiver(e.target.value)}\r\n />
\r\n setBoomSendAmount(+e.target.value)}\r\n />\r\n
\r\n
}\r\n\r\n
\r\n

In-game staked igBOOM: {boomSavings}

\r\n

{isScholar && Of these, {scholarPreviousBoomStake} igBOOM are your personal stake pre-scholarship.}

\r\n

{isTeacher && ...plus part of the stake of your Scholar(s).}

\r\n

Withdrawals available daily after playing

\r\n

Current monthly interest: {MONTHLY_INTEREST_BOOM} %

\r\n \r\n \r\n
\r\n
);\r\n};\r\n\r\nexport const MarsPane = ({ wrapperData, scholarshipData, chainLogin }) => {\r\n const WalletState = useSelector((store) => store.wallet);\r\n const marsBalance = get(WalletState, 'tokens.mars', 0);\r\n\r\n const marsSavingsValue = get(wrapperData, 'apiResponse.savings.mars.amount', 'n/a');\r\n const { isScholar, isTeacher, scholarPreviousMarsStake = 0 } = (scholarshipData || {});\r\n const marsLink = chainLogin === 'mars'\r\n ? 'https://wax.alcor.exchange/trade/mars-csboomcsboom_boom-csboomcsboom'\r\n : 'https://hive-engine.com/trade/MARS';\r\n\r\n return (
\r\n
\r\n
$MARS balance: {marsBalance}
\r\n

\r\n \r\n BUY $MARS\r\n \r\n

\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n

In-game staked igMARS: {marsSavingsValue}

\r\n

{isScholar && Of these, {scholarPreviousMarsStake} igBOOM are your personal stake pre-scholarship.}

\r\n

{isTeacher && ...plus part of the stake of your Scholar(s).}

\r\n

Withdrawals available daily after playing

\r\n

Current monthly interest: {MONTHLY_INTEREST_MARS} %

\r\n \r\n \r\n
\r\n
);\r\n};\r\n","import React from 'react';\r\n\r\nexport const BoomStakingForMars = () => {\r\n return (
\r\n
\r\n

UNDER CONSTRUCTION

\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n

\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
);\r\n};\r\nexport const MarsStakingForGas = () => {\r\n return (
\r\n
\r\n

UNDER CONSTRUCTION

\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n

\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
);\r\n};\r\n","import { get } from \"lodash\";\r\nimport { WaxAuthClient } from 'wax-auth-client';\r\n\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { client } from '../../../helpers/client';\r\nimport { flyingSessionLogin, WaxFlyingSession } from \"../../../services/UserService\";\r\n\r\n\r\nconst authClient = new WaxAuthClient(); \r\n\r\n\r\n// ## SIGN TX TO PROVE ACCOUNT OWNERSHIP\r\n\r\nconst signHiveTx = async ({ inputAccount }) => new Promise((resolve) => {\r\n window.hive_keychain.requestHandshake(() => {\r\n try {\r\n isLocal && console.debug('handshake success!');\r\n const message = `${inputAccount}_${Date.now()}`;\r\n window.hive_keychain.requestSignBuffer(\r\n inputAccount,\r\n message,\r\n 'Posting',\r\n (response) => {\r\n isLocal && console.debug('Keychain requestSignBuffer:', response);\r\n if (response.error) {\r\n const errMsg = 'Keychain signing failed';\r\n console.error(errMsg, response.error);\r\n return resolve({ err: errMsg });\r\n }\r\n const username = get(response, 'data.username');\r\n isLocal && console.debug('signing response data', response.data);\r\n if (username !== inputAccount) {\r\n console.error('Username mismatch:', response.error)\r\n return resolve({ err: `expected signature for ${inputAccount} but got ${username}` });\r\n }\r\n resolve({ message, signed_message: response.result });\r\n }\r\n );\r\n } catch (err) {\r\n console.error('Sign hive Tx caught error:', err);\r\n throw new Error('sign-hive-caught-error');\r\n }\r\n });\r\n});\r\n\r\nconst signWaxTx = async ({ inputAccount }) => {\r\n // ## NONCE\r\n let nonceResponse;\r\n try {\r\n isLocal && console.debug('[cross-chainlink-waxSign] getting nonce for', inputAccount);\r\n nonceResponse = await client.post(`/api/auth/getNonce`, { waxAddress: inputAccount });\r\n } catch (err) {\r\n console.error('nonce ko:', err);\r\n return ({ err: 'getNonce-ko' });\r\n }\r\n const nonce = nonceResponse.data.nonce;\r\n isLocal && console.debug('[cross-chainlink-waxSign] getting tx data:', { nonce, inputAccount });\r\n const tx = authClient.getTransactionData(nonce, inputAccount);\r\n let result;\r\n // ## SIGNATURE\r\n try {\r\n isLocal && console.debug('Creating side session for wax chain');\r\n const waxSession = WaxFlyingSession;\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn) {\r\n return ({ err: 'login failed' });\r\n } else if (waxSession.authName !== inputAccount) {\r\n return({ err: `signed with ${waxSession.authName} instead of ${inputAccount}` });\r\n }\r\n isLocal && console.debug('Signing Wax tx:', { inputAccount, tx });\r\n result = await waxSession.session.signTransaction(tx.data, tx.options);\r\n } catch (err) {\r\n console.error('[cross-chainlink-waxSign] Error signing:', { err, nonce, tx });\r\n return ({ err: 'error signing tx' });\r\n }\r\n // ## RESULT\r\n const proof = {\r\n serializedTransaction: result.transaction.serializedTransaction,\r\n signatures: result.transaction.signatures\r\n };\r\n return ({ proof, nonce });\r\n};\r\n\r\n\r\n// ## API CALLS\r\n\r\n// - Account linking:\r\n// Hive: send sig\r\n// Wax: ask nonce and verify\r\n// POST: api/auth/link\r\n// {\r\n// account, chainToLink /* tab */,\r\n// hiveUsername, message, signed_message, // hive\r\n// waxAddress, proof, nonce, // wax\r\n// }\r\nexport const linkAccount = async ({ currentAuthUser, inputAccount, tab }) => {\r\n let payload = {\r\n account: currentAuthUser,\r\n chainToLink: tab,\r\n };\r\n \r\n // ## HIVE\r\n if (tab === 'hive') {\r\n if (!window.hive_keychain) {\r\n const isConfirmed = window.confirm('You need the Hive keychain extension to link your Hive account.\\nWant me to open the installation page?');\r\n if (isConfirmed) {\r\n window.open('https://chrome.google.com/webstore/detail/hive-keychain/jcacnejopjdphbnjgfaaobbfafkihpep?hl=en', '_blank');\r\n } \r\n return ({ err: 'Hive Keychain missing' });\r\n }\r\n const { message, signed_message, err } = await signHiveTx({ inputAccount });\r\n if (err) {\r\n return ({ err });\r\n }\r\n payload = {\r\n ...payload,\r\n hiveUsername: inputAccount,\r\n message, signed_message, // proof of ownership\r\n };\r\n\r\n // ## WAX\r\n } else if (tab === 'wax') {\r\n const { proof, nonce, err } = await signWaxTx({ inputAccount });\r\n if (err) {\r\n return ({ err });\r\n }\r\n payload = {\r\n ...payload,\r\n waxAddress: inputAccount,\r\n proof, nonce, // proof of ownership\r\n };\r\n\r\n // ## BTC\r\n } else if (tab === 'btc') { \r\n payload = {\r\n ...payload,\r\n btcAddress: inputAccount,\r\n // no proof of ownership for LN Address\r\n };\r\n } else {\r\n throw new Error(`Unexpected tab type ${tab}`);\r\n }\r\n try {\r\n const resCrossChainLink = await client.post('/api/auth/link', payload);\r\n const respError = resCrossChainLink.data?.err || resCrossChainLink.data?.error;\r\n if (resCrossChainLink.status !== 200 || respError) {\r\n console.error('linking failed:', resCrossChainLink);\r\n return ({ err: `linking error: ${respError}` });\r\n }\r\n isLocal && console.debug('api call result:', { resCrossChainLink });\r\n } catch (caughtErr) {\r\n console.error('Caught error linking account', { caughtErr, currentAuthUser, inputAccount });\r\n throw new Error({ err: caughtErr.error || caughtErr });\r\n }\r\n return ({});\r\n};\r\n\r\n\r\n// - Account unlinking:\r\n// POST: api/auth/unlink\r\n// {account, accountToUnlink, chainOfAccountToUnlink /* tab */ }\r\nexport const unlinkAccount = async ({ currentAuthUser, inputAccount, tab }) => {\r\n const payload = {\r\n account: currentAuthUser,\r\n accountToUnlink: inputAccount, \r\n chainOfAccountToUnlink: tab,\r\n };\r\n let resCrossChainLink;\r\n try {\r\n resCrossChainLink = await client.post('/api/auth/unlink', payload);\r\n const respError = resCrossChainLink.data?.err || resCrossChainLink.data?.error;\r\n if (resCrossChainLink.status !== 200 || respError) {\r\n console.error('unlinking failed:', resCrossChainLink);\r\n return ({ err: `unlinking failed: ${respError}` });\r\n }\r\n isLocal && console.debug('api call result:', { resCrossChainLink });\r\n } catch (caughtErr) {\r\n console.error('Caught error ulinking account', { caughtErr, currentAuthUser, inputAccount });\r\n throw new Error({ err: caughtErr.error || caughtErr });\r\n }\r\n return resCrossChainLink.data;\r\n};\r\n\r\n\r\n// WIP:\r\n// - test:\r\n// swapping owned accounts linked - V\r\n// linking another chain AND btc - []\r\n// - build playtest & check: spinner issue in wax \"unlink\" and btc pane - works on hive tab\r\n// - release prod\r\n// - tourney e2e tests btc\r\n\r\n// N blog posts\r\n// caesars MR and then add shit (UTs and manual tests)\r\n","\r\nconst bech32 = require('bech32');\r\n\r\n\r\nconst LN_ADDRESS_PREFIX = 'ln';\r\n\r\n\r\n// The address decodes correctly using the Bech32 library.\r\n// The decoded data has the expected format.\r\nconst isValidLightningNetworkAddress = ({ address }) => {\r\n try {\r\n // Decode the address using Bech32\r\n const decoded = bech32.decode(address);\r\n // Check if the decoded address has the expected human-readable part (prefix)\r\n const expectedPrefix = LN_ADDRESS_PREFIX;\r\n if (decoded.prefix !== expectedPrefix) return false;\r\n // Additional checks based on the Lightning Network address format\r\n // ...\r\n return true;\r\n } catch (error) {\r\n console.error('An error occurred during decoding');\r\n return true; // best effort\r\n }\r\n}\r\n\r\n\r\nexport const validateBtcLnAddress = async ({ address = '' }) => {\r\n // ADDRESS SIZE\r\n const tooShort = address.length < 8;\r\n const tooLong = address.length > 90;\r\n if (tooShort || tooLong) return ({ valid: false, reason: `Incorrect size: ${tooShort ? 'too short' : 'too long'}` });\r\n\r\n // BECH32 ENCODING check\r\n // eg. lnbc1pwr5u7hpp5cx4k6t4szgt0jh5tkj8d4y7mrpw2h\r\n if (address.startsWith(LN_ADDRESS_PREFIX)) { // Lightning Network prefix for Bech32 encoding\r\n const valid = isValidLightningNetworkAddress({ address });\r\n return valid ? ({ valid: true }) : ({ valid: false, reason: 'Failed Bech32 decoding' });\r\n }\r\n\r\n // EMAIL FORMAT check\r\n // eg. sniper@vipsats.app\r\n const [username, tail = ''] = address.split('@');\r\n const [service, suffix] = tail.split('.');\r\n if (!username || !service || !suffix) return ({ valid: false, reason: 'No \"@\" and \".\" found' });\r\n if (username.length < 3 || service.length < 2 || tail.length < 2) return ({ valid: false, reason: 'Not a valid address: parts too short' });\r\n\r\n return ({ valid: true });\r\n};\r\n","import React from 'react';\r\nimport { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { ADMINS } from '../../../config/accounts';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { getPlayerUsername } from '../../../generalUtils/utils';\r\nimport { linkAccount, unlinkAccount } from '../../../sagas/helpers/login/linking';\r\nimport { validateHiveUsername } from '../../../sagas/helpers/wallet/hiveUtils';\r\nimport { checkWaxUserExists } from '../../../sagas/helpers/wallet/waxUtils';\r\nimport { validateBtcLnAddress } from '../../../sagas/helpers/wallet/btcUtils';\r\nimport { linkedBtcAddress } from '../../../reducers/InventoryReducer';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\n\r\n\r\nconst checkValidAddress = async ({ inputAccount, tab: chain }) => {\r\n if (chain === 'hive') {\r\n isLocal && console.debug('Validating hive username', inputAccount);\r\n const { err, caughtErr } = await validateHiveUsername({ username: inputAccount });\r\n if (err) return ({ invalidReason: err });\r\n else if (caughtErr) return ({ invalidReason: `Oops, some issues with this Hive node. Try again.` });\r\n } else if (chain === 'wax') {\r\n isLocal && console.debug('Validating wax username', inputAccount);\r\n const exists = await checkWaxUserExists({ account: inputAccount });\r\n if (!exists) return ({ invalidReason: `the Wax user ${inputAccount} does not exist` });\r\n } else if (chain === 'btc') {\r\n isLocal && console.debug('Validating LN address', inputAccount);\r\n const { valid, reason } = await validateBtcLnAddress({ address: inputAccount });\r\n return valid ? ({}) : ({ invalidReason: reason });\r\n }\r\n else {\r\n console.error('unexpected chain for username validation');\r\n }\r\n return ({});\r\n};\r\n\r\n\r\n// @@ CHEATS: is this ok??\r\n// @@ 0. doni's concern about people sharing 1 hive account - fixed by blocking re-linking of same account < 36 hs\r\n// @@ 1. player swapping account during the day to double time/rewards (mitigated by multi-acc notification)\r\n// @@ 2. scholarships\r\n\r\nexport const AccountLinking = ({ tab }) => {\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n const isHiveLogin = chainLogin === 'hive';\r\n const isHiveUser = tab === 'hive';\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const currentAuthUser = getPlayerUsername({ UserState, InventoryState });\r\n\r\n const [actionError, setError] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const isSuperAdmin = ADMINS.includes(UserState.name);\r\n // const isTrustedDelegate = COMMUNITY_MANAGERS.includes(UserState.name);\r\n\r\n const [didSucceed, setDidSucceed] = useState(false);\r\n const [inputAccount, setInputAccount] = useState('');\r\n\r\n const handleLinking = async () => {\r\n setIsLoading(true);\r\n setError('');\r\n const { invalidReason } = await checkValidAddress({ inputAccount, tab });\r\n if (invalidReason) {\r\n setError(invalidReason);\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n try {\r\n const { err } = await linkAccount({ currentAuthUser, inputAccount, tab });\r\n if (err) {\r\n setError(typeof err === 'string' ? err : JSON.stringify(err));\r\n return;\r\n }\r\n setDidSucceed(true);\r\n setInputAccount('');\r\n // Redux state - NOTE: instead for Wax and Hive we force a re-login to load all NFTs\r\n if (tab === 'btc') {\r\n // Set LN Address\r\n storeAppDispatch(linkedBtcAddress({ lnAddress: inputAccount }));\r\n }\r\n } catch (error) {\r\n console.error('broke:', error);\r\n setError('Uh oh, something broke.');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleUnlinking = async () => {\r\n setIsLoading(true);\r\n setError('');\r\n const { invalidReason } = await checkValidAddress({ inputAccount, tab });\r\n if (invalidReason) {\r\n setError(invalidReason);\r\n setIsLoading(false);\r\n return;\r\n }\r\n try {\r\n const { err, result, hiveErr } = await unlinkAccount({ currentAuthUser, inputAccount, tab });\r\n if (err) {\r\n setError(typeof err === 'string' ? err : JSON.stringify(err));\r\n return;\r\n }\r\n if (result === 'partial') {\r\n setError(`Dynamo update ok but Hive error: ${hiveErr}`);\r\n return;\r\n }\r\n setDidSucceed(true);\r\n setInputAccount('');\r\n } catch (error) {\r\n console.error('broke:', error);\r\n setError('Uh oh, something broke.');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleInputChange = (ev) => {\r\n if (actionError) setError('');\r\n const input = ev.target.value;\r\n setInputAccount(isHiveUser ? input.replace('@', '') : input);\r\n }\r\n\r\n return (\r\n
\r\n {tab !== 'btc' && <>

}\r\n
\r\n {/* TITLE */}\r\n
\r\n
\r\n LINK YOUR {tab.toUpperCase()} {tab === 'btc' ? 'ADDRESS' : 'ACCOUNT'}\r\n

(one-time process)

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {/* INSTRUCTIONS */}\r\n
\r\n {tab === 'btc'\r\n ?

LIGHTNING NETWORK address:

\r\n :

\r\n Enter your {isHiveUser ? <>Hive username:  (no @) : `${tab.toUpperCase()} address:`}\r\n

\r\n }\r\n
\r\n\r\n {/* INPUT FIELD */}\r\n
\r\n \r\n
\r\n {tab !== 'btc' && <>

}\r\n\r\n {/* LINK ACCOUNT */}\r\n \r\n {isLoading\r\n ? \r\n : <>\r\n LINK {isHiveUser ? 'HIVE' : tab.toUpperCase()\r\n } {tab === 'btc' ? 'address' : 'account'}
to {isHiveLogin ? '@' : ''}{currentAuthUser}\r\n }\r\n \r\n\r\n {/* PUSH SIGN UPs */}\r\n {tab === 'btc' && \r\n }\r\n {tab === 'hive' && \r\n }\r\n\r\n {/* // SUPERADMIN SHOULD ALWAYS TARGET THE MAIN/LOGIN ACCOUNT to reset.\r\n // - Only crypto4shots can nuke Hive accounts.\r\n // - Only cryptoshots.nft can nuke Wax accounts. */}\r\n {(isSuperAdmin && tab !== 'btc') && \r\n {isLoading\r\n ? \r\n : <>(ADMIN) UNLINK {isHiveUser ? 'HIVE' : tab.toUpperCase()} account}\r\n }\r\n
\r\n {actionError}\r\n
\r\n {!isLoading && !actionError && didSucceed\r\n &&

\r\n DONE!! {tab !== 'btc' ? 'Please login again.' : ''}\r\n

}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { AccountLinking } from '../../Inventory/chains/AccountLinking';\r\nimport get from 'lodash/get';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport { linkedBtcAddress as linkedBtcAddressData } from '../../../reducers/InventoryReducer';\r\nimport { useState } from 'react';\r\nimport { getPlayerUsername } from '../../../generalUtils/utils';\r\nimport { unlinkAccount } from '../../../sagas/helpers/login/linking';\r\n\r\n\r\nexport const BtcLinkPane = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const linkedBtcAddress = get(InventoryState, 'hive.linkedBtcAddress');\r\n const hiveUsername = get(InventoryState, 'hive.username');\r\n\r\n const [unlinkWip, setUnlinkWip] = useState(false);\r\n \r\n \r\n const unlinkLnAddress = async () => {\r\n setUnlinkWip(true);\r\n try {\r\n const currentAuthUser = getPlayerUsername({ UserState, InventoryState });\r\n const ok = window.confirm(`Are you sure?\\n\\nUnlink your BTC address ${linkedBtcAddress\r\n }\\nfrom your ${chainLogin.toUpperCase()} account ${\r\n chainLogin === 'hive' ? '@' : ''}${currentAuthUser}?`);\r\n if (!ok) return;\r\n\r\n const { result, err } = await unlinkAccount({\r\n currentAuthUser, inputAccount: linkedBtcAddress, tab: 'btc',\r\n });\r\n // Unlink Failure\r\n if (err) alert(`Failed to unlink BTC address ${linkedBtcAddress}: ${err}`);\r\n // Unlink Success\r\n else {\r\n console.log('BTC address unlink success - api result:', result);\r\n storeAppDispatch(linkedBtcAddressData({ lnAddress: null }));\r\n }\r\n } catch (err) {\r\n console.error('Something broke unlinking chain:', err);\r\n alert('Uh oh, something broke..');\r\n } finally {\r\n setUnlinkWip(false);\r\n }\r\n };\r\n\r\n if (chainLogin !== 'hive') {\r\n return (\r\n
\r\n

PLEASE LOG IN WITH A \r\n HIVE ACCOUNT\r\n
IF YOU WANT TO LINK A BITCOIN ADDRESS\r\n
and earn BTC during our Weekly Tournaments.

\r\n

You can link this Wax account to your Hive account too.

\r\n\r\n
\r\n
\r\n \r\n Create FREE Hive Account\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n if (!linkedBtcAddress) {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
);\r\n }\r\n\r\n return (\r\n \r\n \r\n\r\n
\r\n

At the end of each PVP TOURNAMENT, if your total reward is at least\r\n 2 Hive, you will automatically receive its $ worth\r\n (minus the LN channel fee) at your linked Bitcoin address.

\r\n
\r\n

Tournament earnings below 2 Hive are
automatically sent in Hive to your account:
\r\n \r\n @{hiveUsername}\r\n \r\n

\r\n
\r\n
\r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { get } from 'lodash';\r\nimport { Animated } from \"react-animated-css\";\r\n\r\nimport { SendWax } from './subComponents/SendWax';\r\nimport { WaxBalance } from './subComponents/WaxBalance';\r\nimport { LiquidityPools } from './subComponents/LiquidityPools';\r\nimport { ChainChoice } from './subComponents/ChainChoice';\r\nimport { Swaps } from './subComponents/Swaps';\r\nimport { BoomPane, MarsPane } from './subComponents/WaxTokensPanes';\r\nimport { BoomStakingForMars, MarsStakingForGas } from './subComponents/WaxTokensStaking';\r\nimport { HiveBalanceAndSend, DoomBalanceAndSend } from './HiveTokensPanes';\r\nimport './Wallet.scss';\r\nimport { BtcLinkPane } from './subComponents/BtcLinkPane';\r\n\r\n\r\nconst TokenPanes = ({ whichActiveChain }) => {\r\n const PlayState = useSelector((store) => store.play);\r\n const wrapperData = PlayState.wrapperData;\r\n \r\n const InventoryState = useSelector((store) => store.inventory);\r\n const scholarshipData = get(InventoryState, 'scholarship', {});\r\n\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n {whichActiveChain === 2\r\n ? <>\r\n \r\n \r\n : <>\r\n \r\n \r\n }\r\n
\r\n
\r\n
\r\n
\r\n {whichActiveChain === 2\r\n ?
\r\n

HIVE TOKENS

\r\n \r\n \r\n
\r\n : <>\r\n

WAX TOKENS

\r\n \r\n \r\n }\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n

STAKING

\r\n
\r\n
\r\n \r\n
\r\n {whichActiveChain === 1 && <>\r\n \r\n

Smart Contracts

\r\n
\r\n
\r\n
\r\n $BOOM STAKING (to earn $MARS)\r\n
\r\n \r\n
\r\n
\r\n
\r\n $MARS STAKING (to earn $GAS)\r\n
\r\n \r\n
\r\n }\r\n
\r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\n\r\nexport const Wallet = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n const [whichActiveChain, setActiveChain] = useState(chainLogin === 'wax' ? 1 : 2);\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n {whichActiveChain === 3 ? : }\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React from 'react';\r\nimport { isReactLayer } from '../../../constants/envs';\r\n\r\n\r\nexport const LevelChoice = ({ whichBtnExpanded, setExpandedBtn, inTravel, activeLevel, setShowTravelPage }) => {\r\n if (inTravel) return null;\r\n\r\n // Make button larger when clicked. But can be clicked only to travel\r\n // or see travel requirements for the very next level.\r\n const levelZeroBtnStyle = () => ({\r\n cursor: 'auto',\r\n fontWeight: (whichBtnExpanded === 0) ? 'bold' : 'inherit',\r\n width: (whichBtnExpanded === 0) ? '150px' : '120px',\r\n });\r\n const levelOneBtnStyle = () => ({\r\n cursor: (activeLevel === 0 && whichBtnExpanded !== 1) ? 'pointer' : 'auto',\r\n fontWeight: (whichBtnExpanded === 1) ? 'bold' : 'inherit',\r\n width: (whichBtnExpanded === 1) ? '150px' : '120px'\r\n });\r\n const levelTwoBtnStyle = () => ({\r\n cursor: (activeLevel === 1 && whichBtnExpanded !== 2) ? 'pointer' : 'auto',\r\n fontWeight: (whichBtnExpanded === 2) ? 'bold' : 'inherit',\r\n width: (whichBtnExpanded === 2) ? '150px' : '120px'\r\n });\r\n \r\n // Button can be clicked only if player is on previous level\r\n const level1BtnHandler = () => {\r\n if (activeLevel !== 0) return; // cant travel to lower level\r\n setExpandedBtn(1);\r\n setShowTravelPage(1);\r\n };\r\n const level2BtnHandler = () => {\r\n if (activeLevel !== 1) return; // cant travel to lower level\r\n setExpandedBtn(2);\r\n setShowTravelPage(2);\r\n };\r\n\r\n return (\r\n \r\n {}}\r\n style={levelZeroBtnStyle()}\r\n >\r\n LEVEL 0\r\n
\r\n \r\n LEVEL 1\r\n
\r\n \r\n LEVEL 2\r\n \r\n \r\n );\r\n};\r\n","\r\nexport const RESOURCES_PRICES = {\r\n FOOD: 10,\r\n GAS: 10,\r\n};\r\n","import Swal from 'sweetalert2';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { getPlayerUsername } from '../../../../generalUtils/utils';\r\nimport { client } from '../../../../helpers/client';\r\n\r\n\r\nexport const checkSessionStillActive = async () => {\r\n const account = getPlayerUsername();\r\n const resSessionCheck = await client.post('/api/auth/check-auth', { account });\r\n isLocal && console.debug('check session response:', { resSessionCheck });\r\n if (resSessionCheck.status !== 200) {\r\n Swal.fire({text: 'You probably don\\'t want to make a payment, your authentication is expired so you would not be able to play.\\nPlease log in again.'})\r\n return ({ shouldStop: true });\r\n }\r\n return ({ shouldStop: false });\r\n};\r\n","import { RESOURCES_PRICES } from '../../overlays/Resources/resourcesPrices';\r\n\r\n\r\nconst PC_DISCOUNT_WAX_PAYM = 5;\r\n\r\n\r\n// # TOKEN VALUE\r\nconst waxPriceInUsd = 0.06;\r\nconst boomPriceInWax = 0.2;\r\nconst gasPriceInBoom = 0.2;\r\nconst marsPriceInBoom = 2;\r\n\r\n\r\n// # SPACESHIP PRICES -- TODO: read from owners' bio (or high default)\r\n// L-1\r\nconst usdPriceSpaceship1 = 0.3;\r\nconst usdPriceSpaceship2 = 0.35;\r\nconst usdPriceSpaceship3 = 0.4;\r\n// L-2\r\nconst usdPriceSpaceship4 = 0.3;\r\nconst usdPriceSpaceship5 = 0.4;\r\nconst usdPriceSpaceship6 = 0.5;\r\n\r\n\r\n// const ss1Boom = Math.round(usdPriceSpaceship1 / boomPriceInWax / waxPriceInUsd);\r\nconst ss1Mars = Math.round((usdPriceSpaceship1 / boomPriceInWax / waxPriceInUsd) * marsPriceInBoom);\r\nconst ss1Wax = Math.round(usdPriceSpaceship1 / waxPriceInUsd);\r\n\r\nconst ss2Boom = Math.round(usdPriceSpaceship2 / boomPriceInWax / waxPriceInUsd);\r\nconst ss2Wax = Math.round(usdPriceSpaceship2 / waxPriceInUsd);\r\n\r\nconst ss3Boom = Math.round(usdPriceSpaceship3 / boomPriceInWax / waxPriceInUsd);\r\nconst ss3Wax = Math.round(usdPriceSpaceship3 / waxPriceInUsd);\r\n\r\nconst ss4Boom = Math.round(usdPriceSpaceship4 / boomPriceInWax / waxPriceInUsd);\r\nconst ss4Wax = Math.round(usdPriceSpaceship4 / waxPriceInUsd);\r\n\r\nconst ss5Mars = Math.round(usdPriceSpaceship5 / marsPriceInBoom / boomPriceInWax / waxPriceInUsd); // 100 mars\r\nconst ss5Wax = Math.round(usdPriceSpaceship5 / waxPriceInUsd);\r\n\r\n// (divided by MIN chars to get to L2!!)\r\nconst ss6Gas = Math.round(usdPriceSpaceship6 / gasPriceInBoom / boomPriceInWax / waxPriceInUsd) / 6; // 80 gas\r\nconst ss6Wax = Math.round(usdPriceSpaceship6 / waxPriceInUsd);\r\n\r\n\r\nexport const SS_PRICES = {\r\n // level 0\r\n SS0: {\r\n G: RESOURCES_PRICES.GAS, // multiplied by X characters\r\n },\r\n // level 1\r\n SS1: {\r\n // B: ss1Boom,\r\n M: ss1Mars,\r\n W: ss1Wax - (ss1Wax * PC_DISCOUNT_WAX_PAYM / 100),\r\n },\r\n SS2: {\r\n B: ss2Boom,\r\n W: ss2Wax - (ss2Wax * PC_DISCOUNT_WAX_PAYM / 100),\r\n },\r\n SS3: {\r\n B: ss3Boom,\r\n W: ss3Wax - (ss3Wax * PC_DISCOUNT_WAX_PAYM / 100),\r\n },\r\n SS4: {\r\n B: ss4Boom,\r\n W: ss4Wax - (ss4Wax * PC_DISCOUNT_WAX_PAYM / 100),\r\n },\r\n SS5: {\r\n M: ss5Mars,\r\n W: ss5Wax - (ss5Wax * PC_DISCOUNT_WAX_PAYM / 100),\r\n },\r\n SS6: {\r\n G: ss6Gas,\r\n W: ss6Wax - (ss6Wax * PC_DISCOUNT_WAX_PAYM / 100),\r\n },\r\n};\r\n","import { RESOURCES_PRICES } from './resourcesPrices';\r\nimport { TOKEN_ACCOUNT } from '../../../../config/contractNames';\r\nimport { flyingSessionLogin, UserService, WaxFlyingSession } from '../../../../services/UserService';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { get } from 'lodash';\r\nimport { WAX_ACCOUNTS } from '../../../../config/accounts';\r\nimport { MEAL_TX_ID_PREFIX } from '../../subComponents/spaceships/constants';\r\nimport { mealPaymentMemo } from '../../../../generalUtils/paymentMemo';\r\nimport { isClassicStorage } from '../../../../components/Menu/LeftMenu/storage/utils';\r\nimport { client } from '../../../../helpers/client';\r\nimport { checkSessionStillActive } from '../../subComponents/spaceships/checkSession';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const sendFoodPayment = ({ charactersToPay, activeLevel, storageType }) => new Promise(async (resolve) => {\r\n const price = RESOURCES_PRICES.FOOD * charactersToPay;\r\n if (!price) { throw new Error(`Unexpected input for food payment: ${charactersToPay} x ${price}`); }\r\n const quantity = `${price.toFixed(4)} FOOD`;\r\n const contractName = TOKEN_ACCOUNT;\r\n const targetWallet = WAX_ACCOUNTS.FOOD_CANTEEN;\r\n\r\n let waxSession = UserService;\r\n const isHiveUser = localStorage.getItem('chainLogin') !== 'wax';\r\n if (isHiveUser && !UserService.authName) {\r\n isLocal && console.debug('creating side session for wax tokens payment for hive user');\r\n waxSession = WaxFlyingSession;\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn) return resolve({ err: 'still not logged in for wax tokens payment' });\r\n }\r\n isLocal && console.debug('Expected user for payment:', waxSession.authName);\r\n\r\n const memo = mealPaymentMemo({ activeLevel, payer: waxSession.authName, quantity });\r\n isLocal && console.debug('FOOD payment:', { charactersToPay, price });\r\n\r\n const { shouldStop } = await checkSessionStillActive();\r\n if (shouldStop) return;\r\n\r\n waxSession.session.signTransaction(\r\n {\r\n actions: [{\r\n account: contractName,\r\n name: 'transfer',\r\n authorization: [{\r\n actor: waxSession.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: waxSession.authName,\r\n to: targetWallet,\r\n quantity,\r\n memo,\r\n }\r\n }]\r\n },\r\n { blocksBehind: 3, expireSeconds: 30 },\r\n )\r\n .then(async (response = { status: '' }) => {\r\n isLocal && console.log('Transaction outcome:', response.status);\r\n if (response.status !== 'executed') {\r\n console.error('Food payment failed:', JSON.stringify({ response }));\r\n Swal.fire({ text: `Food payment failed.\\n\\n${JSON.stringify(response.status)}` })\r\n resolve({ err: (response.status || 'ko') });\r\n return;\r\n }\r\n isLocal && console.debug('Resources payment response:', { response });\r\n\r\n const txHash = response.transactionId;\r\n localStorage.setItem(`${MEAL_TX_ID_PREFIX}-L${activeLevel}`, txHash);\r\n isLocal && console.log('Meal tx put in ls', { payment: txHash, level: activeLevel });\r\n\r\n // ## STORE IN DB if PREMIUM sub\r\n if (storageType && !isClassicStorage(storageType)) {\r\n try {\r\n const data = await client.post(\r\n '/api/storage/meals',\r\n { account: waxSession.authName, mealL0WaxTx: txHash },\r\n );\r\n isLocal && console.log('Store meal result:', { data });\r\n } catch (err) {\r\n let errMsg = get(err, 'response.data.error') || 'Unknown error';\r\n Swal.fire({ text: `Uh oh, something went wrong storing your meal in db: ${errMsg}` })\r\n // resolve({ err }); // dont waste their payment\r\n }\r\n }\r\n resolve({});\r\n })\r\n .catch((err) => {\r\n console.error('Food payment went wrong:', JSON.stringify({ err }));\r\n const errMsg = get(err, 'cause.message');\r\n const errMsg2 = get(err, 'cause.json.error.details[0].message');\r\n const errMsg3 = get(err, 'cause.json.message');\r\n Swal.fire({ text: `Food payment failed.\\n\\n${errMsg || errMsg2 || errMsg3 || JSON.stringify(err)}` })\r\n resolve({ err });\r\n });\r\n});\r\n","\r\nexport const mapSrc = (activeLevel) => {\r\n switch (activeLevel) {\r\n case 0: return 'https://files.peakd.com/file/peakd-hive/keys-defender/48KbB9tBkiH7AFsBRkNXjmVZos8K9rQ9cU8Th5GALXgr5Xwr6YvEnNceJmULnkZAJv.png';\r\n case 1: return 'https://files.peakd.com/file/peakd-hive/keys-defender/48PvpQBSpgvbmP9equTqq6GoM7BAJgPfSY3NDC1hbQfwtr3DtRH6FAR2eoWx17p491.png';\r\n case 2: return 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/48J8T2kNPmJVaiWHA5G3NHLqRuH4eLd8UkwAvk1FXnYqukHRSVLgo469kzvrdy4cYz.png';\r\n default: { console.error('MAP IMAGE NOT FOUND FOR LEVEL', activeLevel); }\r\n }\r\n};\r\n","import { HIVE_ITEMS_BY_CATEGORY, ITEMS_BY_CATEGORY } from '../../../../constants/templateIds';\r\nimport { getNftCount } from '../../../../generalUtils/utils';\r\nimport { RATIO_FOR_MOSTLY_HIVE_NFTS } from '../../../../config/appConfig';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { windowSetChecksum } from '../../../../generalUtils/secure/checksums';\r\n\r\n\r\n// WAX\r\nconst { WEAPONS, AMMUNITION, CHARACTERS, STARTER_KITS, EARLY_ACCESS } = ITEMS_BY_CATEGORY;\r\nconst { BG } = WEAPONS;\r\nconst { BA } = AMMUNITION;\r\nconst { VA, MA } = CHARACTERS;\r\nconst { SK, AKS, AKM, AKL, GXL } = STARTER_KITS;\r\n\r\n// HIVE\r\nconst {\r\n CHARACTERS: hiveCharacters, AMMO: hiveAmmo, WEAPONS: hiveWeapons, SHIELDS, EARLY_ACCESS: earlyAccessHive,\r\n} = HIVE_ITEMS_BY_CATEGORY;\r\n\r\n\r\n// NFT REQUIREMENTS\r\n\r\nlet cachedMissingMandNfts = null;\r\n\r\nexport const areMandNftsMissing = ({ nfts: waxNfts = [], hiveNfts = [], isPvp = false }) => {\r\n if (cachedMissingMandNfts !== null) return cachedMissingMandNfts;\r\n if (isPvp) {\r\n cachedMissingMandNfts = areWhitelistNftsMissing({ nfts: waxNfts, hiveNfts });\r\n } else {\r\n const hasCharacter = (getNftCount({ nfts: waxNfts, id: VA.ID }) || getNftCount({ nfts: waxNfts, id: MA.ID })) // wax\r\n || (getNftCount({ hiveNfts, name: hiveCharacters.VANCE_TYRRELL.NAME })\r\n || getNftCount({ hiveNfts, name: hiveCharacters.MASHA_TALASHOVA.NAME })); // hive\r\n const hasBaseGun = getNftCount({ nfts: waxNfts, id: BG.ID }) // wax\r\n || getNftCount({ hiveNfts, name: hiveWeapons.BASE_GUN.NAME }); // hive\r\n const hasBaseAmmo = getNftCount({ nfts: waxNfts, id: BA.ID }) // wax\r\n || getNftCount({ hiveNfts, name: hiveAmmo.MYTHIC_AMMO.NAME })\r\n || getNftCount({ hiveNfts, name: hiveAmmo.LEGENDARY_AMMO.NAME }); // hive\r\n const hasThreeBaseItems = hasBaseGun && hasBaseAmmo && hasCharacter;\r\n const hasKit = getNftCount({ nfts: waxNfts, id: SK.ID }) || getNftCount({ nfts: waxNfts, id: AKS.ID })\r\n || getNftCount({ nfts: waxNfts, id: AKM.ID }) || getNftCount({ nfts: waxNfts, id: AKL.ID })\r\n || getNftCount({ nfts: waxNfts, id: GXL.ID });\r\n cachedMissingMandNfts = !hasThreeBaseItems && !hasKit;\r\n isLocal && console.debug('Are NFTs missing?',\r\n {\r\n hasCharacter, hasBaseGun, hasBaseAmmo,\r\n hasThreeBaseItems, hasKit, cachedMissingMandNfts,\r\n }\r\n );\r\n }\r\n return cachedMissingMandNfts;\r\n};\r\n\r\n\r\nlet cachedValueWlNfts = null;\r\n\r\nexport const areWhitelistNftsMissing = ({ nfts: waxNfts = [], hiveNfts = [] }) => {\r\n if (cachedValueWlNfts !== null) return cachedValueWlNfts;\r\n // HIVE\r\n const hasL1Shield = hasHiveShield({ hiveNfts, level: 1 });\r\n const hasL2Shield = hasHiveShield({ hiveNfts, level: 2 });\r\n if (hasL1Shield && hasL2Shield) {\r\n cachedValueWlNfts = false;\r\n return false;\r\n }\r\n const hasPvpPassHive = getNftCount({ hiveNfts, name: earlyAccessHive.PVP_ALPHA_PASS.NAME });\r\n if (hasPvpPassHive) {\r\n cachedValueWlNfts = false;\r\n return false;\r\n }\r\n // WAX\r\n const hasPvpPass = getNftCount({ nfts: waxNfts, id: EARLY_ACCESS.PAA.ID });\r\n if (hasPvpPass) {\r\n cachedValueWlNfts = false;\r\n return false;\r\n }\r\n cachedValueWlNfts = true;\r\n return true;\r\n};\r\n\r\n\r\n// NFTS ON WHICH CHAIN \r\n\r\nlet mostlyHiveNfts = null;\r\n\r\nexport const hasMostlyHiveNfts = ({ hiveNfts = [], waxNfts = [] } = {}) => {\r\n if (mostlyHiveNfts !== null) return mostlyHiveNfts;\r\n if (!hiveNfts.length && !waxNfts.length) {\r\n return !!localStorage.getItem('chainLogin') === 'hive';\r\n }\r\n mostlyHiveNfts = (hiveNfts.length / (waxNfts.length + hiveNfts.length)) > RATIO_FOR_MOSTLY_HIVE_NFTS;\r\n return mostlyHiveNfts;\r\n};\r\nwindow.hasMostlyHiveNfts = hasMostlyHiveNfts;\r\nwindowSetChecksum({ key: 'hasMostlyHiveNfts', value: hasMostlyHiveNfts });\r\ntry {\r\n const original = window.hasMostlyHiveNfts;\r\n Object.defineProperty(window, 'hasMostlyHiveNfts', { value: original, writable: false });\r\n} catch (_) {}\r\n\r\nexport const hasHiveShield = ({ hiveNfts = [], level = 1 }) => {\r\n const shieldCategory = `L${level}_SHIELD`;\r\n return !!getNftCount({ hiveNfts, name: SHIELDS[shieldCategory].NAME });\r\n};\r\n","import { HIVE_TEMPLATES } from \"../../../../constants/hiveNfts\";\r\nimport { ITEMS_BY_CATEGORY } from \"../../../../constants/templateIds\";\r\nimport { getNftCount } from \"../../../../generalUtils/utils\";\r\n\r\nconst { CHARACTERS } = ITEMS_BY_CATEGORY;\r\n\r\n\r\nconst PRICE_MULTIPLIER_SCHOLARS = 2;\r\nconst MAX_CHARS_SCHOLARS = 19; // 20 including captain\r\nconst MAX_CHARS_NONSCHOLARS = 9; // 10 including captain\r\n\r\n\r\nconst charactersCountNfts = ({ waxNfts, hiveNfts }) => {\r\n const waxCount = 0\r\n // L0\r\n + getNftCount({ nfts: waxNfts, id: CHARACTERS.VA.ID })\r\n + getNftCount({ nfts: waxNfts, id: CHARACTERS.MA.ID })\r\n // L1\r\n + getNftCount({ nfts: waxNfts, id: CHARACTERS.IV.ID })\r\n + getNftCount({ nfts: waxNfts, id: CHARACTERS.MI.ID })\r\n // L2\r\n + getNftCount({ nfts: waxNfts, id: CHARACTERS.LEX.ID })\r\n + getNftCount({ nfts: waxNfts, id: CHARACTERS.EVE.ID });\r\n const hiveCount = 0\r\n // L0\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.VANCE_TYRRELL.name })\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.MASHA_TALASHOVA.name })\r\n // L1\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.IVAN_BARRICK.name })\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.MINTA_HANI.name })\r\n // L2\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.LEXI_CAYNE.name })\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.EVELYN_MOORE.name })\r\n return waxCount + hiveCount;\r\n};\r\n\r\n\r\nexport const countCharsToPayFor = ({ isScholar, waxNfts = [], hiveNfts = [] }) => {\r\n let result;\r\n const charsCount = charactersCountNfts({ waxNfts, hiveNfts });\r\n if (isScholar) {\r\n result = Math.min(MAX_CHARS_SCHOLARS, charsCount * PRICE_MULTIPLIER_SCHOLARS);\r\n } else {\r\n result = Math.min(MAX_CHARS_NONSCHOLARS, charsCount);\r\n }\r\n return result + 1; // +1 = captain\r\n};\r\n","import React, { useState } from 'react';\r\nimport { get } from 'lodash';\r\nimport { useEffect } from 'react';\r\nimport { Animated } from 'react-animated-css';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { resetLastMatch, setFirstLevTravel, setPaidResources } from '../../../../reducers/PlayReducer';\r\nimport { RESOURCES_PRICES } from './resourcesPrices';\r\nimport { LEVEL_ZERO_TRAVEL_DURATION, payForSpaceshipTravel, spaceshipTimer } from '../../subComponents/spaceships/travels';\r\nimport { sendFoodPayment } from './paymentUtils';\r\nimport { mapSrc } from '../../subComponents/spaceships/ui';\r\nimport { getNftCount, nap } from '../../../../generalUtils/utils';\r\nimport { isLocal, isTestnet } from '../../../../constants/envs';\r\nimport { ITEMS_BY_CATEGORY } from '../../../../constants/templateIds';\r\nimport { uiHacks } from '../../../../generalUtils/uiHacks/uiHacks';\r\nimport { FREE_RESOURCES_FOR_KILLS, RATIO_FOR_MOSTLY_HIVE_NFTS } from '../../../../config/appConfig';\r\nimport { hasMostlyHiveNfts } from '../../subComponents/utils/requiredNfts';\r\nimport { countCharsToPayFor } from '../../subComponents/utils/countChars';\r\nimport './ResourcesPayment.scss';\r\nimport { setNewPaidResource } from '../../../../reducers/MarsStorage';\r\nimport { windowSetChecksum } from '../../../../generalUtils/secure/checksums';\r\nimport { IS_PVP_ALPHA_FREE_TRAVELS } from '../../../../config/featureFlags';\r\n\r\nconst { SPACESHIPS, BOARDING_PASSES } = ITEMS_BY_CATEGORY;\r\n\r\nconst checkResources = ({ type, waxNfts = [] }) => {\r\n let shouldPay = true && !(isLocal && window.skipPayment);\r\n let discount;\r\n if (type === 'food') {\r\n const has50foodDiscount = getNftCount({ nfts: waxNfts, id: BOARDING_PASSES.FD5.ID });\r\n if (has50foodDiscount) {\r\n discount = 0.5; // 50 % discount\r\n }\r\n const has90foodDiscount = getNftCount({ nfts: waxNfts, id: BOARDING_PASSES.FD9.ID });\r\n if (has90foodDiscount) {\r\n discount = 0.1; // 90 % discount\r\n }\r\n }\r\n return ({ shouldPay, discount });\r\n}\r\n\r\n\r\nconst defaultStatsNoCheat = { levelX: { totalKills: FREE_RESOURCES_FOR_KILLS + 1 } };\r\n\r\nconst getKillsSum = ({ gameStats = defaultStatsNoCheat }) => {\r\n try {\r\n const totPlayerKills = Object.values(gameStats).map(el => el.totalKills)\r\n .filter(count => count > 0)\r\n .reduce((partialSum, num) => partialSum + num, 0);\r\n return totPlayerKills;\r\n } catch (err) {\r\n console.error('Caught in getKillsSum:', err);\r\n return FREE_RESOURCES_FOR_KILLS + 1;\r\n }\r\n};\r\n\r\n\r\nconst checkTravelRequirements = ({\r\n waxNfts = [], hiveNfts = [], gameStats /*no-default*/, canSkipPaymentsPvpAlpha,\r\n}) => {\r\n const kills = getKillsSum({ gameStats });\r\n const isNewbie = kills < FREE_RESOURCES_FOR_KILLS;\r\n\r\n const mostlyHiveNfts = hasMostlyHiveNfts({ hiveNfts, waxNfts });\r\n\r\n const isGasSpaceshipOwner = getNftCount({ nfts: waxNfts, id: SPACESHIPS.COR.ID });\r\n const hasGasPass = getNftCount({ nfts: waxNfts, id: BOARDING_PASSES.COR.ID });\r\n const canSkipGas = isNewbie || isGasSpaceshipOwner || hasGasPass || mostlyHiveNfts || canSkipPaymentsPvpAlpha;\r\n \r\n const isFoodMachineOwner = false; // @@ ADD FOOD MACHINE OWNER\r\n const canSkipFood = isNewbie || isFoodMachineOwner || mostlyHiveNfts || canSkipPaymentsPvpAlpha;\r\n\r\n const has50foodDiscount = getNftCount({ nfts: waxNfts, id: BOARDING_PASSES.FD5.ID });\r\n const has90foodDiscount = getNftCount({ nfts: waxNfts, id: BOARDING_PASSES.FD9.ID });\r\n const hasFoodDiscount = has50foodDiscount || has90foodDiscount;\r\n\r\n isLocal && console.debug('Can skip resources paym?', {\r\n canSkipGas: { value: canSkipGas, isNewbie, isGasSpaceshipOwner, hasGasPass, mostlyHiveNfts },\r\n canSkipFood: { value: canSkipFood, isNewbie, isFoodMachineOwner, mostlyHiveNfts },\r\n newbie: { kills, gameStats },\r\n });\r\n return ({ canSkipGas, canSkipFood, hasFoodDiscount, mostlyHiveNfts });\r\n};\r\n\r\nexport const ResourcesPayment = ({ showResourcesPage, setShouldAutoPlay }) => {\r\n const PlayState = useSelector((store) => store.play);\r\n const WalletState = useSelector((store) => store.wallet);\r\n const foodBalance = get(WalletState, 'tokens.food');\r\n const gasBalance = get(WalletState, 'tokens.gas');\r\n\r\n const StorageState = useSelector((store) => store.marsStorage);\r\n const { resourcesPaid = [], storageType } = StorageState;\r\n const subAlreadyPaidFood = !!resourcesPaid.find(\r\n paidObj => paidObj.type === 'meal',\r\n );\r\n const subAlreadyPaidGas = !!resourcesPaid.find(\r\n paidObj => paidObj.type === 'travel' && paidObj.toLevel === 0,\r\n );\r\n\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const waxNfts = get(InventoryState, 'csAssets.csNfts', []);\r\n const hiveNfts = get(InventoryState, 'hive.nfts', []);\r\n const isScholar = get(InventoryState, 'scholarship.isScholar', false);\r\n const gameStats = get(PlayState, 'wrapperData.apiResponse.gameStats');\r\n\r\n const isPvp = get(PlayState, 'isPvpGameMode');\r\n const canSkipPaymentsPvpAlpha = IS_PVP_ALPHA_FREE_TRAVELS && isPvp;\r\n\r\n const charactersToPay = countCharsToPayFor({ isScholar, waxNfts, hiveNfts });\r\n\r\n const inTravelToZero = PlayState.isTravellingToZero;\r\n const activeLevel = PlayState.activeLevel;\r\n\r\n const { canSkipGas, canSkipFood, hasFoodDiscount, mostlyHiveNfts } = checkTravelRequirements({\r\n waxNfts, hiveNfts, gameStats, canSkipPaymentsPvpAlpha,\r\n });\r\n const showMustPayWarning = waxNfts.length > 0 && hiveNfts.length > 0 && !mostlyHiveNfts;\r\n\r\n const [paidFood, setPaidFood] = useState(false);\r\n const [paidFuel, setPaidFuel] = useState(false);\r\n\r\n const closeAfterPayment = () => {\r\n isTestnet && console.log('============== Closing overlay after payment or trip');\r\n try {\r\n storeAppDispatch(setPaidResources({ paidResources: true }));\r\n uiHacks.disableClaimAndPlayBtnsAtFirst({ claimOnly: true });\r\n storeAppDispatch(resetLastMatch());\r\n } catch (err) { console.error('caught-res-paym:', err); }\r\n showResourcesPage(false);\r\n };\r\n\r\n const showShortTravelPage = async () => {\r\n storeAppDispatch(setFirstLevTravel({ isTravellingToZero: true }));\r\n await spaceshipTimer({\r\n travelDurationMs: isTestnet ? (10 * 1000) : LEVEL_ZERO_TRAVEL_DURATION,\r\n unityLoad: false,\r\n });\r\n storeAppDispatch(setFirstLevTravel({ isTravellingToZero: false }));\r\n setShouldAutoPlay(true);\r\n };\r\n\r\n const skipPayments = async () => {\r\n // adjust rewards\r\n window.skippedResourcesPaym = true;\r\n windowSetChecksum({ key: 'skippedResourcesPaym', value: true });\r\n const originaValue = window.skippedResourcesPaym; // freeze:\r\n try {\r\n Object.defineProperty(window, 'skippedResourcesPaym', { value: originaValue, writable: false });\r\n } catch (_) {}\r\n await showShortTravelPage(); \r\n closeAfterPayment();\r\n };\r\n\r\n useEffect( () => {\r\n const dismissIfResourcesPaid = async () => {\r\n if (paidFuel && paidFood) {\r\n isLocal && console.debug('Both food and gas paid (or both skipped). Dismissing after delay.');\r\n await showShortTravelPage(); \r\n closeAfterPayment();\r\n }\r\n };\r\n dismissIfResourcesPaid();\r\n }, [paidFuel, paidFood]);\r\n\r\n const payFood = async () => {\r\n const { shouldPay, discount } = checkResources({ type: 'food', waxNfts });\r\n if (!canSkipFood && !subAlreadyPaidFood && shouldPay) {\r\n const characters = discount ? (charactersToPay * discount) : charactersToPay;\r\n const { err } = await sendFoodPayment({ charactersToPay: characters, activeLevel, storageType });\r\n if (err) return;\r\n storeAppDispatch(setNewPaidResource({ paidResource: { type: 'meal' } }));\r\n }\r\n setPaidFood(true);\r\n };\r\n\r\n const payGas = async () => {\r\n const { shouldPay } = checkResources({ type: 'gas' });\r\n if (!canSkipGas && !subAlreadyPaidGas && shouldPay) {\r\n const { err } = await payForSpaceshipTravel({\r\n spaceshipId: 0, currency: 'G', charactersCount: charactersToPay, activeLevel\r\n });\r\n if (err) return;\r\n }\r\n setPaidFuel(true);\r\n };\r\n\r\n return (\r\n

\r\n
\r\n {inTravelToZero\r\n ?
\r\n \r\n \"map\"

\r\n
\r\n

Time to your destination: 00:00:00

\r\n
\r\n :
\r\n showResourcesPage(false)}\r\n style={{\r\n color: 'white', padding: '3px', backgroundColor: 'rgba(100,100,100,0.8)',\r\n zIndex: 2000, float: 'left',\r\n marginLeft: '-30px', marginTop: '5px',\r\n width: '40px', height: '47px', outline: 'none', border: 'none',\r\n }}\r\n >X\r\n
\r\n
\r\n CREW PREP and TRAVEL TO THE 1st LEVEL\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n

CREW \r\n MEAL\r\n

\r\n
\r\n

\r\n Meal cost per character: {RESOURCES_PRICES.FOOD}\r\n

\r\n
\r\n
\r\n

\r\n Characters to feed: {charactersToPay}  \r\n {isScholar && (double for scholars)}\r\n
Payment due: {charactersToPay * RESOURCES_PRICES.FOOD} $FOOD{\r\n hasFoodDiscount ?   *minus DISCOUNT! : ''\r\n }\r\n

\r\n {paidFood\r\n ?

Yummy! Ready to pew pew!

\r\n : \r\n \r\n {(!canSkipFood && !subAlreadyPaidFood)\r\n ? FEED TEAM\r\n : FREE FOR YOU!\r\n }\r\n \r\n }\r\n {foodBalance !== undefined &&


Your balance: {foodBalance} $FOOD

}\r\n {(!canSkipFood && !subAlreadyPaidFood) &&

\r\n BUY FOOD on Alcor\r\n
with $BOOM\r\n

}\r\n
\r\n \r\n

+

\r\n
\r\n
\r\n
\r\n \r\n
\r\n

Cordoba, \r\n \r\n Level-0 Spaceship\r\n \r\n

\r\n
\r\n

\r\n Travel cost per character: {RESOURCES_PRICES.GAS}\r\n

\r\n
\r\n

\r\n Characters to carry: {charactersToPay}  \r\n {isScholar && (double for scholars)}\r\n
Payment due: {charactersToPay * RESOURCES_PRICES.GAS} $GAS\r\n

\r\n {paidFuel\r\n ?

To the moon!!

\r\n : \r\n {(!canSkipGas && !subAlreadyPaidGas)\r\n ? FILL TANK\r\n : FREE FOR YOU!\r\n }\r\n \r\n }\r\n {gasBalance !== undefined &&


Your balance: {gasBalance} $GAS

}\r\n {(!canSkipGas && !subAlreadyPaidGas) &&

\r\n BUY GAS on Alcor\r\n
with $BOOM\r\n

}\r\n
\r\n
\r\n {showMustPayWarning &&
\r\n

\r\n You need at least {\r\n RATIO_FOR_MOSTLY_HIVE_NFTS * 100\r\n }% Hive NFTs to skip spaceship fees - offer valid until spaceships are live on Hive too\r\n

\r\n
}\r\n
\r\n {(paidFuel && paidFood)\r\n ?

(( HYPERDRIVE IN PROGRESS... ))

\r\n : <>\r\n {!(canSkipFood && canSkipGas) &&
\r\n          \r\n
\r\n
\r\n OR..  \r\n \r\n SKIP PAYMENTS and earn
only 10% igBOOM\r\n \r\n
\r\n
\r\n

\r\n TRAVEL TIME: no wait
\r\n FREE TRAVEL TO ALL LEVELS
\r\n MAX REWARD: 62 igBOOM\r\n

\r\n
\r\n
\r\n
\r\n
}\r\n \r\n }\r\n
\r\n
\r\n
\r\n }\r\n
\r\n \r\n );\r\n};\r\n","import { isLocal, isTestnet } from '../../../../constants/envs';\r\nimport { ITEMS_BY_CATEGORY } from '../../../../constants/templateIds';\r\nimport { freeTrippers } from './constants';\r\n\r\n\r\nconst { BOARDING_PASSES, SPACESHIPS } = ITEMS_BY_CATEGORY;\r\nconst {\r\n SEQ, EXE, FIR, // L1\r\n GEN: GENP, ART, EXA, // L2\r\n} = BOARDING_PASSES;\r\nconst {\r\n FLW, FRW, FRA, FCR, FFU, FEN, ERA, ELW, ERW, ECR, EFU, EEN, ESE, // L1\r\n EXRA, EXLW, EXRW, EXCR, EXFU, EXEN, // L2 (Exarch) - ss1\r\n ARA, ALW, ARW, ACR, AFU, AEN, // L2 (Arthas) - ss2\r\n GLW, GRW, GFU, GCR, GRA, GEN, // L2 (Genesis) - ss3\r\n} = SPACESHIPS;\r\n\r\n\r\nlet freeTravelsCache = {\r\n L1: {},\r\n L2: {},\r\n L3: { freeSs1: false, freeSs2: false, freeSs3: false },\r\n};\r\n\r\nconst checkSpaceshipPasses = ({ nfts, travelingTo }) => {\r\n let hasSs1Pass, hasSs2Pass, hasSs3Pass;\r\n switch (travelingTo) {\r\n case 1: {\r\n hasSs1Pass = nfts.filter(nft => nft.template_id === SEQ.ID).length;\r\n hasSs2Pass = nfts.filter(nft => nft.template_id === EXE.ID).length;\r\n hasSs3Pass = isTestnet ? true : nfts.filter(nft => nft.template_id === FIR.ID).length;\r\n break;\r\n }\r\n case 2: {\r\n hasSs1Pass = nfts.filter(nft => nft.template_id === EXA.ID).length;\r\n hasSs2Pass = nfts.filter(nft => nft.template_id === ART.ID).length;\r\n hasSs3Pass = isTestnet ? true : nfts.filter(nft => nft.template_id === GENP.ID).length;\r\n break;\r\n }\r\n case 3: { isLocal && console.debug('Ignored pass check to L3 - button not available anyway'); break; }\r\n default: { throw new Error(`check pass for unexpected level ${travelingTo}`); }\r\n }\r\n isLocal && console.debug('Has passes:', { hasSs1Pass, hasSs2Pass, hasSs3Pass });\r\n return ({ hasSs1Pass, hasSs2Pass, hasSs3Pass });\r\n};\r\n\r\nconst checkSpaceshipPartOwnership = ({ nfts, travelingTo }) => {\r\n let hasSs1FullSpaceship, hasSs1Left, hasSs1Right, hasSs1Radar, hasSs1Contr, hasSs1Fuse, hasSs1Engine,\r\n hasSs2Right, hasSs2Left, hasSs2Radar, hasSs2Contr, hasSs2Fuse, hasSs2Engine,\r\n hasSs3Left, hasSs3Right, hasSs3Radar, hasSs3Contr, hasSs3Fuse, hasSs3Engine;\r\n switch (travelingTo) {\r\n case 1: {\r\n hasSs1FullSpaceship = /*isTestnet ? true :*/ nfts.filter(nft => nft.template_id === ESE.ID).length;\r\n hasSs2Right = nfts.filter(nft => nft.template_id === ERA.ID).length;\r\n hasSs2Left = nfts.filter(nft => nft.template_id === ELW.ID).length;\r\n hasSs2Radar = nfts.filter(nft => nft.template_id === ERW.ID).length;\r\n hasSs2Contr = nfts.filter(nft => nft.template_id === ECR.ID).length;\r\n hasSs2Fuse = nfts.filter(nft => nft.template_id === EFU.ID).length;\r\n hasSs2Engine = nfts.filter(nft => nft.template_id === EEN.ID).length;\r\n hasSs3Left = nfts.filter(nft => nft.template_id === FLW.ID).length;\r\n hasSs3Right = nfts.filter(nft => nft.template_id === FRW.ID).length;\r\n hasSs3Radar = nfts.filter(nft => nft.template_id === FRA.ID).length;\r\n hasSs3Contr = nfts.filter(nft => nft.template_id === FCR.ID).length;\r\n hasSs3Fuse = nfts.filter(nft => nft.template_id === FFU.ID).length;\r\n hasSs3Engine = nfts.filter(nft => nft.template_id === FEN.ID).length;\r\n break;\r\n }\r\n case 2: {\r\n hasSs1Left = nfts.filter(nft => nft.template_id === EXRA.ID).length;\r\n hasSs1Right = nfts.filter(nft => nft.template_id === EXLW.ID).length;\r\n hasSs1Radar = nfts.filter(nft => nft.template_id === EXRW.ID).length;\r\n hasSs1Contr = nfts.filter(nft => nft.template_id === EXCR.ID).length;\r\n hasSs1Fuse = nfts.filter(nft => nft.template_id === EXFU.ID).length;\r\n hasSs1Engine = nfts.filter(nft => nft.template_id === EXEN.ID).length;\r\n hasSs2Right = nfts.filter(nft => nft.template_id === ARA.ID).length;\r\n hasSs2Left = nfts.filter(nft => nft.template_id === ALW.ID).length;\r\n hasSs2Radar = nfts.filter(nft => nft.template_id === ARW.ID).length;\r\n hasSs2Contr = nfts.filter(nft => nft.template_id === ACR.ID).length;\r\n hasSs2Fuse = nfts.filter(nft => nft.template_id === AFU.ID).length;\r\n hasSs2Engine = nfts.filter(nft => nft.template_id === AEN.ID).length;\r\n hasSs3Left = /*isTestnet ? true :*/ nfts.filter(nft => nft.template_id === GLW.ID).length;\r\n hasSs3Right = nfts.filter(nft => nft.template_id === GRW.ID).length;\r\n hasSs3Radar = nfts.filter(nft => nft.template_id === GFU.ID).length;\r\n hasSs3Contr = nfts.filter(nft => nft.template_id === GCR.ID).length;\r\n hasSs3Fuse = nfts.filter(nft => nft.template_id === GRA.ID).length;\r\n hasSs3Engine = nfts.filter(nft => nft.template_id === GEN.ID).length;\r\n break;\r\n }\r\n case 3: { isLocal && console.debug('Ignored ownership check for L3 - button not available anyway'); break; }\r\n default: { throw new Error(`check wwnership for unexpected level ${travelingTo}`); }\r\n }\r\n const hasSs1Part = hasSs1FullSpaceship\r\n || hasSs1Right || hasSs1Left || hasSs1Radar\r\n || hasSs1Contr || hasSs1Fuse || hasSs1Engine;\r\n const hasSs2Part = hasSs2Right || hasSs2Left || hasSs2Radar\r\n || hasSs2Contr || hasSs2Fuse || hasSs2Engine;\r\n const hasSs3Part = hasSs3Left || hasSs3Right || hasSs3Radar\r\n || hasSs3Contr || hasSs3Fuse || hasSs3Engine;\r\n isLocal && console.debug('Spaceships ownership:', { hasSs1Part, hasSs2Part, hasSs3Part });\r\n return ({ hasSs1Part, hasSs2Part, hasSs3Part });\r\n};\r\n\r\n// Used for all levels above 0. The latter uses ResourcesPayment.jsx.\r\nexport const checkSpaceshipPassOrOwner = ({ nfts = [], user, travelingTo }) => {\r\n try {\r\n // -- use cache\r\n const levelSpecificTravelCache = freeTravelsCache[`L${travelingTo}`];\r\n if (Object.keys(levelSpecificTravelCache) > 0) return levelSpecificTravelCache;\r\n // -- vs calc and fill cache\r\n let freeSs1, freeSs2, freeSs3;\r\n // PASSES\r\n const { hasSs1Pass, hasSs2Pass, hasSs3Pass } = checkSpaceshipPasses({ nfts, travelingTo });\r\n // OWNERS\r\n const { hasSs1Part, hasSs2Part, hasSs3Part } = checkSpaceshipPartOwnership({ nfts, travelingTo });\r\n // checks\r\n freeSs1 = isLocal ? false : (hasSs1Pass || hasSs1Part);\r\n freeSs2 = isLocal ? false : (hasSs2Pass || hasSs2Part);\r\n const isWhitelisted = freeTrippers.includes(user);\r\n freeSs3 = isLocal ? false : (hasSs3Pass || hasSs3Part || isWhitelisted);\r\n // cache\r\n if (freeSs1 || freeSs2 || freeSs3) {\r\n freeTravelsCache[`L${travelingTo}`] = { freeSs1, freeSs2, freeSs3 };\r\n }\r\n isLocal && console.debug('Spaceships free usage:', { freeSs1, freeSs2, freeSs3, isWhitelisted, freeTravelsCache });\r\n return ({ freeSs1, freeSs2, freeSs3 });\r\n } catch (err) {\r\n console.error('Check spaceship pass or owner broke:', err);\r\n return ({});\r\n }\r\n};\r\n","import { isLocal } from '../../../../constants/envs';\r\nimport { freeTrippers } from \"./constants\";\r\nimport { getNftCount } from '../../../../generalUtils/utils';\r\nimport { ITEMS_BY_CATEGORY } from '../../../../constants/templateIds';\r\nimport { HIVE_TEMPLATES } from '../../../../constants/hiveNfts';\r\n\r\n\r\nconst MIN_CHARS_NEW_LEVEL = 2;\r\n\r\nconst countNextLevChars = ({ user, waxNfts, hiveNfts, travelingTo }) => {\r\n if (freeTrippers.includes(user)) return true;\r\n switch (travelingTo) {\r\n case 1: {\r\n const lev1Chars = 0\r\n // wax\r\n + getNftCount({ nfts: waxNfts, id: ITEMS_BY_CATEGORY.CHARACTERS.IV.ID })\r\n + getNftCount({ nfts: waxNfts, id: ITEMS_BY_CATEGORY.CHARACTERS.MI.ID })\r\n // hive\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.IVAN_BARRICK.name })\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.MINTA_HANI.name });\r\n return lev1Chars >= MIN_CHARS_NEW_LEVEL;\r\n }\r\n case 2: {\r\n const lev2Chars = 0\r\n // wax\r\n + getNftCount({ nfts: waxNfts, id: ITEMS_BY_CATEGORY.CHARACTERS.LEX.ID })\r\n + getNftCount({ nfts: waxNfts, id: ITEMS_BY_CATEGORY.CHARACTERS.EVE.ID })\r\n // hive\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.LEXI_CAYNE.name })\r\n + getNftCount({ hiveNfts, name: HIVE_TEMPLATES.EVELYN_MOORE.name });\r\n return lev2Chars >= MIN_CHARS_NEW_LEVEL;\r\n }\r\n case 3: { isLocal && console.debug('Ignored characters check for L3 - button not available anyway'); break; }\r\n default: { throw new Error(`Unexpected level ${travelingTo} in countNextLevChars`); }\r\n }\r\n};\r\n\r\n\r\nconst wonCurrentLevel = ({ user, travelingTo, sessionData }) => {\r\n if (freeTrippers.includes(user)) return true;\r\n const sessionUnlockedLev = sessionData.currentUnlockedLev;\r\n return sessionUnlockedLev === travelingTo;\r\n};\r\n\r\n\r\nconst checkHasCurrentEolNft = ({ nfts, travelingTo }) => {\r\n // TEMP @@\r\n // TEMP @@\r\n return true;\r\n};\r\n\r\n\r\nexport const checkNextLevRequirements = ({\r\n waxNfts, hiveNfts, travelingTo, user, sessionData,\r\n}) => {\r\n try {\r\n const hasEnoughNextLevCharacters = countNextLevChars({ user, waxNfts, hiveNfts, travelingTo });\r\n const wonCurrentLev = wonCurrentLevel({ user, travelingTo, sessionData });\r\n const hasEolNft = checkHasCurrentEolNft({ nfts: waxNfts, travelingTo });\r\n isLocal && console.log('Next level travel reqs:', { hasEnoughNextLevCharacters, wonCurrentLev, hasEolNft });\r\n return ({ hasEnoughNextLevCharacters, wonCurrentLev, hasEolNft });\r\n } catch (err) {\r\n console.error('Check next lev requirements broke:', err);\r\n return ({});\r\n }\r\n};\r\n","import { DAYS } from '../../../../../generalUtils/constants';\r\nimport { HOURS, MINUTES } from '../constants';\r\nimport { getTravelDuration } from '../travels';\r\n\r\n\r\nconst prepDurationDisplay = ({ spaceshipId, travellingTo }) => {\r\n const value = getTravelDuration({ spaceshipId, travellingTo });\r\n if (value === 0) return 'no wait';\r\n if (value < HOURS) return `${value / MINUTES} minutes`;\r\n if (value < DAYS) return `${value / HOURS} hour`;\r\n};\r\n\r\n\r\nexport const SS_INFO = {\r\n TO_L0: {\r\n NAME: 'Airbus', ENGINE: 'Antimatter reactors',\r\n SRC: 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23tRtN5H6gYHm4RhxyZ6DXsRKvB9yB3FP9TEyB7TKP75PrzUAL8CcAGhBgo8yz2F7bdun.gif',\r\n DURATION: `no wait`, // no wait\r\n },\r\n TO_L1: [\r\n {\r\n NAME: 'Sequeira', ENGINE: 'Magneto-inertial fusion engine',\r\n SRC: 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23wMMuVgkyFwTJDE53byinnZe931ZKT2kVhLNTr7iyT65Eden15pGhjJE3bFKqEcFqsMc.gif',\r\n DURATION: `${prepDurationDisplay({ spaceshipId: 1, travellingTo: 1 })}`, // 1 h\r\n },\r\n {\r\n NAME: 'Exeter', ENGINE: 'Holtzman Engines',\r\n SRC: 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23wWpjqY9LGEsybVpBBMmefrerors9unJ4XHYYf4nevy2CKLGYh3grYADJ7Wi38z37epV.gif',\r\n DURATION: `${prepDurationDisplay({ spaceshipId: 2, travellingTo: 1 })}`, // 15 min\r\n },\r\n {\r\n NAME: 'Firefly', ENGINE: 'Quantum Engines',\r\n SRC: 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23wg923VWUe5sia5MP4fP8RgspfQwA1uvYiy8N9Fs5bC54nFC325LQJe6ir3HfPkpeZMR.gif',\r\n DURATION: `${prepDurationDisplay({ spaceshipId: 3, travellingTo: 1 })}`, // no wait\r\n },\r\n ],\r\n TO_L2: [\r\n {\r\n NAME: 'Exarch', ENGINE: 'Ion Engine',\r\n SRC: 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23t74ZLNca3SJajHtuyyXhowMQjjQ9SzitH7upwMw6DLzQYhhEwfYR2FN73feiurtfWmR.gif',\r\n DURATION: `${prepDurationDisplay({ spaceshipId: 1, travellingTo: 2 })}`, // 1 h\r\n },\r\n {\r\n NAME: 'Arthas', ENGINE: 'Lightspeed Engines',\r\n SRC: 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23t77KoqkPxyN9Rn6u6YeYi9n8U697qw3dXmw97ZhwErLcNTWrFPv6z2pgC2wDfXWzMR2.gif',\r\n DURATION: `${prepDurationDisplay({ spaceshipId: 2, travellingTo: 2 })}`, // 15 min\r\n },\r\n {\r\n NAME: 'Genesis', ENGINE: 'Warp Engines',\r\n SRC: 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23t773NYK47k1FioLTPfYPjtaTB89dz5JNC4zpCwY3T7DfHLaffkawtK1xEpW6TTz8srg.gif',\r\n DURATION: `${prepDurationDisplay({ spaceshipId: 3, travellingTo: 2 })}`, // no wait\r\n },\r\n ],\r\n TO_L3: [],\r\n};\r\n","import { get } from 'lodash';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { isLocal } from '../../../../../constants/envs';\r\nimport { hasMostlyHiveNfts } from '../../utils/requiredNfts';\r\nimport { SS_PRICES } from \"../travelPrices\";\r\nimport { getFormattedPrice } from '../travels';\r\nimport { SS_INFO } from './spaceshipsInfo';\r\n\r\n\r\nconst getSpaceshipInfo = ({ spaceshipId, destinationLevel, charactersCount }) => {\r\n try {\r\n isLocal && console.debug('Getting spaceship info:', { spaceshipId, destinationLevel, charactersCount, SS_INFO });\r\n const currentSsInfo = SS_INFO[`TO_L${destinationLevel}`][spaceshipId - 1];\r\n if (!currentSsInfo) return ({});\r\n const { SRC: imgSrc, NAME: spaceshipName, DURATION: travelDuration, ENGINE: engineType } = currentSsInfo;\r\n \r\n const index = spaceshipId + ((destinationLevel - 1) * 3); // L1: 1,2,3 -- L2: 1+3,2+3,3+3 -- L3: 1+6,2+6,3+6\r\n const ssCurrencies = SS_PRICES[`SS${index}`]; // . B/F/M/G, W\r\n const { W: waxAmount, ...rest } = ssCurrencies;\r\n const [abbr, ourToken] = Object.entries(rest)[0]; // { inWax: 1, abbr: 'H', ourToken: 2 }\r\n const waxFormattedPrice = getFormattedPrice({ currency: 'W', price: waxAmount, forUI: true });\r\n const ourTokenFormattedPrice = getFormattedPrice({ currency: abbr, price: ourToken, charactersCount, forUI: true });\r\n return ({\r\n imgSrc, spaceshipName, travelDuration, engineType,\r\n travelCost: { ourTokenFormattedPrice, ourTokenInitial: abbr, waxFormattedPrice },\r\n });\r\n } catch (err) {\r\n console.error('Get spaceship info broke:', err);\r\n return ({});\r\n }\r\n};\r\n\r\nconst SpaceshipListing = ({\r\n spaceshipId, destinationLevel,\r\n canUnlockNextLevel, charactersCount, freebies, bookTravel,\r\n} = {}) => {\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const waxNfts = get(InventoryState, 'csAssets.csNfts', []);\r\n const hiveNfts = get(InventoryState, 'hive.nfts', []);\r\n const isMostlyHive = hasMostlyHiveNfts({ hiveNfts, waxNfts });\r\n \r\n const isFree = freebies[`freeSs${spaceshipId}`] || isMostlyHive;\r\n const {\r\n spaceshipName, imgSrc, travelDuration, engineType, travelCost = {},\r\n } = getSpaceshipInfo({ spaceshipId, destinationLevel, charactersCount });\r\n if (!spaceshipName) return null;\r\n\r\n return (\r\n
\r\n {`${spaceshipName}\r\n
\r\n

{spaceshipName}  \r\n \r\n (parts owned by players)\r\n

\r\n

Travel duration: {travelDuration}

\r\n

{engineType}

\r\n
\r\n {(!canUnlockNextLevel || !!window.freeShip)\r\n ? null\r\n : <>\r\n {!isFree && bookTravel({ spaceshipId, currency: travelCost.ourTokenInitial })}\r\n >\r\n {travelCost.ourTokenFormattedPrice}\r\n \r\n }\r\n \r\n {(!isFree && travelCost.ourTokenInitial === 'G') &&
\r\n       [ {charactersCount} characters ]\r\n
}\r\n {!isFree &&

or GET A LIFETIME PASS NFT

}\r\n \r\n }\r\n
\r\n );\r\n};\r\n\r\nexport const ThreeSpaceships = ({\r\n bookTravel, canUnlockNextLevel,\r\n charactersCount, freeSs1, freeSs2, freeSs3\r\n}) => {\r\n const PlayState = useSelector((store) => store.play);\r\n const destinationLevel = PlayState.activeLevel + 1;\r\n if (!destinationLevel) return null;\r\n const freebies = { freeSs1, freeSs2, freeSs3 };\r\n const allSpaceshipsProps = { destinationLevel, canUnlockNextLevel, charactersCount, freebies, bookTravel };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { get, invoke } from 'lodash';\r\nimport { storeAppDispatch } from '../../../../../GlobalState/Store';\r\nimport { UserService } from '../../../../../services/UserService';\r\nimport { isLocal } from '../../../../../constants/envs';\r\nimport { useSelector } from 'react-redux';\r\nimport { resetLastMatch, setActiveLevel, setInTravel } from '../../../../../reducers/PlayReducer';\r\nimport { nap } from '../../../../../generalUtils/utils';\r\nimport { getTravelDuration, payForSpaceshipTravel, spaceshipTimer } from '../travels';\r\nimport { checkSpaceshipPassOrOwner } from '../freeTravels';\r\nimport { hasImmutableValueOf } from '../../../../../generalUtils/secure';\r\nimport { uiHacks } from '../../../../../generalUtils/uiHacks/uiHacks';\r\nimport { Animated } from 'react-animated-css';\r\nimport { mapSrc } from '../ui';\r\nimport { checkNextLevRequirements } from '../nextLevRequirements';\r\nimport { ThreeSpaceships } from './ThreeSpaceships';\r\nimport { countCharsToPayFor } from '../../utils/countChars';\r\nimport { SS_INFO } from './spaceshipsInfo';\r\nimport { setFreeSpaceshipUsage } from '../../../../../components/Menu/LeftMenu/storage/utils';\r\n\r\n\r\nexport const TravelSection = ({ travelPage, resetLevelChoice, inTravel }) => {\r\n const PlayState = useSelector((store) => store.play);\r\n const activeLevel = PlayState.activeLevel;\r\n // if (!travelPage) return null;\r\n\r\n const StorageState = useSelector((store) => store.marsStorage);\r\n const { storageType } = StorageState;\r\n\r\n return (\r\n
\r\n {/* IN TRAVEL */}\r\n {inTravel &&
\r\n \r\n \"map\"

\r\n \r\n

Time to your destination: 00:00:00

\r\n {!storageType && \r\n No travel insurance!👇 Get a $MARS subscription and chill.\r\n \r\n }\r\n
\r\n }\r\n {/* SPACESHIP CHOICE */}\r\n {!inTravel && }\r\n
\r\n );\r\n};\r\n\r\nconst SpaceTravelChoice = ({ travelPage, resetLevelChoice }) => {\r\n // play state\r\n const PlayState = useSelector((store) => store.play);\r\n const activeLevel = PlayState.activeLevel;\r\n const travelingTo = activeLevel + 1;\r\n\r\n // inventory\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const nfts = get(InventoryState, 'csAssets.csNfts', []);\r\n const hiveNfts = get(InventoryState, 'hive.nfts', []);\r\n const waxScholarshipData = get(InventoryState, 'scholarship', {});\r\n const { isScholar } = waxScholarshipData;\r\n\r\n // storage\r\n const StorageState = useSelector((store) => store.marsStorage);\r\n const { resourcesPaid = [], storageType } = StorageState;\r\n const subAlreadyPaidTripWithSs1 = !!resourcesPaid.find(\r\n paidObj => paidObj?.type === 'travel' && paidObj?.toLevel === (activeLevel + 1) && paidObj?.spaceshipId === 1\r\n );\r\n const subAlreadyPaidTripWithSs2 = !!resourcesPaid.find(\r\n paidObj => paidObj?.type === 'travel' && paidObj?.toLevel === (activeLevel + 1) && paidObj?.spaceshipId === 2\r\n );\r\n const subAlreadyPaidTripWithSs3 = !!resourcesPaid.find(\r\n paidObj => paidObj?.type === 'travel' && paidObj?.toLevel === (activeLevel + 1) && paidObj?.spaceshipId === 3\r\n );\r\n\r\n // freebies\r\n const { freeSs1: freeSs1Og, freeSs2: freeSs2Og, freeSs3: freeSs3Og } = checkSpaceshipPassOrOwner({\r\n nfts, user: UserService.authName, travelingTo,\r\n });\r\n const freeSs1 = freeSs1Og || subAlreadyPaidTripWithSs1 || window.skippedResourcesPaym;\r\n const freeSs2 = freeSs2Og || subAlreadyPaidTripWithSs2 || window.skippedResourcesPaym;\r\n const freeSs3 = freeSs3Og || subAlreadyPaidTripWithSs3 || window.skippedResourcesPaym;\r\n isLocal && console.debug('Free travels:', { freeSs1, freeSs2, freeSs3 }, { resourcesPaid });\r\n\r\n // requirements\r\n const previousLevel = Math.max(0, travelPage - 1);\r\n const { sessionData = {} } = PlayState.wrapperData;\r\n const { hasEnoughNextLevCharacters, wonCurrentLev, hasEolNft } = checkNextLevRequirements({\r\n waxNfts: nfts, hiveNfts, travelingTo, user: UserService.authName, sessionData,\r\n });\r\n const canUnlockNextLevel = isLocal || (hasEnoughNextLevCharacters && wonCurrentLev && hasEolNft);\r\n\r\n // spaceships info\r\n const charactersCount = countCharsToPayFor({ isScholar, waxNfts: nfts, hiveNfts });\r\n const { NAME: busName, ENGINE: busEngine, SRC: busSrc, DURATION: busDuration } = SS_INFO.TO_L0;\r\n\r\n\r\n const bookTravel = async ({ spaceshipId, currency, isMostlyHive }) => {\r\n try {\r\n // set half rewards if free\r\n if (spaceshipId === 0) {\r\n // - cond1: for following levels that re-use the free bus\r\n // - cond2: 90% fee for skipping food/gas takes precedence\r\n if (window.freeShip !== true && !window.skippedResourcesPaym) setFreeSpaceshipUsage();\r\n } else {\r\n const skippedPayments = hasImmutableValueOf({\r\n target: window, attribute: 'skippedResourcesPaym', matchValue: true,\r\n });\r\n const isThisTripFree = (spaceshipId === 1 && freeSs1) || (spaceshipId === 2 && freeSs2)\r\n || (spaceshipId === 3 && freeSs3) || skippedPayments || isMostlyHive;\r\n if (!isThisTripFree) {\r\n isLocal && console.debug('[l1-load] Asking for payment...');\r\n const { err } = await payForSpaceshipTravel({ spaceshipId, currency, charactersCount, activeLevel, storageType });\r\n if (err) return;\r\n }\r\n }\r\n // travelling\r\n const newState = { travelling: true };\r\n storeAppDispatch(setInTravel(newState));\r\n // start timer\r\n isLocal && console.debug('[l1-load] Starting travel timer...');\r\n const travelDuration = getTravelDuration({ spaceshipId, travelingTo });\r\n await spaceshipTimer({ travelDurationMs: travelDuration, unityLoad: true });\r\n // launch level-1 in unity\r\n isLocal && console.debug('[l1-load] Launching Unity...');\r\n invoke(window, 'loadUnity', { level: activeLevel + 1 });\r\n isLocal && console.debug('[l1-load] Unity launched.');\r\n // Show map + (loading..)\r\n // @@@\r\n await nap(10 * 1000);\r\n // Reset UI\r\n isLocal && console.debug('[l1-load] Updating Play page state: travel state, active level, last match, ..');\r\n storeAppDispatch(setInTravel({ travelling: false }));\r\n storeAppDispatch(setActiveLevel({ activeLevel: activeLevel + 1 }));\r\n resetLevelChoice(activeLevel + 1);\r\n storeAppDispatch(resetLastMatch());\r\n uiHacks.disableClaimAndPlayBtnsAtFirst({ claimOnly: true });\r\n } catch (err) {\r\n console.error('Book travel broke:', err);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n {/* TRAVEL CLOSE BTN */}\r\n resetLevelChoice(activeLevel)}\r\n style={{\r\n color: 'white', padding: '3px', backgroundColor: 'rgba(100,100,100,0.3)',\r\n borderBottomRightRadius: '20px', display: 'block',\r\n width: '35px', height: '35px', outline: 'none', border: 'none',\r\n }}\r\n >X\r\n
\r\n SPACESHIP TRAVEL FARES\r\n
\r\n {/* TRAVEL REQUIREMENTS */}\r\n
\r\n

Are you able to travel to LEVEL {travelPage}?

\r\n
    \r\n
  • You have the End-Of-Level {previousLevel} NFT? (won defeating all enemies on HARD) \r\n   {hasEolNft ? true : false} (temporarily always true)\r\n
  • \r\n
  • Completed Level-{previousLevel} on MEDIUM at least once in this session?   {wonCurrentLev ? true : false}
  • \r\n
  • You have at least 2x Level-{activeLevel + 1} characters?   {hasEnoughNextLevCharacters ? true : false}
  • \r\n
\r\n
\r\n {/* SPACESHIP PRICES AND TIMES */}\r\n
\r\n {/* FREE SPACESHIP */}\r\n
\r\n \"Free\r\n
\r\n

{busName}

\r\n

Travel duration: {busDuration}

\r\n {/*

propulsion engines

SPACESHIP CAPTAIN = LAND? :D */}\r\n

{busEngine}

\r\n
\r\n {canUnlockNextLevel && <>\r\n \r\n {!window.skippedResourcesPaym &&

\r\n {!window.freeShip\r\n ? ...but the spaceship captain keeps half
of all your NEW rewards!
\r\n : The captain is already keeping half rewards from your matches!\r\n }\r\n

}\r\n \r\n }\r\n
\r\n {/* NON-FREE SPACESHIPS */}\r\n \r\n
\r\n \r\n );\r\n};\r\n","\r\nexport const calcTotWins = ({ totalWins = {} }) => {\r\n try {\r\n return Object.values(totalWins)\r\n .filter(count => count > 0)\r\n .reduce((partialSum, num) => partialSum + num, 0);\r\n } catch (err) {\r\n console.error('Caught in calcTotWins:', err);\r\n }\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { STAKE_TO_CLAIM } from '../../config/appConfig';\r\nimport { isLocal } from '../../constants/envs';\r\nimport { calcTotWins } from './subComponents/claims/wrapperData/utils';\r\n\r\n\r\nconst showClean = (value) => {\r\n if (!value) return n/a;\r\n return value?.toFixed ? value.toFixed(3) : value;\r\n}\r\n\r\nconst toIsoDate = (dateNum) => new Date(dateNum).toISOString().split('T')[0];\r\n\r\nconst claimedToday = ({ amount, dateOfLastClaim }) => {\r\n if (!amount) return 0;\r\n const isSameDay = dateOfLastClaim === toIsoDate(Date.now());\r\n const result = isSameDay ? amount.toFixed(3) : 0;\r\n return result;\r\n};\r\n\r\nconst prepStakeToClaimMsg = ({ rank, savingsBoom }) => {\r\n try {\r\n const stakeToClaim = (rank - 1) * STAKE_TO_CLAIM;\r\n const s2cAmount = stakeToClaim > 0\r\n ? ((savingsBoom < stakeToClaim) ? {stakeToClaim} : stakeToClaim)\r\n : showClean(stakeToClaim);\r\n const s2cMsg = rank < 2\r\n ? \r\n    

0 for rank {rank}
players

\r\n
\r\n : s2cAmount;\r\n console.log('STYLE FIX:', stakeToClaim);\r\n const s2cStyle = isNaN(stakeToClaim) ? { marginTop: '-10px' } : { marginTop: '-25px' };\r\n return ({ s2cMsg, s2cStyle });\r\n } catch (err) {\r\n console.error('Caught in prepStakeToClaimMsg:', err);\r\n }\r\n};\r\n\r\n\r\nexport const PlayerStats = () => {\r\n const PlayState = useSelector((store) => store.play);\r\n const { sessionData = {}, gameData = {}, apiResponse = {} } = PlayState.wrapperData;\r\n isLocal && console.log('SESSION DATA:', { sessionData, apiResponse, gameData });\r\n const {\r\n playerLevel: rank, matchCount: sessionMatches, totalKills,\r\n totalWins, unlockedConsecutiveWins, unlockedFastKills,\r\n } = sessionData;\r\n const { taxApplied } = gameData?.rewards || {};\r\n const { joinDate, savings = {}, transactionStats = {} } = apiResponse;\r\n const { boom = {}, mars = {} } = savings;\r\n const { amount: savingsBoom, lastWithdrawTimestamp: lastWithBoom } = boom;\r\n const { amount: savingsMars, lastWithdrawTimestamp: lastWithMars } = mars;\r\n const {\r\n dateOfLastClaim,\r\n totBoomClaimed, totBoomClaimedForCurrentDay,\r\n totMarsClaimed, totMarsClaimedForCurrentDay,\r\n } = transactionStats;\r\n\r\n const totWins = calcTotWins({ totalWins });\r\n const percentWins = ((totWins / (sessionMatches || 1)) * 100).toFixed(2);\r\n const { s2cMsg, s2cStyle } = prepStakeToClaimMsg({ rank, savingsBoom });\r\n\r\n return (\r\n
\r\n

PVE   PLAYER STATS


\r\n
\r\n
\r\n {/* tech debt, dom api */}\r\n
\r\n

Total Kills:   n/a

\r\n

Rank:   n/a  

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Rank: {rank || n/a}

\r\n

Total Kills: {totalKills || n/a}

\r\n

TAX: {taxApplied || 0}%

\r\n

Joined: {joinDate ? {joinDate} : 'OG'}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Session Matches: {sessionMatches || 0}

\r\n

Session Wins: {totWins} ({percentWins} %)

\r\n

Consecutive L2 Wins: {unlockedConsecutiveWins ? 'yes' : 'no'}

\r\n

Fast Kills: {unlockedFastKills ? 'yes' : 'no'}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {/* deprecated, dom manipulation.. hidden now */}\r\n
\r\n

Tax on gaming rewards: n/a %

\r\n

igBOOM currently staked: n/a

\r\n

igBOOM claimed today: n/a

\r\n

Total igBOOM withdrawn: n/a

\r\n
\r\n\r\n
\r\n
\r\n

igBOOM currently staked: {showClean(savingsBoom)}\r\n {lastWithBoom && Last:
{toIsoDate(lastWithBoom)}
}
\r\n

\r\n

igMARS currently staked: {showClean(savingsMars )}\r\n {lastWithMars && Last:
{toIsoDate(lastWithMars)}
}
\r\n

\r\n

igBOOM to claim new rewards: {s2cMsg}

\r\n
\r\n
\r\n
\r\n
\r\n

Last token withdrawal: {showClean(dateOfLastClaim)}

\r\n

igBOOM claimed today: \r\n {claimedToday({ amount: totBoomClaimedForCurrentDay, dateOfLastClaim })}\r\n

\r\n

igBOOM withdrawn total: {showClean(totBoomClaimed)}

\r\n

igMARS claimed today: \r\n {claimedToday({ amount: totMarsClaimedForCurrentDay, dateOfLastClaim })}\r\n

\r\n

igMARS withdrawn total: {showClean(totMarsClaimed)}

\r\n
\r\n
\r\n
\r\n
\r\n  \r\n
\r\n );\r\n};\r\n","import { get } from 'lodash';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { isMainnet, isTestnet } from '../../../constants/envs';\r\n\r\n\r\nconst getUsernameLink = (username, chain) => {\r\n if (chain === 'hive') return `https://peakd.com/@${username}`;\r\n return isMainnet\r\n ? `https://wax.atomichub.io/profile/${username}`\r\n : `https://wax-test.atomichub.io/profile/${username}`;\r\n};\r\n\r\n\r\nexport const ScholarshipPane = () => {\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const waxScholarshipData = get(InventoryState, 'scholarship', {});\r\n const { hive = {}, csAssets = {} } = InventoryState;\r\n const { csNfts: waxNFts = [] } = csAssets;\r\n const { nfts: hiveNFts = [], username: hiveUsername, teacher: hiveTeacher } = hive;\r\n\r\n isTestnet && console.debug('Data received in ScholarshipPane component:', { waxScholarshipData, hiveUsername, hiveTeacher });\r\n const {\r\n isTeacher, scholarName, teacherCut, isScholar, teacherName, scholarCut,\r\n } = (waxScholarshipData || {});\r\n if (!isTeacher && !isScholar && !hiveTeacher) {\r\n return

\r\n Not a Scholarship account\r\n

;\r\n }\r\n const teacherPercentage = teacherCut || (100 - scholarCut);\r\n const scholarPercentage = scholarCut || (100 - teacherCut);\r\n return (

\r\n {isTeacher && Only your scholar {\r\n scholarName} can play with your inventory. You get {teacherPercentage}%.}\r\n {isScholar && You are playing with {\r\n teacherName}'s {waxNFts.length} NFTs and keeping {scholarPercentage}% of all the rewards.}\r\n {hiveTeacher &&

\r\n Hive Scholarship   ({hiveNFts.length} NFTs)\r\n
Scholar: @{hiveUsername}\r\n
Teacher: @{hiveTeacher}\r\n
}\r\n

);\r\n};\r\n","import Swal from 'sweetalert2';\r\nimport { isLocal } from '../../../../constants/envs';\r\n\r\n\r\nconst prepGameResultAndScore = ({ resMatch, score }) => {\r\n if (!resMatch || !score) return ({});\r\n let outcomeToDisplay = '';\r\n let boomToDisplay = 0;\r\n switch (resMatch) {\r\n case 'won': {\r\n outcomeToDisplay = 'YOU WON !!';\r\n boomToDisplay = score;\r\n break;\r\n }\r\n case 'validTimeout': {\r\n outcomeToDisplay = 'Timeout - 40% claim';\r\n boomToDisplay = +score * 40 / 100;\r\n break;\r\n }\r\n case 'invalidTimeout': {\r\n outcomeToDisplay = 'Timeout - no claim'; // should be 10 % per wp! @@@@@ --> backend change\r\n boomToDisplay = 0;\r\n break;\r\n }\r\n case 'lost': {\r\n outcomeToDisplay = 'You lost';\r\n boomToDisplay = score * 10 / 100;\r\n break;\r\n }\r\n default: { throw new Error(`Unexpected match result to display: ${resMatch}`); }\r\n }\r\n return ({ outcomeToDisplay, boomAmountToDisplay: boomToDisplay.toFixed(3) });\r\n};\r\n\r\n\r\nconst roundSum = (...args) => {\r\n let result = 0;\r\n args.forEach((num) => { result += num; });\r\n return +(result).toFixed(2);\r\n};\r\n\r\nconst formattedRewardsBreakdown = ({ gameData }) => {\r\n if (!gameData?.rewards) return null;\r\n const {\r\n levelKills, boostsTot, stakedNfts, weapons, tekno,\r\n difficultyAdjustment, taxApplied, finalEarnings,\r\n } = gameData?.rewards || {};\r\n if (!finalEarnings || finalEarnings === 0) return '';\r\n\r\n const boostsSum = roundSum(stakedNfts, weapons, tekno);\r\n const isBoostersBreakdownCorrect = (roundSum(boostsTot) === boostsSum);\r\n let earningsSum = levelKills + boostsTot + difficultyAdjustment + taxApplied;\r\n if (window.skippedResourcesPaym) {\r\n earningsSum /= 10;\r\n } else if (window.freeShip) {\r\n earningsSum /= 2;\r\n }\r\n const isTotalBreakdownCorrect = (roundSum(finalEarnings) === roundSum(earningsSum));\r\n if (isLocal && (!isBoostersBreakdownCorrect || !isTotalBreakdownCorrect)) {\r\n Swal.fire({\r\n text: `INCORRECT BREAKDOWN: ${JSON.stringify({\r\n cond1: { isBoostersBreakdownCorrect, boostsTot: roundSum(boostsTot), boostsSum },\r\n cond2: { isTotalBreakdownCorrect, finalEarnings: roundSum(finalEarnings), earningsSum },\r\n })}`\r\n })\r\n }\r\n isLocal && console.log('Rewards breakdown:', { rewards: gameData.rewards, boostsSum, earningsSum });\r\n\r\n return (\r\n
    \r\n
  • \r\n Level kills: {levelKills.toFixed(3)}\r\n
  • \r\n
  • \r\n Extra rewards: {boostsTot.toFixed(2)}
    \r\n \r\n ( {stakedNfts.toFixed(2)} boosters, {weapons.toFixed(2)\r\n } weapons, {tekno.toFixed(2)} tekno )\r\n \r\n
  • \r\n
  • \r\n Difficulty adjustment: {difficultyAdjustment.toFixed(3)}\r\n
  • \r\n {window.skippedResourcesPaym\r\n ?
  • -90 % for skipping $FOOD and $GAS payment
  • \r\n : (window.freeShip ?
  • -50 % for free spaceship use
  • : null)}\r\n
  • \r\n Taxes: {taxApplied.toFixed(3)}\r\n
  • \r\n
\r\n );\r\n};\r\n\r\n\r\nexport const prepLastMatchInfo = ({ sessionData, gameData }) => {\r\n try {\r\n const {\r\n resMatch, score, killBalance, remainingTime, difficulty,\r\n } = sessionData?.lastMatchInfo || {};\r\n isLocal && console.debug('Parsing last match data..',\r\n { resMatch, score, killBalance, remainingTime, difficulty });\r\n // result and score\r\n const { outcomeToDisplay, boomAmountToDisplay } = prepGameResultAndScore({ resMatch, score });\r\n // rewards\r\n const formattedRewards = formattedRewardsBreakdown({ gameData });\r\n // difficulty\r\n const difficultyTxt = +difficulty === 0\r\n ? 'EASY' : (+difficulty === 1 ? 'MEDIUM' : 'HARD');\r\n isLocal && console.debug('Updating UI with match result and score..', {\r\n outcomeToDisplay, boomAmountToDisplay, formattedRewards, difficultyTxt\r\n });\r\n // result \r\n return ({\r\n outcomeToDisplay, boomAmountToDisplay,\r\n killBalance, remainingTime, difficultyTxt, formattedRewards,\r\n });\r\n } catch (err) {\r\n console.error('Error prepping last match info:', err);\r\n }\r\n};\r\n\r\nexport const extractPlayedTime = ({ sessionData }) => {\r\n try {\r\n const { totTimeSinceMidnight } = sessionData?.lastMatchInfo || {};\r\n if (!totTimeSinceMidnight) return null;\r\n const minsPlayed = Math.ceil((+totTimeSinceMidnight / 1000) / 60);\r\n isLocal && console.debug('Mins played since midnight:', minsPlayed);\r\n return minsPlayed;\r\n } catch (err) {\r\n console.error('Error extracting played time:', err);\r\n }\r\n};\r\n","\r\nconst msToHMS = (ms) => {\r\n let h = ms / 3.6e6 | 0;\r\n let m = (ms % 3.6e6) / 6e4 | 0;\r\n let s = (ms % 6e4) / 1e3 | 0;\r\n // let ss = (ms % 1e3);\r\n // .${(''+ss).padStart(3, '0')}`;\r\n return `${h}:${('' + m).padStart(2, '0')}:${('' + s).padStart(2, '0')}`;\r\n};\r\n\r\nexport const timeToUTCMidnight = (d = new Date()) => msToHMS(\r\n new Date(d).setUTCHours(24, 0, 0, 0) - d,\r\n);\r\n","import React from 'react';\r\nimport { timeToUTCMidnight } from '../utils/time';\r\nimport { useSelector } from 'react-redux';\r\nimport { extractPlayedTime } from './prepLastMatchInfo';\r\n\r\n\r\nexport const PlayTime = () => {\r\n const PlayState = useSelector((store) => store.play);\r\n const { sessionData = {} } = PlayState.wrapperData;\r\n const minsPlayed = extractPlayedTime({ sessionData });\r\n const timeReset = timeToUTCMidnight();\r\n\r\n // if (!sessionData.matchCount) return null; // @@ @@\r\n return (\r\n
\r\n Played since midnight UTC: \r\n {!!minsPlayed\r\n ? {minsPlayed} minutes\r\n : n/a}\r\n \r\n \r\n {/* remove completely from DOM too @@ */}\r\n \r\n - Weapons:   n/a\r\n

\r\n

\r\n Time resets in: {timeReset}\r\n

\r\n
\r\n );\r\n};\r\n","import { consumeTourneyConfig } from \"../../pages/Play/subComponents/utils/requiredNFts/pvpRemoteConfig\";\r\n\r\nconst NO_BOTHER_MS = 10 * 60 * 1000; // 10 minutes in milliseconds\r\n\r\n\r\nconst canAskToJoinPvP = () => {\r\n const lastTimeAsked = localStorage.getItem('askedPvePlayerJoinF2e');\r\n if (!lastTimeAsked) {\r\n return true;\r\n }\r\n if ((Date.now() - parseInt(lastTimeAsked, 10)) >= NO_BOTHER_MS) {\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport const askPvePlayerJoinTourney = async ({ isPvp }) => {\r\n const { isPvpPassRequired = true } = await consumeTourneyConfig() || {};\r\n if (!isPvp && !isPvpPassRequired) {\r\n const canAsk = canAskToJoinPvP();\r\n if (canAsk) {\r\n localStorage.setItem('askedPvePlayerJoinF2e', Date.now());\r\n const ok = window.confirm('Free-To-Earn PVP Tournament in progress! Want to navigate to PVP to join?');\r\n if (ok) window.location.replace('/?pvp');\r\n }\r\n }\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { useSelector } from 'react-redux';\r\nimport { prepLastMatchInfo } from './prepLastMatchInfo';\r\nimport { PlayTime } from './PlayTime';\r\nimport { getPlayerUsername } from '../../../../generalUtils/utils';\r\nimport Swal from 'sweetalert2';\r\nimport { askPvePlayerJoinTourney } from '../../../../services/notifications/joinTourney';\r\n\r\nconst getGamingTokenName = ({ activeLevel }) => {\r\n switch (activeLevel) {\r\n case 0:\r\n case 1: return 'BOOM';\r\n case 2:\r\n case 3: return 'MARS';\r\n case 4: return 'PROX';\r\n default: break;\r\n }\r\n};\r\n\r\n// GAME ID to verify screenshots during contests.\r\nconst antiCheatId = ({ lastMatch = {}, uname }) => {\r\n const {\r\n // startTime, endTime, gameLevel, matchID,\r\n difficulty = 0, finalScore = {}, monthDay = '',\r\n } = lastMatch;\r\n isLocal && console.debug('calculating match uuid:', { lastMatch, uname });\r\n if (!monthDay) return '';\r\n try {\r\n const uuid = window.btoa(\r\n `${difficulty}-${finalScore?.reward.slice(0, 3)}-${\r\n uname.slice(0, 2)}-${monthDay}`\r\n .split('').reverse().join(''),\r\n ).replace(/=/g, '');\r\n return uuid;\r\n } catch (err) {\r\n console.error('broke generating anti-cheat match id', err);\r\n }\r\n};\r\n\r\n\r\nexport const MatchResults = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const PlayState = useSelector((store) => store.play);\r\n\r\n const activeLevel = PlayState.activeLevel;\r\n const { sessionData = {}, gameData = {}, apiResponse = {} } = PlayState.wrapperData;\r\n const { breakdownPerKill = {} } = gameData?.rewards || {};\r\n const { lastMatch = {} } = apiResponse;\r\n const {\r\n outcomeToDisplay, boomAmountToDisplay, killBalance, remainingTime, difficultyTxt, formattedRewards,\r\n // minsPlayed,\r\n } = prepLastMatchInfo({ sessionData, gameData });\r\n const rewardToken = getGamingTokenName({ activeLevel });\r\n const uname = getPlayerUsername({ UserState, InventoryState });\r\n const encodedMatchId = outcomeToDisplay && antiCheatId({ lastMatch, uname });\r\n\r\n const isPvp = PlayState.isPvpGameMode;\r\n\r\n useEffect(() => {\r\n // ask PVE player to join active F2E pvp tourney\r\n askPvePlayerJoinTourney({ isPvp });\r\n }, []);\r\n\r\n\r\n const showKillsInfo = () => {\r\n if (!breakdownPerKill.length) return;\r\n try {\r\n const toShow = breakdownPerKill.map(\r\n ({\r\n enemyName, weaponUsed, percentageBoost, enemyReward,\r\n immortalReward, killTotReward\r\n }, id) => `${id + 1}. ${enemyName} killed with ${weaponUsed}. Enemy reward ${\r\n enemyReward} * weapon reward ${percentageBoost}% = ${\r\n (killTotReward).toFixed(4)} (+ tekno reward? ${!!immortalReward ? 'Y' : 'N'})`\r\n ).join('\\n\\n');\r\n Swal.fire({ text: `KILL WEAPON rewards:\\n\\n${toShow}` })\r\n } catch (err) {\r\n console.error('Unable to show weapon kills popup', err);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n
\r\n
\r\n Result:  \r\n \r\n {!!outcomeToDisplay\r\n ? {outcomeToDisplay}\r\n : not played yet}\r\n \r\n
\r\n
\r\n Earned:  \r\n {boomAmountToDisplay\r\n ? {boomAmountToDisplay} ig{rewardToken}\r\n : n/a}\r\n \r\n
\r\n
\r\n \r\n {formattedRewards}\r\n \r\n
\r\n
\r\n \r\n

\r\n Kills:\r\n

{(killBalance !== undefined)\r\n ? \r\n {killBalance}*\r\n \r\n : n/a}

 \r\n

\r\n

\r\n Difficulty:\r\n

{!!outcomeToDisplay\r\n ? {difficultyTxt}\r\n : n/a}

\r\n

\r\n

\r\n Time left:\r\n

{!!remainingTime\r\n ? {remainingTime}\r\n : n/a}

\r\n

\r\n {\r\n Match ID: {encodedMatchId ||  n/a}\r\n }\r\n
\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const Penalties = () => {\r\n return (

\r\n {!!window.skippedResourcesPaym && -90% rewards
[no FOOD/GAS]
}\r\n {!!window.freeShip && -50% rewards
[captain]
}\r\n

);\r\n};\r\n","/* eslint-disable react-hooks/exhaustive-deps */\r\nimport React, { useEffect, useState } from 'react';\r\nimport { get } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { ScholarshipPane } from '../ScholarshipPane';\r\nimport { areMandNftsMissing, areWhitelistNftsMissing } from '../utils/requiredNfts';\r\nimport { MatchResults } from './MatchResults';\r\nimport { isPlayerCrossChainSecondary, multiTabCheckBeforePlayAndClaim, updateBlacklists } from '../../../../generalUtils/secure';\r\nimport { Penalties } from './Penalties';\r\nimport { getNftCount, getPlayerUsername } from '../../../../generalUtils/utils';\r\nimport { ITEMS_BY_CATEGORY } from '../../../../constants/templateIds';\r\nimport { isTestnet } from '../../../../constants/envs';\r\nimport { consumeTourneyConfig } from '../utils/requiredNFts/pvpRemoteConfig';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const PlayAndMatchOutcome = ({ showResourcesPage, paidResources, shouldAutoPlay, setShouldAutoPlay }) => {\r\n // PLAY STATE\r\n const PlayState = useSelector((store) => store.play);\r\n const activeLevel = PlayState.activeLevel;\r\n const percentLoaded = PlayState.isPercentLoaded;\r\n const isPvp = get(PlayState, 'isPvpGameMode');\r\n // INVENTORY STATE\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const waxScholarshipData = get(InventoryState, 'scholarship', {});\r\n const { isTeacher } = (waxScholarshipData || {});\r\n const nfts = get(InventoryState, 'csAssets.csNfts', []);\r\n const hiveData = get(InventoryState, 'hive', {});\r\n const { nfts: hiveNfts } = hiveData;\r\n const missingPveNFts = areMandNftsMissing({ nfts, hiveNfts, isPvp });\r\n // USER\r\n const UserState = useSelector((store) => store.user);\r\n const authChain = UserState.chainLogin;\r\n\r\n\r\n // shouldAutoPlay\r\n useEffect(async () => {\r\n if (shouldAutoPlay) {\r\n onHandlePlay();\r\n setShouldAutoPlay(false);\r\n }\r\n // Check if pass needed only if he doesnt have it\r\n const shouldCheckPass = isPvp && areWhitelistNftsMissing({ nfts, hiveNfts });\r\n if (shouldCheckPass) {\r\n // cache result for when requested clicking on Play button\r\n await consumeTourneyConfig();\r\n }\r\n }, []);\r\n\r\n const onHandlePlay = async () => {\r\n // LOADING\r\n if (!window.unityLoadCompleted) {\r\n Swal.fire({ text: `The game is still loading in the background: ${window.loadMissingPc}% missing. Try in a bit.` })\r\n return;\r\n }\r\n // SCHOLARSHIPS\r\n if (isTeacher) {\r\n Swal.fire({text: `You cannot play with a Teacher account!\r\n If you want to interrupt the Scholarship talk to your Scholar and burn your Scholar NFT.` })\r\n return;\r\n }\r\n // For Wax account linked to Hive account\r\n if (authChain === 'hive') {\r\n const hasWaxTeacherNft = getNftCount({\r\n nfts,\r\n id: get(ITEMS_BY_CATEGORY, 'SCHOLARSHIPS.TEA.ID'),\r\n });\r\n if (hasWaxTeacherNft) {\r\n Swal.fire({ text: 'You linked a Wax account with a Teacher NFT. A scholar is already playing with that inventory, so you can\\'t.' })\r\n return;\r\n }\r\n }\r\n // WHITELIST\r\n const missingWhitelistPvp = isPvp && areWhitelistNftsMissing({ nfts, hiveNfts })\r\n && (await consumeTourneyConfig()).isPvpPassRequired;\r\n isTestnet && console.log('::::::: PVP Pass check:', { isPvp, missingWhitelistPvp });\r\n if (missingWhitelistPvp) {\r\n Swal.fire({ text: `You need a whitelist NFT to access the PVP ALPHA ${isTestnet ? '(ok on testnet)' : ''}` })\r\n if (!isTestnet) return;\r\n }\r\n\r\n // USAGE OF CROSS-CHAIN ACCOUNT CHECK\r\n const authAccount = getPlayerUsername({ UserState, InventoryState });\r\n if (isPlayerCrossChainSecondary({ authAccount, authChain })) {\r\n Swal.fire({ text: 'You cannot play with an account which inventory you already linked to another account of yours!\\nAsk support to reset your account if you lost access to it.' })\r\n return;\r\n }\r\n // multi tab check\r\n multiTabCheckBeforePlayAndClaim();\r\n // play..\r\n const playBtn = document.getElementById('play-button');\r\n if (playBtn?.getAttribute('disabled')) return;\r\n if (!window.pageShow) {\r\n Swal.fire({ status: true, type: 'warning', body: 'works only when embedded in the CS-wrapper' })\r\n } else {\r\n window.pageShow('game');\r\n updateBlacklists();\r\n }\r\n };\r\n\r\n\r\n return (\r\n
\r\n

Level-{activeLevel}   {isPvp ? PVP : <>PVE   MATCH OUTCOME}

\r\n  \r\n
\r\n
\r\n
\r\n {paidResources ?\r\n
\r\n

Pew pew!! 😎

\r\n \r\n PLAY {percentLoaded < 100 && ({percentLoaded.toFixed(0)}% loaded)}\r\n \r\n
\r\n :
\r\n {!isPvp && missingPveNFts &&
\r\n You won't earn rewards until you have: Base Gun, Base Ammo and 1x level-0 Character. Or a closed 3D Starter/Advanced Pack.\r\n
}\r\n showResourcesPage(true)}\r\n >\r\n START GAME\r\n \r\n
}\r\n {!isPvp && <>\r\n \r\n \r\n }\r\n
\r\n {!isPvp && }\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","/* eslint-disable react-hooks/rules-of-hooks */\r\nimport React from 'react';\r\nimport { useState } from 'react';\r\nimport {\r\n claimLimits, BONUS_AMOUNT, HIGHEST_LEVEL, HIGHEST_REWARD, HIGHEST_MARS_CLAIM,\r\n} from '../../../../config/appConfig';\r\nimport './ClaimDisclaimer.scss';\r\n\r\n\r\nconst { minBoom } = claimLimits();\r\n\r\n\r\nexport const ClaimDisclaimer = ({\r\n whichActiveToken,\r\n boomClaimInfo, activeLevel, totalRewards, scholarCut,\r\n}) => {\r\n if (whichActiveToken === 'MARS') {\r\n return (\r\n
\r\n
\r\n

\r\n The MAX amount that you can currently claim per day is:  \r\n {HIGHEST_MARS_CLAIM} igMARS\r\n

\r\n
\r\n
\r\n );\r\n }\r\n else if (whichActiveToken === 'PROX') {\r\n return (\r\n
\r\n
\r\n

Not available yet, token for the 5th level.

\r\n
\r\n
\r\n );\r\n }\r\n\r\n const {\r\n hasMinClaim = false, yourCurrentMaxClaimable = 0, isBelowMaxDaily = true,\r\n isChampionOverflow, isMostlyUnstaker,\r\n } = boomClaimInfo;\r\n\r\n const totPendingRewards = scholarCut ? (totalRewards * scholarCut / 100) : totalRewards; \r\n const [isExpanded, setExpanded] = useState(false);\r\n\r\n const AboveMaxDaily = ({ isChampionOverflow }) =>

\r\n {isChampionOverflow\r\n ?

GG CHAMPION!! 😎 🏆

\r\n :

\r\n {totPendingRewards > 0 && <>\r\n Uh oh, your pending rewards ({totPendingRewards.toFixed(2)}) went above your daily MAX of {yourCurrentMaxClaimable}.\r\n {!isMostlyUnstaker &&

You can claim again after the daily reset. Or... 👇

}\r\n }\r\n

\r\n }\r\n

;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {(totalRewards > 0 && !hasMinClaim)\r\n &&

You need at least {minBoom} igBOOM in your pending rewards before you can claim or unstake.

\r\n }\r\n {isBelowMaxDaily\r\n ?

\r\n The MAX amount that you can currently claim per day is:  \r\n {yourCurrentMaxClaimable} igBOOM\r\n

\r\n : \r\n }\r\n
\r\n NOTE: keep an eye on your rewards!
\r\n Once they go above your daily max,
you won't be able to claim! \r\n ( unless you unlock it 👇 )
\r\n
\r\n {!isExpanded && setExpanded(true)}\r\n >\r\n More info...\r\n

}\r\n {isExpanded &&
    \r\n {(activeLevel < HIGHEST_LEVEL)\r\n &&
  • \r\n If you play and win the next level of the game, you will \r\n unlock a higher claim threshold!\r\n
  • \r\n }\r\n {(yourCurrentMaxClaimable < HIGHEST_REWARD)\r\n &&
  • \r\n CHAMPION staus unlocks a +{BONUS_AMOUNT} higher threshold per day! \r\n (see requirements)\r\n

    Champions can also claim above their max and the excess automatically goes into staking!

    \r\n
  • \r\n }\r\n
}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n","\r\nconst defaultState = { won: [], lost: [], validTimeout: [], unstaked: [] };\r\n\r\nexport const getPendingRewardToClaim = (rewardsToClaim = defaultState) => {\r\n let allClaimableAmount = 0;\r\n rewardsToClaim?.won.forEach((element) => {\r\n const amount = (element.boomAmount || element.amount || 0);\r\n allClaimableAmount += amount;\r\n });\r\n rewardsToClaim?.lost.forEach((element) => {\r\n const amount = (element.boomAmount || element.amount || 0);\r\n allClaimableAmount += amount;\r\n });\r\n rewardsToClaim?.validTimeout.forEach((element) => {\r\n const amount = (element.boomAmount || element.amount || 0);\r\n allClaimableAmount += amount;\r\n });\r\n\r\n rewardsToClaim?.unstaked.forEach((element) => {\r\n const amount = (element.boomAmount || element.amount || 0);\r\n allClaimableAmount += amount;\r\n });\r\n return allClaimableAmount;\r\n};\r\n\r\nexport const getUnstakedSum = (unstakeArr = []) => {\r\n let sumToUnstake = 0;\r\n unstakeArr.forEach((element) => {\r\n sumToUnstake += (element.amount || element.boomAmount);\r\n });\r\n return sumToUnstake;\r\n};\r\n","import { get } from 'lodash';\r\nimport {\r\n BONUS_AMOUNT, claimLimits, HIGHEST_REWARD,\r\n KILLS_PER_LEVEL, PERCENT_WINS, STAKE_TO_CLAIM\r\n} from '../../../../../config/appConfig';\r\nimport { isLocal } from '../../../../../constants/envs';\r\nimport { isObjectEmpty } from '../../../../../generalUtils/utils';\r\nimport { calcTotWins } from './utils';\r\nimport { getPendingRewardToClaim, getUnstakedSum } from './extractors';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nconst THRESHOLDS = {\r\n MIN_CLAIMABLE_PER_DAY: claimLimits().minBoom,\r\n MAX_CLAIMABLE_PER_DAY_L0: claimLimits().maxBoomL0,\r\n MAX_CLAIMABLE_PER_DAY_L1: claimLimits().maxBoomL1,\r\n // MAX_CLAIMABLE_PER_DAY_L2: claimLimits().maxMarsL2,\r\n // MAX_CLAIMABLE_PER_DAY_L3: claimLimits().maxMarsL3,\r\n};\r\nconst {\r\n MIN_CLAIMABLE_PER_DAY,\r\n MAX_CLAIMABLE_PER_DAY_L0, MAX_CLAIMABLE_PER_DAY_L1,\r\n // MAX_CLAIMABLE_PER_DAY_L2, MAX_CLAIMABLE_PER_DAY_L3,\r\n} = THRESHOLDS;\r\n\r\n // 1/3 CHAMPION REQUIREMENTS CHECK\r\nconst checkEnoughWins = ({ totalWins = {}, matchCount }) => {\r\n const totWins = calcTotWins({ totalWins });\r\n return (totWins / matchCount) >= PERCENT_WINS;\r\n};\r\n\r\nexport const isChampion = ({ sessionData }) => {\r\n const {\r\n totalWins, matchCount,\r\n unlockedFastKills, unlockedConsecutiveWins,\r\n } = sessionData;\r\n const hasEnoughWins = checkEnoughWins({ totalWins, matchCount });\r\n const wonBonus = hasEnoughWins && unlockedFastKills && unlockedConsecutiveWins; // ALL 3 REQUIREMENTS CHAMPIONS\r\n isLocal && console.debug('Is Champion?', { isChampion: wonBonus,\r\n reasons: { hasEnoughWins, unlockedFastKills, unlockedConsecutiveWins }, more: { totalWins, matchCount }});\r\n return wonBonus;\r\n};\r\n\r\nexport const calcMaxBoomClaimable = ({ apiInfo, sessionData, unityLevel }) => {\r\n if (isObjectEmpty(apiInfo)) return 0;\r\n if (window.skippedResourcesPaym) return MAX_CLAIMABLE_PER_DAY_L0;\r\n const wonBonus = isChampion({ sessionData });\r\n const bonus = wonBonus ? BONUS_AMOUNT : 0;\r\n const wonCurrentLevel = sessionData.totalWins[`level${unityLevel}`] > 0;\r\n isLocal && console.debug('[react] max claimable input:',\r\n { unityLevel, wonCurrentLevel, wonBonus, bonus });\r\n if (!wonCurrentLevel) {\r\n const temp = Math.max(0, unityLevel - 1);\r\n const level = Math.min(1, temp); // BOOM: level 0 and 1\r\n return THRESHOLDS[`MAX_CLAIMABLE_PER_DAY_L${level}`];\r\n }\r\n switch (unityLevel) {\r\n case 0: return MAX_CLAIMABLE_PER_DAY_L0;\r\n case 1:\r\n default:\r\n return MAX_CLAIMABLE_PER_DAY_L1 + bonus; // Even if they're playing level 5, max 105 BOOM!\r\n }\r\n};\r\n\r\n// NOTE: when they go over their BOOM daily max claim, they cant claim MARS neither. (unless champion)\r\n// Required otherwise the client-side 62 vs 90/105 threshold check fails.\r\nconst checkRewardsClaimRequirements = ({ apiInfo, sessionData, scholarCut, unityLevel }) => {\r\n // Extraction\r\n const boomClaimableRewards = getPendingRewardToClaim(apiInfo.boomRewardsToClaim);\r\n const marsClaimableRewards = getPendingRewardToClaim(apiInfo.marsRewardsToClaim);\r\n const allClaimableRewards = boomClaimableRewards + marsClaimableRewards;\r\n const totBoomClaimedForCurrentDay = get(apiInfo, 'transactionStats.totBoomClaimedForCurrentDay'); // eg. 0.75\r\n const dateOfLastClaim = get(apiInfo, 'transactionStats.dateOfLastClaim'); // eg. '2022-08-06'\r\n const lastClaimWasToday = dateOfLastClaim === new Date().toISOString().substring(0, 10);\r\n const claimedToday = lastClaimWasToday ? +(totBoomClaimedForCurrentDay || 0).toFixed(4) : 0;\r\n const totalKills = get(apiInfo, 'gameStats.level0.totalKills', 0)\r\n + get(apiInfo, 'gameStats.level1.totalKills', 0)\r\n + get(apiInfo, 'gameStats.level2.totalKills', 0) + get(apiInfo, 'gameStats.level3.totalKills', 0);\r\n const playerLevel = 1 + Math.floor(totalKills / KILLS_PER_LEVEL);\r\n const stakeToClaim = (playerLevel - 1) * STAKE_TO_CLAIM;\r\n const currentSavings = get(apiInfo, 'savings.boom.amount'); // eg. 1203.23\r\n const stakeAllowsToClaim = (currentSavings >= stakeToClaim);\r\n // Results\r\n const hasMinClaim = allClaimableRewards >= MIN_CLAIMABLE_PER_DAY;\r\n const yourCurrentMaxClaimable = calcMaxBoomClaimable({ apiInfo, sessionData, unityLevel });\r\n const playerRewards = scholarCut ? (allClaimableRewards * scholarCut / 100) : allClaimableRewards;\r\n const isBelowMaxDaily = (playerRewards + claimedToday) <= yourCurrentMaxClaimable;\r\n const isAboveStakeToClaim = (playerLevel < 2 || stakeAllowsToClaim);\r\n // OVERFLOW REQUIREMENTS\r\n let isChampionOverflow, isMostlyUnstaker;\r\n if ((playerRewards + claimedToday) > HIGHEST_REWARD) {\r\n const unlockedHighestThreshold = yourCurrentMaxClaimable === HIGHEST_REWARD;\r\n // (above max threshold and) unlocked the very max claim\r\n if (unlockedHighestThreshold && !window.skippedResourcesPaym) {\r\n isChampionOverflow = true; // NOTE: allowing scholar champion to withdraw 105 at the time. Is saving logic ok in BE?? ⚠️\r\n }\r\n // (above max threshold and) more than 50% is unstake -> reduce max claim in api call\r\n const unstakedSum = getUnstakedSum(get(apiInfo, 'boomRewardsToClaim.unstaked'));\r\n const mostlyUnstake = (unstakedSum / allClaimableRewards) > 0.5;\r\n if (!unlockedHighestThreshold && mostlyUnstake) {\r\n isMostlyUnstaker = true;\r\n }\r\n }\r\n isLocal && console.debug('--- claim requirements:',\r\n {\r\n hasMinClaim: { value: hasMinClaim, parts: {\r\n allClaimableRewards, MIN_CLAIMABLE_PER_DAY,\r\n }},\r\n isBelowMaxDaily: { value: isBelowMaxDaily, parts: {\r\n allClaimableRewards, claimedToday, lastClaimWasToday, yourCurrentMaxClaimable,\r\n }},\r\n isAboveStakeToClaim: { value: isAboveStakeToClaim, parts: {\r\n playerLevel, STAKE_TO_CLAIM, stakeAllowsToClaim, currentSavings, stakeToClaim,\r\n }},\r\n overflow: { isChampionOverflow, isMostlyUnstaker },\r\n });\r\n return ({ hasMinClaim, yourCurrentMaxClaimable, isBelowMaxDaily, isAboveStakeToClaim, isChampionOverflow, isMostlyUnstaker });\r\n};\r\n\r\nexport const checkIsTokensClaimDisabled = ({ apiInfo, sessionData, scholarCut, unityLevel = 0 }) => {\r\n if (isObjectEmpty(apiInfo)) return ({ result: true });\r\n try {\r\n const args = { apiInfo, sessionData, unityLevel };\r\n if (scholarCut) { args.scholarCut = scholarCut; }\r\n const reasons = checkRewardsClaimRequirements(args);\r\n const { hasMinClaim, isBelowMaxDaily, isAboveStakeToClaim, isChampionOverflow, isMostlyUnstaker } = reasons;\r\n const canOverflow = isChampionOverflow || isMostlyUnstaker; // isMostlyUnstaker -> enable and BE reduced claim\r\n const shouldEnableClaimBtn = hasMinClaim && isAboveStakeToClaim && (isBelowMaxDaily || canOverflow);\r\n isLocal && console.debug('Claim btn disabling debug:',\r\n { shouldEnableClaimBtn }, { hasMinClaim, isAboveStakeToClaim, isBelowMaxDaily, canOverflow },\r\n );\r\n const claimBtn = document.getElementById('claim-boom');\r\n if (shouldEnableClaimBtn) {\r\n isLocal && console.log('Enabling claim btn. Allowing player to claim.');\r\n // NOTE: Leave these to avoid fast clickers to claim before api response\r\n claimBtn && claimBtn.removeAttribute('disabled');\r\n claimBtn && claimBtn.removeAttribute('bigger'); // anti-cheat\r\n return ({ result: false, reasons });\r\n } else {\r\n claimBtn && claimBtn.setAttribute('disabled', true);\r\n claimBtn && claimBtn.setAttribute('bigger', '1.02x'); // anti-cheat\r\n return ({ result: true, reasons });\r\n }\r\n } catch (err) {\r\n console.error('check boom claim disabled broke:', err);\r\n Swal.fire({ text: `Something broke in claim prep logic. Please report to support.` })\r\n }\r\n};\r\n","import React from 'react';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { getPendingRewardToClaim } from './wrapperData/extractors';\r\nimport './PendingRewards.scss';\r\n\r\n\r\nconst MatchEarnings = ({ rewards = {} } = {}) => {\r\n const allResults = Object.entries(rewards);\r\n if (!allResults.length) return null;\r\n const [first, ...rest] = allResults;\r\n const reordered = [...rest, first];\r\n const capitalize = str => str[0].toUpperCase() + str.slice(1);\r\n try {\r\n return reordered\r\n .map(([resultCategory, matches]) =>
  • \r\n {capitalize(resultCategory)}: {matches.length\r\n ? matches.map(\r\n ({ amount, boomAmount, marsAmount } = {}) => (amount || boomAmount || marsAmount || 0).toFixed(2)\r\n ).join(', ')\r\n : none}\r\n
  • );\r\n } catch (err) {\r\n console.error('Match Earnings component broke:', err);\r\n return null;\r\n }\r\n};\r\n\r\nexport const PendingRewards = ({\r\n name, rewards, shouldLockNavigation,\r\n whichActiveToken, setWhichActiveToken,\r\n}) => {\r\n const totalRewards = getPendingRewardToClaim(rewards);\r\n isLocal && console.debug('Rewards:', { name, rewards, totalRewards });\r\n const isActiveTab = whichActiveToken === name;\r\n return (\r\n !shouldLockNavigation && setWhichActiveToken(name)}\r\n >\r\n

    {name}

    \r\n {(totalRewards > 0)\r\n ?
    \r\n \r\n \r\n \r\n
      \r\n \r\n
    \r\n
    \r\n : \r\n No pending ig{name} rewards\r\n }\r\n \r\n );\r\n};\r\n","import { get } from 'lodash';\r\n\r\nexport const getUnstakeOptionsStatus = ({ token, apiInfo, sessionData, withdrawLots }) => {\r\n let withdrawOption, percentUnstake;\r\n if (withdrawLots) {\r\n withdrawOption = 3;\r\n percentUnstake = 20;\r\n } else if (!sessionData.totalWins) {\r\n withdrawOption = 2;\r\n percentUnstake = 3;\r\n } else {\r\n withdrawOption = 1;\r\n percentUnstake = 5;\r\n }\r\n const boomSavings = get(apiInfo, `savings.${token}.amount`); // eg. 1203.23\r\n let unstakingAmount = boomSavings * percentUnstake / 100;\r\n if (withdrawLots) {\r\n unstakingAmount -= (unstakingAmount * 35 / 100); // burn fee\r\n }\r\n return ({ unstakingAmount, withdrawOption, percentUnstake });\r\n};\r\n","import React from 'react';\r\nimport CheckBox from 'rc-checkbox';\r\nimport { invoke } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { client } from '../../../../../helpers/client';\r\nimport { UserService } from '../../../../../services/UserService';\r\nimport { isLocal } from '../../../../../constants/envs';\r\nimport { getPlayerUsername } from '../../../../../generalUtils/utils';\r\nimport { getPendingRewardToClaim } from '../wrapperData/extractors';\r\nimport { LoadingSpinner } from '../../../../../images/gifs/LoadingSpinner';\r\nimport { getUnstakeOptionsStatus } from './utils';\r\nimport { calcTotWins } from '../wrapperData/utils';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const BoomRewardsActions = ({\r\n whichActiveToken, actions,\r\n}) => {\r\n // USER STATE\r\n const UserState = useSelector((store) => store.user);\r\n\r\n // INVENTORY STATE\r\n const InventoryState = useSelector((store) => store.inventory);\r\n\r\n // PLAY STATE\r\n const PlayState = useSelector((store) => store.play);\r\n const { wrapperData = {} } = PlayState;\r\n const { apiResponse: apiInfo = {}, sessionData = {} } = wrapperData;\r\n const totalBoomRewards = +(getPendingRewardToClaim(apiInfo.boomRewardsToClaim)).toFixed(3);\r\n\r\n // PARENT STATE\r\n const {\r\n withdrawLots, setWithdrawLots,\r\n claimInProgress,\r\n stakeInProgress, setStakeInProgress,\r\n unstakeInProgress, setUnstakeInProgress,\r\n } = actions;\r\n const totalWins = calcTotWins({ totalWins: sessionData?.totalWins });\r\n const isUnstakeDisabled = !totalBoomRewards || !totalWins || unstakeInProgress || claimInProgress || stakeInProgress;\r\n\r\n // LOCAL STATE\r\n const tokenInitial = whichActiveToken.slice(0, 1);\r\n const {\r\n unstakingAmount, withdrawOption, percentUnstake\r\n } = getUnstakeOptionsStatus({ token: 'boom', apiInfo, sessionData, withdrawLots });\r\n\r\n\r\n const onHandleStake = async () => {\r\n if (document.getElementById('stake-button').getAttribute('disabled')) {\r\n return;\r\n }\r\n setStakeInProgress(true);\r\n const isOk = window.confirm('Do you confirm that you want to stake all your igBOOM pending rewards?\\n\\nYou do accrue interest but there are specific rules to withdraw.');\r\n if (!isOk) {\r\n setStakeInProgress(false);\r\n return;\r\n }\r\n try {\r\n isLocal && console.log('Sending API request to stake funds');\r\n const payload = { account: getPlayerUsername({ UserService, UserState, InventoryState }) };\r\n // it gets all pending BOOM claims transferred to their BOOM saving balance.\r\n // It can be done whenever the request is called.\r\n const detail = await client.post(`/api/user/stake/boom`, payload);\r\n console.log('Stake result:', { detail });\r\n invoke(window, 'fetchUserData');\r\n } catch (err) {\r\n console.error('caught handling stake action:', err);\r\n } finally {\r\n setStakeInProgress(false);\r\n }\r\n };\r\n\r\n const onHandleWithdraw = async () => {\r\n if (document.getElementById('unstaking-options').getAttribute('bigger')) return; // anti-cheat\r\n setUnstakeInProgress(true);\r\n // validation and confirmation\r\n const msElapsed = Date.now() - +localStorage.getItem('lastBoomUnstakeTs');\r\n if (msElapsed < (18 * 60 * 60 * 1000)) { // 18 hours // validated server side too\r\n Swal.fire({text: `You already unstaked in the past 18 hours (${(msElapsed / (60 * 1000)).toFixed(0)} mins ago). Come back later.`});\r\n setUnstakeInProgress(false);\r\n return;\r\n }\r\n try {\r\n if (!unstakingAmount) {\r\n Swal.fire({text: `Cannot unstake, you have: ${unstakingAmount}`});\r\n setUnstakeInProgress(false);\r\n return;\r\n }\r\n const msg = `Do you confirm that you want to get ${unstakingAmount.toFixed(4)} igBOOM, that is ${percentUnstake}% of your stake/savings${withdrawLots ? ' minus the 35% rush fee' : ''}?`;\r\n const isOk = window.confirm(msg);\r\n if (!isOk) {\r\n setUnstakeInProgress(false);\r\n return;\r\n }\r\n // api call\r\n isLocal && console.log('Sending API request to unstake funds with withdraw option:', withdrawOption);\r\n const payload = { account: getPlayerUsername({ UserService, UserState, InventoryState }), withdrawOption };\r\n const detail = await client.post('/api/user/withdraw/boom', payload);\r\n console.log('Unstake result:', { detail });\r\n localStorage.setItem('lastBoomUnstakeTs', Date.now());\r\n Swal.fire({text: 'Unstake successful. Press Claim to get it into your wallet.'});\r\n // - update claimable balance on UI\r\n isLocal && console.log('Updating UI to show unstaked balance that can be claimed now');\r\n invoke(window, 'fetchUserData');\r\n // - disable claim btn\r\n const claimBtn = document.getElementById('claim-boom');\r\n claimBtn.setAttribute('disabled', 'true');\r\n } catch (err) {\r\n console.error('caught in unstake action:', err);\r\n } finally {\r\n setUnstakeInProgress(false);\r\n }\r\n };\r\n\r\n const toggleUnstakeLots = (event) => {\r\n setWithdrawLots(event.target.checked);\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n Stake all your pending ig{whichActiveToken}
    ({totalBoomRewards} ig{tokenInitial})\r\n \r\n {stakeInProgress && }\r\n
    \r\n
    \r\n
    \r\n \r\n Unstake 20{percentUnstake} %\r\n
    of your staked ig{whichActiveToken}\r\n \r\n {unstakeInProgress\r\n ? \r\n :
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    \r\n Increase unstaking to 20% and burn 35% of the withdrawn amount\r\n

    \r\n
    \r\n
    \r\n
      \r\n
    • You can unstake funds only once per day, and first you need to win at least one match.
    • \r\n
    • Keep in mind your max daily claim!
    • \r\n
    \r\n
    \r\n
    }\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport CheckBox from 'rc-checkbox';\r\nimport { get, invoke } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { client } from '../../../../../helpers/client';\r\nimport { UserService } from '../../../../../services/UserService';\r\nimport { isLocal } from '../../../../../constants/envs';\r\nimport { getPlayerUsername } from '../../../../../generalUtils/utils';\r\nimport { getPendingRewardToClaim } from '../wrapperData/extractors';\r\nimport { LoadingSpinner } from '../../../../../images/gifs/LoadingSpinner';\r\nimport { getUnstakeOptionsStatus } from './utils';\r\nimport { calcTotWins } from '../wrapperData/utils';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const MarsRewardsActions = ({ whichActiveToken, actions }) => {\r\n // USER STATE\r\n const UserState = useSelector((store) => store.user);\r\n\r\n // INVENTORY STATE\r\n const InventoryState = useSelector((store) => store.inventory);\r\n\r\n // PLAY STATE\r\n const PlayState = useSelector((store) => store.play);\r\n const { wrapperData = {} } = PlayState;\r\n const { apiResponse: apiInfo = {}, sessionData = {} } = wrapperData;\r\n const totalMarsRewards = +(getPendingRewardToClaim(apiInfo.marsRewardsToClaim)).toFixed(3);\r\n\r\n // PARENT STATE\r\n const {\r\n withdrawLots, setWithdrawLots,\r\n claimInProgress,\r\n stakeInProgress, setStakeInProgress,\r\n unstakeInProgress, setUnstakeInProgress,\r\n } = actions;\r\n const totalWins = calcTotWins({ totalWins: sessionData?.totalWins });\r\n const isUnstakeDisabled = !totalMarsRewards || !totalWins || unstakeInProgress || claimInProgress || stakeInProgress;\r\n\r\n // LOCAL STATE\r\n const tokenInitial = whichActiveToken.slice(0, 1);\r\n const {\r\n unstakingAmount, withdrawOption, percentUnstake\r\n } = getUnstakeOptionsStatus({ token: 'mars', apiInfo, sessionData, withdrawLots });\r\n\r\n\r\n const onHandleStake = async () => {\r\n if (document.getElementById('stake-button').getAttribute('disabled')) {\r\n return;\r\n }\r\n setStakeInProgress(true);\r\n const isOk = window.confirm('Do you confirm that you want to stake all your igMARS pending rewards?\\n\\nYou do accrue interest but there are specific rules to withdraw.');\r\n if (!isOk) {\r\n setStakeInProgress(false);\r\n return;\r\n }\r\n try {\r\n isLocal && console.log('Sending API request to stake funds');\r\n const payload = { account: getPlayerUsername({ UserService, UserState, InventoryState }) };\r\n // it gets all pending BOOM claims transferred to their BOOM saving balance.\r\n // It can be done whenever the request is called.\r\n const detail = await client.post(`/api/user/stake/mars`, payload);\r\n console.log('Stake result:', { detail });\r\n invoke(window, 'fetchUserData');\r\n } catch (err) {\r\n console.error('caught handling stake action:', err);\r\n } finally {\r\n setStakeInProgress(false);\r\n }\r\n };\r\n\r\n const onHandleWithdraw = async () => {\r\n if (document.getElementById('unstaking-options').getAttribute('bigger')) return; // anti-cheat\r\n setUnstakeInProgress(true);\r\n // validation and confirmation\r\n const msElapsed = Date.now() - +localStorage.getItem('lastMarsUnstakeTs');\r\n if (msElapsed < (18 * 60 * 60 * 1000)) { // 18 hours // validated server side too\r\n Swal.fire({text: `You already unstaked in the past 18 hours (${(msElapsed / (60 * 1000)).toFixed(0)} mins ago). Come back later.`})\r\n setUnstakeInProgress(false);\r\n return;\r\n }\r\n try {\r\n if (!unstakingAmount) {\r\n Swal.fire({text: `Cannot unstake, you have: ${unstakingAmount}`})\r\n setUnstakeInProgress(false);\r\n return;\r\n }\r\n const msg = `Do you confirm that you want to get ${unstakingAmount.toFixed(4)} igMARS, that is ${percentUnstake}% of your stake/savings${withdrawLots ? ' minus the 35% rush fee' : ''}?`;\r\n const isOk = window.confirm(msg);\r\n if (!isOk) {\r\n setUnstakeInProgress(false);\r\n return;\r\n }\r\n // api call\r\n isLocal && console.log('Sending API request to unstake funds with withdraw option:', withdrawOption);\r\n const payload = { account: getPlayerUsername({ UserService, UserState, InventoryState }), withdrawOption };\r\n const detail = await client.post('/api/user/withdraw/mars', payload);\r\n console.log('Unstake result:', { detail });\r\n localStorage.setItem('lastMarsUnstakeTs', Date.now());\r\n Swal.fire({text: 'Unstake successful. Press Claim to get it into your wallet.'})\r\n // - update claimable balance on UI\r\n isLocal && console.log('Updating UI to show unstaked balance that can be claimed now');\r\n invoke(window, 'fetchUserData');\r\n // - disable claim btn\r\n const claimBtn = document.getElementById('claim-mars');\r\n claimBtn.setAttribute('disabled', 'true');\r\n } catch (err) {\r\n console.error('caught in unstake action:', err);\r\n } finally {\r\n setUnstakeInProgress(false);\r\n }\r\n };\r\n\r\n const toggleUnstakeLots = (event) => {\r\n setWithdrawLots(event.target.checked);\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n Stake all your pending ig{whichActiveToken}
    ({totalMarsRewards} ig{tokenInitial})\r\n \r\n {stakeInProgress && }\r\n
    \r\n
    \r\n
    \r\n \r\n Unstake 20{percentUnstake} %\r\n
    of your staked ig{whichActiveToken}\r\n \r\n {unstakeInProgress\r\n ? \r\n :
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    \r\n Increase unstaking to 20% and burn 35% of the withdrawn amount\r\n

    \r\n
    \r\n
    \r\n
      \r\n
    • You can unstake funds only once per day, and first you need to win at least one match.
    • \r\n
    • Keep in mind your max daily claim!
    • \r\n
    \r\n
    \r\n
    }\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\n\r\nexport const ProxRewardsActions = ({ whichActiveToken, isClaimBtnDisabled }) => {\r\n return (\r\n <>\r\n \r\n {}}\r\n disabled={isClaimBtnDisabled}\r\n >\r\n Stake all your pending ig{whichActiveToken}\r\n \r\n \r\n \r\n {}}\r\n disabled={isClaimBtnDisabled}\r\n >\r\n Unstake 5% of your ig{whichActiveToken}\r\n \r\n \r\n \r\n );\r\n};\r\n","import { client } from '../../../../helpers/client';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { get } from 'lodash';\r\nimport { isFeatureEnabled } from '../../../../config/featureFlags';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const calcPercentageDoom = ({ waxNfts = [], hiveNfts = [] }) => {\r\n const hiveNftsCount = hiveNfts.length;\r\n if (!hiveNftsCount) return undefined;\r\n const waxNftsCount = waxNfts.length;\r\n if (!isFeatureEnabled('HIVE')) return hiveNftsCount > 0 ? 1 : 0;\r\n const percentDoom = +((hiveNftsCount / (hiveNftsCount + waxNftsCount)) * 100).toFixed(0);\r\n return percentDoom;\r\n};\r\n\r\nconst prepClaimResMsg = ({ resProcessClaimDoom, who}) => {\r\n // const doomStatusCode = get(resProcessClaimDoom, 'statusCode');\r\n // const doomPlayerMsg = get(resProcessClaimDoom, 'resClaimDoomForPlayer.response.msg', ''); // msg vs statusCode\r\n try {\r\n const tx = get(resProcessClaimDoom, `resClaimDoomFor${who}.response.hiveTrxId`, '');\r\n const broadcastedJson = get(resProcessClaimDoom, `resClaimDoomFor${who}.response.broadcastedJson`, '{}');\r\n const { contractPayload } = (JSON.parse(broadcastedJson) || {});\r\n if (!contractPayload) return ({});\r\n // \"contractPayload\":{\"symbol\":\"DOOM\",\"to\":\"ilovecryptos\",\"quantity\":\"0.1372\",\"memo\":\"claim 0.1372 DOOM for ygnre.wam/ilovecryptos\"}}\"\r\n const { quantity, symbol, to } = contractPayload;\r\n isLocal && console.debug('[] [] [] contract payload', { contractPayload, quantity, symbol, to }); // TEMP @@\r\n return ({ tx, msg: quantity ? `${quantity} ${symbol} sent to ${to}` : '' });\r\n } catch (err) {\r\n console.error('Caught error parsing claim response:', err);\r\n return ({});\r\n }\r\n};\r\n\r\nexport const claimAllTokens = async ({\r\n username = '', teacherName = '', scholarCut = 0, isMostlyUnstaker,\r\n hiveData = {}, nfts = []\r\n}) => {\r\n // ## REQUEST\r\n const { nfts: hiveNfts = [], username: hiveUsername, teacher: hiveTeacher, linkedWaxAccount } = hiveData;\r\n const percentageDoom = calcPercentageDoom({ waxNfts: nfts, hiveNfts, username });\r\n const scholarCutDecimals = (scholarCut / 100) || undefined;\r\n const teacherNameValue = teacherName || undefined;\r\n const requestData = {\r\n account: username, // eg. 'boomfungible'\r\n linkedWaxUsername: linkedWaxAccount,\r\n teacher: teacherNameValue, // 'hitstoken123'\r\n scholarCut: scholarCutDecimals, // 0.6\r\n percentageDoom, // 40\r\n hiveUsername: hiveUsername || undefined, // hivedev0404\r\n hiveUsernameOfTeacher: hiveTeacher || undefined, // hivedev5040\r\n isMostlyUnstaker, // reduces max claim to 62 if not a champion\r\n };\r\n console.debug('[claim-step] Claim api request data:', { requestData });\r\n try {\r\n const response = await client.post(\r\n `/api/transaction/claim-pending-rewards`,\r\n requestData,\r\n { timeout: 2 * 60 * 1000 }\r\n );\r\n\r\n // ## RESPONSE\r\n isLocal && console.log('[claim-step] Claim result:', { response: response.data });\r\n\r\n // retrocompatibility v1\r\n const { claim, updateUser, restoreUser } = response.data;\r\n const txIdOldStyle = get(claim, 'resultClaimBOOM.response.transaction_id');\r\n\r\n // retrocompatibility v2\r\n let isPlayerClaimBoomOk = get(claim, 'resClaimBoomForPlayer.statusCode') < 300;\r\n let isTeacherClaimBoomOk = !teacherName || get(claim, 'resClaimBoomForTeacher.statusCode') < 300;\r\n let isUserUpdateOk = get(updateUser, 'updateUserInfoStatusCode') < 300;\r\n let isUserRestoreOk = !get(restoreUser, 'restoreUserInfoStatusCode') || get(restoreUser, 'restoreUserInfoStatusCode') < 300;\r\n\r\n // v3\r\n const { resProcessClaimBoom = {}, resProcessClaimDoom = {}, resProcessClaimMars = {} } = response.data;\r\n isPlayerClaimBoomOk = isPlayerClaimBoomOk || !resProcessClaimBoom || (resProcessClaimBoom.statusCode < 300);\r\n isTeacherClaimBoomOk = isTeacherClaimBoomOk\r\n || !resProcessClaimBoom || (!teacherName || get(resProcessClaimBoom, 'resClaimBoomForTeacher.statusCode') < 300);\r\n isUserUpdateOk = isUserUpdateOk || !resProcessClaimBoom || get(resProcessClaimBoom, 'resUpdateUserInfo.statusCode') < 300;\r\n\r\n if (/*response.status > 300 ||*/ !isPlayerClaimBoomOk || !isTeacherClaimBoomOk || !isUserUpdateOk || !isUserRestoreOk) {\r\n const statusSummary = { isPlayerClaimBoomOk, isTeacherClaimBoomOk, isUserUpdateOk, isUserRestoreOk };\r\n console.error('Something failed in the BE for claim:', { statusSummary });\r\n Swal.fire({ text: `An error occur. Please check your transactions and report anything missing.`})\r\n return ({ err: JSON.stringify(statusSummary) });\r\n }\r\n // Boom claim result\r\n const {\r\n toAccount: playerAddr = `${username}(?)`,\r\n transaction_id: playerTx = txIdOldStyle,\r\n } = get(claim, 'resClaimBoomForPlayer.response') || get(resProcessClaimBoom, 'resClaimBoomForPlayer.response') || {};\r\n const playerClaimAmount = get(claim, 'amountToClaimForPlayer')\r\n || get(resProcessClaimBoom, 'amountBoomToClaimForPlayer') || 'n/a';\r\n const stakedAmount = get(claim, 'amountToStaking')\r\n || get(resProcessClaimBoom, 'amountBoomToStaking') || 'n/a';\r\n // Claim details IF SCHOLARSHIP is active\r\n const {\r\n toAccount: teacherAddr, transaction_id: teacherTx,\r\n } = get(claim, 'resClaimBoomForTeacher.response') || get(resProcessClaimBoom, 'resClaimBoomForTeacher.response') || {};\r\n const teacherClaimAmount = get(claim, 'amountToClaimForTeacher')\r\n || get(resProcessClaimBoom, 'amountBoomToClaimForTeacher') || 'n/a';\r\n \r\n // DOOM\r\n const { tx: playerDoomTxLink, msg: doomPlayerMsg } = prepClaimResMsg({ resProcessClaimDoom, who: 'Player' });\r\n const { tx: teacherDoomTxLink, msg: doomTeacherMsg } = prepClaimResMsg({ resProcessClaimDoom, who: 'Teacher' });\r\n\r\n // MARS\r\n const {\r\n transaction_id: marsTx,\r\n } = get(claim, 'resClaimMarsForPlayer.response') || get(resProcessClaimMars, 'resClaimMarsForPlayer.response') || {};\r\n const marsAmount = get(claim, 'amountToClaimForPlayer')\r\n || get(resProcessClaimMars, 'amountMarsToClaimForPlayer') || 'n/a';\r\n const marsStakedAmount = get(claim, 'amountToStaking')\r\n || get(resProcessClaimMars, 'amountMarsToStaking') || 'n/a';\r\n // teacher (if any)\r\n const {\r\n transaction_id: marsTxTeacher,\r\n } = get(claim, 'resClaimMarsForTeacher.response') || get(resProcessClaimMars, 'resClaimMarsForTeacher.response') || {};\r\n const marsAmountTeacher = get(claim, 'amountToClaimForTeacher')\r\n || get(resProcessClaimMars, 'amountMarsToClaimForTeacher') || 'n/a';\r\n\r\n // Result\r\n const mainUser = {\r\n id: playerTx, amount: playerClaimAmount, playerAddr, stakedAmount,\r\n doomPlayer: doomPlayerMsg, playerDoomTxLink,\r\n marsTx, marsAmount, marsStakedAmount,\r\n };\r\n const teacher = {\r\n id: teacherTx, amount: teacherClaimAmount, teacherAddr,\r\n doomTeacher: doomTeacherMsg, teacherDoomTxLink,\r\n marsTxTeacher, marsAmountTeacher,\r\n };\r\n const claimResult = { mainUser, teacher };\r\n isLocal && console.log('[claim-step] claim result data for redux:', { claimResult });\r\n return ({ claimResult });\r\n } catch (err) {\r\n console.error('Claim failed:', err);\r\n Swal.fire({text: `Uh oh, something went wrong during your claim. Please reach out to support.\\n\\nError: ${err} - ${JSON.stringify(err)}`})\r\n return ({ err });\r\n }\r\n};\r\n\r\n\r\n// // mars\r\n// resProcessClaimMars.amountMarsToClaimForPlayer // 0.62808\r\n// resProcessClaimMars.resClaimMarsForPlayer.statusCode === 200\r\n// resProcessClaimMars.resClaimMarsForPlayer.response.toAccount\r\n// resProcessClaimMars.resClaimMarsForPlayer.response.transaction_id\r\n\r\n// resProcessClaimMars.amountMarsToClaimForTeacher\r\n// resProcessClaimMars.resClaimMarsForTeacher.statusCode === 200\r\n// resProcessClaimMars.resClaimMarsForTeacher.response.toAccount\r\n// resProcessClaimMars.resClaimMarsForTeacher.response.transaction_id\r\n\r\n// resProcessClaimMars.amountMarsToStaking\r\n// resProcessClaimMars.resUpdateUserInfo.statusCode === 204\r\n","import React from 'react';\r\nimport { isLocal, isTestnet } from '../../../../constants/envs';\r\n\r\nconst formatNumber = (num) => !isNaN(num) ? num.toFixed(4) : ''; // num;\r\nconst shorterTxt = (txt = '') => txt.substr(0, 35);\r\n\r\n\r\nexport const ClaimResult = ({ scholarshipData, claimResult = {} }) => {\r\n isLocal && console.debug('Data received in ClaimResult component:', { scholarshipData, claimResult });\r\n const { mainUser = {}, teacher = {} } = claimResult;\r\n if (!mainUser) return null;\r\n const {\r\n id: playerTxId, amount: playerClaimedAmount, playerAddr, stakedAmount,\r\n doomPlayer: doomClaimMsg = '', playerDoomTxLink = '',\r\n marsTx, marsAmount, marsStakedAmount, // MARS\r\n } = mainUser;\r\n const {\r\n id: teacherTxId, amount: teacherClaimedAmount, teacherAddr = '',\r\n doomTeacher = '', teacherDoomTxLink = '',\r\n marsTxTeacher, marsAmountTeacher, // MARS\r\n } = teacher;\r\n\r\n const linkBaseTx = `https://wax${isTestnet ? '-test' : ''}.bloks.io/transaction/`;\r\n const linkBaseAcc = `https://wax.bloks.io/account/`;\r\n const { scholarName, teacherName } = (scholarshipData || {});\r\n\r\n return (
    \r\n {(playerTxId || teacherDoomTxLink || doomClaimMsg || marsTx) &&

    \r\n {(playerTxId || marsTx) && <>\r\n Claimed:  \r\n \r\n {!!(+playerClaimedAmount) && <>{formatNumber(playerClaimedAmount)} $BOOM }\r\n {teacherTxId && \r\n {scholarName || playerAddr}
    \r\n
    }\r\n {playerTxId && [{\r\n shorterTxt(playerTxId)\r\n }]}\r\n
    \r\n \r\n {!!(+marsAmount) && <>
    {formatNumber(marsAmount)} $MARS }\r\n {marsTxTeacher && \r\n {scholarName || playerAddr}
    \r\n
    }\r\n {marsTx && [\r\n {shorterTxt(marsTx)}\r\n ]}\r\n
    \r\n \r\n }\r\n {!!(stakedAmount > 0 || marsStakedAmount > 0) && \r\n \r\n Staked because over max:\r\n {stakedAmount > 0 &&
    {formatNumber(stakedAmount)} igBOOM
    }\r\n {marsStakedAmount > 0 &&
    {formatNumber(marsStakedAmount)} igMARS
    }\r\n
    \r\n }\r\n {(doomClaimMsg || playerDoomTxLink) &&

    \r\n {doomClaimMsg}  -  \r\n Hive tx\r\n
    }\r\n

    }\r\n {(teacherTxId || teacherDoomTxLink || marsTxTeacher) &&
    \r\n

    \r\n To Teacher {teacherAddr}:  \r\n {!!+teacherClaimedAmount && <>{formatNumber(teacherClaimedAmount)} $BOOM }\r\n {!!+marsAmountTeacher && <>
    {formatNumber(marsAmountTeacher)} $MARS }\r\n {(teacherTxId || marsTxTeacher) && \r\n {teacherTxId &&
    [\r\n {shorterTxt(teacherTxId)\r\n }]
    }\r\n {marsTxTeacher &&
    [\r\n {shorterTxt(marsTxTeacher)}\r\n ]
    }\r\n
    }\r\n

    \r\n {doomTeacher &&

    \r\n {doomTeacher}  -  \r\n Hive tx\r\n
    }\r\n
    }\r\n
    );\r\n};\r\n","import React from 'react';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { calcPercentageDoom } from '../subComponents/claims/claim';\r\n\r\nexport const WhichChains = ({ hiveNfts = [], waxNfts = [] }) => {\r\n const hiveNftsCount = hiveNfts.length;\r\n const waxNftsCount = waxNfts.length;\r\n isLocal && console.debug('NFT counts: ', { hiveNftsCount, waxNftsCount });\r\n if (!hiveNftsCount && waxNftsCount)\r\n return null; // wax only account\r\n if (hiveNftsCount && !waxNftsCount)\r\n return null; // hive only account\r\n const pcDoom = calcPercentageDoom({ waxNfts, hiveNfts });\r\n if (!pcDoom)\r\n return null;\r\n const pcWaxTokens = 100 - pcDoom;\r\n isLocal && console.debug('percentages: ', { pcDoom, pcWaxTokens });\r\n return

    \r\n

    Wax tokens rewards:  {pcWaxTokens}%
    ({waxNftsCount} Wax NFTs)


    \r\n

    DOOM (Hive) rewards:  {pcDoom}%
    ({hiveNftsCount} Hive NFTs)


    \r\n

    ETH token rewards:  {0}%
    ({0} Eth-L2 NFTs)

    \r\n

    ;\r\n};\r\n","import React, { useState } from 'react';\r\nimport { get, invoke } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { isLocal, isTestnet } from '../../constants/envs';\r\nimport { ClaimDisclaimer } from './subComponents/claims/ClaimDisclaimer';\r\nimport { getPendingRewardToClaim, getUnstakedSum } from './subComponents/claims/wrapperData/extractors';\r\nimport { checkIsTokensClaimDisabled } from './subComponents/claims/wrapperData/claimBoomRequirements';\r\nimport { PendingRewards } from './subComponents/claims/PendingRewards';\r\nimport { BoomRewardsActions } from './subComponents/claims/buttonsPanes/BoomRewardsActions';\r\nimport { MarsRewardsActions } from './subComponents/claims/buttonsPanes/MarsRewardsActions';\r\nimport { ProxRewardsActions } from './subComponents/claims/buttonsPanes/ProxRewardsAction';\r\nimport { getPlayerUsername } from '../../generalUtils/utils';\r\nimport { UserService } from '../../services/UserService';\r\nimport { claimAllTokens } from './subComponents/claims/claim';\r\nimport { HIGHEST_REWARD, LOWEST_THRESHOLD } from '../../config/appConfig';\r\nimport { LoadingSpinner } from '../../images/gifs/LoadingSpinner';\r\nimport { ClaimResult } from './subComponents/claims/ClaimResult';\r\nimport { WhichChains } from './subComponents/WhichChains';\r\nimport { storeAppDispatch } from '../../GlobalState/Store';\r\nimport { setClaimResult } from '../../reducers/PlayReducer';\r\nimport { antiCheatersCheck, multiTabCheckBeforePlayAndClaim } from '../../generalUtils/secure';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nexport const RightPaneRewards = () => {\r\n // PLAY STATE\r\n const PlayState = useSelector((store) => store.play);\r\n const { wrapperData = {}, claimResult = {} } = PlayState;\r\n const { apiResponse: apiInfo = {}, gameData = {}, sessionData = {}, unityLevel } = wrapperData;\r\n const totalRewards = +(getPendingRewardToClaim(apiInfo.boomRewardsToClaim)).toFixed(4);\r\n const totalBoomRewards = +(getPendingRewardToClaim(apiInfo.boomRewardsToClaim)).toFixed(4);\r\n const totalMarsRewards = +(getPendingRewardToClaim(apiInfo.marsRewardsToClaim)).toFixed(4)\r\n const hasAnyRewards = !!(totalBoomRewards || totalMarsRewards);\r\n const hasAnyGamingOnlyRewards = (\r\n totalBoomRewards - getUnstakedSum(get(apiInfo, 'boomRewardsToClaim.unstaked', []))\r\n + totalMarsRewards - getUnstakedSum(get(apiInfo, 'marsRewardsToClaim.unstaked', []))\r\n ) > 0;\r\n const activeLevel = PlayState.activeLevel;\r\n\r\n // INVENTORY STATE\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const waxScholarshipData = get(InventoryState, 'scholarship', {});\r\n const { teacherCut, isScholar, teacherName, scholarCut } = (waxScholarshipData || {});\r\n const hiveData = get(InventoryState, 'hive', {});\r\n const { nfts: hiveNfts, username: hiveUsername, teacher: hiveTeacher } = hiveData;\r\n const waxNfts = get(InventoryState, 'csAssets.csNfts', []);\r\n const hasOnlyHiveNfts = waxNfts.length === 0 && hiveNfts.length > 0;\r\n\r\n // USER STATE\r\n const UserState = useSelector((store) => store.user);\r\n const isWaxUser = UserState.chainLogin === 'wax';\r\n\r\n // LOCAL STATE\r\n const [whichActiveToken, setWhichActiveToken] = useState('BOOM');\r\n const [withdrawLots, setWithdrawLots] = useState(false);\r\n const [claimInProgress, setClaimInProgress] = useState(false);\r\n const [stakeInProgress, setStakeInProgress] = useState(false);\r\n const [unstakeInProgress, setUnstakeInProgress] = useState(false);\r\n const shouldLockNavigation = claimInProgress || stakeInProgress || unstakeInProgress;\r\n const actions = {\r\n withdrawLots, setWithdrawLots,\r\n claimInProgress, setClaimInProgress,\r\n stakeInProgress, setStakeInProgress,\r\n unstakeInProgress, setUnstakeInProgress,\r\n };\r\n\r\n // BOOM CLAIM BTN STATUS\r\n const { result: isBoomClaimDisabled, reasons: boomDisReasons = {} } = checkIsTokensClaimDisabled({\r\n apiInfo, sessionData, scholarCut: isScholar && scholarCut, unityLevel\r\n });\r\n const { isChampionOverflow, isMostlyUnstaker } = boomDisReasons;\r\n const isBoomClaimBtnDisabled = isBoomClaimDisabled || claimInProgress || stakeInProgress;\r\n const shouldBtnShine = hasAnyRewards && !claimInProgress;\r\n // (debug)\r\n isLocal && console.debug('[--] All-rewards claim buttons disabled?', {\r\n isBoomClaimBtnDisabled, isBoomClaimDisabled, claimInProgress, stakeInProgress,\r\n });\r\n\r\n const onHandleClaim = async () => {\r\n // VALIDATIONS\r\n const claimBtn = document.getElementById('claim-boom');\r\n if (claimBtn.getAttribute('disabled') === 'true' || claimBtn.getAttribute('bigger')) return; // anti-cheat\r\n claimBtn.setAttribute('disabled', 'true');\r\n isTestnet && console.debug('Initialized claim request..');\r\n setClaimInProgress(true);\r\n const username = getPlayerUsername({ UserService, UserState, InventoryState });\r\n\r\n if (!sessionStorage.getItem('verified')) {\r\n Swal.fire({ text: `Authentication expired. Do not clear cache during your gaming session. Login again to claim.\\n[client-issue:no-refund]` })\r\n return;\r\n }\r\n // anti-cheats\r\n await antiCheatersCheck({ waxNfts, isWaxUser, isScholar });\r\n multiTabCheckBeforePlayAndClaim();\r\n try {\r\n const scholarCutValue = isScholar && (scholarCut || (100 - teacherCut));\r\n const { err = '', claimResult: apiResponse = {} } = await claimAllTokens({\r\n username, teacherName, scholarCut: scholarCutValue,\r\n isMostlyUnstaker, hiveData, nfts: waxNfts\r\n });\r\n if (err) return; // not resetting UI, they can try again\r\n // React State update\r\n isLocal && console.debug('Dispatching claim result', { apiResponse });\r\n setClaimInProgress(false);\r\n storeAppDispatch(setClaimResult({ claimResult: apiResponse }));\r\n // UI RESET\r\n console.debug('Resetting claim UI..');\r\n invoke(window, 'fetchUserData');\r\n } catch (err) {\r\n console.error('caught error in claim:', err);\r\n Swal.fire({ text: `Claim failed. IF you have been logged in for a long time please log in again.\\n\\n${err}` })\r\n setClaimInProgress(false);\r\n // !isTestnet && window.location.reload(); // issue with spaceship payments\r\n }\r\n };\r\n\r\n return (\r\n \r\n
    \r\n

    PVE   PENDING REWARDS

    \r\n
    \r\n
    \r\n {/* tech debt - used by wrapper, hidden now */}\r\n

    \r\n No pending igBOOM rewards\r\n

    \r\n \r\n \r\n \r\n
    \r\n  \r\n
    \r\n \r\n
    \r\n  \r\n
    \r\n
    \r\n \r\n

    \r\n\r\n onHandleClaim()}\r\n disabled={isBoomClaimBtnDisabled}\r\n >\r\n {shouldBtnShine &&
    \r\n \r\n \r\n \r\n \r\n
    }\r\n Claim all your pending rewards
    \r\n {totalBoomRewards.toFixed(2)} igB{!!scholarCut\r\n &&   (you: {(totalBoomRewards * scholarCut / 100).toFixed(2)}),}\r\n \r\n  + {totalMarsRewards.toFixed(2)} igM{!!scholarCut\r\n &&   (you: {(totalMarsRewards * scholarCut / 100).toFixed(2)})}\r\n \r\n {(hasOnlyHiveNfts && !scholarCut) &&  = {\r\n (totalBoomRewards + totalMarsRewards).toFixed(2)\r\n } $DOOM}\r\n \r\n\r\n

    \r\n {!!sessionData.matchCount && isBoomClaimDisabled && !hasAnyRewards && !isChampionOverflow\r\n && !isMostlyUnstaker && 🔒}\r\n {!sessionData.matchCount && isBoomClaimDisabled && !hasAnyGamingOnlyRewards\r\n && [PLAYER: WIN at least 1 match to claim/unstake 🔫]}\r\n {!isBoomClaimDisabled && hasAnyGamingOnlyRewards\r\n && [PLAYER: you can claim gaming rewards 💰]}\r\n {isChampionOverflow && (totalBoomRewards - HIGHEST_REWARD > 0)\r\n && [CHAMPION: {(totalBoomRewards - HIGHEST_REWARD).toFixed(2)} into stake 🏆]}\r\n {isMostlyUnstaker && (totalBoomRewards - LOWEST_THRESHOLD > 0)\r\n && [UNSTAKER: {(totalBoomRewards - LOWEST_THRESHOLD).toFixed(2)} into stake 🏦]}\r\n

    \r\n {claimResult.mainUser && storeAppDispatch(setClaimResult({ claimResult: {} }))}\r\n style={{\r\n color: 'white', paddingTop: '4px', paddingRight: '4px', backgroundColor: 'rgba(100,100,100,0.3)',\r\n borderTopRightRadius: '20px', display: 'block', marginLeft: '0px', marginBottom: '-5px',\r\n width: '25px', height: '25px', outline: 'none', border: 'none', fontSize: '12px',\r\n }}\r\n >X}\r\n {claimInProgress\r\n ? \r\n : \r\n }\r\n \r\n
    \r\n
    \r\n

    MANAGE {whichActiveToken} REWARDS

    \r\n {whichActiveToken === 'BOOM' && \r\n }\r\n {whichActiveToken === 'MARS' && \r\n }\r\n {whichActiveToken === 'PROX' && \r\n }\r\n
    \r\n
    \r\n \r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { Animated } from \"react-animated-css\";\r\nimport { useSelector } from 'react-redux';\r\nimport { LevelChoice } from './overlays/LevelChoice';\r\nimport { ResourcesPayment } from './overlays/Resources/ResourcesPayment';\r\nimport { TravelSection } from './subComponents/spaceships/components/SpaceTravelPane';\r\nimport { uiHacks } from '../../generalUtils/uiHacks/uiHacks';\r\nimport { PlayerStats } from './PlayerStats';\r\nimport { PlayAndMatchOutcome } from './subComponents/launchPodAndResults/PlayAndMatchOutcome';\r\nimport { RightPaneRewards } from './RightPaneRewards';\r\nimport { windowSetChecksum } from '../../generalUtils/secure/checksums';\r\nimport './Play.scss';\r\n\r\n\r\nexport const Play = () => {\r\n const PlayState = useSelector((store) => store.play);\r\n const activeLevel = PlayState.activeLevel;\r\n\r\n // TRAVEL\r\n const inTravel = PlayState.isInTravel;\r\n window.inTravel = inTravel; // to prevent cheats on the wrapper side\r\n windowSetChecksum({ key: 'inTravel', value: inTravel });\r\n const inTravelToZero = PlayState.isTravellingToZero;\r\n\r\n const [travelPage, setShowTravelPage] = useState(false);\r\n const [whichBtnExpanded, setExpandedBtn] = useState(activeLevel);\r\n\r\n const resetLevelChoice = (targetLevel) => {\r\n uiHacks.disableClaimAndPlayBtnsAtFirst({ claimOnly: true });\r\n setShowTravelPage(false);\r\n setExpandedBtn(targetLevel || activeLevel);\r\n };\r\n\r\n // For RESOURCES page\r\n const [shouldShowResourcesPage, showResourcesPage] = useState(false);\r\n const paidResources = PlayState.paidResources;\r\n const isPvp = PlayState.isPvpGameMode;\r\n const autoPlayDefault = isPvp ? true : false; // TEMP until spacehips travels @@ @@\r\n const [shouldAutoPlay, setShouldAutoPlay] = useState(autoPlayDefault);\r\n \r\n const PlayAreaLanding = ({ paidResources }) => {\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n {/* The 3 buttons to navigate game levels */}\r\n {(shouldShowResourcesPage || inTravelToZero) \r\n ? \r\n : <>\r\n {/* The 3 buttons to navigate game levels */}\r\n \r\n {/* Travel page / Play section */}\r\n {(travelPage || inTravel)\r\n ? \r\n : \r\n }\r\n \r\n }\r\n \r\n
    \r\n );\r\n};\r\n","/* eslint-disable no-useless-concat */\r\nimport { isLocal, isTestnet } from \"../constants/envs\";\r\nimport { cacheBustParam } from \"../helpers/client\";\r\nimport { BYPASS_INVENTORY_CODE, BYPASS_OUTAGE_CODE } from \"./appConfig\";\r\n\r\n\r\n// ## MAINTENANCE\r\n\r\nconst maintenanceStatus = {\r\n underMaintenance: false,\r\n reason: null,\r\n inventoryDisabled: false,\r\n};\r\n\r\n\r\n\r\nconst fetchMaintenance = () => {\r\n isTestnet && console.debug('fetching maintenance status..');\r\n fetch(`/json/out.json${cacheBustParam()}`)\r\n .then(res => res.json())\r\n .then((data = {}) => {\r\n isTestnet && console.debug('Maintenance status:', data);\r\n maintenanceStatus.underMaintenance = data.underMaintenance;\r\n maintenanceStatus.reason = data.reason;\r\n maintenanceStatus.inventoryDisabled = data.inventoryDisabled;\r\n })\r\n .catch(err => console.error('Maintenance status fetch err:', err));\r\n};\r\nfetchMaintenance();\r\n\r\n\r\n// # OUTAGE\r\n\r\nexport const isUnderMaintenance = () => {\r\n if (localStorage.getItem(BYPASS_OUTAGE_CODE)) return false;\r\n return maintenanceStatus.underMaintenance;\r\n};\r\n\r\nexport const maintenanceReason = () => maintenanceStatus.reason;\r\n\r\n\r\n// # INVENTORY STATUS\r\n\r\nexport const isInventoryDisabled = () => {\r\n if (localStorage.getItem(BYPASS_INVENTORY_CODE)) return false;\r\n return maintenanceStatus.inventoryDisabled;\r\n};\r\n\r\n\r\n// ## PROMOS\r\n\r\nconst promoStatus = {\r\n level0: {\r\n isFast: false,\r\n isFree: false,\r\n untilTime: 0,\r\n },\r\n level1: {\r\n isFast: false,\r\n isFree: false,\r\n untilTime: 0,\r\n },\r\n};\r\n\r\n// {\r\n// level0: { isFast: false, isFree: false }\r\n// }\r\nconst fetchPromos = () => {\r\n isTestnet && console.debug('fetching Promos status..');\r\n fetch(`/json/promos.json${cacheBustParam()}`)\r\n .then(res => res.json())\r\n .then((data = {}) => {\r\n isTestnet && console.debug('Promos status:', data);\r\n // const { level0 = {}, level1 = {}, level2 = {}, level3 = {}, level4 = {} } = data;\r\n const levels = Object.keys(data);\r\n levels.forEach((level) => {\r\n const { isFast, isFree, untilTime } = (data[level] || {});\r\n if (!promoStatus[level]) {\r\n promoStatus[level] = { isFast, isFree, untilTime };\r\n } else {\r\n promoStatus[level].isFast = isFast;\r\n promoStatus[level].isFree = isFree;\r\n promoStatus[level].untilTime = untilTime;\r\n }\r\n });\r\n })\r\n .catch(err => console.error('Promos status err:', err));\r\n};\r\nfetchPromos();\r\n\r\n\r\n// ## CHEAP TRIALS WL\r\n\r\nexport const cheapTrials = { whitelist: [] };\r\n\r\nconst fetchCheapTrials = () => {\r\n isLocal && console.debug('fetching cheap trials folks..');\r\n fetch(`/json/cheapTrials.json${cacheBustParam()}`)\r\n .then(res => res.json())\r\n .then((json = {}) => {\r\n const { data } = json;\r\n isLocal && console.debug('CheapTrials status:', { wl: data });\r\n cheapTrials.whitelist = [...data];\r\n })\r\n .catch(err => console.error('Maintenance status fetch err:', err));\r\n};\r\nfetchCheapTrials();\r\n","\r\nimport { get } from \"lodash\";\r\nimport { isLocal } from \"../../../constants/envs\";\r\nimport { cacheBustParam } from \"../../../helpers/client\";\r\n\r\n\r\n// const DROPLIVENOW_BANNER = 'https://files.peakd.com/file/peakd-hive/crypto-shots/23vsUgX3FvJ88JMDzNqa9jYpYS2aH5jzqrqGX9CDjEEoMDL1HTHUJyWhvGohnqPYVrhsi.png';\r\n// const BANNER_LINK = 'https://wax.atomichub.io/drops/89979+89978+89977+89976';\r\nconst DISCORD_INVITE = 'https://crypto-shots.com/discord';\r\n\r\n\r\nconst bannersDynConfig = {\r\n // empty = use ALT message\r\n adSrc: '',\r\n // what webpage it opens on click\r\n adWebpage: DISCORD_INVITE,\r\n // displayed if no src, or if there's src then becomes label under the ad\r\n adAlt: '',\r\n};\r\n\r\nexport const getBannersConfig = async () => {\r\n await fetchAds();\r\n return ({ ...bannersDynConfig })\r\n};\r\n\r\n// ads.json\r\n// {\r\n// \"primary\": {\r\n// \"desktop\": {\r\n// \"src\": \"https://files.peakd.com/file/peakd-hive/crypto-shots/EogLsFMDzjXWFWAQBfeXWWPaWnRixFHAsKqGmAY4WTByArGpJyStrY4Jcrz6nFH3xMb.jpg\",\r\n// \"link\": \"https://www.crypto-shots.com/drops\"\r\n// }\r\n// }\r\n// }\r\nconst fetchAds = async () => {\r\n isLocal && console.debug('fetching banners data..');\r\n // if (isLocal) return;\r\n return fetch(`/json/ads.json${cacheBustParam()}`)\r\n .then(res => res.json())\r\n .then((data = {}) => {\r\n isLocal && console.debug('banners data:', data);\r\n const { src, link, alt = '' } = get(data, 'primary.desktop', {});\r\n bannersDynConfig.adSrc = src;\r\n bannersDynConfig.adWebpage = link;\r\n bannersDynConfig.adAlt = alt;\r\n })\r\n .catch(err => console.error('banners data fetch err:', err));\r\n};\r\n// fetchAds();\r\n","import { get } from 'lodash';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { flyingSessionLogin, WaxFlyingSession } from '../../../../services/UserService';\r\nimport { TRIAL_PAYMENTS_ACCOUNT_HIVE, WAX_ACCOUNTS } from '../../../../config/accounts';\r\nimport { cheapTrials } from '../../../../config/appRemoteStatus';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nconst isFreeTrialWhitelistedUser = ({ username }) => cheapTrials.whitelist?.includes(username);\r\n\r\n// const { err } = window.payForNextLevel({ username, amount, currency });\r\nexport const payForNextLevel = async ({ username, amount, currency }) => {\r\n let finalAmount = isFreeTrialWhitelistedUser({ username }) ? 0.001 : amount;\r\n if (currency === 'HIVE') {\r\n const { err } = await hiveTrialPayment({ username, amount: finalAmount });\r\n return ({ err });\r\n } else if (currency === 'WAX') {\r\n const { err } = await waxTrialPayment({ username, amount: finalAmount });\r\n return ({ err });\r\n }\r\n return ({ err: `Unexpected input: ${amount} ${currency}` });\r\n};\r\n\r\n\r\n// ## HIVE\r\n\r\nconst hiveTrialPayment = ({ username, amount }) => new Promise((resolve) => {\r\n isLocal && console.debug('Starting hive keychain handshake..');\r\n try {\r\n window.hive_keychain.requestHandshake(() => {\r\n isLocal && console.debug('handshake success');\r\n window.hive_keychain.requestTransfer(\r\n username,\r\n TRIAL_PAYMENTS_ACCOUNT_HIVE,\r\n (+amount).toFixed(3),\r\n 'Trial payment in Free to Play mode',\r\n 'HIVE',\r\n (response) => {\r\n isLocal && console.debug('Hive transfer resp:', response);\r\n if (!response.success) {\r\n resolve({\r\n err: `ERROR: transfer failed. ${response.message || ''}`,\r\n });\r\n return;\r\n }\r\n console.log('Payment BROADCASTED.', {\r\n msg: `${response.message || ''}`,\r\n tx: get(response, 'result.id'),\r\n });\r\n resolve({});\r\n },\r\n true\r\n );\r\n }\r\n );\r\n } catch (err) { console.error('Caught during hive payment:', err); resolve({ err }); }\r\n});\r\n\r\n\r\n// ## WAX\r\n\r\nconst waxTrialPayment = async ({ username: waxSender, amount: waxAmount }) => {\r\n isLocal && console.debug('Creating side session for wax chain');\r\n const waxSession = WaxFlyingSession;\r\n if (isLocal) { window.flyingSession = waxSession; } // DEBUG @@\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn || waxSession.authName !== waxSender) {\r\n Swal.fire({text: `To unlock the new level you have to sign-in with ${waxSender}`})\r\n }\r\n isLocal && console.debug('Initiating Wax transfer:', { waxSender, waxAmount });\r\n try {\r\n return waxSession.session.signTransaction(\r\n {\r\n actions: [{\r\n account: 'eosio.token',\r\n name: 'transfer',\r\n authorization: [{\r\n actor: waxSender,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: waxSender,\r\n to: WAX_ACCOUNTS.TRIAL_PAYMENTS,\r\n quantity: `${waxAmount.toFixed(8)} WAX`,\r\n memo: 'Trial payment in Free to Play mode',\r\n },\r\n }],\r\n },\r\n {\r\n blocksBehind: 3,\r\n expireSeconds: 30\r\n }\r\n )\r\n .then((response = {}) => {\r\n isLocal && console.log('Wax send response status:', { waxSender, waxAmount, response });\r\n if (response.status !== 'executed') {\r\n console.error('Transfer not executed:', { data: JSON.stringify(response) });\r\n return ({ err: JSON.stringify(response) });\r\n }\r\n return ({});\r\n })\r\n .catch((err) => {\r\n console.error('Caught error during Wax transfer:', err);\r\n return ({ err });\r\n });\r\n } catch (err) {\r\n console.error('Caught error during trial payment', err);\r\n return ({ err });\r\n }\r\n};\r\n","import { invoke } from 'lodash';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { payForNextLevel } from '../../../sagas/helpers/wallet/payAfterTrial/payForNextLevel';\r\nimport { windowSetChecksum } from '../../../generalUtils/secure/checksums';\r\n\r\n\r\n// INIT FREE TRIAL\r\nexport const setFreeTrial = ({ value, from }) => {\r\n isLocal && console.debug('Free UI:', value);\r\n if (window.isFreeTrial === undefined) {\r\n window.isFreeTrial = value;\r\n windowSetChecksum({ key: 'isFreeTrial', value });\r\n }\r\n if (from === 'login-btn') { // login sets it to false and freezes it\r\n isLocal && console.debug('After login set freeTrial to', value);\r\n } else if (from === 'free-btn') {\r\n isLocal && console.debug('After F2P set freeTrial to', value);\r\n const originaValue = window.isFreeTrial; // cant login after F2P anyway\r\n try {\r\n Object.defineProperty(window, 'isFreeTrial', { value: originaValue, writable: false });\r\n } catch (_) {}\r\n invoke(window, 'initFreeTrial');\r\n }\r\n};\r\nwindow.payForNextLevel = payForNextLevel;\r\nwindowSetChecksum({ key: 'payForNextLevel', value: payForNextLevel });\r\n\r\n// PAYMENT TO UNLOCK LEVELS ABOVE 2nd\r\ntry {\r\n const original = window.payForNextLevel;\r\n Object.defineProperty(window, 'payForNextLevel', { value: original, writable: false });\r\n} catch (_) { }\r\n","export default __webpack_public_path__ + \"static/media/sci-fi-warning.0f3b8722.png\";","\r\nexport const checkBrowserType = () => {\r\n const isBrave = navigator.brave || (navigator.userAgent && navigator.userAgent.includes('Brave'));\r\n const choseIgnoreBrave = !!localStorage.getItem('dismissBrave');\r\n return ({ isBrave, choseIgnoreBrave });\r\n};\r\n","import React, { useState } from 'react';\r\nimport SciFiWarning from '../../../_embedAssets/sci-fi-warning.png';\r\nimport { checkBrowserType } from '../../../generalUtils/browser/browserType';\r\nimport './SuggestBrowser.scss';\r\n\r\n\r\nconst { isBrave, choseIgnoreBrave } = checkBrowserType();\r\n\r\nexport const SuggestBrave = () => {\r\n const [shouldDisplay, setShouldDisplay] = useState(true);\r\n\r\n const handleClose = () => {\r\n localStorage.setItem('dismissBrave', 1);\r\n setShouldDisplay(false);\r\n };\r\n\r\n if (isBrave || choseIgnoreBrave || !shouldDisplay) return null;\r\n\r\n return (\r\n
    \r\n

    \r\n \"Warning\"\r\n \r\n You're not using {' '}\r\n \r\n Brave Browser\r\n \r\n .\r\n
    Equip it now if you want to boost your frame rate to warp speed!\r\n
    \r\n
    \r\n
    \r\n       If you still experience lag, close heavy apps and adjust the in-game graphics\r\n settings.\r\n \r\n

    \r\n
    \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/LogoWrite2.4b5d171b.png\";","import React from 'react';\r\nimport LogoWrite from '../../../images/logos/LogoWrite2.png';\r\n\r\nexport const LogoLanding = () => {\r\n return (<>\r\n
    \r\n \"LogoWrite\"\r\n \r\n \r\n First Person Shooter\r\n \r\n

    \r\n
    \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { isMainnet } from '../../../../constants/envs';\r\nimport { checkBrowserType } from '../../../../generalUtils/browser/browserType';\r\n\r\nconst LOCAL_BANNER_TEST = 'https://files.peakd.com/file/peakd-hive/cryptoshots.nft/23tvD1xjoABB5dA4oBzGe2Fk8kL9uVvgjVQraAxwKFBLZS8snLnLsTZFcNeQ2gfAi8sgJ.png';\r\n\r\n\r\nconst { isBrave, choseIgnoreBrave } = checkBrowserType();\r\n\r\nexport const LandingBanner = ({ isLogged, isFirstLoad, bannersDynConfig }) => {\r\n const { adSrc, adWebpage, adAlt } = bannersDynConfig || {};\r\n const imgSrc = adSrc || (isMainnet ? \"\" : LOCAL_BANNER_TEST);\r\n \r\n const [isBannerOpen, setBannerOpen] = useState(true);\r\n\r\n // Don't show our ad/banner if we need to show SuggestBrowser component\r\n if (!isBrave && !choseIgnoreBrave) return null;\r\n\r\n return (<>\r\n {!isLogged &&\r\n
    \r\n {(imgSrc && isBannerOpen) && <>\r\n
    \r\n window.open(adWebpage, '_blank')}\r\n alt={adAlt}\r\n />\r\n \r\n
    \r\n \r\n /* CONTACT MARKETING for banner - meh */\r\n /* // {!isFirstLoad && } */\r\n }\r\n
    }\r\n {/* ANON ADS */}\r\n {/* {!UserState.isLogged && !isFirstLoad && } */}\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { maintenanceReason } from '../../../../config/appRemoteStatus';\r\n\r\nexport const MaintenanceMessage = () => {\r\n return (<>\r\n \r\n
    \r\n

    \r\n We are temporarily under maintenance, please come back later. Pew pew!\r\n

    \r\n
    \r\n
    \r\n Reason:   {maintenanceReason() || 'system update or infrastructure change in progress'}\r\n
    \r\n \r\n );\r\n};\r\n","import { isLocal } from '../../constants/envs';\r\n\r\nconst interceptChainChoice = ({ urlParams }) => {\r\n const isHiveOnlyLogin = urlParams.has('hive');\r\n if (isHiveOnlyLogin) {\r\n sessionStorage.setItem('exclusiveLogin', 'hive');\r\n return;\r\n }\r\n const isWaxOnlyLogin = urlParams.has('wax') || urlParams.has('waxp');\r\n if (isWaxOnlyLogin) {\r\n sessionStorage.setItem('exclusiveLogin', 'wax');\r\n return;\r\n }\r\n const isBtcOnlyLogin = urlParams.has('btc') || urlParams.has('bitcoin');\r\n if (isBtcOnlyLogin) {\r\n sessionStorage.setItem('exclusiveLogin', 'btc');\r\n return;\r\n }\r\n const isEthOnlyLogin = urlParams.has('eth') || urlParams.has('ethereum');\r\n if (isEthOnlyLogin) {\r\n sessionStorage.setItem('exclusiveLogin', 'eth-choice');\r\n return;\r\n }\r\n const isSklOnlyLogin = urlParams.has('skl') || urlParams.has('skale');\r\n if (isSklOnlyLogin) {\r\n sessionStorage.setItem('exclusiveLogin', 'skl');\r\n return;\r\n }\r\n sessionStorage.removeItem('exclusiveLogin');\r\n};\r\n\r\nconst interceptGamemodeChoice = ({ urlParams }) => {\r\n const wantsPve = urlParams.has('pve') || urlParams.has('singleplayer');\r\n if (wantsPve) {\r\n sessionStorage.setItem('urlGameMode', 'pve');\r\n return;\r\n }\r\n const wantsPvp = urlParams.has('pvp') || urlParams.has('multiplayer');\r\n if (wantsPvp) {\r\n sessionStorage.setItem('urlGameMode', 'pvp');\r\n return;\r\n }\r\n sessionStorage.removeItem('urlGameMode');\r\n};\r\n\r\nexport const detectUrlParams = () => {\r\n const params = window.location.search;\r\n isLocal && console.log('[urlParams]', { params });\r\n const urlParams = new URLSearchParams(params);\r\n\r\n // CHAIN CHOICE\r\n interceptChainChoice({ urlParams });\r\n\r\n // GAME MODE CHOICE\r\n interceptGamemodeChoice({ urlParams });\r\n};\r\n\r\n\r\nexport const getSingleChainLogin = () => {\r\n return sessionStorage.getItem('exclusiveLogin');\r\n};\r\n\r\nexport const getNavigationGameMode = () => {\r\n return sessionStorage.getItem('urlGameMode');\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Checkbox from 'rc-checkbox';\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { setChainLogin, setPlayerTac } from '../../../../reducers/UserReducer';\r\n\r\n\r\nexport const TermsConditions = ({ urlParamChain }) => {\r\n const UserState = useSelector((store) => store.user);\r\n const { acceptedTac } = UserState;\r\n\r\n const termsToggle = (event) => {\r\n const newState = { acceptedTac: event.target.checked };\r\n storeAppDispatch(setPlayerTac(newState));\r\n if (event.target.checked) {\r\n localStorage.setItem('acceptedTac', Date.now());\r\n } else {\r\n localStorage.removeItem('acceptedTac');\r\n }\r\n };\r\n\r\n const ChainChoiceBtn = () => {\r\n return ( storeAppDispatch(setChainLogin({ chainLogin: null }))}\r\n >\r\n Other Chains >\r\n \r\n );\r\n };\r\n\r\n return (<>\r\n
    \r\n
    \r\n {!urlParamChain && }\r\n
    \r\n \r\n  \r\n
    \r\n
    \r\n I have read and accept the  
    \r\n \r\n \r\n Terms & Conditions (v1)\r\n \r\n \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const BitcoinLnInstructions = () => {\r\n return (\r\n \r\n Login with a Hive\r\n account and link your \r\n Lightning Network address in the \r\n Tokens section!\r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport Swal from 'sweetalert2';\r\n\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { setChainLogin } from '../../../../reducers/UserReducer';\r\nimport { isUnderMaintenance } from \"../../../../config/appRemoteStatus\";\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { ChainIcon } from './ChainIcon';\r\nimport { getSingleChainLogin } from '../../../../generalUtils/browser/urlParams';\r\nimport { BitcoinLnInstructions } from './BitcoinLnInstructions';\r\nimport { useSelector } from 'react-redux';\r\n\r\n\r\nexport const ChainChoicePanel = () => {\r\n const PlayState = useSelector((store) => store.play);\r\n const isPvp = PlayState.isPvpGameMode;\r\n\r\n const [btcInfoMsg, setBtcInfoMsg] = useState('');\r\n\r\n useEffect(() => {\r\n const urlParamChain = getSingleChainLogin();\r\n if (urlParamChain === 'btc') showBtcInstructions();\r\n }, []);\r\n\r\n\r\n const handleChainChoice = (chain) => {\r\n if (isUnderMaintenance()) {\r\n Swal.fire({ text: `We are currently in maintenance mode. Please try later.` });\r\n return;\r\n }\r\n if (chain === 'eth-choice' && !isPvp) {\r\n Swal.fire({ text: `For now only Multiplayer mode is supported on Ethereum` });\r\n return;\r\n }\r\n isLocal && console.debug('Setting game chain to:', chain);\r\n storeAppDispatch(setChainLogin({ chainLogin: chain }));\r\n };\r\n\r\n const showBtcInstructions = () => {\r\n setBtcInfoMsg();\r\n };\r\n\r\n return (\r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n {btcInfoMsg\r\n ?
    {btcInfoMsg}
    \r\n : }\r\n
    \r\n
    \r\n \r\n {!btcInfoMsg && }\r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const GameModesBtn = ({ backToModeChoice }) => {\r\n return (
    \r\n Game Modes >\r\n
    );\r\n};\r\n","import axios from 'axios';\r\nimport stringHash from 'string-hash';\r\n\r\nimport { WaxAuthClient } from 'wax-auth-client';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport { setPlayerLogout } from '../../../reducers/UserReducer';\r\nimport { client } from '../../../helpers/client';\r\nimport { UserService } from '../../../services/UserService';\r\nimport { setBridgeToken } from '../play/unityBridge';\r\nimport { isLocal, isTestnet } from '../../../constants/envs';\r\nimport { nukeAnchorSavedAccount } from '../../../services/autoLogin';\r\nimport { get } from 'lodash';\r\nimport Swal from 'sweetalert2';\r\n\r\nconst authClient = new WaxAuthClient();\r\nsessionStorage.removeItem('verified');\r\n\r\n\r\n// --------- utils\r\n\r\nconst failureHandler = ({ reason, err }) => {\r\n Swal.fire({text: `Verification error. Please try again`})\r\n console.error(`Verification failure details:\\n-Reason: ${reason}\\n-Error: ${err}`);\r\n storeAppDispatch(setPlayerLogout());\r\n window.location.reload();\r\n throw new Error('verify-ko');\r\n};\r\n\r\n\r\n// ADD USER-AGENT HASH anti-cheat. Multi tab/window check.\r\n// - send it and store it in login request\r\n// - send it in all claim/stake/unstake requests\r\n// - check it srv side and 400 if mismatch\r\nconst addDefaultHeaders = () => {\r\n // FE version\r\n const version = get(window, 'version.wrapper');\r\n axios.defaults.headers.common['X-FE-VERSION'] = `R_v${version}`;\r\n // User Agent\r\n const uaHash = stringHash(navigator.userAgent);\r\n axios.defaults.headers.common['X-Client-ID'] = uaHash;\r\n};\r\n\r\n\r\n// --------- WAX\r\n\r\nexport const verifyWaxUser = async ({ username }) => {\r\n console.debug('[vwu] Starting verification for', username);\r\n // ## NONCE\r\n let nonceResponse;\r\n try {\r\n isTestnet && console.debug('[vwu] getting nonce for', username);\r\n nonceResponse = await client.post(`/api/auth/getNonce`, { waxAddress: username });\r\n } catch (err) {\r\n failureHandler({ reason: 'caught-getnonce', err});\r\n return ({ err: 'error-getting-nonce' });\r\n }\r\n const nonce = nonceResponse.data.nonce;\r\n isLocal && console.debug('[vwu] getting tx data:', { nonce, username });\r\n const tx = authClient.getTransactionData(nonce, username);\r\n let result;\r\n // ## SIGNATURE 1\r\n try {\r\n result = await UserService.session.signTransaction(tx.data, tx.options);\r\n } catch (err) {\r\n console.error('[vwu] Error signing:', { nonce, tx, err });\r\n nukeAnchorSavedAccount();\r\n return ({ err: 'error-signing-tx' });\r\n }\r\n // ## VERIFY (BACKEND)\r\n const proof = {\r\n serializedTransaction: result.transaction.serializedTransaction,\r\n signatures: result.transaction.signatures\r\n };\r\n const payload = { proof, waxAddress: username, nonce };\r\n let verificationResult;\r\n try {\r\n isTestnet && console.debug('<><> verifying sig');\r\n addDefaultHeaders(); // applied to all API calls from now on\r\n verificationResult = await client.post(`/api/auth/verify`, payload);\r\n } catch (err) {\r\n failureHandler({ reason: 'caught-verify', err});\r\n return ({ err: 'error-verify-call' });\r\n }\r\n isLocal && console.debug('[vu] Verification result', verificationResult);\r\n if (verificationResult.data.result !== 'success') {\r\n failureHandler({ reason: '401-result', err: 'verification response is not success' });\r\n return ({ err: 'verify-call-failed' });\r\n }\r\n // ## LOGIN SUCCESS ACTIONS\r\n const headerValue = `Bearer ${verificationResult.data.token}`;\r\n axios.defaults.headers.common['Authorization'] = headerValue;\r\n setBridgeToken({ headerValue, username });\r\n sessionStorage.setItem('verified', Date.now());\r\n isLocal && console.log('Wax user correctly authenticated!'); // toast.success\r\n return ({});\r\n};\r\n\r\n\r\n// ----------- Used for HIVE, SKL, ETH. For Wax double signature crap.\r\n\r\nexport const verifyUserIdentity = async ({ username, message, signed_message, chainLogin }) => {\r\n // ## VERIFY (message already signed)\r\n addDefaultHeaders(); // applied to all API calls from now on\r\n const resUserSigVerify = await client.post('/api/auth/verify',\r\n { username, message, signed_message },\r\n );\r\n if (resUserSigVerify.status !== 200 || resUserSigVerify.data.result !== 'success') {\r\n failureHandler({ reason: 'verify-ko', err: resUserSigVerify });\r\n }\r\n // ## LOGIN SUCCESS ACTIONS\r\n // - Axios Auth header\r\n const headerValue = `Bearer ${resUserSigVerify.data.token}`;\r\n axios.defaults.headers.common['Authorization'] = headerValue;\r\n // - Unity\r\n setBridgeToken({ headerValue, username });\r\n // - Browser Storage\r\n sessionStorage.setItem('verified', Date.now());\r\n localStorage.setItem(`${chainLogin}Username`, username);\r\n\r\n isLocal && console.log(`${chainLogin} user correctly authenticated!`); // toast.success\r\n return true;\r\n};\r\n","import { extractNftsInfo, groupHotNfts } from './extractNfts';\r\nimport { nap } from '../../../generalUtils/utils';\r\nimport { get } from 'lodash';\r\nimport { isLocal } from '../../../constants/envs';\r\n\r\n\r\nexport const fetchInventory = async (waxAccountName) => {\r\n try {\r\n return fetch(`https://wax.api.atomicassets.io/atomicassets/v1/assets?collection_name=crypto4shots&owner=${\r\n waxAccountName\r\n }&page=1&limit=100&order=desc&sort=asset_id`,\r\n {\r\n headers: {\r\n accept: 'application/json',\r\n 'cache-control': 'no-cache',\r\n pragma: 'no-cache',\r\n 'sec-fetch-dest': 'empty',\r\n 'sec-fetch-mode': 'cors',\r\n 'sec-fetch-site': 'cross-site',\r\n 'sec-gpc': '1',\r\n },\r\n referrer: 'https://wax.bloks.io/',\r\n referrerPolicy: 'strict-origin-when-cross-origin',\r\n body: null,\r\n method: 'GET',\r\n mode: 'cors',\r\n credentials: 'omit',\r\n })\r\n .then(res => res.json())\r\n .then(async (result) => {\r\n let nftsArr = result.data;\r\n if (nftsArr.length === 0) {\r\n // const isOk = window.confirm('It looks like you dont have the NFTs required to play. Want to purchase them from AtomicHub?');\r\n // if (isOk) window.open('https://wax.atomichub.io/market?collection_name=crypto4shots&order=asc&schema_name=cs.startpack&sort=price&symbol=WAX', '_blank');\r\n }\r\n const responseOwner = get(result, 'data[0].owner');\r\n if (responseOwner && responseOwner !== waxAccountName) {\r\n console.error('Account mismatch:', responseOwner, waxAccountName);\r\n nftsArr = []; // need to empty because otherwise it has another account data (yeh wtf)\r\n }\r\n const { currentAssets, ignoredItems } = extractNftsInfo({ nftsArr, waxAccountName });\r\n let additionalCsAssets = [];\r\n let additionalIgnored = [];\r\n console.debug(`CS NFTs in reply: ${nftsArr.length}`);\r\n if (nftsArr.length === 100) {\r\n await nap(window.ahCors ? 3000 : 500);\r\n const { err, res } = await fetchAdditionalPage({ page: 2, waxAccountName }); // eslint-disable-line no-use-before-define\r\n if (err) return ({ err });\r\n additionalCsAssets = res.additionalCsAssets;\r\n additionalIgnored = res.additionalIgnored;\r\n }\r\n const csNfts = [...currentAssets, ...additionalCsAssets];\r\n const hotNfts = groupHotNfts([...ignoredItems, ...additionalIgnored]); // { home: 2, sweet: 1 }\r\n window.ahCors = false;\r\n console.debug(`Unique NFT types in cooldown: ${Object.keys(hotNfts).length}`);\r\n return ({ csNfts, hotNfts });\r\n })\r\n .catch((err) => {\r\n console.error('>>>>>>>> WAX initial retrieve error:', err);\r\n window.ahCors = true;\r\n return ({ err });\r\n });\r\n } catch (err) {\r\n console.error('Fetch ext caught:', err);\r\n window.ahCors = true;\r\n }\r\n};\r\n\r\nconst fetchAdditionalPage = ({ page, waxAccountName }) => {\r\n console.debug(`Fetching page ${page} for ${waxAccountName}'s assets`);\r\n try {\r\n return fetch(`https://wax.api.atomicassets.io/atomicassets/v1/assets?collection_name=crypto4shots&owner=${\r\n waxAccountName\r\n }&page=${page}&limit=100&order=desc&sort=asset_id`, {\r\n headers: {\r\n accept: 'application/json',\r\n 'sec-ch-ua': '\"Microsoft Edge\";v=\"93\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"93\"',\r\n 'sec-ch-ua-mobile': '?0',\r\n 'sec-ch-ua-platform': '\"Windows\"',\r\n 'sec-fetch-dest': 'empty',\r\n 'sec-fetch-mode': 'cors',\r\n 'sec-fetch-site': 'cross-site',\r\n },\r\n referrer: 'https://wax.bloks.io/',\r\n referrerPolicy: 'strict-origin-when-cross-origin',\r\n body: null,\r\n method: 'GET',\r\n mode: 'cors',\r\n credentials: 'omit',\r\n })\r\n .then(res => res.json()).then(async (result) => {\r\n const nftsArr = result.data;\r\n let additionalCsAssets = [];\r\n let additionalIgnored = [];\r\n if (nftsArr.length === 100) {\r\n if (page === 51) return ({ err: 'More than 5000 NFTs???' });\r\n await nap(window.ahCors ? 3000 : 500);\r\n const { err, res } = await fetchAdditionalPage({ page: page + 1, waxAccountName });\r\n if (err) return ({ err });\r\n additionalCsAssets = res.additionalCsAssets;\r\n additionalIgnored = res.additionalIgnored;\r\n }\r\n const { currentAssets, ignoredItems } = extractNftsInfo({ nftsArr, waxAccountName });\r\n console.debug(`Page ${page} of NFTs:`, currentAssets.length);\r\n const csNfts = [...currentAssets, ...additionalCsAssets];\r\n return ({ res: {\r\n additionalCsAssets: csNfts,\r\n additionalIgnored: [...ignoredItems, ...additionalIgnored],\r\n } });\r\n })\r\n .catch((err) => {\r\n console.error(`>>>>>>>> WAX error for page ${page}:`, err);\r\n window.ahCors = true;\r\n return ({ err });\r\n });\r\n } catch (err) {\r\n console.error('Fetch ext caught:', err);\r\n window.ahCors = true;\r\n }\r\n};\r\n\r\n\r\n// ALTERNATIVE WAY OF FETCHING NFTS ---------------------------------------------------\r\n\r\nconst { ExplorerApi } = require('atomicassets'); // NFTs lookup!\r\n\r\n// https://test.wax.api.atomicassets.io\r\nconst nftsLookupNodes = [\r\n 'https://wax.api.atomicassets.io',\r\n];\r\n\r\nlet nftsClient;\r\n\r\n// https://www.npmjs.com/package/atomicassets\r\nconst getNFTsClient = () => {\r\n if (nftsClient && Math.random() > 0.5) return nftsClient;\r\n const randId = Math.floor(Math.random() * nftsLookupNodes.length);\r\n const waxNode = nftsLookupNodes[randId];\r\n nftsClient = new ExplorerApi(waxNode, 'atomicassets', { fetch });\r\n return nftsClient;\r\n};\r\nwindow.getNFTsClient = getNFTsClient; // TEMP\r\n\r\n// #### NFTS LOOKUP\r\n\r\nconst fetchWaxNfts = async ({ waxAddr }) => {\r\n isLocal && console.log('Loading nft asset_ids for wallet', waxAddr);\r\n const api = getNFTsClient();\r\n const waxNfts = await api.getAssets({ owner: waxAddr });\r\n isLocal && console.log('Fetched::::', JSON.stringify(waxNfts[0], null, 2));\r\n return ({ waxNfts });\r\n};\r\n","import countWords from 'count-words';\r\nimport { get } from 'lodash';\r\nimport { isTestnet } from '../../../constants/envs';\r\nimport { ITEMS_BY_CATEGORY } from '../../../constants/templateIds';\r\n\r\nimport { checkIsNewUser, shouldNewItemBeSkipped } from \"./cooldownUtils\";\r\n\r\n\r\nexport const groupHotNfts = (hotNfts = []) => {\r\n const hotNftsStr = hotNfts.map(el => el.replace(/,/g, '').replace(/-/g, '_').replace(/ /g, '_')).join(', ');\r\n const groupedItems = countWords(hotNftsStr, true); // { home: 2, sweet: 1 }\r\n const result = {};\r\n Object.keys(groupedItems).forEach((item) => {\r\n result[item.replace(/_/g, ' ')] = groupedItems[item];\r\n });\r\n return result;\r\n};\r\n\r\nconst keywordsOfFaultyNfts = [' cell', ' shield', ' condenser'];\r\nconst isDuplicatedName = (name = '') => !!keywordsOfFaultyNfts.find(\r\n keyword => name.toLowerCase().includes(keyword),\r\n);\r\n\r\nexport const extractNftsInfo = ({ nftsArr, waxAccountName }) => {\r\n const isNewUser = checkIsNewUser(waxAccountName);\r\n const ignoredItems = [];\r\n const currentAssets = nftsArr.map((item = {}) => {\r\n const {\r\n asset_id, name = 'n/a', minted_at_block = -1, template = {}, data = {},\r\n transferred_at_time, minted_at_time, schema: schemaObj = {},\r\n } = item;\r\n if (name === 'n/a') console.debug('==== NO NAME NFT:', { item });\r\n const { schema_name: schema = '' } = schemaObj;\r\n const { template_id = -1 } = (template || {});\r\n const scholarId = ITEMS_BY_CATEGORY.SCHOLARSHIPS.STU.ID;\r\n const teacherId = ITEMS_BY_CATEGORY.SCHOLARSHIPS.TEA.ID;\r\n isTestnet && (template_id === scholarId || template_id === teacherId)\r\n && console.debug('> scholarship metadata:', { item });\r\n if (shouldNewItemBeSkipped({ asset_id, isNewUser, template_id, transferred_at_time, minted_at_time })) {\r\n ignoredItems.push(item.name || 'mysterious-nft-with-no-name');\r\n return null; // then filtered below\r\n }\r\n const { img, rarity = 'n/a', customField = '', } = (data || {});\r\n const ownersCut = +get(data, 'keeps %') || '';\r\n const partnersWaxAddr = get(data, 'partner\\'s address', '');\r\n // isLocal && console.debug(`[D].1. ${waxAccountName} NFT found:`, { name, asset_id, template_id });\r\n const uniqueNameForNft = isDuplicatedName(name) ? `${name} (${rarity})` : name;\r\n return ({\r\n asset_id, name: uniqueNameForNft, minted_at_block,\r\n template_id,\r\n schema,\r\n img: img ? `https://gateway.pinata.cloud/ipfs/${img}` : '',\r\n s3Img: (schema && name)\r\n ? `https://play.crypto-shots.com/nft-images/wax/${getWaxNftPathS3({ schema, name, template_id })}`\r\n : '',\r\n rarity,\r\n scholarship: partnersWaxAddr && ({ partnersWaxAddr, ownersCut, customField }),\r\n });\r\n }).filter(elem => !!elem);\r\n return ({ currentAssets, ignoredItems });\r\n};\r\n\r\n\r\nexport const getWaxNftPathS3 = ({ schema, name, template_id: tid }) => {\r\n let fluidName = name;\r\n // NAME CLASHES WAX:\r\n // energy cell - eg. Energy_Cell_-_Common.gif\r\n if (fluidName.includes('Energy Cell')) {\r\n fluidName = `${fluidName} - ${cellRarity(tid)}`;\r\n }\r\n // shield - eg. Energy_Shield_-_Common.gif\r\n else if (fluidName.includes('Energy Shield')) {\r\n fluidName = `${fluidName} - ${shieldRarity(tid)}`;\r\n }\r\n // condenser - eg. Energy_Condenser_-_Common.gif\r\n else if (fluidName.includes('Energy Condenser')) {\r\n fluidName = `${fluidName} - ${condenserdRarity(tid)}`;\r\n }\r\n // cyber girls - eg. \"KarinaYana_-_GPT_Cybergirl_-_February.gif\"\r\n else if (fluidName.endsWith('GPT Cybergirl')) {\r\n fluidName = `${fluidName} - ${cyberMonth(tid)}`;\r\n }\r\n // SPACES INTO UNDERSCORES\r\n fluidName = fluidName.replace(/ /g, '_');\r\n // SPECIAL CHARS : -> _\r\n fluidName = fluidName.replace(/:/g, '_');\r\n // , -> _\r\n fluidName = fluidName.replace(/,/g, '_');\r\n // % INTO %25\r\n fluidName = fluidName.replace('%', '%25');\r\n // # INTO %23\r\n fluidName = fluidName.replace('#', '%23');\r\n // ’ into \r\n fluidName = fluidName.replace('’', '\\'');\r\n // n/a into undefined\r\n fluidName = fluidName.replace('n/a', 'undefined');\r\n // res\r\n return `${schema}/${fluidName}.gif`;\r\n};\r\n\r\n\r\nconst cellRarity = (tid) => {\r\n switch (tid) {\r\n case '403688': return 'Common';\r\n case '391901': return 'Rare';\r\n case '403690': return 'Epic';\r\n default: return '';\r\n }\r\n};\r\nconst shieldRarity = (tid) => {\r\n switch (tid) {\r\n case '403685': return 'Common';\r\n case '403686': return 'Rare';\r\n case '403687': return 'Epic';\r\n default: return '';\r\n }\r\n};\r\nconst condenserdRarity = (tid) => {\r\n switch (tid) {\r\n case '403681': return 'Common';\r\n case '403683': return 'Rare';\r\n case '403684': return 'Epic';\r\n default: return '';\r\n }\r\n};\r\n\r\n\r\nconst cyberMonth = (tid) => {\r\n const { CYBERGIRLS = {} } = ITEMS_BY_CATEGORY;\r\n const { NAME = '' } = Object.values(CYBERGIRLS)\r\n .find(({ ID }) => ID === tid) || {};\r\n const month = NAME.split(' ').pop();\r\n return month;\r\n};\r\n","import { MINTER_ACCOUNT } from '../../../config/contractNames';\r\nimport { WAX_NODES } from '../../../config/endpoints';\r\nimport { isLocal, isTestnet } from '../../../constants/envs';\r\nimport { ITEMS_BY_CATEGORY } from '../../../constants/templateIds';\r\n\r\n\r\nconst PRICES_CACHED_MINS = 15;\r\nconst PRICES_CACHE_DURATION_MS = PRICES_CACHED_MINS * 60 * 1000;\r\n\r\nlet fetchEndpoint = WAX_NODES.DEFAULT;\r\nconst fallbackEndpoints = WAX_NODES.ALTS;\r\n\r\n\r\nconst pricesCache = {\r\n lastFetch: Date.now(),\r\n rowsObj: {\r\n // '365485': 30, // template_id, boom_price\r\n // '385499': 100, // template_id, boom_price\r\n },\r\n};\r\n\r\n// ---- FOR MAINNET ONLY -----\r\n// !!!! -- here due to CORS issues --\r\n// const hardcodedPrices = {\r\n// '365485': 30, // Base Gun\r\n// '385499': 100, // Shotgun\r\n// };\r\n// if (!isTestnet) {\r\n// pricesCache.rowsObj = hardcodedPrices;\r\n// pricesCache.lastFetch = Date.now();\r\n// return ({ rowsObj: pricesCache.rowsObj });\r\n// }\r\nlet priceFetchFailed = false;\r\n\r\nconst fetchPrices = async () => {\r\n return fetch(\r\n `${fetchEndpoint}/v1/chain/get_table_rows`,\r\n {\r\n \"headers\": {\r\n \"Content-Type\": \"application/x-www-form-urlencoded\",\r\n },\r\n \"body\": JSON.stringify({\r\n \"json\": true,\r\n \"code\": MINTER_ACCOUNT,\r\n \"scope\": MINTER_ACCOUNT,\r\n \"table\": \"marketplace\",\r\n \"lower_bound\": null,\r\n \"upper_bound\": null,\r\n \"index_position\": 1,\r\n \"key_type\": \"\",\r\n \"limit\": \"100\",\r\n \"reverse\": false,\r\n \"show_payer\": false,\r\n }),\r\n \"method\": \"POST\",\r\n },\r\n )\r\n .then(res => res.json())\r\n .then((data) => {\r\n isLocal && console.log('Marketplace rows:', { size: data.rows.length, data: data.rows });\r\n data.rows.forEach((row) => {\r\n pricesCache.rowsObj[`${row.template_id}`] = +row.cost;\r\n });\r\n pricesCache.lastFetch = Date.now();\r\n isLocal && console.log('Cached prices:', pricesCache);\r\n return ({ rowsObj: pricesCache.rowsObj });\r\n })\r\n .catch((err) => {\r\n console.error('Caught error fetching prices:', err);\r\n const endpoints = fallbackEndpoints;\r\n const randId = Math.floor(Math.random() * endpoints.length);\r\n fetchEndpoint = endpoints[randId];\r\n priceFetchFailed = true;\r\n return ({ err });\r\n });\r\n};\r\n// INITIAL FETCH !\r\nfetchPrices();\r\n\r\n\r\nexport const getCachedPrices = async ({ idsOnly = false } = {}) => {\r\n // Template ids only\r\n const allTemplateIds = Object.keys(pricesCache.rowsObj);\r\n const adjustedTemplateIds = isTestnet\r\n ? allTemplateIds.map(template => templateReplacement({ testnetTemplate: template }))\r\n : allTemplateIds;\r\n // isLocal && console.log('Available items:', { adjustedAvailableItems: adjustedTemplateIds });\r\n if (idsOnly) return adjustedTemplateIds;\r\n // All data\r\n const noRows = allTemplateIds.length === 0;\r\n if (priceFetchFailed) return ({ err: 'initial fetch failed, not bombing int' });\r\n let err;\r\n if (noRows || ((Date.now() - pricesCache.lastFetch) > PRICES_CACHE_DURATION_MS)) {\r\n if (noRows && pricesCache.loading) return { rowsObj: {} };\r\n pricesCache.loading = true;\r\n const res = await fetchPrices();\r\n err = res.err;\r\n delete pricesCache.loading;\r\n }\r\n return ({ err, rowsObj: pricesCache.rowsObj });\r\n};\r\n\r\n\r\nexport const templateReplacement = ({ testnetTemplate, mainnetTemplate }) => {\r\n if (!isTestnet) { throw new Error('Why are you using the template replacement on mainnet?!'); }\r\n if (testnetTemplate && mainnetTemplate) {\r\n throw new Error('Provide either the testnet OR the mainnet template id, not both');\r\n }\r\n if (mainnetTemplate) {\r\n if (`${mainnetTemplate}` === ITEMS_BY_CATEGORY.WEAPONS.BG.ID) return '280338'; // BG\r\n else if (`${mainnetTemplate}` === ITEMS_BY_CATEGORY.WEAPONS.LS.ID) return '338061'; // LS\r\n } else {\r\n if (`${testnetTemplate}` === '280338') return ITEMS_BY_CATEGORY.WEAPONS.BG.ID; // BG\r\n else if (`${testnetTemplate}` === '338061') return ITEMS_BY_CATEGORY.WEAPONS.LS.ID; // LS\r\n }\r\n return testnetTemplate || mainnetTemplate;\r\n};\r\n\r\nexport const getItemPrice = async ({ templateId }) => {\r\n const { rowsObj = {}, err } = await getCachedPrices();\r\n if (Object.keys(rowsObj).length === 0) return 'n/a';\r\n if (isTestnet) {\r\n templateId = templateReplacement({ mainnetTemplate: templateId });\r\n }\r\n const price = +rowsObj[`${templateId}`];\r\n if (!price) {\r\n // console.error('Unexpected price:', { templateId, rowsObj });\r\n }\r\n return ({ err, price });\r\n};\r\n","import Swal from \"sweetalert2\";\r\nimport { DEFAULT_CUT_SCHOLAR, DEFAULT_CUT_TEACHER } from \"../../../config/appConfig\";\r\nimport { isTestnet } from \"../../../constants/envs\";\r\nimport { CATEGORIES_BY_ITEM, ITEMS_BY_CATEGORY } from \"../../../constants/templateIds\";\r\nimport { blacklistedUsers } from \"../../../generalUtils/secure\";\r\nimport { nap } from \"../../../generalUtils/utils\";\r\nimport { fetchInventory } from \"./fetchInventory\";\r\nimport { getItemPrice } from \"./marketplacePrices\";\r\n\r\n\r\nconst { SCHOLARSHIPS } = ITEMS_BY_CATEGORY;\r\nconst msInOneDay = 24 * 60 * 60 * 1000;\r\n\r\nconst getInfoCustomField = ({ customField }) => {\r\n if (customField.length < 3) return ({});\r\n try {\r\n const parsedJson = JSON.parse(customField.trim());\r\n const {\r\n scholarKeepsNfts = false, scholarPreviousBoomStake = 0, expiration = {},\r\n } = parsedJson;\r\n const { startTs = 0, durationDays = 0 } = expiration;\r\n const expirationTs = startTs + (durationDays * msInOneDay);\r\n const expiresInMs = expirationTs && (expirationTs - Date.now());\r\n isTestnet && console.debug('Scholarship custom fields:', { scholarKeepsNfts, scholarPreviousBoomStake, expiresInMs });\r\n return ({ scholarKeepsNfts, scholarPreviousBoomStake, expiresInMs });\r\n } catch (err) {\r\n console.error('Something broke extracting info from custom field:', err);\r\n return ({});\r\n }\r\n};\r\n\r\n\r\nconst hasOneScholarNft = ({ csNfts: firstRoundNfts }) => {\r\n const scholarNfts = firstRoundNfts.filter(nft => nft.template_id === SCHOLARSHIPS.STU.ID);\r\n if (scholarNfts.length > 1) {\r\n Swal.fire({text: 'CAN ONLY HAVE ONE SCHOLAR NFT'}); // plus webhook\r\n throw new Error('more than one scholar nft');\r\n }\r\n const scholarNft = scholarNfts[0];\r\n if (!scholarNft) return ({});\r\n const { partnersWaxAddr, ownersCut, customField } = scholarNft.scholarship || {};\r\n const { scholarKeepsNfts, scholarPreviousBoomStake, expiresInMs } = getInfoCustomField({ customField });\r\n if (expiresInMs && expiresInMs < 0) {\r\n Swal.fire({text: 'This scholarship account is expired, please burn your Scholarship NFT'});\r\n throw new Error('expired-scholarship');\r\n }\r\n isTestnet && console.debug('Scholarship custom fields:', { scholarNft });\r\n const scholarCut = Math.max(DEFAULT_CUT_SCHOLAR, ownersCut || DEFAULT_CUT_SCHOLAR); // no 50/50 old scholarships\r\n return ({\r\n teacherName: partnersWaxAddr.trim(), scholarCut,\r\n scholarKeepsNfts, scholarPreviousBoomStake,\r\n });\r\n};\r\n\r\nconst hasOneTeacherNft = ({ csNfts: teacherNfts }) => {\r\n const teachNfts = teacherNfts.filter(nft => nft.template_id === SCHOLARSHIPS.TEA.ID);\r\n if (teachNfts.length > 1) {\r\n Swal.fire({text: 'CAN ONLY HAVE ONE TEACHER NFT'}); // plus webhook\r\n throw new Error('more than one teacher nft');\r\n }\r\n const teacherNft = teachNfts[0];\r\n if (!teacherNft) return ({});\r\n const { partnersWaxAddr, ownersCut, customField } = teacherNft.scholarship || {};\r\n const { scholarKeepsNfts, scholarPreviousBoomStake, expiresInMs } = getInfoCustomField({ customField });\r\n if (expiresInMs && expiresInMs < 0) {\r\n Swal.fire({text: 'This scholarship account is expired, please burn your Scholarship NFT'});\r\n throw new Error('expired-scholarship');\r\n }\r\n isTestnet && console.debug('Scholarship custom fields:', { teacherNft });\r\n const teacherCut = Math.min(DEFAULT_CUT_TEACHER, ownersCut || DEFAULT_CUT_TEACHER); // no 50/50 old scholarships\r\n return ({\r\n scholarName: partnersWaxAddr.trim(), teacherCut,\r\n scholarKeepsNfts, scholarPreviousBoomStake,\r\n });\r\n};\r\n\r\n\r\nexport const processInventory = async ({ username }) => {\r\n let scholarship = null;\r\n let teacherNameLs = localStorage.getItem('b055');\r\n // ## Fetch inventory\r\n isTestnet && console.log(`Fetching NFTs for ${username}. Is teacher (from LS) -> ${!!teacherNameLs}`);\r\n if (blacklistedUsers[teacherNameLs]) { teacherNameLs = ''; }\r\n let { csNfts, hotNfts, err } = await fetchInventory(teacherNameLs || username);\r\n if (err) {\r\n console.error('Inventory fetch:', err);\r\n Swal.fire({text: 'Inventory check failed, please try again.\\nIf this persists try changing your IP address.\\nIf all still fails it may be a temporary issue with Wax. Hang in there!'});\r\n return ({ err: 'inventory-check-fail' }); // TODO: analytics\r\n }\r\n // ## Anti cheat - in case they put it in the LS\r\n if (teacherNameLs) {\r\n const { scholarName } = hasOneTeacherNft({ csNfts });\r\n if (scholarName !== username) {\r\n console.error('Account reported - LS teacher but no student nft', { scholarName, username });\r\n localStorage.removeItem('b055');\r\n const isWaxLogin = localStorage.getItem('chainLogin') === 'wax';\r\n isWaxLogin && Swal.fire({text: 'Stale data from your Scholar account, please try again.'});\r\n return ({ err: 'ls-teacher-inventory-but-no-student' }); // TODO: discord notification\r\n }\r\n }\r\n // ## Check if he's a Teacher -----------------------------------\r\n isTestnet && console.log('Checking if it has TEACHER NFT');\r\n const {\r\n scholarName, teacherCut,\r\n scholarKeepsNfts: skn1, scholarPreviousBoomStake: spbs1,\r\n } = hasOneTeacherNft({ csNfts });\r\n if (scholarName) {\r\n isTestnet && console.log('YEP, HAS TEACHER NFT.', { scholarName, teacherCut });\r\n scholarship = { isTeacher: true, scholarName, teacherCut };\r\n if (skn1) { scholarship.scholarKeepsNfts = !!skn1 }\r\n if (spbs1) { scholarship.scholarPreviousBoomStake = +spbs1 }\r\n }\r\n // ## Check if he's Scholar ----------------------------------------\r\n // Teacher not in LS -> it could be scholar first time or new browser\r\n isTestnet && console.log('Checking if it has SCHOLAR NFT');\r\n const {\r\n teacherName: teacherNameNft, scholarCut,\r\n scholarKeepsNfts: skn2, scholarPreviousBoomStake: spbs2,\r\n } = hasOneScholarNft({ csNfts });\r\n const isTeacherBlacklisted = blacklistedUsers[teacherNameLs];\r\n if (isTeacherBlacklisted) {\r\n Swal.fire({text: 'Your teacher is blacklisted. Burn your scholar NFT.'});\r\n return;\r\n }\r\n if (teacherNameNft) {\r\n isTestnet && console.log('YEP, HAS SCHOLAR NFT. Re-fetching.', { teacherNameNft, scholarCut });\r\n await nap(3000);\r\n const {\r\n csNfts: teachersNfts, hotNfts: teacherHotNfts,\r\n err: teacherErr,\r\n } = await fetchInventory(teacherNameNft);\r\n if (teacherErr) {\r\n console.error('Teacher inventory fetch:', err);\r\n Swal.fire({text: 'Teacher inventory check failed, please try again.'});\r\n return ({ err: 'teacher-inventory-check-fail' }); // TODO: analytics\r\n }\r\n // verify teacher still has this scholar\r\n isTestnet && console.log('Verifying that TEACHER still has this SCHOLAR..');\r\n const { scholarName } = hasOneTeacherNft({ csNfts: teachersNfts });\r\n if (!scholarName) {\r\n console.error('Account reported - The TEACHER account does not have this SCHOLAR..');\r\n return ({ err: 'using-teacher-inventory-but-no-student' }); // TODO: warning hook\r\n } else if (scholarName !== username) {\r\n console.error('Account reported - The TEACHER has a different SCHOLAR', { scholarName, username });\r\n return ({ err: 'using-teacher-inventory-but-different-student' }); // TODO: warning hook\r\n }\r\n csNfts = teachersNfts;\r\n hotNfts = teacherHotNfts;\r\n localStorage.setItem('b055', teacherNameNft);\r\n isTestnet && console.log(`Done. Using ${csNfts.length} teacher NFTs.`);\r\n }\r\n const teacher = teacherNameLs || teacherNameNft;\r\n if (teacher) {\r\n isTestnet && console.log('Using TEACHER NFTs.', { teacher, teacherCut });\r\n scholarship = {\r\n isScholar: true, teacherName: teacher,\r\n scholarCut: scholarCut || (100 - teacherCut),\r\n };\r\n if (skn2) { scholarship.scholarKeepsNfts = !!skn2 }\r\n if (spbs2) { scholarship.scholarPreviousBoomStake = +spbs2 }\r\n }\r\n\r\n // ## PRICES AND CATEGORIES\r\n isTestnet && console.log('Getting prices and categories..');\r\n for (let id = 0; id < csNfts.length; id++) {\r\n const currentNft = csNfts[id];\r\n const { template_id: template } = currentNft;\r\n // Insert price\r\n const { price } = await getItemPrice({ templateId: template });\r\n currentNft.price = price;\r\n // Insert category\r\n const currentCategory = CATEGORIES_BY_ITEM[template];\r\n if (!currentCategory) {\r\n console.log('Found item without category :::::::::::::::::::--+>', currentNft);\r\n }\r\n currentNft.category = currentCategory || 'OTHERS';\r\n }\r\n\r\n // TEST @@@@@@@@@@@@@@@\r\n // scholarship = {\r\n // // SCHOLAR\r\n // isScholar: true, teacherName: 'csteknopolly',\r\n // scholarCut: 0.4 || (100 - teacherCut),\r\n // // TEACHER\r\n // isTeacher: true, scholarName: 'crypto5shots',\r\n // teacherCut: 0.6,\r\n // };\r\n // TEST @@@@@@@@@@@@@@@\r\n isTestnet && console.log('Scholarship state for redux -_-_-_-_-_-_:', { scholarship });\r\n\r\n // Result\r\n return ({ csNfts, hotNfts, scholarship });\r\n};\r\n","\r\nconst BEACON_URL_HE = 'https://beacon.peakd.com/api/he/nodes';\r\n\r\n// testnet: 'https://enginetestnet.rishipanthee.com/contracts'\r\nconst FALLBACK_NODE = 'https://engine.hive.pizza';;\r\n\r\nconst REQUIRED_FEATURES = ['is_full'];\r\n\r\nconst VERBOSE = true;\r\n\r\n\r\nconst withPath = (url) => `${url}/contracts`;\r\n\r\n\r\nexport const findHealthyNode = async () => {\r\n const response = await fetch(BEACON_URL_HE);\r\n if (!response.ok) {\r\n console.error(`Failed to fetch node data: ${response.status} ${response.statusText}`);\r\n return withPath(FALLBACK_NODE);\r\n }\r\n const data = await response.json();\r\n VERBOSE && console.log('[he-nfts] Beacon health response:', data);\r\n const validNodes = data.filter((node = {}) => {\r\n if (node.fail !== 0) return false;\r\n if (!Array.isArray(node.features)) return false;\r\n return REQUIRED_FEATURES.every((feature) => node.features.includes(feature));\r\n });\r\n\r\n // We pick the first valid node whose endpoint responds successfully, else try the next\r\n const nodesToCheck = [{ endpoint: FALLBACK_NODE }, ...validNodes];\r\n for (const node of nodesToCheck) {\r\n const url = node?.endpoint;\r\n VERBOSE && console.log('[he-nfts] Double checking health status for', url);\r\n try {\r\n const testRes = await fetch(url);\r\n if (testRes.ok) {\r\n // We found a healthy node\r\n return withPath(url);\r\n }\r\n } catch (err) {\r\n console.warn(`Request failed for ${url}, trying next...`);\r\n }\r\n }\r\n\r\n console.error('No healthy node found among the available options from', BEACON_URL_HE);\r\n return withPath(FALLBACK_NODE);\r\n};\r\n","// \"@hiveio/hive-js\": \"2.0.4\",\r\nimport hive from '@hiveio/hive-js';\r\nimport stringHash from 'string-hash';\r\nimport { get } from 'lodash';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { client } from '../../../helpers/client';\r\nimport { setRandNode } from '../../../generalUtils/hiveData/reader';\r\nimport Swal from 'sweetalert2';\r\nimport { findHealthyNode } from '../../../generalUtils/hiveData/healthyHeNodes';\r\n\r\n\r\nconst hiveAmount = isLocal ? (localStorage.getItem('linkPrice') || '0.001') : '1.000';\r\nexport const LINKING_COST = `${hiveAmount} HIVE`;\r\nexport const LINKING_RECIPIENT = 'cryptoshots.nft';\r\nexport const HEAD = '[';\r\nexport const TAIL = ':CRYPTO-SHOTS]'; // eg. [5cfb2162f026880e05fe97da8fb018dac0c55d78:CRYPTO-SHOTS]\r\n\r\n\r\n// ## WAX\r\n\r\nconst retrieveWaxBio = async ({ waxAddr }) => {\r\n isLocal && console.log('Checking wax account bio:', waxAddr);\r\n return fetch('https://wax.pink.gg/v1/chain/get_table_rows', {\r\n headers: {\r\n accept: '*/*',\r\n 'accept-language': 'en-GB,en;q=0.9,en-US;q=0.8',\r\n 'content-type': 'text/plain;charset=UTF-8',\r\n 'sec-ch-ua': '\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Microsoft Edge\";v=\"92\"',\r\n 'sec-ch-ua-mobile': '?0',\r\n 'sec-fetch-dest': 'empty',\r\n 'sec-fetch-mode': 'cors',\r\n 'sec-fetch-site': 'cross-site',\r\n },\r\n referrer: 'https://wax.atomichub.io/',\r\n referrerPolicy: 'strict-origin-when-cross-origin',\r\n body: `{\"code\":\"atomhubtools\",\"table\":\"acctexts\",\"scope\":\"${waxAddr\r\n }\",\"lower_bound\":\"description\",\"upper_bound\":\"description\",\"limit\":1,\"json\":true}`,\r\n method: 'POST',\r\n mode: 'cors',\r\n credentials: 'omit',\r\n })\r\n .then(res => res.json())\r\n .then((data) => {\r\n isLocal && console.log('wax bio data:', data);\r\n // WAX account existance check\r\n const { code } = data;\r\n if (code) {\r\n const errCode = get(data.error, 'code');\r\n if (errCode === 3010000) return ({ invalidAcc: true });\r\n }\r\n // WAX account found\r\n const bio = get(data, 'rows[0].value', '');\r\n const hasHiveTx = bio.includes(TAIL);\r\n if (!hasHiveTx) return ({});\r\n const part = bio.split(HEAD)[1];\r\n const foundTx = part && part.split(TAIL)[0];\r\n isLocal && console.log('Found tx:', foundTx);\r\n return ({ foundTx });\r\n })\r\n .catch((err) => {\r\n console.error('>>>>>>>> BIO error:', err);\r\n return ({ errWaxBio: err });\r\n });\r\n};\r\n\r\nconst fetchAtomicProfile = async ({ waxAddr }) => {\r\n const { invalidAcc, errWaxBio, foundTx } = await retrieveWaxBio({ waxAddr });\r\n if (invalidAcc) {\r\n Swal.fire({text: 'It looks like the WAX wallet in use does not exist?'});\r\n return ({ err: 'account-404' });\r\n }\r\n if (errWaxBio) {\r\n Swal.fire({text: `Oops, unable to read your Hive account. Please try again in a bit.`});\r\n return ({ err: 'wax-ko' });\r\n }\r\n if (foundTx) return ({ foundTx });\r\n return ({});\r\n};\r\n\r\nexport const tokenInMemo = (waxAddr) => {\r\n if (isLocal && !localStorage.getItem('linkPrice')) return 'blahblahtoken';\r\n const hash = stringHash(waxAddr);\r\n const expectedToken = `${btoa(hash).replace(/=/g, '')}.${`${+hash * 2}`.substr(0, 3)}`;\r\n return expectedToken;\r\n};\r\n\r\n\r\n// ## HIVE\r\n\r\nconst isInvalidStudent = ({ student, teacher }) => {\r\n // not same account\r\n if (student === teacher) {\r\n Swal.fire({text: `The Scholar has the same username as the Teacher: ${teacher}`});\r\n return true;\r\n }\r\n // check scholar exists\r\n hive.api.getAccounts([student], (err, result) => {\r\n if(get(result, '[0].name') !== student) Swal.fire({text: `Incorrect student name: ${student}`});\r\n });\r\n // scholar username format validation (dots, lenght, etc)\r\n const error = hive.utils.validateAccountName(student);\r\n error && console.error('Invalid scholar name. Reason:', error);\r\n return error;\r\n};\r\n\r\nconst findAndValidate = ({ ops = [], expectedToken = '' }) => {\r\n for (let id = 0; id < ops.length; id++) {\r\n const [opName, data] = ops[id];\r\n if (opName === 'transfer') {\r\n const { from = '', to = '', amount = '0.000 HIVE', memo = '' } = data;\r\n let isValid = to === LINKING_RECIPIENT && amount === LINKING_COST\r\n && memo.includes(expectedToken);\r\n const studentOg = memo.trim().split(':')[1] || '';\r\n const student = studentOg.replace('@', '');\r\n isLocal && console.log('hive operations check:', { isValid,\r\n data, expected: { to: LINKING_RECIPIENT, amount: LINKING_COST, memo: expectedToken },\r\n scholarship: { value: !!student, teacher: from, scholar: student },\r\n });\r\n if (student && isInvalidStudent({ student, teacher: from })) { isValid = false; }\r\n if (isValid) {\r\n return !!student\r\n ? ({ hiveUsername: student, teacher: from })\r\n : ({ hiveUsername: from });\r\n }\r\n }\r\n }\r\n return ({});\r\n};\r\n\r\nconst fetchLinkedIdentity = ({ waxAddr }) => new Promise(async (resolve) => {\r\n const { foundTx , err } = await fetchAtomicProfile({ waxAddr });\r\n if (err || !foundTx) {\r\n resolve({});\r\n return;\r\n }\r\n // look for tx in Hive block from AH profile\r\n const expectedToken = tokenInMemo(waxAddr);\r\n const nodeInUse = setRandNode();\r\n isLocal && console.log('Checking tx data on Hive using api node', { nodeInUse });\r\n if (foundTx.length > 9) {\r\n isLocal && console.log('ID found in AH is tx:', { foundTx });\r\n hive.api.getTransaction(foundTx, (err, result) => {\r\n isLocal && console.log('HIVE DATA from tx :::::', err, result);\r\n const ops = get(result, 'operations', []);\r\n const { hiveUsername, teacher } = findAndValidate({ ops, expectedToken });\r\n resolve({ hiveUsername, teacher });\r\n });\r\n } else {\r\n const blockNum = foundTx;\r\n isLocal && console.log('ID found in AH is block:', { blockNum });\r\n hive.api.getBlock(blockNum, (err, result) => {\r\n isLocal && console.log('HIVE DATA from block :::::', err, result);\r\n const transactions = get(result, 'transactions', []);\r\n for (let id = 0; id < transactions.length; id++) {\r\n const currentTx = transactions[id];\r\n const ops = get(currentTx, 'operations', []);\r\n isLocal && console.log(`Checking HIVE tx ${id} that has ${ops.length} operations`);\r\n const { hiveUsername, teacher } = findAndValidate({ ops, expectedToken });\r\n if (hiveUsername) {\r\n resolve({ hiveUsername, teacher });\r\n return;\r\n }\r\n }\r\n resolve({});\r\n });\r\n }\r\n});\r\n\r\nconst fetchUserNfts = ({ hiveUsername, offset = 0 }) => new Promise(async (resolve) => {\r\n const symbolNft = 'CSHOTS';\r\n const payload = [{\r\n method: 'find',\r\n jsonrpc: '2.0',\r\n params: {\r\n contract: 'nft',\r\n table: `${symbolNft}instances`,\r\n query: { account: hiveUsername },\r\n limit: 1000,\r\n offset,\r\n indexes: []\r\n },\r\n id: 1,\r\n }];\r\n const url = await findHealthyNode();\r\n isLocal && console.log('[he-nfts] Sending hive nfts fetch request:', { url, payload });\r\n client.post(\r\n url,\r\n payload,\r\n { fullUrl: true },\r\n )\r\n .then(async (res) => {\r\n isLocal && console.log('[he-nfts] NFTs response:', res);\r\n let dataArr = get(res, 'data[0].result', []);\r\n if (offset > 0) {\r\n return resolve(res); // TEMP, cuts some away @@\r\n }\r\n if (!dataArr.length) Swal.fire({text: `No Hive NFTs found for @${hiveUsername}`});\r\n if (dataArr.length === 1000) {\r\n isLocal && console.debug('Fetching NFTs again, previous offset:', offset);\r\n const newRes = await fetchUserNfts({ hiveUsername, offset: 1000 + offset });\r\n let newDataArr = get(newRes, 'data[0].result', []);\r\n dataArr = [...dataArr, ...newDataArr];\r\n }\r\n const parsedArr = dataArr.map(({ account, _id, previousAccount, properties = {} } = {}) => {\r\n const { name, schema, img, description } = properties\r\n if (account === hiveUsername) return ({\r\n mint: _id,\r\n previousOwner: previousAccount,\r\n name, schema, img, description,\r\n });\r\n }).filter(e => !!e);\r\n isLocal && console.log('Hive nfts data:', parsedArr);\r\n resolve({ hiveNftsArr: parsedArr});\r\n })\r\n .catch((err) => {\r\n console.error('Caught error fetching NFT list:', err);\r\n Swal.fire({text: 'Uh oh, something went wrong fetching your Hive NFTs. Please try again.'});\r\n resolve({ hiveNftsArr: [] });\r\n })\r\n});\r\n\r\n\r\nexport const fetchHiveNfts = async ({\r\n waxAddr, linkedHiveAccount, // wax login\r\n hiveUsername, linkedWaxAccount, // hive login\r\n}) => {\r\n if (waxAddr) {\r\n // # WAX LOGIN\r\n const teacher = null; // for now\r\n // const { hiveUsername, teacher } = await fetchLinkedIdentity({ waxAddr }); // wax\r\n if (!linkedHiveAccount) return ({ hiveUsername: null, hiveNftsArr: [] });\r\n const { hiveNftsArr } = await fetchUserNfts({ hiveUsername: teacher || linkedHiveAccount }); // hive\r\n return ({ hiveNftsArr, teacher });\r\n } else if (hiveUsername) {\r\n // # HIVE LOGIN\r\n const { hiveNftsArr } = await fetchUserNfts({ hiveUsername });\r\n return ({ hiveNftsArr });\r\n }\r\n};\r\n","export const LINKS = {\r\n HIVE_SIGNUP: 'https://hiveonboard.com/?ref=cryptoshots.nft',\r\n KEYCHAIN_INSTALL: 'https://chrome.google.com/webstore/detail/hive-keychain/jcacnejopjdphbnjgfaaobbfafkihpep?hl=en',\r\n};\r\nexport const ICONS = {\r\n DOOR_LOGIN: 'https://www.glyphicons.com/img/glyphicons/basic/2x/glyphicons-basic-431-log-in@2x.png',\r\n};\r\n","import Store from '../../../../../GlobalState/Store';\r\n\r\n// pvp -> inventory\r\n// pve -> leaderboard\r\n// Exceptions: \r\n// - dont show leaderboard if no nfts (so it can show welcome page)\r\n// - (will still skip welcome page during f2e tourneys)\r\nexport const navigatePostLogin = ({ locationHistory, hasNfts = true }) => {\r\n const { play } = Store.getState();\r\n const destination = (play.isPvpGameMode || !hasNfts)\r\n ? '/inventory'\r\n : '/leaderboard';\r\n locationHistory.push(destination);\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { toast } from 'react-toastify';\r\nimport { get } from 'lodash';\r\nimport hive from '@hiveio/hive-js';\r\nimport Swal from 'sweetalert2';\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { setPlayerData, setPlayerLogout } from '../../../../reducers/UserReducer';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { verifyUserIdentity } from '../../../../sagas/helpers/login/verifyUser';\r\nimport { processInventory } from '../../../../sagas/helpers/inventory/processInventory';\r\nimport { setPlayerInventory } from '../../../../reducers/InventoryReducer';\r\nimport { isLocal, isTestnet } from '../../../../constants/envs';\r\nimport { blacklistedUsers, multiTabCheckAfterLogin, usernamesChecks } from '../../../../generalUtils/secure';\r\nimport { setFreeTrial } from '../../utils/freeTrial';\r\nimport { fetchHiveNfts } from '../../../../sagas/helpers/inventory/hiveNfts';\r\nimport { isFeatureEnabled } from '../../../../config/featureFlags';\r\nimport { loadStorage } from '../../../../components/Menu/LeftMenu/storage/init/loadStorage';\r\nimport { fetchUserDataOnly, setUrlParamApiCalls } from '../../../../helpers/client';\r\nimport { LINKS, ICONS } from './config';\r\nimport { navigatePostLogin } from '../Shared/utils/navigation';\r\nimport { notifyHiveOnboarding } from '../../../../services/monitoring/discordNotifications';\r\n\r\n\r\nexport const HiveLoginPanel = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const { chainLogin } = UserState;\r\n\r\n const [hiveUsername, setHiveUsername] = useState(localStorage.getItem('hiveUsername') || '');\r\n const locationHistory = useHistory();\r\n\r\n const hiveLoginSteps = async ({ username, message, response }) => {\r\n // # BLACKLIST CHECK\r\n const blacklistedUserData = blacklistedUsers[username];\r\n if (blacklistedUserData) {\r\n isTestnet && console.log('401 reason: ', blacklistedUserData);\r\n Swal.fire({ text: `Uh oh, there seems to be a problem with your account.\\nPlease reach out to support on Discord.` });\r\n return;\r\n } else { isLocal && console.log('u-ok', { blacklistedUsers, u: username }); }\r\n\r\n // # VERIFICATION IN BACKEND\r\n try {\r\n await verifyUserIdentity({ username, message, signed_message: response.result, chainLogin });\r\n } catch (err) {\r\n handleHiveLoginError('Caught error during Hive login. Please try later.');\r\n return;\r\n }\r\n setFreeTrial({ value: false, from: 'login-btn' });\r\n\r\n // ## LOGGED-IN USER PUSH\r\n storeAppDispatch(setPlayerData({\r\n name: username,\r\n isLogged: true,\r\n }));\r\n localStorage.setItem('chainLogin', chainLogin);\r\n\r\n // ## Anti-Cheat\r\n usernamesChecks(username);\r\n\r\n // ## FETCH HIVE NFTS\r\n const { hiveNftsArr /*, teacher*/ } = await fetchHiveNfts({ hiveUsername: username });\r\n // UI next login wait\r\n localStorage[hiveNftsArr.length ? 'setItem' : 'removeItem']('hivenfts', true);\r\n\r\n const { linkedAccounts, err: errDataFetch } = await fetchUserDataOnly({ account: username, chain: chainLogin });\r\n isLocal && console.debug('cross-chain account linked:', { linkedAccounts, errDataFetch });\r\n if (errDataFetch) {\r\n Swal.fire({ text: `Something went wrong fetching your data. Please try again.` });\r\n storeAppDispatch(setPlayerLogout());\r\n return;\r\n }\r\n\r\n // # FETCH WAX {INVENTORY}\r\n const { wax: linkedWaxAccount, btc: linkedBtcAddress } = linkedAccounts || {};\r\n isLocal && console.log('{hl} fetching inventory for Wax linked user', linkedWaxAccount);\r\n let csNfts = [];\r\n let hotNfts = {};\r\n if (linkedWaxAccount) {\r\n // eslint-disable-next-line no-unused-vars\r\n const inventoryResponse = await processInventory({ username: linkedWaxAccount });\r\n const { err: errWaxInventory, scholarship: _notSupported_ } = inventoryResponse;\r\n csNfts = inventoryResponse.csNfts;\r\n hotNfts = inventoryResponse.hotNfts;\r\n if (errWaxInventory) {\r\n console.error('Error fetching linked wax inventory for hive user', errWaxInventory);\r\n storeAppDispatch(setPlayerLogout());\r\n return;\r\n }\r\n localStorage[csNfts.length === 0 ? 'removeItem' : 'setItem']('waxnfts', true);\r\n // let kitNft;\r\n // const hasNoNfts = csNfts.length === 0 && Object.keys(hotNfts).length === 0;\r\n // if (hasNoNfts) {\r\n // kitNft = { [MINIMUM_REQUIREMENTS_INFO]: '' }; // HACK @@\r\n // }\r\n }\r\n\r\n const currentState = {\r\n csAssets: { csNfts, hotNfts },\r\n hive: {\r\n nfts: hiveNftsArr, username /*, teacher*/,\r\n linkedWaxAccount, linkedBtcAddress, // linked chains\r\n },\r\n scholarship: null, chainLogin: UserState.chainLogin,\r\n };\r\n storeAppDispatch(setPlayerInventory(currentState));\r\n\r\n // ## Routing\r\n const hasNfts = csNfts.length + hiveNftsArr.length;\r\n navigatePostLogin({ locationHistory, hasNfts });\r\n\r\n // ## Fetch Balances\r\n // isLocal && console.log('{hl} fetching boom balance');\r\n // const boomAmount = await fetchBoomBalance(UserService.authName);\r\n // const savingsAmount = await Promise.resolve(0); // TEMP for savings @@ @@ @@ @@\r\n // storeAppDispatch(setPlayerWaxTokensBalances({\r\n // tokens: { boom: boomAmount },\r\n // stakedSavings: { boom: savingsAmount }\r\n // }));\r\n // // Whitelist check (TESTNET only)\r\n // isLocal && console.log('{hl} checking whitelist items');\r\n // const missingItem = await verifyAccessAllowed(UserService.authName, csNfts); // IMPROVEMENT: just check the NFTs just fetched above !!!\r\n // if (missingItem) {\r\n // const isOk = window.confirm(`${UserService.authName} the following item is required to access this version of the game: ${(missingItem || '').replace(/_/g, ' ')}\\n\\nUnless it's a new mint, keep in mind the 12 hour cooldown.`);\r\n // if (isOk)\r\n // window.open('https://wax.atomichub.io/market?collection_name=crypto4shots&order=desc&schema_name=early.access&sort=created&symbol=WAX', '_blank');\r\n // storeAppDispatch(setPlayerLogout());\r\n // !isLocal && window.location.reload();\r\n // }\r\n\r\n // # MULTI SESSION CHECKS\r\n multiTabCheckAfterLogin();\r\n\r\n // # LOAD STORAGE \r\n loadStorage({ user: username });\r\n isLocal && console.log('{hl} all done');\r\n };\r\n\r\n const triggerKeychainLogin = () => {\r\n const message = `${hiveUsername}_${Date.now()}`;\r\n window.hive_keychain.requestSignBuffer(\r\n hiveUsername,\r\n message,\r\n 'Posting',\r\n async (response) => {\r\n console.log('Keychain requestSignBuffer:', response);\r\n if (response.error) {\r\n const errMsg = 'Keychain signing failed';\r\n console.error(errMsg, response.error);\r\n handleHiveLoginError(errMsg);\r\n toast.error(errMsg);\r\n return;\r\n }\r\n let username = get(response, 'data.username');\r\n console.log('response data', response.data);\r\n if (username !== hiveUsername) {\r\n const errMsg = 'Username mismatch';\r\n console.error(errMsg, username, response.error);\r\n handleHiveLoginError(errMsg);\r\n toast.error(errMsg);\r\n return;\r\n }\r\n // if (!isFeatureEnabled('HIVE')) {\r\n // const errMsg = 'You gotta wait until Sunday! 🚀';\r\n // handleHiveLoginError(errMsg);\r\n // return;\r\n // }\r\n toast.success('Keychain login OK');\r\n hiveLoginSteps({ username, message, response });\r\n }\r\n );\r\n };\r\n\r\n const handleLogin = (event) => {\r\n event.preventDefault();\r\n setIsLoadingHive(true);\r\n if (hiveUsername.endsWith('.wam')) { // wax username check\r\n handleHiveLoginError(`Invalid Hive username, this is not the Wax login.`);\r\n return;\r\n }\r\n if (window.hive_keychain) {\r\n window.hive_keychain.requestHandshake(() => {\r\n try {\r\n console.log('handshake success!');\r\n toast.success('Keychain handshaked');\r\n localStorage.setItem('chainLogin', UserState.chainLogin);\r\n setUrlParamApiCalls({ chain: UserState.chainLogin });\r\n // input validation (username rules only)\r\n let error = hive.utils.validateAccountName(hiveUsername);\r\n if (error) {\r\n console.error('Invalid hive name. Reason:', error);\r\n handleHiveLoginError(`Invalid username. ${error}`);\r\n return;\r\n }\r\n triggerKeychainLogin();\r\n } catch (err) { console.error('Caught after handshake:', err); }\r\n });\r\n } else {\r\n const errMsg = Keychain handshake failed! Install the \r\n \r\n Hive Keychain extension\r\n \r\n ;\r\n handleHiveLoginError(errMsg);\r\n toast.error('No Hive Keychain found');\r\n }\r\n };\r\n\r\n const [hiveLoginError, setHiveLoginError] = useState('');\r\n const [isLoadingHive, setIsLoadingHive] = useState(false);\r\n\r\n const handleHiveLoginError = (errMsg) => {\r\n setHiveLoginError(errMsg);\r\n setIsLoadingHive(false);\r\n };\r\n\r\n const handleSignupLinkClick = (msg) => {\r\n notifyHiveOnboarding({ msg, data: null });\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n setHiveUsername(input.target.value)}\r\n >\r\n \r\n \"Loggin\"  \r\n {isLoadingHive\r\n ? \r\n : LOGIN\r\n }\r\n \r\n {hiveLoginError &&

    {hiveLoginError}

    }\r\n \r\n
    \r\n
    \r\n Don't have a HIVE account?  \r\n handleSignupLinkClick('signup-click')}\r\n >\r\n Sign Up\r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import { ITEMS_BY_CATEGORY } from '../constants/templateIds';\r\n\r\nexport const ACCESS_CONFIG = {\r\n SNEAK_PEEK: {\r\n GRANTS_ACCESS: true,\r\n TEMPLATE_ID: ITEMS_BY_CATEGORY.EARLY_ACCESS.SPA.ID,\r\n NAME: ITEMS_BY_CATEGORY.EARLY_ACCESS.SPA.NAME,\r\n },\r\n TELEPORT_DEVICE: {\r\n GRANTS_ACCESS: false, // is check enabled\r\n TEMPLATE_ID: ITEMS_BY_CATEGORY.EARLY_ACCESS.TD.ID,\r\n NAME: ITEMS_BY_CATEGORY.EARLY_ACCESS.TD.NAME,\r\n },\r\n};\r\n","import { ACCESS_CONFIG } from \"../../../config/accessConfig\";\r\nimport { getCurrentEnvName, isLocal, isMainnet, isTestnet } from \"../../../constants/envs\";\r\nimport { ITEMS_BY_CATEGORY } from \"../../../constants/templateIds\";\r\nimport { fetchHiveData } from \"../../../generalUtils/hiveData/reader\";\r\nimport { nap } from \"../../../generalUtils/utils\";\r\n\r\nconst isLocalTesting = getCurrentEnvName() === 'local';\r\n\r\nconst { SNEAK_PEEK, TELEPORT_DEVICE } = ACCESS_CONFIG;\r\nconst [sneakName, teleportName] = Object.keys(ACCESS_CONFIG);\r\n\r\nconst { EARLY_ACCESS, WEAPONS } = ITEMS_BY_CATEGORY;\r\n\r\nconst ALPHA_TESTERS_WHITELIST_PERMLINK = 're-crypto-shots-r6mbgx';\r\n\r\n\r\nexport const verifyAccessAllowed = async (currentAccount, csNfts) => {\r\n // # Local testing and mainnet, no early access items checks\r\n if (isLocalTesting || isMainnet) return null;\r\n // # Playtest:\r\n // -- MANUAL MAPPINGS (wam/gm->12) AND FULL WHITELISTED (12)\r\n const { whitelistUsers = [], mappedSneakers } = await getManualMappingIfAny();\r\n if (isTestnet && whitelistUsers.includes(currentAccount)) return null; // whitelist only for testnet\r\n const isMappedUser = !!mappedSneakers[currentAccount];\r\n const waxAcc = (isTestnet && mappedSneakers[currentAccount]) || currentAccount; // mappings only for testnet\r\n // -- WHITELIST ITEMS CHECK\r\n const hasSneak = isMappedUser\r\n ? !(await isItemMissing({ waxAcc, sneakTemplateId: SNEAK_PEEK.TEMPLATE_ID, name: SNEAK_PEEK.NAME }))\r\n : csNfts.filter(nft => nft.template_id === EARLY_ACCESS.SPA.ID).length;\r\n const sneakPassMissing = SNEAK_PEEK.GRANTS_ACCESS && !hasSneak;\r\n if (sneakPassMissing) {\r\n if (!TELEPORT_DEVICE.GRANTS_ACCESS) return sneakName;\r\n isLocal && console.debug('No sneak, teleport grants access too now so checking it...');\r\n isMappedUser && (await nap(1500));\r\n const hasTeleport = isMappedUser\r\n ? !(await isItemMissing({ waxAcc, teleportTemplateId: TELEPORT_DEVICE.TEMPLATE_ID, name: TELEPORT_DEVICE.NAME }))\r\n : csNfts.filter(nft => nft.template_id === EARLY_ACCESS.TD.ID).length;\r\n if (!hasTeleport) return teleportName;\r\n }\r\n // -- BASE GUN CHECK\r\n const hasBaseGun = isMappedUser\r\n ? !(await isItemMissing({ waxAcc, templateId: WEAPONS.BG.ID, name: WEAPONS.BG.NAME }))\r\n : csNfts.filter(nft => nft.template_id === WEAPONS.BG.ID).length;\r\n if (!hasBaseGun) return WEAPONS.BG.NAME;\r\n return null;\r\n};\r\n\r\n\r\nconst getManualMappingIfAny = async () => {\r\n const { err, whitelistObj } = await fetchHiveData({ permlink: ALPHA_TESTERS_WHITELIST_PERMLINK });\r\n if (err) return ({ err: 'unable to check.. Network Error' });\r\n const { whitelistUsers: dirtyWhitelistUsers, mappedSneakers: dirtyMappedSneakers } = whitelistObj; \r\n isLocalTesting && console.log('>>>>>>>>>>>>>>> whitelist:', { dirtyWhitelistUsers });\r\n const whitelistUsers = dirtyWhitelistUsers.map(el => el.split('//')[0]); // ['sdjfksdld//mod', ..]\r\n const mappedSneakers = {}; // { 'jfsldkfj': 'fsdf.wam//fanZero' }\r\n Object.keys(dirtyMappedSneakers).forEach((key) => {\r\n mappedSneakers[key] = dirtyMappedSneakers[key].split('//')[0];\r\n });\r\n isLocalTesting && console.log('Users whitelisted on Hive:', { whitelistUsers, mappedSneakers });\r\n return ({ whitelistUsers, mappedSneakers });\r\n};\r\n\r\n// CORS wax.api.aa.atomichub.io -> wax.api.atomicassets.io\r\nconst isItemMissing = ({ waxAcc, templateId, name }) => {\r\n return fetch(\r\n `https://wax.api.atomicassets.io/atomicassets/v1/assets?owner=${ // WAS STILL HAVING CORS ISSUES, USING SAME HEADERS AS INVENTORY NOW <<<<<<<<<<<<<<<<<<<<<<< still a risk for us\r\n waxAcc\r\n }&collection_name=crypto4shots&template_id=${\r\n templateId\r\n }&sort=template_mint&order=asc&limit=1`,\r\n {\r\n headers: {\r\n accept: 'application/json',\r\n 'cache-control': 'no-cache',\r\n pragma: 'no-cache',\r\n 'sec-fetch-dest': 'empty',\r\n 'sec-fetch-mode': 'cors',\r\n 'sec-fetch-site': 'cross-site',\r\n 'sec-gpc': '1',\r\n },\r\n referrer: 'https://wax.bloks.io/',\r\n referrerPolicy: 'strict-origin-when-cross-origin',\r\n body: null,\r\n method: 'GET',\r\n mode: 'cors',\r\n credentials: 'omit',\r\n },\r\n )\r\n .then(res => res.json())\r\n .then(async (resp) => {\r\n if (!resp.success || !resp.data.length) return name;\r\n return false;\r\n })\r\n .catch((err) => {\r\n console.error(`Error looking for `, waxAcc, templateId, err);\r\n return 'caught Network Error'; // true\r\n });\r\n};\r\n","export const ICONS = {\r\n LOGIN_DOOR: 'https://www.glyphicons.com/img/glyphicons/basic/2x/glyphicons-basic-431-log-in@2x.png',\r\n};\r\nexport const LINKS = {\r\n WAX_SIGNUP: 'https://www.mycloudwallet.com/signin#create-account',\r\n BUY_PASS: 'https://wax.atomichub.io/market?collection_name=crypto4shots&order=desc&schema_name=early.access&sort=created&symbol=WAX',\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport Swal from 'sweetalert2';\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { setPlayerLogin, setPlayerLogout } from '../../../../reducers/UserReducer';\r\nimport { UserService } from '../../../../services/UserService';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { verifyAccessAllowed } from '../../../../sagas/helpers/login/verifyAccessAllowed';\r\nimport { uiHacks } from '../../../../generalUtils/uiHacks/uiHacks';\r\nimport { verifyWaxUser } from '../../../../sagas/helpers/login/verifyUser';\r\nimport { processInventory } from '../../../../sagas/helpers/inventory/processInventory';\r\nimport { setPlayerInventory } from '../../../../reducers/InventoryReducer';\r\nimport { fetchBoomBalance } from '../../../../sagas/helpers/wallet/waxUtils';\r\nimport { setPlayerWaxTokensBalances } from '../../../../reducers/WalletReducer';\r\nimport { isLocal, isTestnet } from '../../../../constants/envs';\r\nimport { blacklistedUsers, multiTabCheckAfterLogin } from '../../../../generalUtils/secure';\r\nimport { setFreeTrial } from '../../utils/freeTrial';\r\nimport { fetchHiveNfts } from '../../../../sagas/helpers/inventory/hiveNfts';\r\nimport { MINIMUM_REQUIREMENTS_INFO } from '../../../../constants/genericConstants';\r\nimport { getPlayerUsername } from '../../../../generalUtils/utils';\r\nimport { loadStorage } from '../../../../components/Menu/LeftMenu/storage/init/loadStorage';\r\nimport { fetchUserDataOnly, setUrlParamApiCalls } from '../../../../helpers/client';\r\nimport { LINKS, ICONS } from './config';\r\nimport { navigatePostLogin } from '../Shared/utils/navigation';\r\n\r\n\r\nexport const WaxLoginPanel = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const locationHistory = useHistory();\r\n\r\n // TODO: refactor\r\n const loginHandler = async () => {\r\n // # Login status check\r\n if (!UserService.isLogged()) {\r\n storeAppDispatch(setPlayerLogout());\r\n return;\r\n }\r\n\r\n // # BLACKLIST CHECK\r\n const { authName } = UserService;\r\n const blacklistedUserData = blacklistedUsers[authName];\r\n if (blacklistedUserData) {\r\n isTestnet && console.log('401 reason: ', blacklistedUserData);\r\n Swal.fire({ text: `Uh oh, there seems to be a problem with your account.\\nPlease reach out to support on Discord.` });\r\n return;\r\n } else { isLocal && console.log('u-ok', { blacklistedUsers, u: authName }); }\r\n\r\n // # PUSH LOGGED-IN USER\r\n storeAppDispatch(setPlayerLogin({ name: authName }));\r\n\r\n // # VERIFY USER IN BACKEND\r\n const { err: errVerify } = await verifyWaxUser({ username: getPlayerUsername({ UserService, UserState, InventoryState }) });\r\n if (errVerify) {\r\n Swal.fire({ text: `Login failure: ${errVerify}` });\r\n window.location.reload();\r\n return;\r\n }\r\n\r\n // # SET CURRENT STATE\r\n setFreeTrial({ value: false, from: 'login-btn' });\r\n localStorage.setItem('chainLogin', UserState.chainLogin);\r\n\r\n // # FETCH WAX {INVENTORY}\r\n isLocal && console.log('{hl} fetching inventory');\r\n const { err, csNfts, hotNfts, scholarship } = await processInventory({ username: authName });\r\n if (err) {\r\n storeAppDispatch(setPlayerLogout());\r\n return;\r\n }\r\n let kitNft;\r\n const hasNoNfts = csNfts.length === 0 && Object.keys(hotNfts).length === 0;\r\n if (hasNoNfts) {\r\n kitNft = { [MINIMUM_REQUIREMENTS_INFO]: '' }; // HACK @@\r\n }\r\n // UI next login wait\r\n localStorage[hasNoNfts ? 'removeItem' : 'setItem']('waxnfts', true);\r\n\r\n // # CROSS-CHAIN {INVENTORY}\r\n const { linkedAccounts, err: errDataFetch } = await fetchUserDataOnly({ account: authName, chain: UserState.chainLogin });\r\n isLocal && console.debug('cross-chain account linked:', { linkedAccounts, errDataFetch });\r\n if (errDataFetch) {\r\n Swal.fire({ text: `Something went wrong fetching your data. Please try again.` });\r\n storeAppDispatch(setPlayerLogout());\r\n return;\r\n }\r\n const { hive: linkedHiveAccount, btc: linkedBtcAddress } = linkedAccounts || {};\r\n let hiveNftsArr = [];\r\n let teacher = null;\r\n if (linkedHiveAccount) {\r\n // FETCH HIVE NFTS\r\n const inventoryResponse = await fetchHiveNfts({ waxAddr: authName, linkedHiveAccount });\r\n hiveNftsArr = inventoryResponse.hiveNftsArr;\r\n teacher = inventoryResponse.teacher;\r\n // UI next login wait\r\n localStorage[hiveNftsArr.length ? 'setItem' : 'removeItem']('hivenfts', true);\r\n }\r\n const currentState = {\r\n chainLogin: UserState.chainLogin,\r\n // wax:\r\n csAssets: { csNfts, hotNfts: Object.keys(hotNfts).length ? hotNfts : kitNft },\r\n scholarship,\r\n // hive:\r\n hive: {\r\n nfts: hiveNftsArr, username: linkedHiveAccount, teacher, // linked hive username and nfts\r\n linkedBtcAddress, // other linked chains (ie. btc only here)\r\n },\r\n };\r\n storeAppDispatch(setPlayerInventory(currentState));\r\n\r\n // # ROUTING\r\n const hasNfts = csNfts.length + hiveNftsArr.length;\r\n navigatePostLogin({ locationHistory, hasNfts });\r\n\r\n // # MULTI SESSION CHECKS\r\n multiTabCheckAfterLogin();\r\n\r\n // # FETCH BALANCES\r\n isLocal && console.log('{hl} fetching boom balance');\r\n const boomAmount = await fetchBoomBalance(authName);\r\n const savingsAmount = await Promise.resolve(0); // TEMP for savings @@ @@ @@ @@\r\n storeAppDispatch(setPlayerWaxTokensBalances({\r\n tokens: { boom: boomAmount },\r\n stakedSavings: { boom: savingsAmount }\r\n }));\r\n\r\n // # WHITELIST CHECK (TESTNET ONLY)\r\n isLocal && console.log('{hl} checking whitelist items');\r\n const missingItem = await verifyAccessAllowed(authName, csNfts); // IMPROVEMENT: just check the NFTs just fetched above !!!\r\n if (missingItem) {\r\n const isOk = window.confirm(`${authName} the following item is required to access this version of the game: ${(missingItem || '').replace(/_/g, ' ')}\\n\\nUnless it's a new mint, keep in mind the 12 hour cooldown.`);\r\n if (isOk) window.open(LINKS.BUY_PASS, '_blank');\r\n storeAppDispatch(setPlayerLogout());\r\n !isLocal && window.location.reload();\r\n }\r\n\r\n // # LOAD STORAGE \r\n loadStorage({ user: authName }); // no await\r\n isLocal && console.log('{hl} all done');\r\n };\r\n\r\n const handleLogin = () => {\r\n uiHacks.chevron();\r\n UserService.init();\r\n setUrlParamApiCalls({ chain: UserState.chainLogin });\r\n UserService.login(loginHandler);\r\n };\r\n\r\n return (
    \r\n

    \r\n \r\n \"Loggin\"  \r\n LOGIN\r\n \r\n

    \r\n
    \r\n Don't have a WAX account?  \r\n \r\n Sign Up\r\n \r\n
    \r\n
    );\r\n};\r\n","import React from 'react';\r\nimport { HiveLoginPanel } from '../Hive/HiveLoginPanel';\r\nimport { BitcoinLnInstructions } from '../Shared/BitcoinLnInstructions';\r\n\r\nexport const BitcoinLoginPanel = () => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n};\r\n","\r\nexport const ICONS = {\r\n DOOR_LOGIN: 'https://www.glyphicons.com/img/glyphicons/basic/2x/glyphicons-basic-431-log-in@2x.png',\r\n};\r\n\r\nexport const LINKS = {\r\n ETH_WALLETS: 'https://www.investopedia.com/best-ethereum-wallets-6830692',\r\n METAMASK_INSTALL: 'https://metamask.io/download',\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { toast } from 'react-toastify';\r\nimport Swal from 'sweetalert2';\r\n\r\nimport { storeAppDispatch } from '../../../../../GlobalState/Store';\r\nimport { setPlayerData } from '../../../../../reducers/UserReducer';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { verifyUserIdentity } from '../../../../../sagas/helpers/login/verifyUser';\r\nimport { setPlayerInventory } from '../../../../../reducers/InventoryReducer';\r\nimport { isLocal, isTestnet } from '../../../../../constants/envs';\r\nimport { blacklistedUsers, multiTabCheckAfterLogin, usernamesChecks } from '../../../../../generalUtils/secure';\r\nimport { setFreeTrial } from '../../../utils/freeTrial';\r\nimport { loadStorage } from '../../../../../components/Menu/LeftMenu/storage/init/loadStorage';\r\nimport { setUrlParamApiCalls } from '../../../../../helpers/client';\r\nimport { ICONS, LINKS } from '../config';\r\nimport { navigatePostLogin } from '../../Shared/utils/navigation';\r\n\r\n\r\nexport const SkaleLoginPanel = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const { chainLogin, acceptedTac } = UserState;\r\n\r\n const PlayState = useSelector((store) => store.play);\r\n const { isPvpGameMode: isPvp } = PlayState;\r\n\r\n const locationHistory = useHistory();\r\n\r\n \r\n const skaleLoginSteps = async ({ account, message, signature }) => {\r\n // # BLACKLIST CHECK\r\n const blacklistedUserData = blacklistedUsers[account];\r\n if (blacklistedUserData) {\r\n isTestnet && console.log('401 reason: ', blacklistedUserData);\r\n Swal.fire({ text: `Uh oh, there seems to be a problem with your account.\\nPlease reach out to support on Discord.` });\r\n return;\r\n }\r\n // # VERIFICATION IN BACKEND\r\n setUrlParamApiCalls({ chain: chainLogin });\r\n try {\r\n await verifyUserIdentity({ username: account, message, signed_message: signature, chainLogin });\r\n } catch (err) {\r\n handleLoginError('Something broke. Please try again.');\r\n return;\r\n }\r\n // Free Trial flag\r\n setFreeTrial({ value: false, from: 'login-btn' });\r\n\r\n // ## Set LOGGED-IN USER in local state\r\n storeAppDispatch(setPlayerData({\r\n name: account,\r\n isLogged: true,\r\n }));\r\n localStorage.setItem('chainLogin', chainLogin);\r\n\r\n // anti-cheat\r\n usernamesChecks(account);\r\n\r\n // // # FETCH HIVE NFTS\r\n // const { hiveNftsArr /*, teacher*/ } = await fetchHiveNfts({ hiveUsername: username });\r\n // // UI next login wait\r\n // localStorage[hiveNftsArr.length ? 'setItem' : 'removeItem']('hivenfts', true);\r\n\r\n // const { linkedAccounts, err: errDataFetch } = await fetchUserDataOnly({ account: username, chain: chainLogin });\r\n // isLocal && console.debug('cross-chain account linked:', { linkedAccounts, errDataFetch });f\r\n // if (errDataFetch) {\r\n // Swal.fire({ text: `Something went wrong fetching your data. Please try again.` });\r\n // storeAppDispatch(setPlayerLogout());\r\n // return;\r\n // }\r\n // const { wax: linkedWaxAccount, btc: linkedBtcAddress } = linkedAccounts || {};\r\n // isLocal && console.log('{hl} fetching inventory for Wax linked user', linkedWaxAccount);\r\n // let csNfts = [];\r\n // let hotNfts = {};\r\n // if (linkedWaxAccount) {\r\n // // # FETCH WAX {INVENTORY}\r\n // // eslint-disable-next-line no-unused-vars\r\n // const inventoryResponse = await processInventory({ username: linkedWaxAccount });\r\n // const { err: errWaxInventory, scholarship: _notSupported_ } = inventoryResponse;\r\n // csNfts = inventoryResponse.csNfts;\r\n // hotNfts = inventoryResponse.hotNfts;\r\n // if (errWaxInventory) {\r\n // console.error('Error fetching linked wax inventory for hive user', errWaxInventory);\r\n // storeAppDispatch(setPlayerLogout());\r\n // return;\r\n // }\r\n // localStorage[csNfts.length === 0 ? 'removeItem' : 'setItem']('waxnfts', true);\r\n // // let kitNft;\r\n // // const hasNoNfts = csNfts.length === 0 && Object.keys(hotNfts).length === 0;\r\n // // if (hasNoNfts) {\r\n // // kitNft = { [MINIMUM_REQUIREMENTS_INFO]: '' }; // HACK @@\r\n // // }\r\n // }\r\n\r\n const currentState = {\r\n chainLogin: chainLogin,\r\n // wax\r\n csAssets: { csNfts: [], hotNfts: [] },\r\n // hive\r\n hive: { nfts: [] },\r\n // skale\r\n skale: { nfts: [] },\r\n // eth\r\n eth: { nfts: [], username: account },\r\n // scholarship: null,\r\n };\r\n storeAppDispatch(setPlayerInventory(currentState));\r\n\r\n // ## Routing\r\n navigatePostLogin({ locationHistory });\r\n\r\n // ## Fetch Balances\r\n // isLocal && console.log('{hl} fetching boom balance');\r\n // const boomAmount = await fetchBoomBalance(UserService.authName);\r\n // const savingsAmount = await Promise.resolve(0); // TEMP for savings @@ @@ @@ @@\r\n // storeAppDispatch(setPlayerWaxTokensBalances({\r\n // tokens: { boom: boomAmount },\r\n // stakedSavings: { boom: savingsAmount }\r\n // }));\r\n // // Whitelist check (TESTNET only)\r\n // isLocal && console.log('{hl} checking whitelist items');\r\n // const missingItem = await verifyAccessAllowed(UserService.authName, csNfts); // IMPROVEMENT: just check the NFTs just fetched above !!!\r\n // if (missingItem) {\r\n // const isOk = window.confirm(`${UserService.authName} the following item is required to access this version of the game: ${(missingItem || '').replace(/_/g, ' ')}\\n\\nUnless it's a new mint, keep in mind the 12 hour cooldown.`);\r\n // if (isOk)\r\n // window.open('https://wax.atomichub.io/market?collection_name=crypto4shots&order=desc&schema_name=early.access&sort=created&symbol=WAX', '_blank');\r\n // storeAppDispatch(setPlayerLogout());\r\n // !isLocal && window.location.reload();\r\n // }\r\n\r\n // # MULTI SESSION CHECKS\r\n multiTabCheckAfterLogin();\r\n\r\n // # LOAD STORAGE \r\n loadStorage({ user: account });\r\n isLocal && console.log('{hl} all done');\r\n };\r\n\r\n \r\n const SKALE_NETWORK = {\r\n chainId: isTestnet\r\n ? '0x235ddd0' // ie. 37084624\r\n : '0x585eb4b1', // ie. 1482601649\r\n chainName: isTestnet ? 'SKALE Nebula Testnet' : 'SKALE Nebula Hub',\r\n nativeCurrency: {\r\n name: 'sFUEL',\r\n symbol: 'sFUEL',\r\n decimals: 18,\r\n },\r\n rpcUrls: [\r\n isTestnet\r\n ? 'https://testnet.skalenodes.com/v1/lanky-ill-funny-testnet'\r\n : 'https://mainnet.skalenodes.com/v1/green-giddy-denebola',\r\n ],\r\n blockExplorerUrls: [\r\n isTestnet\r\n ? 'https://lanky-ill-funny-testnet.explorer.testnet.skalenodes.com'\r\n : 'https://green-giddy-denebola.explorer.mainnet.skalenodes.com',\r\n ],\r\n };\r\n\r\n const addSkaleNetwork = async () => {\r\n try {\r\n await window.ethereum.request({\r\n method: 'wallet_addEthereumChain',\r\n params: [SKALE_NETWORK]\r\n });\r\n isLocal && console.log('SKALE network added to MetaMask');\r\n return ({});\r\n } catch (err) {\r\n console.error('Error adding SKALE network to MetaMask', err);\r\n const errMsg = Failed to add Skale Network.;\r\n handleLoginError(errMsg);\r\n return ({ err });\r\n }\r\n }\r\n\r\n const checkAndAddSkaleNetwork = async () => {\r\n try {\r\n const currentChainId = await window.ethereum.request({ method: 'eth_chainId' });\r\n if (currentChainId !== SKALE_NETWORK.chainId) {\r\n const { err } = await addSkaleNetwork();\r\n if (err) return ({ err });\r\n }\r\n } catch (err) {\r\n console.error('Error checking if the SKALE network is available', err);\r\n const errMsg = Failed to check Skale Network status.;\r\n handleLoginError(errMsg);\r\n return ({ err });\r\n }\r\n return ({});\r\n }\r\n\r\n const signMessage = async (account, message) => {\r\n try {\r\n const signature = await window.ethereum.request({\r\n method: 'personal_sign',\r\n params: [message, account],\r\n });\r\n return ({ signature });\r\n } catch (error) {\r\n console.error('Something went wrong signing the message:', error);\r\n return ({ err: 'Failed to sign the message to log in' });\r\n }\r\n }\r\n\r\n const handleLogin = async () => {\r\n // Game mode check\r\n if (!isPvp) {\r\n Swal.fire({ text: `For now only Multiplayer mode is supported on Skale` });\r\n return;\r\n }\r\n // UI\r\n setIsLoading(true);\r\n // Metamask Check\r\n if (!window.ethereum || !window.ethereum.isMetaMask) {\r\n const errMsg = \r\n MetaMask not found, please install it.\r\n ;\r\n handleLoginError(errMsg);\r\n toast.error('Ethereum wallet not found');\r\n return;\r\n }\r\n // Skale Network check\r\n const { err: errChain } = await checkAndAddSkaleNetwork();\r\n if (errChain) return;\r\n isLocal && console.log('Skale network enabled in MetaMask');\r\n // Retrieve ETH address to use\r\n const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n const account = accounts[0]; // use the first account\r\n if (!account) {\r\n const errMsg = No Ethereum address found;\r\n handleLoginError(errMsg);\r\n return;\r\n }\r\n // Sign message\r\n const message = \"Crypto Shots login\";\r\n const { signature, err } = await signMessage(account, message);\r\n if (err) {\r\n const errMsg = Failed to sign the message to log in;\r\n handleLoginError(errMsg);\r\n return;\r\n }\r\n isLocal && console.log('Signature:', signature);\r\n // Verify signature and next steps\r\n skaleLoginSteps({ account, message, signature });\r\n };\r\n\r\n\r\n const [loginError, setLoginError] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const handleLoginError = (errMsg) => {\r\n setLoginError(errMsg);\r\n setIsLoading(false);\r\n };\r\n\r\n return (
    \r\n
    \r\n \r\n \"Loggin\"  \r\n {isLoading\r\n ? \r\n : MetaMask Login}\r\n \r\n {loginError &&

    {loginError}

    }\r\n
    \r\n {!loginError &&
    \r\n No MetaMask Browser Wallet?  \r\n \r\n Get It Here\r\n \r\n
    \r\n }\r\n
    );\r\n};\r\n","import React from 'react';\r\nimport { storeAppDispatch } from '../../../../GlobalState/Store';\r\nimport { setChainLogin } from '../../../../reducers/UserReducer';\r\nimport { isMainnet } from '../../../../constants/envs';\r\n\r\nconst IS_SKALE_LIVE = isMainnet ? false : true;\r\n\r\n\r\nexport const EthNetworkChoice = () => {\r\n\r\n const ethChainChoiceHandler = (chain = '') => {\r\n sessionStorage.removeItem('exclusiveLogin');\r\n storeAppDispatch(setChainLogin({ chainLogin: chain }));\r\n };\r\n\r\n const handleBack = () => {\r\n storeAppDispatch(setChainLogin({ chainLogin: '' }));\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n

    Back >

    \r\n
    \r\n
    \r\n
    \r\n

    Ethereum {isMainnet ? 'Mainnet' : 'Testnet'}

    \r\n ethChainChoiceHandler('eth')}\r\n style={{ color: 'black', fontSize: '22px' }}\r\n >\r\n ETH\r\n \r\n
    \r\n
    \r\n

    Ethereum Layer-2

    \r\n ethChainChoiceHandler('skl')}\r\n style={{ fontSize: '22px', display: 'inline-block' }}\r\n disabled={!IS_SKALE_LIVE}\r\n >\r\n {!IS_SKALE_LIVE ? '? ?' : 'SKALE'}\r\n \r\n \r\n NEXT ETH L2 @@\r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { toast } from 'react-toastify';\r\nimport Swal from 'sweetalert2';\r\n\r\nimport { storeAppDispatch } from '../../../../../GlobalState/Store';\r\nimport { setPlayerData } from '../../../../../reducers/UserReducer';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { verifyUserIdentity } from '../../../../../sagas/helpers/login/verifyUser';\r\nimport { setPlayerInventory } from '../../../../../reducers/InventoryReducer';\r\nimport { isLocal, isTestnet } from '../../../../../constants/envs';\r\nimport { blacklistedUsers, multiTabCheckAfterLogin, usernamesChecks } from '../../../../../generalUtils/secure';\r\nimport { setFreeTrial } from '../../../utils/freeTrial';\r\nimport { loadStorage } from '../../../../../components/Menu/LeftMenu/storage/init/loadStorage';\r\nimport { setUrlParamApiCalls } from '../../../../../helpers/client';\r\nimport { ICONS, LINKS } from '../config';\r\nimport { navigatePostLogin } from '../../Shared/utils/navigation';\r\n\r\n\r\nexport const EthLoginPanel = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const { chainLogin, acceptedTac } = UserState;\r\n\r\n const PlayState = useSelector((store) => store.play);\r\n const { isPvpGameMode: isPvp } = PlayState;\r\n\r\n const locationHistory = useHistory();\r\n\r\n \r\n const ethLoginSteps = async ({ account, message, signature }) => {\r\n // # BLACKLIST CHECK\r\n const blacklistedUserData = blacklistedUsers[account];\r\n if (blacklistedUserData) {\r\n isTestnet && console.log('401 reason: ', blacklistedUserData);\r\n Swal.fire({ text: `Uh oh, there seems to be a problem with your account.\\nPlease reach out to support on Discord.` });\r\n return;\r\n }\r\n // # VERIFICATION IN BACKEND\r\n setUrlParamApiCalls({ chain: chainLogin });\r\n try {\r\n await verifyUserIdentity({ username: account, message, signed_message: signature, chainLogin });\r\n } catch (err) {\r\n handleLoginError('Something broke. Please try again.');\r\n return;\r\n }\r\n // Free Trial flag\r\n setFreeTrial({ value: false, from: 'login-btn' });\r\n\r\n // ## Set LOGGED-IN USER in local state\r\n storeAppDispatch(setPlayerData({\r\n name: account,\r\n isLogged: true,\r\n }));\r\n localStorage.setItem('chainLogin', chainLogin);\r\n\r\n // anti-cheat\r\n usernamesChecks(account);\r\n\r\n // // # FETCH HIVE NFTS\r\n // const { hiveNftsArr /*, teacher*/ } = await fetchHiveNfts({ hiveUsername: username });\r\n // // UI next login wait\r\n // localStorage[hiveNftsArr.length ? 'setItem' : 'removeItem']('hivenfts', true);\r\n\r\n // const { linkedAccounts, err: errDataFetch } = await fetchUserDataOnly({ account: username, chain: chainLogin });\r\n // isLocal && console.debug('cross-chain account linked:', { linkedAccounts, errDataFetch });f\r\n // if (errDataFetch) {\r\n // Swal.fire({ text: `Something went wrong fetching your data. Please try again.` });\r\n // storeAppDispatch(setPlayerLogout());\r\n // return;\r\n // }\r\n // const { wax: linkedWaxAccount, btc: linkedBtcAddress } = linkedAccounts || {};\r\n // isLocal && console.log('{hl} fetching inventory for Wax linked user', linkedWaxAccount);\r\n // let csNfts = [];\r\n // let hotNfts = {};\r\n // if (linkedWaxAccount) {\r\n // // # FETCH WAX {INVENTORY}\r\n // // eslint-disable-next-line no-unused-vars\r\n // const inventoryResponse = await processInventory({ username: linkedWaxAccount });\r\n // const { err: errWaxInventory, scholarship: _notSupported_ } = inventoryResponse;\r\n // csNfts = inventoryResponse.csNfts;\r\n // hotNfts = inventoryResponse.hotNfts;\r\n // if (errWaxInventory) {\r\n // console.error('Error fetching linked wax inventory for hive user', errWaxInventory);\r\n // storeAppDispatch(setPlayerLogout());\r\n // return;\r\n // }\r\n // localStorage[csNfts.length === 0 ? 'removeItem' : 'setItem']('waxnfts', true);\r\n // // let kitNft;\r\n // // const hasNoNfts = csNfts.length === 0 && Object.keys(hotNfts).length === 0;\r\n // // if (hasNoNfts) {\r\n // // kitNft = { [MINIMUM_REQUIREMENTS_INFO]: '' }; // HACK @@\r\n // // }\r\n // }\r\n\r\n const currentState = {\r\n chainLogin: chainLogin,\r\n // wax\r\n csAssets: { csNfts: [], hotNfts: [] },\r\n // hive\r\n hive: { nfts: [] },\r\n // skale\r\n skale: { nfts: [], username: account },\r\n // scholarship: null,\r\n };\r\n storeAppDispatch(setPlayerInventory(currentState));\r\n\r\n // ## Routing\r\n navigatePostLogin({ locationHistory });\r\n\r\n // ## Fetch Balances\r\n // isLocal && console.log('{hl} fetching boom balance');\r\n // const boomAmount = await fetchBoomBalance(UserService.authName);\r\n // const savingsAmount = await Promise.resolve(0); // TEMP for savings @@ @@ @@ @@\r\n // storeAppDispatch(setPlayerWaxTokensBalances({\r\n // tokens: { boom: boomAmount },\r\n // stakedSavings: { boom: savingsAmount }\r\n // }));\r\n // // Whitelist check (TESTNET only)\r\n // isLocal && console.log('{hl} checking whitelist items');\r\n // const missingItem = await verifyAccessAllowed(UserService.authName, csNfts); // IMPROVEMENT: just check the NFTs just fetched above !!!\r\n // if (missingItem) {\r\n // const isOk = window.confirm(`${UserService.authName} the following item is required to access this version of the game: ${(missingItem || '').replace(/_/g, ' ')}\\n\\nUnless it's a new mint, keep in mind the 12 hour cooldown.`);\r\n // if (isOk)\r\n // window.open('https://wax.atomichub.io/market?collection_name=crypto4shots&order=desc&schema_name=early.access&sort=created&symbol=WAX', '_blank');\r\n // storeAppDispatch(setPlayerLogout());\r\n // !isLocal && window.location.reload();\r\n // }\r\n\r\n // # MULTI SESSION CHECKS\r\n multiTabCheckAfterLogin();\r\n\r\n // # LOAD STORAGE \r\n loadStorage({ user: account });\r\n isLocal && console.log('{hl} all done');\r\n };\r\n\r\n\r\n \r\n const ETH_NETWORK = {\r\n chainId: isTestnet\r\n ? '0xaa36a7' // ie. 11155111\r\n : '0x1', // ie. 1\r\n chainName: isTestnet\r\n ? 'Sepolia test network'\r\n : 'Ethereum Mainnet',\r\n nativeCurrency: {\r\n name: 'Ether',\r\n symbol: 'ETH',\r\n decimals: 18,\r\n },\r\n rpcUrls: [\r\n isTestnet\r\n ? 'https://sepolia.infura.io/v3/'\r\n : 'https://mainnet.infura.io/v3',\r\n ],\r\n blockExplorerUrls: [\r\n isTestnet\r\n ? 'https://sepolia.etherscan.io'\r\n : 'https://etherscan.io',\r\n ],\r\n };\r\n\r\n const switchToEthNetwork = async () => {\r\n try {\r\n await window.ethereum.request({\r\n method: 'wallet_switchEthereumChain', // no addEthereumChain, added by default\r\n params: [{ chainId: ETH_NETWORK.chainId }],\r\n });\r\n isLocal && console.log('Switched to ETH network');\r\n return ({});\r\n } catch (err) {\r\n console.error('Error adding SKALE network to MetaMask', err);\r\n let errMsg;\r\n if (err?.code === 4902) {\r\n errMsg = Ethereum network not available in your MetaMask. Add it manually.;\r\n } else {\r\n errMsg = Failed to switch to ETH Network.;\r\n }\r\n handleLoginError(errMsg);\r\n return ({ err });\r\n }\r\n }\r\n\r\n const checkAndAddEthNetwork = async () => {\r\n try {\r\n const currentChainId = await window.ethereum.request({ method: 'eth_chainId' });\r\n if (currentChainId !== ETH_NETWORK.chainId) {\r\n const { err } = await switchToEthNetwork();\r\n if (err) return ({ err });\r\n }\r\n } catch (err) {\r\n console.error('Error checking if the ETH network is available', err);\r\n const errMsg = Failed to check ETH Network status.;\r\n handleLoginError(errMsg);\r\n return ({ err });\r\n }\r\n return ({});\r\n }\r\n\r\n const signMessage = async (account, message) => {\r\n try {\r\n const signature = await window.ethereum.request({\r\n method: 'personal_sign',\r\n params: [message, account],\r\n });\r\n return ({ signature });\r\n } catch (error) {\r\n console.error('Something went wrong signing the message:', error);\r\n return ({ err: 'Failed to sign the message to log in' });\r\n }\r\n }\r\n\r\n const handleLogin = async () => {\r\n // Game mode check\r\n if (!isPvp) {\r\n Swal.fire({ text: `For now only Multiplayer mode is supported for Ethreum logins` });\r\n return;\r\n }\r\n // UI\r\n setIsLoading(true);\r\n // Metamask Check\r\n if (!window.ethereum || !window.ethereum.isMetaMask) {\r\n const errMsg = \r\n MetaMask not found, please install it.\r\n ;\r\n handleLoginError(errMsg);\r\n toast.error('Ethereum wallet not found');\r\n return;\r\n }\r\n // Eth Network check\r\n const { err: errChain } = await checkAndAddEthNetwork();\r\n if (errChain) return;\r\n isLocal && console.log('ETH network enabled in MetaMask');\r\n // Retrieve ETH address to use\r\n const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });\r\n const account = accounts[0]; // use the first account\r\n if (!account) {\r\n const errMsg = No Ethereum address found;\r\n handleLoginError(errMsg);\r\n return;\r\n }\r\n // Sign message\r\n const message = \"Crypto Shots login\";\r\n const { signature, err } = await signMessage(account, message);\r\n if (err) {\r\n const errMsg = Failed to sign the message to log in;\r\n handleLoginError(errMsg);\r\n return;\r\n }\r\n isLocal && console.log('Signature:', signature);\r\n // Verify signature and next steps\r\n ethLoginSteps({ account, message, signature });\r\n };\r\n\r\n\r\n const [loginError, setLoginError] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const handleLoginError = (errMsg) => {\r\n setLoginError(errMsg);\r\n setIsLoading(false);\r\n };\r\n\r\n return (
    \r\n
    \r\n \r\n \"Loggin\"  \r\n {isLoading\r\n ? \r\n : MetaMask Login}\r\n \r\n {loginError &&

    {loginError}

    }\r\n
    \r\n {!loginError &&
    \r\n No MetaMask Browser Wallet?  \r\n \r\n Get It Here\r\n \r\n
    \r\n }\r\n
    );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport { setChainLogin } from '../../../reducers/UserReducer';\r\nimport { getSingleChainLogin } from '../../../generalUtils/browser/urlParams';\r\nimport { TermsConditions } from './Shared/TermsConditions';\r\nimport { ChainChoicePanel } from './Shared/ChainChoicePanel';\r\nimport { ChainPromo } from './Shared/ChainIcon';\r\nimport { GameModesBtn } from './Shared/GameModesBtn';\r\nimport { HiveLoginPanel } from './Hive/HiveLoginPanel';\r\nimport { WaxLoginPanel } from './Wax/WaxLoginPanel';\r\nimport { BitcoinLoginPanel } from './Bitcoin/BitcoinLoginPanel';\r\nimport { SkaleLoginPanel } from './Ethereum/SkaleChain/SkaleLoginPanel';\r\nimport { EthNetworkChoice } from './Ethereum/EthNetworkChoice';\r\nimport { EthLoginPanel } from './Ethereum/EthChain/EthLoginPanel';\r\nimport './LoginOptions.scss';\r\n\r\n\r\nexport const LoginChoice = ({ backBtn: backToModeChoice } = {}) => {\r\n const UserState = useSelector((store) => store.user);\r\n const { chainLogin } = UserState;\r\n const urlParamChain = getSingleChainLogin();\r\n const chain = urlParamChain || chainLogin;\r\n \r\n const isIntermediateScreen = chain === 'eth-choice';\r\n const shouldDisplayTc = !isIntermediateScreen && urlParamChain !== 'btc';\r\n\r\n useEffect(() => {\r\n if (urlParamChain && !chainLogin) {\r\n storeAppDispatch(setChainLogin({ chainLogin: urlParamChain }));\r\n }\r\n }, []);\r\n\r\n const LoginPanel = ({ chain }) => {\r\n switch (chain) {\r\n case 'wax': return ;\r\n case 'hive': return ;\r\n case 'btc': return ;\r\n\r\n // ETH CHAINS\r\n case 'eth-choice': return ;\r\n case 'skl': return ;\r\n case 'eth': return ;\r\n\r\n default: return null;\r\n }\r\n };\r\n\r\n return (\r\n
    \r\n {(urlParamChain || !chainLogin) && }\r\n {chain && }\r\n {(!chainLogin && !urlParamChain)\r\n ? \r\n : <>{shouldDisplayTc && }\r\n }\r\n \r\n
    \r\n );\r\n};\r\n","\r\nexport const ICONS = {\r\n P2E: 'https://files.peakd.com/file/peakd-hive/gaottantacinque/23wBxxdKiJQ32FjeTVC55mChN5i2eGeyECztSFE71Ng8hAuvzrWjCL7UaKmwWGWYuLKQZ.png',\r\n F2P: 'https://files.peakd.com/file/peakd-hive/gaottantacinque/EoiTEbnkLJAfWmUhqwcaAJm8KS1a4wTfeMyWUJKG8GfWTaWr8GjUmnGg2Z6xYsedCQ7.png',\r\n CONTROLLER: 'https://www.glyphicons.com/img/glyphicons/basic/2x/glyphicons-basic-413-game-controller@2x.png',\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { ICONS } from '../../config/config';\r\n\r\n\r\nexport const PlayerMode = ({ singleplayerHandler, multiplayerHandler, mode }) => {\r\n const { CONTROLLER } = ICONS;\r\n \r\n const PlayState = useSelector((store) => store.play);\r\n const percentLoaded = PlayState.isPercentLoaded;\r\n const isPvp = localStorage.getItem('lastGameModePlayed') !== 'pve'; // assumes default is pvp (ls empty)\r\n\r\n const extraTextPlayBtn = percentLoaded < 100\r\n ? {percentLoaded.toFixed()}% loaded\r\n : <>;\r\n\r\n return (<>\r\n
    \r\n
    \r\n
    \r\n \r\n  \r\n

    \r\n SINGLE PLAYER
    \r\n {isPvp ? <> : {extraTextPlayBtn}}\r\n

    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n  \r\n \r\n
    \r\n

    \r\n MULTIPLAYER\r\n {isPvp ? {extraTextPlayBtn} : <>}\r\n

    \r\n \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Animated } from \"react-animated-css\";\r\nimport { LoginChoice } from '../../Login/LoginOptions';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { PlayerMode } from '../../Login/Shared/PlayerMode';\r\n\r\n\r\nconst nftScanMsgs = ({ isHiveLogin }) => {\r\n const hadWaxNfts = localStorage.getItem('waxnfts');\r\n const hadHiveNfts = localStorage.getItem('hivenfts');\r\n const steps = [\r\n \r\n


    - Finding your NFTs on the {isHiveLogin ? 'Hive' : 'Wax'} blockchain

    \r\n ,\r\n \r\n


    - Finding your NFTs on the {isHiveLogin ? 'Wax' : 'Hive'} blockchain

    \r\n \r\n ];\r\n const oneChainOnly = (isHiveLogin && !hadWaxNfts) || (!isHiveLogin && !hadHiveNfts);\r\n isLocal && console.debug('UI login msg:', { isHiveLogin, oneChainOnly, why: { hadWaxNfts, hadHiveNfts } });\r\n if (oneChainOnly) return [steps[0]];\r\n return steps;\r\n};\r\n\r\nconst PostLoginLoading = ({ isHiveLogin }) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n {!isHiveLogin &&

    - Logging you in (2 signatures)

    }\r\n {[...nftScanMsgs({ isHiveLogin })]}\r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nconst ForcedReloadForP2E = () => {\r\n return (\r\n

    Please \r\n window.location.reload()}>reload the page to log in.\r\n

    \r\n );\r\n};\r\n\r\n\r\nexport const P2EarnPane = ({ didPlayTrial, choseP2eMode, setChoseP2eMode, handleP2eGamePVE, handleP2eGamePVP }) => {\r\n const UserState = useSelector((store) => store.user);\r\n const isHiveLogin = UserState.chainLogin === 'hive';\r\n\r\n return (\r\n UserState.isLogged\r\n ? \r\n : <>\r\n {didPlayTrial\r\n ? \r\n : <>\r\n {choseP2eMode\r\n ? setChoseP2eMode(false)} />\r\n :
    \r\n \r\n
    \r\n ALPHA   with initial auto-rewards system\r\n
    \r\n
    \r\n }\r\n \r\n }\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { PlayerMode } from '../../Login/Shared/PlayerMode';\r\n\r\nexport const F2PlayPane = ({ handleGameTrialPVE, handleGameTrialPVP }) => {\r\n return (\r\n
    \r\n \r\n
    \r\n No login required to play.  All levels available!\r\n
    \r\n
    \r\n );\r\n};\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Animated } from \"react-animated-css\";\r\nimport { isUnderMaintenance } from \"../../config/appRemoteStatus\";\r\nimport { getBannersConfig } from './utils/bannerAds';\r\nimport { invoke } from 'lodash';\r\nimport { setFreeTrial } from './utils/freeTrial';\r\nimport { isLocal } from '../../constants/envs';\r\nimport { SuggestBrave } from './subcomp/SuggestBrowser';\r\nimport { setGameMode } from '../../reducers/PlayReducer';\r\nimport { storeAppDispatch } from '../../GlobalState/Store';\r\nimport Swal from 'sweetalert2';\r\nimport { LogoLanding } from './subcomp/LogoLanding';\r\nimport { LandingBanner } from './subcomp/Banners/LandingBanner';\r\nimport { MaintenanceMessage } from './Login/Shared/MaintenanceMessage';\r\nimport { P2EarnPane } from './subcomp/P2E/P2EarnPane';\r\nimport { F2PlayPane } from './subcomp/F2P/F2PlayPane';\r\nimport { ICONS } from './config/config';\r\nimport { getNavigationGameMode } from '../../generalUtils/browser/urlParams';\r\nimport './LandingPage.scss';\r\n\r\nconst isFirstLoad = !window.localStorage.getItem('cached');\r\n\r\n\r\nexport const LandingPage = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const [didPlayTrial, setDidPlayTrial] = useState(false);\r\n const [choseP2eMode, setChoseP2eMode] = useState(false);\r\n\r\n const [bannersDynConfig, setBannersDynConfig] = useState(null);\r\n \r\n useEffect(() => {\r\n // Default to P2E menu expanded (they can still click F2P button)\r\n setExpandedLoginPane('P2E');\r\n // Shows specific game mode if url param was present\r\n const gameMode = getNavigationGameMode();\r\n if (gameMode) {\r\n if (gameMode === 'pve') handleP2eGamePVE();\r\n else if (gameMode === 'pvp') handleP2eGamePVP();\r\n }\r\n // NOTE: I could also default to specific game mode based on LS lastGameModePlayed\r\n // but prefer not to. Allow them to try F2P a few times without forcing P2E on them.\r\n\r\n const fetchBanners = async () => {\r\n const bannersConfig = await getBannersConfig();\r\n setBannersDynConfig(bannersConfig);\r\n };\r\n fetchBanners();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!UserState.isLogged) return;\r\n // Hides Ads displayed in loading page\r\n isLocal && console.debug('Removing banners...');\r\n const adsLoadPage = document.getElementById('ad-loading-page'); // web wrapper element\r\n if (adsLoadPage) adsLoadPage.style.display = 'none';\r\n }, [UserState.isLogged]);\r\n\r\n\r\n const loadUnityGame = ({ level, isTrial }) => {\r\n localStorage.setItem('lastGameModePlayed', level); // 0 or 'pvp'\r\n // TODO: in cs-wrapper default to PVP once the builds are split per level (too heavy now)\r\n invoke(window, 'loadUnity', { level, isTrial });\r\n // store last choice so that it pre-loads that next time (in cs-wrapper)\r\n };\r\n\r\n // ## FREE-TO-PLAY\r\n const handleGameTrialPVE = () => {\r\n if (!window.unityLoadCompleted) {\r\n Swal.fire({ text: 'Please wait a sec, the game is still loading behind the scenes!' })\r\n return;\r\n }\r\n // show game\r\n invoke(window, 'pageShow', 'game');\r\n // free trial state\r\n setFreeTrial({ value: true, from: 'free-btn' });\r\n setDidPlayTrial(true);\r\n // gameMode in reducer\r\n storeAppDispatch(setGameMode({ gameMode: 'pve' }));\r\n // unity loader (redundant if no switch)\r\n loadUnityGame({ level: 0, isTrial: true });\r\n }\r\n const handleGameTrialPVP = () => {\r\n if (!window.unityLoadCompleted) {\r\n Swal.fire({ text: `Please wait a sec, the game is still loading behind the scenes!` })\r\n return;\r\n }\r\n // show game\r\n invoke(window, 'pageShow', 'game');\r\n // free trial state\r\n setFreeTrial({ value: true, from: 'free-btn' });\r\n setDidPlayTrial(true);\r\n // gameMode in reducer\r\n storeAppDispatch(setGameMode({ gameMode: 'pvp' }));\r\n // unity loader\r\n loadUnityGame({ level: 'pvp', isTrial: true });\r\n // set free trial random guest username in cs-wrapper\r\n document.dispatchEvent(new Event('trialUsername'));\r\n }\r\n\r\n // ## PLAY-TO-EARN\r\n const handleP2eGamePVE = () => {\r\n // login ui local state\r\n setChoseP2eMode(true);\r\n // gameMode in reducer\r\n storeAppDispatch(setGameMode({ gameMode: 'pve' }));\r\n // unity loader (redundant if no switch)\r\n loadUnityGame({ level: 0, isTrial: false });\r\n };\r\n const handleP2eGamePVP = () => {\r\n // login ui local state\r\n setChoseP2eMode(true);\r\n // gameMode in reducer\r\n storeAppDispatch(setGameMode({ gameMode: 'pvp' }));\r\n // unity loader\r\n loadUnityGame({ level: 'pvp', isTrial: false });\r\n };\r\n\r\n const [expandedLoginPane, setExpandedLoginPane] = useState(null);\r\n\r\n\r\n const PlayToEarn = () => {\r\n return (<>\r\n \r\n {!UserState.isLogged && setExpandedLoginPane('P2E')}\r\n >\r\n \r\n }\r\n
    \r\n {isUnderMaintenance() && }\r\n
    \r\n\r\n {/* Travel Into Game While Loading - Animation and Fetches */}\r\n {!isUnderMaintenance() && expandedLoginPane === 'P2E'\r\n && }\r\n \r\n );\r\n };\r\n\r\n const FreeToPlay = () => {\r\n return (<>\r\n \r\n setExpandedLoginPane('F2P')}\r\n >\r\n \r\n {/* // not needed for now\r\n
    \r\n {isUnderMaintenance() && }\r\n
    \r\n */}\r\n {expandedLoginPane === 'F2P' && }\r\n \r\n );\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n {/* Main Logo */}\r\n \r\n
    \r\n\r\n {/* Play-To-Earn Pane */}\r\n \r\n \r\n \r\n\r\n {/* Free-To-Play Pane */}\r\n {!UserState.isLogged && <>\r\n \r\n \r\n \r\n \r\n }\r\n
    \r\n\r\n {/* Recommended Browser */}\r\n \r\n\r\n {/* Our Banner, Browser Suggestion, and Ads */}\r\n \r\n
    \r\n );\r\n};\r\n","import { isTestnet } from '../../../constants/envs';\r\n\r\n\r\nexport const PRIZES_FILENAME = 'pve-leaderboard.json';\r\nexport const REMOTE_JSON_PATH = `https://${isTestnet ? 'playtest' : 'play'}.crypto-shots.com/json`;\r\n\r\nexport const LDB_BANNER_PRICE = {\r\n WEEK: 10,\r\n MONTH: 30,\r\n YEAR: 200,\r\n};\r\n","import { isLocal } from '../../../../../constants/envs';\r\n\r\n\r\nconst cache = {\r\n cachedResults: {}, // eg. { 'BOOM:csboomcsboom': { lastPriceUsd, ts } }\r\n marketNumbers: {}, // eg. { 'BOOM:csboomcsboom': 368 }\r\n};\r\nconst CACHE_DURATION_MINS = 10;\r\n\r\n\r\nconst alcorApiPrice = marketNumber => `https://wax.alcor.exchange/api/markets/${marketNumber}/deals`;\r\nconst alcorApiMarkets = `https://wax.alcor.exchange/api/markets`;\r\n\r\n\r\nexport const getWaxTokenPrice = async ({ tokenName = '', chainPrice = 0 }) => {\r\n if (!tokenName) return;\r\n try {\r\n // CACHE CHECK\r\n const cached = cache.cachedResults[tokenName] || {};\r\n const { lastPriceUsd: cachedPrice, ts: lastFetchTs } = cached;\r\n if (cachedPrice) {\r\n const elapsedTime = Date.now() - lastFetchTs;\r\n if (elapsedTime < (CACHE_DURATION_MINS * 60 * 1000)) {\r\n isLocal && console.log('[alcor-price] Returned cached value of', cachedPrice);\r\n return ({ lastPriceUsd: cachedPrice });\r\n }\r\n // doing this here so that it returns previous result if new requests come in\r\n // while this request is still in progress (prevent api throttling)\r\n cached.ts = Date.now();\r\n }\r\n\r\n // FETCH MARKET NUMBER (and cached)\r\n let marketNumCache = cache.marketNumbers[tokenName];\r\n if (!marketNumCache) {\r\n isLocal && console.log('[alcor-price] fetching market for token', tokenName);\r\n const markets = await fetch(alcorApiMarkets).then(response => response.json())\r\n const [symbol, contract] = tokenName.split(':');\r\n const marketNumber = markets.find(\r\n market => (market.base_symbol || market.quote_token?.symbol?.name) === symbol\r\n && (market.contract || market.quote_token?.contract) === contract,\r\n );\r\n if (!marketNumber?.id) {\r\n console.error(`[alcor-price] market not found for ${tokenName}. Response:`, markets[0]);\r\n return ({ err: 'market-not-found' });\r\n }\r\n marketNumCache = (cache.marketNumbers[tokenName] = marketNumber?.id);\r\n isLocal && console.log('[alcor-price] market match:', marketNumCache);\r\n }\r\n // FETCH TOKEN PRICE\r\n isLocal && console.log('[alcor-price] fetching token price for', tokenName);\r\n const priceData = await fetch(alcorApiPrice(marketNumCache)).then(res => res.json());\r\n const lastPrice = priceData[0]?.unit_price;\r\n if (!lastPrice) {\r\n console.error('[alcor-price] price data missing:', { priceData });\r\n return ({ err: 'price-not-found' });\r\n }\r\n isLocal && console.log('[alcor-price] token price in Wax:', lastPrice);\r\n\r\n // CONVERT INTO USD\r\n const lastPriceUsd = +lastPrice * chainPrice;\r\n // RESULT\r\n isLocal && console.log('[alcor-price] result:', { lastPrice, lastPriceUsd });\r\n cache.cachedResults[tokenName] = { lastPriceUsd, ts: Date.now() };\r\n return ({ lastPriceUsd });\r\n } catch (err) {\r\n console.error(`[alcor-price] Something broke fetching token price from HE: ${err}`);\r\n return ({ err });\r\n }\r\n};\r\n\r\n// // TEST\r\n// const fetch = require('node-fetch');\r\n// const test = async () => {\r\n// const { lastPriceUsd, err } = await getFungibleTokenPrice({ tokenName: 'BOOM:csboomcsboom', chainPrice: 0.062 });\r\n// };\r\n// test();\r\n","import { isLocal } from \"../../../../../constants/envs\";\r\n\r\n\r\nconst cache = {\r\n cachedResults: {}, // eg. { 'doom': { lastPriceUsd, ts } }\r\n};\r\nconst CACHE_DURATION_MINS = 10;\r\n\r\n\r\nconst tokenInfoUrl = `https://api.hive-engine.com/rpc/contracts`;\r\n\r\nconst prepTokenInfoBody = tokenName => ({\r\n jsonrpc: '2.0',\r\n method: 'find',\r\n params: {\r\n contract: 'market',\r\n table: 'metrics',\r\n query: { 'symbol': tokenName },\r\n limit: 1,\r\n offset: 0,\r\n indexes: [],\r\n },\r\n id: 1,\r\n});\r\n\r\nexport const getHiveEngineTokenPrice = async ({ tokenName = '', chainPrice = 0 }) => {\r\n if (!tokenName) return;\r\n const priceFetchStartTs = Date.now();\r\n try {\r\n // CACHE CHECK\r\n const cached = cache.cachedResults[tokenName] || {};\r\n const { lastPriceUsd: cachedPrice, ts: lastFetchTs } = cached;\r\n if (cachedPrice) {\r\n const elapsedTime = Date.now() - lastFetchTs;\r\n if (elapsedTime < (CACHE_DURATION_MINS * 60 * 1000)) {\r\n isLocal && console.log('[he-price] Returned cached value of', cachedPrice);\r\n return ({ lastPriceUsd: cachedPrice });\r\n }\r\n // doing this here so that it returns previous result if new requests come in\r\n // while this request is still in progress (prevent api throttling)\r\n cached.ts = Date.now();\r\n }\r\n // API CALL\r\n const tokenInfoBody = prepTokenInfoBody(tokenName);\r\n const tokenInfoData = await fetch(tokenInfoUrl, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(tokenInfoBody),\r\n })\r\n .then(res => res.json());\r\n const { lastPrice } = tokenInfoData?.result[0];\r\n if (!lastPrice) {\r\n console.error('[he-price] price data missing:', { tokenInfoData });\r\n return ({ err: 'price-not-found' });\r\n }\r\n // CONVERT INTO USD\r\n const lastPriceUsd = +lastPrice * chainPrice;\r\n // RESULT\r\n isLocal && console.log('[he-price] result:', { lastPrice, lastPriceUsd });\r\n cache.cachedResults[tokenName] = { lastPriceUsd, ts: Date.now() };\r\n return ({ lastPriceUsd });\r\n } catch (err) {\r\n const durationMs = Date.now() - priceFetchStartTs;\r\n console.error(`[he-price] Something broke fetching token price from HE: [durationMs:${durationMs}] ${err}`);\r\n return ({ err });\r\n }\r\n};\r\n","import { isLocal } from \"../../../../constants/envs\";\r\nimport { getWaxTokenPrice } from \"./prices/alcor\";\r\nimport { getHiveEngineTokenPrice } from \"./prices/hiveEngine\";\r\n\r\nconst supportedChains = ['HIVE', 'WAX'];\r\n\r\nconst toUsd = (prices = [], tokenPrice) => prices.map(prize => prize * tokenPrice);\r\n\r\n\r\nexport const calcTileRewards = async ({\r\n cs = {}, divider = 1, chainPrice = 0,\r\n sponsor = {}, sponsorSymbol = '',\r\n chainLogin = '',\r\n}) => {\r\n isLocal && console.log('Calculating rewards for:', {\r\n cs, divider, chainPrice, sponsor, sponsorSymbol, chainLogin,\r\n });\r\n try {\r\n const igBoomSponsor = sponsor?.igBoom?.amounts || [];\r\n const igMarsSponsor = sponsor?.igMars?.amounts || [];\r\n let igBoomCs = cs?.igBoom?.usdValues || [];\r\n let igMarsCs = cs?.igMars?.usdValues || [];\r\n\r\n // If there's a sponsor, our rewards are less\r\n if (igBoomSponsor.length + igMarsSponsor.length) {\r\n igBoomCs = igBoomCs.map(prize => prize / divider);\r\n igMarsCs = igMarsCs.map(prize => prize / divider);\r\n }\r\n\r\n // If a token symbol is provided, fetch its market price. Otherwise default to chainPrice.\r\n let tokenPrice;\r\n const isProjectToken = sponsorSymbol && !supportedChains.includes(sponsorSymbol);\r\n if (isProjectToken) {\r\n const priceChecker = chainLogin.toLowerCase() === 'hive'\r\n ? getHiveEngineTokenPrice\r\n : getWaxTokenPrice;\r\n const { lastPriceUsd, err } = await priceChecker({ tokenName: sponsorSymbol, chainPrice });\r\n tokenPrice = err ? 0 : lastPriceUsd;\r\n isLocal && console.log(`${sponsorSymbol} price: $`, lastPriceUsd);\r\n } else {\r\n tokenPrice = chainPrice;\r\n }\r\n\r\n const tokenValues = [...toUsd(igBoomSponsor, tokenPrice), ...toUsd(igMarsSponsor, tokenPrice)];\r\n const tokenUsdSum = tokenValues.reduce((acc, cur) => acc + cur, 0);\r\n\r\n // Sum\r\n const allPrizes = [\r\n tokenUsdSum, // sponsors\r\n ...igBoomCs, ...igMarsCs, // ours\r\n ];\r\n const usdTotalSum = allPrizes.reduce((acc, cur) => acc + cur, 0);\r\n\r\n // Result\r\n isLocal && console.log('Tile rewards calc:', { sponsorSymbol, divider, tokenUsdSum, allPrizes, usdTotalSum });\r\n return { usdTotalSum, tokenUsdSum };\r\n } catch (err) {\r\n console.error('broke in calcTileRewards:', err);\r\n return ({ err: 'rewards-calc-broke' });\r\n }\r\n};\r\n","import React from 'react';\r\n\r\nexport const isEmbedded = window !== window.top || localStorage.getItem('chainParam');\r\n\r\nexport const PrizesCurrency = ({ chainLogin = '', short = false }) => {\r\n return isEmbedded\r\n ? <>${chainLogin.toUpperCase()}{short ? '/' : ' or '}${chainLogin === 'hive' ? 'WAX' : 'HIVE'}\r\n : <>${chainLogin.toUpperCase()};\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\n\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { LDB_BANNER_PRICE, PRIZES_FILENAME, REMOTE_JSON_PATH } from './config';\r\nimport { DISCORD_INVITE } from '../../../constants/links';\r\nimport { capitalize } from '../../../generalUtils/utils';\r\nimport { calcTileRewards } from './utils/calcTileRewards';\r\nimport { coingeckoFetch } from './utils/prices/coingecko';\r\nimport { PrizesCurrency, isEmbedded } from '../StandaloneAds/Shared/PrizesCurrency';\r\nimport './LeaderboardPrizes.scss';\r\n\r\n\r\nconst formatAmounts = ({ igToken, symbol, rewardDivider }) => {\r\n const values = igToken?.usdValues || igToken?.amounts;\r\n if (!values) return ['n/a'];\r\n return values.map(value => symbol ? `${value} ${symbol}` : `$ ${value / rewardDivider}`);\r\n}\r\n\r\nconst CsPrizesPanel = ({ prizes = {}, chainLogin, hasSponsor, rewardDivider = 1 }) => {\r\n const { igBoom, igMars } = prizes.cs || {};\r\n const playerGoalLow = hasSponsor ? 'Highest TOTAL KILLS' : 'Top igBoom balance';\r\n const playerGoalTop = hasSponsor ? '3rd level BEST TIME' : 'Top igMars balance';\r\n\r\n return
    \r\n

    {playerGoalLow}:  
    \r\n   {formatAmounts({ igToken: igBoom, rewardDivider }).join(', ')}\r\n
      in

    \r\n

    {playerGoalTop}:  
    \r\n   {formatAmounts({ igToken: igMars, rewardDivider }).join(', ')}\r\n
      in

    \r\n
    ;\r\n};\r\n\r\nconst LeaderboardBanner = ({\r\n placeholder, period = '', // \"buy this ad space\" banner\r\n sponsor = {}, // sponsor banner\r\n chainLogin,\r\n}) => {\r\n const { projectName, banner, sponsorDiscordInvite } = sponsor;\r\n const periodUc = period.toUpperCase();\r\n\r\n if (!projectName) return (\r\n
    \r\n \r\n \"sponsor\"\r\n \r\n
    \r\n 1 {periodUc} for

    $ {LDB_BANNER_PRICE[periodUc]\r\n }

    in {period === 'week' ?


    ...or your {isEmbedded ? 'project' : capitalize(chainLogin)} token

    : ''}\r\n
    \r\n
    \r\n );\r\n return (\r\n <>\r\n \r\n \"sponsor\"\r\n \r\n \r\n );\r\n};\r\n\r\nconst SponsorPrizesPanel = ({ placeholder, sponsor = {}, period = '', chainLogin, tokenUsdSum = 0, showBanner = true }) => {\r\n const { projectName, symbol = '', igBoom, igMars, sponsorDiscordInvite } = sponsor;\r\n const cleanSymbol = symbol.split(':')[0];\r\n\r\n const tokenValue = tokenUsdSum > 0 ? tokenUsdSum.toFixed(0) : '...';\r\n\r\n // MISSING SPONSOR, sell spot!\r\n if (!projectName) return (\r\n
    \r\n
    \r\n ...PLUS prizes sponsored by:  \r\n
    \r\n Advertise your project and reward our players!\r\n   Chat with us \r\n HERE\r\n \r\n
    \r\n\r\n {showBanner && }\r\n
    \r\n );\r\n\r\n // SPONSOR, show prizes and their ad\r\n return (\r\n
    \r\n

    \r\n ...PLUS $ {tokenValue} sponsored by:  \r\n \r\n \r\n {projectName}\r\n \r\n \r\n

    \r\n
    \r\n

    - {capitalize(chainLogin)\r\n } user with most igBoom:  \r\n {formatAmounts({ igToken: igBoom, symbol: cleanSymbol || chainLogin }).join(', ')}\r\n \r\n

    \r\n

    - {capitalize(chainLogin)\r\n } user with most igMars:  \r\n {formatAmounts({ igToken: igMars, symbol: cleanSymbol || chainLogin }).join(', ')}\r\n \r\n

    \r\n
    \r\n\r\n {showBanner && }\r\n
    \r\n );\r\n};\r\n\r\nconst PrizeTile = ({ period = '', leaderboardConfig = {}, chainData = {} }) => {\r\n // Configs Prep\r\n const { chainLogin, chainPrice } = chainData;\r\n const chainLc = chainLogin.toLowerCase();\r\n const { prizes = {}, bannerPlaceholder = {} } = leaderboardConfig;\r\n const { additionalProperties = {} } = prizes[chainLc] || {};\r\n const placeholder = bannerPlaceholder.primaryImg;\r\n const chainPrizes = prizes[chainLc] || {};\r\n const { cs, sponsor } = chainPrizes[period] || {};\r\n const { dividerCsRewardsWhenSponsored: divider = 1 } = additionalProperties;\r\n \r\n // Local State\r\n const [tileRewards, setTileRewards] = useState(...);\r\n const [tokenUsdSum, setTokenUsdSum] = useState(0);\r\n \r\n // Rewards Calc\r\n useEffect(() => {\r\n if (!chainPrice) return;\r\n const calcTileRewardsIncludingTokens = async () => {\r\n const { usdTotalSum = 0, tokenUsdSum = 0 } = await calcTileRewards({\r\n cs, divider, chainPrice,\r\n sponsor, sponsorSymbol: sponsor?.symbol,\r\n chainLogin,\r\n });\r\n const usdTotalSumFormatted = `$ ${usdTotalSum.toFixed(0)}`;\r\n if (usdTotalSum > 0) setTileRewards(usdTotalSumFormatted);\r\n if (tokenUsdSum > 0) setTokenUsdSum(tokenUsdSum);\r\n };\r\n calcTileRewardsIncludingTokens();\r\n }, [chainPrice, chainLogin, cs, divider, sponsor]);\r\n\r\n\r\n // UI\r\n const title = `${period.toUpperCase()}${period === 'year' ? ` ${new Date().getFullYear()}` : 'LY'} PRIZES`;\r\n const rewardDivider = sponsor?.symbol ? divider : 1;\r\n const hasSponsor = sponsor?.projectName;\r\n\r\n return (\r\n
    \r\n
    \r\n {title}\r\n

    {tileRewards}

    \r\n
    \r\n {period === 'year'\r\n ?
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n : <>\r\n \r\n \r\n \r\n }\r\n
    \r\n );\r\n};\r\n\r\nexport const LeaderboardPrizes = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = localStorage.getItem('chainParam') || UserState.chainLogin;\r\n \r\n const [leaderboardConfig, setLeaderboardConfig] = useState({});\r\n const [chainData, setChainData] = useState({ chainLogin: chainLogin.toUpperCase() });\r\n\r\n useEffect(() => {\r\n // Fetch Prizes Config\r\n const fetchPvePrizes = async () => {\r\n const url = isLocal\r\n ? `./${PRIZES_FILENAME}` // uses package.json > proxy\r\n : `${REMOTE_JSON_PATH}/${PRIZES_FILENAME}`;\r\n try {\r\n const json = await fetch(url).then(res => res.json());\r\n setLeaderboardConfig(json);\r\n } catch (err) { console.error(`Unable to fetch pve prizes: ${err}`); }\r\n };\r\n fetchPvePrizes();\r\n // Fetch chain price\r\n const fetchChainPrice = async () => {\r\n const { data = {}, err } = await coingeckoFetch({ token: chainLogin });\r\n !err && setChainData({ ...chainData, chainPrice: data[chainLogin]?.usd });\r\n };\r\n fetchChainPrice();\r\n }, []);\r\n\r\n return (\r\n
    \r\n

    Automated PVE CRYPTO PRIZES, on top of our tokens

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import { ADMINS, MODS } from \"./accounts\";\r\n\r\nexport const LEADERBOARD_ADMINS = [\r\n ...ADMINS,\r\n 'boomfungible',\r\n ...MODS,\r\n // Partners:\r\n 'xofr2.wam', // ANDREW\r\n];\r\n\r\nexport const leaderboardInterval = 15 * 60 * 1000;\r\nexport const countPerLoad = 15;\r\n\r\nexport const MAX_USERS_CHART = 50;\r\n\r\nexport const tokens = ['boom', 'mars'];\r\nexport const levels = [0, 1, 2];\r\nexport const difficulties = ['easy', 'medium', 'hard'];\r\nexport const periods = ['weekly', 'monthly'];\r\nexport const properties = ['kills', 'scores', 'bestTime']\r\nexport const recentStatsCategories = ['staked', 'kills', 'bestTime']\r\nexport const countShowBestTime = 10;\r\nexport const countShowPlayedTime = 10;\r\n","import { useEffect } from \"react\";\r\nimport { useState } from \"react\";\r\nimport { Button, ButtonGroup } from \"react-bootstrap\";\r\nimport {\r\n Chart as ChartJS,\r\n CategoryScale,\r\n LinearScale,\r\n BarElement,\r\n Title,\r\n Tooltip,\r\n Legend,\r\n} from \"chart.js\";\r\nimport { Bar } from \"react-chartjs-2\";\r\nimport \"./ReportChart.scss\";\r\n\r\nimport {\r\n difficulties,\r\n levels,\r\n periods,\r\n properties,\r\n} from \"../../config/leaderboardConfig\";\r\n\r\nChartJS.register(\r\n CategoryScale,\r\n LinearScale,\r\n BarElement,\r\n Title,\r\n Tooltip,\r\n Legend\r\n);\r\n\r\nexport default function ReportChart({ dataReport, loading }) {\r\n // const [periodSelected, setPeriodSelected] = useState(periods[0]);\r\n const [propertySelected, setPropertySelected] = useState(properties[0]);\r\n const [levelForChartSelected, setLevelForChartSelected] = useState(levels[0]);\r\n const [difficultyForChartSelected, setDifficultyForChartSelected] = useState(\r\n difficulties[0]\r\n );\r\n const [options, setOptions] = useState(null);\r\n const [data, setData] = useState(null);\r\n\r\n // dataChart\r\n function getDifficultyNum(difficulty) {\r\n if (difficulty === \"easy\") return 0;\r\n else if (difficulty === \"normal\") return 1;\r\n else if (difficulty === \"hard\") return 2;\r\n else return null;\r\n }\r\n\r\n useEffect(() => {\r\n // let selectedChartData = dataReport[periodSelected];\r\n let selectedChartData = dataReport;\r\n let dataForChart = {};\r\n let chartTitle = \"\";\r\n if (selectedChartData) {\r\n // console.log(\"before\", selectedChartData, Object.keys(selectedChartData));\r\n switch (propertySelected) {\r\n case \"kills\":\r\n chartTitle = \"Chart of Kills\";\r\n dataForChart = {};\r\n Object.keys(selectedChartData).map((item) => {\r\n let kills = 0;\r\n if (selectedChartData[item].length > 0) {\r\n selectedChartData[item].forEach((element) => {\r\n kills += element.kills.length;\r\n });\r\n }\r\n dataForChart[item] = kills;\r\n return kills;\r\n });\r\n break;\r\n case \"scores\":\r\n chartTitle = \"Chart of Scores\";\r\n dataForChart = {};\r\n Object.keys(selectedChartData).map((item) => {\r\n let scores = 0;\r\n if (selectedChartData[item].length > 0) {\r\n selectedChartData[item].forEach((element) => {\r\n scores += element.score;\r\n });\r\n }\r\n dataForChart[item] = scores;\r\n return scores;\r\n });\r\n break;\r\n case \"bestTime\":\r\n chartTitle = `Chart of Best Time on level${levelForChartSelected} for ${difficultyForChartSelected}`;\r\n dataForChart = {};\r\n Object.keys(selectedChartData).map((item) => {\r\n let bestTime = 999999000;\r\n if (selectedChartData[item].length > 0) {\r\n selectedChartData[item].forEach((element) => {\r\n const gameLevel = element.gameLevel ?? 0;\r\n if (\r\n element.difficulty ===\r\n getDifficultyNum(difficultyForChartSelected) &&\r\n element.resMatch === \"won\" &&\r\n gameLevel === levelForChartSelected &&\r\n element.endTime - element.startTime < bestTime\r\n ) {\r\n bestTime = element.endTime - element.startTime;\r\n }\r\n });\r\n }\r\n if (bestTime === 999999000) bestTime = 0;\r\n bestTime = bestTime / 1000; // convert to second\r\n dataForChart[item] = bestTime;\r\n return bestTime;\r\n });\r\n\r\n break;\r\n default:\r\n break;\r\n }\r\n // console.log(\"dataForChart\", dataForChart);\r\n\r\n const options = {\r\n responsive: true,\r\n plugins: {\r\n legend: {\r\n position: \"top\", // as const,\r\n },\r\n title: {\r\n display: true,\r\n text: chartTitle,\r\n },\r\n },\r\n };\r\n setOptions(options);\r\n\r\n const labels = Object.keys(dataForChart);\r\n const data = {\r\n labels,\r\n datasets: [\r\n {\r\n label: propertySelected,\r\n data: labels.map((item) => dataForChart[item]),\r\n backgroundColor: \"rgba(255, 99, 132, 0.5)\",\r\n },\r\n ],\r\n };\r\n setData(data);\r\n // console.log(\"chart data: \", options, data);\r\n }\r\n }, [\r\n // periodSelected,\r\n propertySelected,\r\n difficultyForChartSelected,\r\n levelForChartSelected,\r\n dataReport,\r\n ]);\r\n\r\n return (\r\n <>\r\n
    \r\n {/* \r\n {periods.map((period) => (\r\n setPeriodSelected(period)}\r\n >\r\n {period}\r\n \r\n ))}\r\n */}\r\n \r\n {properties.map((property, index) => (\r\n setPropertySelected(property)}\r\n >\r\n {property}\r\n \r\n ))}\r\n \r\n {propertySelected === properties[2] && (\r\n <>\r\n \r\n {levels.map((level) => (\r\n setLevelForChartSelected(level)}\r\n >\r\n Level {level}\r\n \r\n ))}\r\n \r\n \r\n {difficulties.map((difficulty, index) => (\r\n setDifficultyForChartSelected(difficulty)}\r\n >\r\n {difficulty}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n
    \r\n\r\n {!loading && data && options && (\r\n
    \r\n ;\r\n
    \r\n )}\r\n \r\n );\r\n}\r\n","import { css } from \"@emotion/react\";\r\n\r\nexport const styleOverride = css`\r\ndisplay: block;\r\nmargin: 30px auto;\r\nborder-color: red;\r\n`;\r\n","import React from \"react\";\r\nimport { Button, Table } from \"react-bootstrap\";\r\nimport classNames from \"classnames\";\r\nimport { useSelector } from \"react-redux\";\r\nimport {\r\n countPerLoad,\r\n LEADERBOARD_ADMINS,\r\n MAX_USERS_CHART,\r\n} from \"../../../config/leaderboardConfig\";\r\nimport { useState } from \"react\";\r\nimport { useEffect } from \"react\";\r\nimport { PacmanLoader } from \"react-spinners\";\r\nimport { styleOverride } from \"../styleOverride\";\r\nimport { toUpper } from \"lodash\";\r\n\r\n\r\nconst ProfileLink = ({ name, chain }) => \r\n {name}\r\n ;\r\n\r\nexport default function LeaderboardTable({ loading, dataList = [], title, category='', token='boom' }) {\r\n const UserState = useSelector((store) => store.user);\r\n\r\n const checkIsAdmin = uname => LEADERBOARD_ADMINS.includes(uname);\r\n\r\n const sliceSize = checkIsAdmin(UserState.name) ? 100000 : countPerLoad;\r\n const maxUsers = username => checkIsAdmin(username) ? 100000 : MAX_USERS_CHART;\r\n const isLogged = UserState.isLogged;\r\n\r\n const [showCount, setShowCount] = useState(sliceSize);\r\n const [showList, setShowList] = useState([]);\r\n\r\n useEffect(() => {\r\n setShowList(dataList.slice(0, showCount));\r\n }, [dataList, showCount]);\r\n\r\n const getYourRankings = ({ data, uname }) => {\r\n const unchartedMsg = (`Not in the first ${maxUsers(uname)}, keep grinding!`);\r\n const yourRanking =\r\n data.findIndex((item = {}) => item.account === uname) + 1 || unchartedMsg;\r\n return {\r\n yourRanking,\r\n };\r\n };\r\n\r\n const { yourRanking } = getYourRankings({\r\n data: showList,\r\n uname: UserState.name,\r\n });\r\n\r\n const handleLoadClick = () => {\r\n setShowCount(showCount + countPerLoad);\r\n };\r\n\r\n const getChain = (account) => {\r\n let isHive = account.includes('hive::');\r\n return isHive ? 'HIVE' : 'WAX';\r\n }\r\n\r\n const getAccountName = (account) => {\r\n let isHive = account.includes('hive::');\r\n return isHive ? account.replace('hive::','') : account;\r\n }\r\n\r\n function renderTitle(title) {\r\n switch (title) {\r\n case \"totalKillsData0\":\r\n return \"Kills\";\r\n case \"totalKillsData1\":\r\n return \"Kills\";\r\n case \"totalKillsData2\":\r\n return \"Kills\";\r\n case \"boomSavingData\":\r\n return \"In-game Balance\";\r\n case \"marsSavingData\":\r\n return \"In-game Balance\";\r\n case \"boomClaimedData\":\r\n return \"BOOM\";\r\n case \"marsClaimedData\":\r\n return \"MARS\";\r\n case \"bestTimeData\":\r\n return \"Best Time [S]\";\r\n case \"playedTimeData\":\r\n return \"Played Time [HS]\";\r\n case \"Recent Stats\":\r\n if (category === 'bestTime') return \"Best Time [S]\";\r\n else if(category === 'kills') return 'Kills';\r\n else if(category === 'staked') return `${toUpper(token)} Staked`;\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n function renderValue(title, item = {}) {\r\n switch (title) {\r\n case \"totalKillsData0\":\r\n return item.amount + \" kills\";\r\n case \"totalKillsData1\":\r\n return item.amount + \" kills\";\r\n case \"totalKillsData2\":\r\n return item.amount + \" kills\";\r\n case \"boomSavingData\":\r\n return item.amount.toFixed(4) + \" igBOOM\";\r\n case \"marsSavingData\":\r\n return item.amount.toFixed(4) + \" igMARS\";\r\n case \"boomClaimedData\":\r\n return item.amount.toFixed(4) + \" BOOM\";\r\n case \"marsClaimedData\":\r\n return item.amount.toFixed(4) + \" MARS\";\r\n case \"bestTimeData\":\r\n return (item.time/1000).toFixed(2) + \" S\";\r\n case \"playedTimeData\":\r\n return (item.time/1000).toFixed(2) + \" HS\";\r\n case \"Recent Stats\":\r\n if (category === 'bestTime') return (item.time/1000).toFixed(2) + \" S\";\r\n else if(category === 'kills') return `${item.amount} kills`;\r\n else if(category === 'staked') return `${item.amount?.toFixed(4)} ${token.toUpperCase()}`;\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {isLogged && showList.length > 0 && (\r\n \r\n \r\n Your Position: {yourRanking}\r\n \r\n

    \r\n )}\r\n {loading && (\r\n
    \r\n \r\n {/* {(!loading && !boomSavingData.length) &&
    There is no Leaderboard data.
    } */}\r\n
    \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n showList.map((item = {}, index) => {\r\n const name = getAccountName(item.account);\r\n const chain = getChain(item.account);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n })\r\n }\r\n \r\n
    RankPlayer's Name{renderTitle(title)}Player's ChainLender (if any)
    {index + 1}{renderValue(title, item)}{chain}{item.teacher ?? ''}
    \r\n {showCount < dataList.length && (\r\n <>\r\n
    \r\n \r\n
    \r\n \r\n )}\r\n \r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { Tab, Tabs, Button, ButtonGroup } from \"react-bootstrap\";\r\nimport { toast } from \"react-toastify\";\r\nimport {\r\n LEADERBOARD_ADMINS,\r\n difficulties,\r\n leaderboardInterval,\r\n levels,\r\n MAX_USERS_CHART,\r\n periods,\r\n recentStatsCategories,\r\n tokens\r\n} from \"../../../config/leaderboardConfig\";\r\nimport { client } from \"../../../helpers/client\";\r\nimport { isLocal, isTestnet } from \"../../../constants/envs\";\r\nimport { get } from \"lodash\";\r\nimport { capitalize, getPlayerUsername } from \"../../../generalUtils/utils\";\r\nimport ReportChart from \"../../../components/report/ReportChart\";\r\nimport LeaderboardTable from \"./LeaderboardTable\";\r\nimport { LoadingSpinner } from \"../../../images/gifs/LoadingSpinner\";\r\nimport { UserService } from \"../../../services/UserService\";\r\n\r\n\r\n// ## UTILS\r\n\r\nconst checkIsAdmin = (uname) => LEADERBOARD_ADMINS.includes(uname);\r\n\r\nconst maxUsers = (username) => checkIsAdmin(username) ? 100000 : MAX_USERS_CHART;\r\n\r\n// const localCacheDuration = 5 * 60 * 1000;\r\n\r\nconst loadRecentStatsTab = async (username, level, difficulty, period) => {\r\n let dataRecentStats = {};\r\n\r\n for (const level of levels) {\r\n const resRecentStatsBestTime = await client.get(\r\n `/api/leaderboard/${period}/besttime/${level}?account=${username}`\r\n );\r\n dataRecentStats[`bestTimeHard${level}`] =\r\n resRecentStatsBestTime.data[`res${capitalize(period)}BestTime`];\r\n }\r\n\r\n const resRecentStatsKills = await client.get(\r\n `/api/leaderboard/${period}/kills?account=${username}`\r\n );\r\n dataRecentStats.kills =\r\n resRecentStatsKills.data[`res${capitalize(period)}Kills`];\r\n\r\n for (const token of tokens) {\r\n const resRecentTokenStaked = await client.get(\r\n `/api/leaderboard/staked/${period}/${token}?account=${username}`\r\n );\r\n // to filter out 0 as well negative values\r\n const tokens = resRecentTokenStaked.data[`resTokenStaked`];\r\n dataRecentStats[`${token}Staked`] = tokens.filter((token) => token.amount >= 0.001);\r\n }\r\n return ({ ...dataRecentStats });\r\n};\r\n\r\n// const loadReportTabData = async (username, level, difficulty, period) => {\r\n// // need to change to single data later\r\n// isTestnet && console.log(\"Fetching leaderboard data for report..\");\r\n// const resReportWeekly = await client.get(`/api/report?account=${username}&period=${'weekly'}`);\r\n// const dataReportWeekly = resReportWeekly.data.resReport;\r\n// const resReportMonthly = await client.get(`/api/report?account=${username}&period=${'monthly'}`);\r\n// const dataReportMonthly = resReportMonthly.data.resReport;\r\n// isLocal && console.debug('Partial state for leaderboards data Report:', { level, difficulty, dataReportWeekly, dataReportMonthly });\r\n// return ({ monthly: dataReportMonthly, weekly: dataReportWeekly });\r\n// }\r\n\r\nconst loadReportTabDataMonthly = async (username, level, difficulty, period) => {\r\n // need to change to single data later\r\n isTestnet && console.log(\"Fetching leaderboard data for report..\");\r\n\r\n const resReportMonthly = await client.get(`/api/report?account=${username}&period=${'monthly'}`);\r\n const dataReportMonthly = resReportMonthly.data.resReport;\r\n\r\n isLocal && console.debug('Partial state for leaderboards data Report:', { level, difficulty, dataReportMonthly });\r\n\r\n return ({ monthly: dataReportMonthly });\r\n};\r\n\r\nconst loadReportTabDataWeekly = async (username, level, difficulty, period) => {\r\n // need to change to single data later\r\n isTestnet && console.log(\"Fetching leaderboard data for report..\");\r\n const resReportWeekly = await client.get(`/api/report?account=${username}&period=${'weekly'}`);\r\n const dataReportWeekly = resReportWeekly.data.resReport;\r\n\r\n isLocal && console.debug('Partial state for leaderboards data Report:', { level, difficulty, dataReportWeekly });\r\n\r\n return ({ weekly: dataReportWeekly });\r\n};\r\n\r\nconst loadBestTimesTabData = async (username, level, difficulty) => {\r\n isTestnet && console.log(\"Fetching leaderboard data for best times..\");\r\n const resBestTime = await client.get(\r\n `/api/leaderboard/besttime/${level}/${difficulty}?account=${username}`\r\n );\r\n const dataBestTime = resBestTime.data.resBestTime;\r\n\r\n isLocal && console.debug('Partial state for leaderboards best times:', { level, difficulty, dataBestTime });\r\n\r\n return dataBestTime;\r\n};\r\n\r\nconst loadPlayedTimesTabData = async (username, level, difficulty) => {\r\n isTestnet && console.log(\"Fetching leaderboard data for played times..\");\r\n // need to check redux\r\n const resPlayedTime = await client.get(\r\n `/api/leaderboard/playedtime/${level}/${difficulty}?account=${username}`\r\n );\r\n const dataPlayedTime = resPlayedTime.data.resPlayedTime;\r\n\r\n isLocal && console.debug('Partial state for leaderboards played times:', { level, difficulty, dataPlayedTime });\r\n\r\n return dataPlayedTime;\r\n};\r\n\r\nconst loadKillsTabData = async (username, level) => {\r\n isTestnet && console.log(\"Fetching leaderboard data for Kills..\");\r\n const dataTotalKills = await client.get(`/api/leaderboard/totalkills/${level}?account=${username}`);\r\n isLocal && console.debug('Partial state for leaderboards:', { dataTotalKills });\r\n\r\n return dataTotalKills;\r\n};\r\n\r\nconst loadSavingsTabData = async (username, token) => {\r\n isTestnet && console.log(\"Fetching leaderboard data for savings..\");\r\n\r\n const savingsData = await client.get(`/api/leaderboard/${token}-saving?account=${username}`);\r\n\r\n isLocal && console.debug('Partial state for leaderboards token balance for ', { token, savingsData });\r\n return savingsData;\r\n};\r\n\r\nconst loadClaimsTabData = async (username, token) => {\r\n isTestnet && console.log(\"Fetching leaderboard data for claims..\");\r\n\r\n const claimsData = await client.get(`/api/leaderboard/tot-${token}-claimed?account=${username}`);\r\n\r\n isLocal && console.debug('Partial state for leaderboards token claim for ', { token, claimsData });\r\n return claimsData;\r\n};\r\n\r\nexport const LeaderboardTabs = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const account = UserState.name;\r\n\r\n const [loading, setLoading] = useState(true);\r\n\r\n const [totalKillsData, setTotalKillsData] = useState([]);\r\n\r\n const [boomSavingData, setBoomSavingData] = useState([]);\r\n const [marsSavingData, setMarsSavingData] = useState([]);\r\n const [boomClaimedData, setBoomClaimedData] = useState([]);\r\n const [marsClaimedData, setMarsClaimedData] = useState([]);\r\n const [bestTimeData, setBestTimeData] = useState([]);\r\n const [playedTimeData, setPlayedTimeData] = useState([]);\r\n const [report, setReport] = useState({});\r\n const [recentStats, setRecentStats] = useState([]);\r\n\r\n const InventoryState = useSelector((store) => store.inventory);\r\n\r\n const [tabSelected, setTabSelected] = useState({\r\n parent: 'saving',\r\n level: levels[0],\r\n token: tokens[0],\r\n period: periods[0],\r\n difficulty: difficulties[0],\r\n recentStatsCategory: recentStatsCategories[0],\r\n chartPeriodSelected: periods[0]\r\n });\r\n\r\n useEffect(() => {\r\n const loadTabsData = async () => {\r\n const { parent: selectedTab, level: selectedLevel, token: selectedToken, difficulty: selectedDifficulty, period: selectedPeriod, recentStatsCategory: recentStatsCategorySelected } = tabSelected;\r\n\r\n setLoading(true);\r\n try {\r\n const username = getPlayerUsername({\r\n UserService,\r\n UserState,\r\n InventoryState,\r\n });\r\n\r\n switch (selectedTab) {\r\n case 'kills':\r\n const killsData = await loadKillsTabData(username, selectedLevel);\r\n isLocal && console.debug('Leaderboard data \"kills \":', killsData);\r\n const totalKills = get(killsData, \"data\", { resTotalKills: [] });\r\n setTotalKillsData(totalKills.resTotalKills.slice(0, maxUsers(account)));\r\n setLoading(false);\r\n break;\r\n case 'saving':\r\n const savingsData = await loadSavingsTabData(username, selectedToken);\r\n isLocal && console.debug('Leaderboard data \"savings \":', savingsData);\r\n if (selectedToken === 'boom') {\r\n const boomSavings = get(savingsData, \"data\", { resBoomSaving: [] });\r\n setBoomSavingData(\r\n boomSavings.resBoomSaving.slice(0, maxUsers(account))\r\n );\r\n } else if (selectedToken === 'mars') {\r\n const marsSavings = get(savingsData, \"data\", { resMarsSaving: [] });\r\n setMarsSavingData(\r\n marsSavings.resMarsSaving.slice(0, maxUsers(account))\r\n );\r\n }\r\n setLoading(false);\r\n break;\r\n case 'claimed':\r\n const claimsData = await loadClaimsTabData(username, selectedToken);\r\n isLocal && console.debug('Leaderboard data \"claims \":', claimsData);\r\n if (selectedToken === 'boom') {\r\n const totBoomClaimed = get(claimsData, \"data\", {\r\n resBoomClaimed: [],\r\n });\r\n setBoomClaimedData(\r\n totBoomClaimed.resBoomClaimed.slice(0, maxUsers(account))\r\n );\r\n } else if (selectedToken === 'mars') {\r\n const totMarsClaimed = get(claimsData, \"data\", {\r\n resMarsClaimed: [],\r\n });\r\n setMarsClaimedData(\r\n totMarsClaimed.resMarsClaimed.slice(0, maxUsers(account))\r\n );\r\n }\r\n setLoading(false);\r\n break;\r\n case 'best-time':\r\n const bestTimesData = await loadBestTimesTabData(username, selectedLevel, selectedDifficulty);\r\n isLocal && console.debug('Leaderboard data \"best times \":', bestTimesData);\r\n setBestTimeData(bestTimesData);\r\n setLoading(false);\r\n break;\r\n case 'played-time':\r\n const playedTimesData = await loadPlayedTimesTabData(username, selectedLevel, selectedDifficulty);\r\n isLocal && console.debug('Leaderboard data \"played times \":', playedTimesData);\r\n setPlayedTimeData(playedTimesData);\r\n setLoading(false);\r\n break;\r\n case 'report':\r\n let report = null;\r\n // const report = await loadReportTabData(username, selectedLevel, selectedDifficulty, selectedPeriod)\r\n if (tabSelected.chartPeriodSelected === 'weekly') {\r\n report = await loadReportTabDataWeekly(username, selectedLevel, selectedDifficulty, selectedPeriod);\r\n } else if (tabSelected.chartPeriodSelected === 'monthly') {\r\n report = await loadReportTabDataMonthly(username, selectedLevel, selectedDifficulty, selectedPeriod);\r\n }\r\n isLocal && console.debug('Leaderboard data report:', report);\r\n // const dataReport = {\r\n // monthly: report['monthly'],\r\n // weekly: report['weekly']\r\n // }\r\n // setReport(dataReport);\r\n // we now load weekly/monthly separate\r\n setReport(report);\r\n setLoading(false);\r\n break;\r\n case 'recent-stats':\r\n const dataRecentStats = await loadRecentStatsTab(username, selectedLevel, selectedDifficulty, selectedPeriod);\r\n let tempRecentStats = [];\r\n if (recentStatsCategorySelected === \"bestTime\") {\r\n tempRecentStats =\r\n dataRecentStats[`bestTimeHard${selectedLevel}`];\r\n } else if (recentStatsCategorySelected === \"kills\") {\r\n tempRecentStats = dataRecentStats.kills;\r\n } else if (recentStatsCategorySelected === \"staked\") {\r\n tempRecentStats = dataRecentStats[`${selectedToken}Staked`];\r\n }\r\n if (tempRecentStats) setRecentStats(tempRecentStats);\r\n setLoading(false);\r\n break;\r\n default:\r\n // nothing here\r\n }\r\n\r\n } catch (e) {\r\n console.error(\"Caught error fetching leaderboard data:\", e);\r\n toast.error(\"Error updating leaderboard\", e);\r\n setLoading(false);\r\n return [];\r\n }\r\n };\r\n loadTabsData();\r\n let timer = setInterval(() => {\r\n isTestnet && console.log(new Date(), \"Fetching leaderboard..\");\r\n loadTabsData();\r\n }, leaderboardInterval);\r\n return () => {\r\n // clear leaderboard loading \r\n clearInterval(timer);\r\n };\r\n }, [\r\n InventoryState,\r\n // UserState,\r\n tabSelected\r\n ]);\r\n\r\n\r\n const handleParentTabChange = (parentTabName) => {\r\n setTabSelected({ ...tabSelected, parent: parentTabName, level: 0, token: tokens[0], difficulty: difficulties[0] });\r\n };\r\n\r\n const handleChildTabLevelChange = (parentTabName, key) => {\r\n key = levels.includes(key) ? key : key.slice(-1);\r\n setTabSelected({ ...tabSelected, parent: parentTabName, level: key, difficulty: difficulties[0] });\r\n };\r\n\r\n const handleChildTabTokenChange = (parentTabName, token) => {\r\n const tokenName = token.split('-')[0];\r\n setTabSelected({ ...tabSelected, parent: parentTabName, token: tokenName, difficulty: difficulties[0] });\r\n };\r\n\r\n const handleChildTabPeriodChange = (parentTabName, period) => {\r\n setTabSelected({ ...tabSelected, parent: parentTabName, period, level: levels[0], difficulty: difficulties[0] });\r\n };\r\n\r\n const handleChildTabDifficultyChange = (parentTabName, difficulty) => {\r\n setTabSelected({ ...tabSelected, parent: parentTabName, difficulty });\r\n };\r\n\r\n const handleReportTabPeriodChange = (parentTabName, chartPeriodSelected) => {\r\n setTabSelected({ ...tabSelected, parent: parentTabName, chartPeriodSelected });\r\n };\r\n\r\n const Loader = () => <>\r\n \r\n

    Loading may take a minute...

    \r\n ;\r\n\r\n return (\r\n \r\n \r\n handleChildTabTokenChange('saving', k)}>\r\n \r\n {!loading ? (\r\n <>\r\n \r\n \r\n ) : }\r\n \r\n \r\n {!loading ? (\r\n <>\r\n \r\n \r\n ) : }\r\n \r\n \r\n \r\n \r\n handleChildTabTokenChange('claimed', k)}\r\n className=\"text-white thin-column\">\r\n \r\n {!loading ? (\r\n <>\r\n \r\n \r\n ) : }\r\n \r\n \r\n {!loading ? (\r\n <>\r\n \r\n \r\n ) : }\r\n \r\n \r\n \r\n \r\n handleChildTabLevelChange('kills', k)}\r\n >\r\n {levels.map((level) => {\r\n const dataName = `totalKillsData${level}`;\r\n\r\n return \r\n {!loading ? (\r\n <>\r\n \r\n \r\n ) : }\r\n ;\r\n })}\r\n \r\n \r\n \r\n handleChildTabLevelChange('best-time', k)}\r\n >\r\n {levels.map((level) => {\r\n const eventKey = `best-time-level-${level}`;\r\n const title = `Level ${level}`;\r\n\r\n return (\r\n \r\n \r\n {difficulties.map((difficulty, index) => (\r\n handleChildTabDifficultyChange('best-time', difficulty)}\r\n >\r\n {difficulty}\r\n \r\n ))}\r\n \r\n {!loading ? (\r\n <>\r\n \r\n \r\n ) : }\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n handleChildTabLevelChange('played-time', k)}\r\n >\r\n {levels.map((level) => {\r\n const eventKey = `played-time-level-${level}`;\r\n const title = `Level ${level}`;\r\n\r\n return (\r\n \r\n \r\n {difficulties.map((difficulty, index) => (\r\n handleChildTabDifficultyChange('played-time', difficulty)}\r\n >\r\n {difficulty}\r\n \r\n ))}\r\n \r\n {!loading ? (\r\n <>\r\n \r\n \r\n ) : }\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n {periods.map((period) => (\r\n handleReportTabPeriodChange('report', period)}\r\n >\r\n {period}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n {periods.map((period) => (\r\n handleChildTabPeriodChange('recent-stats', period)}\r\n >\r\n {period}\r\n \r\n ))}\r\n \r\n \r\n {recentStatsCategories.map((category, index) => (\r\n setTabSelected({ ...tabSelected, recentStatsCategory: category })}\r\n >\r\n {category}\r\n \r\n ))}\r\n \r\n {tabSelected.recentStatsCategory === recentStatsCategories[2] && (\r\n \r\n {levels.map((level) => (\r\n handleChildTabLevelChange('recent-stats', level)}\r\n >\r\n Level {level}\r\n \r\n ))}\r\n \r\n )}\r\n {tabSelected.recentStatsCategory === recentStatsCategories[0] && (\r\n \r\n {tokens.map((token) => (\r\n handleChildTabTokenChange('recent-stats', token)}\r\n >\r\n {token}\r\n \r\n ))}\r\n \r\n )}\r\n
    \r\n {!loading ? (\r\n \r\n ) : }\r\n
    \r\n \r\n );\r\n};\r\n","import { client } from '../../../helpers/client';\r\nimport { TOKEN_ACCOUNT } from '../../../config/contractNames';\r\nimport { isLocal, isTestnet } from '../../../constants/envs';\r\nimport { templateReplacement } from './marketplacePrices';\r\nimport { get } from 'lodash';\r\nimport { WAX_ACCOUNTS } from '../../../config/accounts';\r\nimport { getPlayerUsername } from '../../../generalUtils/utils';\r\nimport { notifyOfInventoryBuyIssue } from '../../../services/monitoring/discordNotifications';\r\nimport { flyingSessionLogin, WaxFlyingSession } from '../../../services/UserService';\r\nimport Swal from 'sweetalert2';\r\n\r\nlet currentBuy;\r\n\r\nexport const transferAndMint = async ({ UserService, UserState, template, price, currency }) => {\r\n if (isTestnet) {\r\n template = templateReplacement({ mainnetTemplate: `${template}` });\r\n }\r\n let waxSession = UserService;\r\n const isHiveUser = localStorage.getItem('chainLogin') !== 'wax';\r\n if (isHiveUser && !UserService.authName) {\r\n isLocal && console.debug('creating side wax session for hive user');\r\n waxSession = WaxFlyingSession\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn) {\r\n Swal.fire({text: 'You did not successfully log in, please try again.'})\r\n return;\r\n }\r\n }\r\n isLocal && console.debug('Expected user to sign tx:', waxSession.authName);\r\n\r\n const amount = price && price.toFixed(currency === 'BOOM' ? 4 : 8);\r\n const account = currency === 'WAX' ? 'eosio.token' : TOKEN_ACCOUNT;\r\n const playerUsername = getPlayerUsername({ UserService, UserState });\r\n currentBuy = { template, price, currency, payer: waxSession.authName, playerUsername };\r\n isTestnet && console.debug('[market] Transfering for purchase:', { template, amount, currency });\r\n \r\n return waxSession.session.signTransaction(\r\n {\r\n actions: [{\r\n account,\r\n name: 'transfer',\r\n authorization: [{\r\n actor: waxSession.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: waxSession.authName,\r\n to: WAX_ACCOUNTS.MARKETPLACE,\r\n quantity: `${amount} ${currency}`,\r\n memo: JSON.stringify({ template, amount, currency })\r\n }\r\n }]\r\n },\r\n {\r\n blocksBehind: 3,\r\n expireSeconds: 30\r\n }\r\n )\r\n .then(async (response) => {\r\n if (response.status !== 'executed') {\r\n Swal.fire({text: `Your transfer to purchase ${template} did not succeed`})\r\n return 'send-not-exec';\r\n }\r\n isTestnet && console.debug('[market] Sending mint request:', { template });\r\n let detail;\r\n const payload = {\r\n account: playerUsername, // can also be hive. For the latter we add waxSideAccount.\r\n templateIds: [`${template}`],\r\n purchaseId: response.transactionId,\r\n };\r\n if (isHiveUser) {\r\n payload.waxSideAccount = waxSession.authName;\r\n }\r\n isLocal && console.debug('sending purchase request', { playerUsername, payer: waxSession.authName });\r\n try {\r\n detail = await client.post(\r\n '/api/transaction/purchase',\r\n payload,\r\n );\r\n } catch (err) {\r\n let refundMsg = 'Unknown error';\r\n const errMsg = get(err, 'response.data', {});\r\n if (errMsg.error) {\r\n const refundedUser = get(errMsg, 'resRefundPayment.response.toAccount');\r\n const refundTx = get(errMsg, 'resRefundPayment.response.transactoin_id');\r\n refundMsg = refundedUser ? `User ${refundedUser} refunded. Transaction: ${refundTx}` : JSON.stringify(errMsg);\r\n }\r\n alertAndNotify(`Error minting your NFT. ${refundMsg}`);\r\n return 'mint-error';\r\n }\r\n isLocal && console.log('Mint result:', { detail });\r\n const status = get(detail, 'data.resMintNft[0].statusCode', 555);\r\n const error = get(detail, 'error', '');\r\n if (status > 300 || error) {\r\n alertAndNotify(`Uh oh, that did not work\\n\\n${JSON.stringify(error)}`);\r\n return (error || status);\r\n }\r\n const txId = get(detail, 'data.resMintNft[0].response.transaction_id', '');\r\n const showMe = txId && window.confirm(`Payment AND NFT minting completed.\r\n \\nDo you want to see the purchase transaction?`);\r\n if (showMe) window.open(`https://wax${isTestnet\r\n ? '-test' : ''}.bloks.io/transaction/${txId}`, '_blank');\r\n return null;\r\n })\r\n .catch((err) => {\r\n const errMsg = `Caught error during transfer: ${err}`;\r\n console.error(errMsg);\r\n Swal.fire({text: errMsg});\r\n return 'transfer-req-error';\r\n });\r\n};\r\n\r\n\r\nconst alertAndNotify = (msg) => {\r\n Swal.fire({text: msg});\r\n notifyOfInventoryBuyIssue({ currentBuy, errMsg: msg });\r\n};\r\n","import React from \"react\";\r\nimport { Animated } from \"react-animated-css\";\r\n\r\nimport { LeaderboardPrizes } from \"./Prizes/LeaderboardPrizes\";\r\nimport { LeaderboardTabs } from \"./Tables/LeaderboardTabs\";\r\nimport \"./Leaderboard.scss\";\r\n\r\n// FEATURE FLAGGED\r\nimport { isLocal } from \"../../constants/envs\";\r\n\r\n\r\nexport const Leaderboard = () => {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/refresh.0af003c8.png\";","import { invoke } from 'lodash';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { isTestnet } from '../../../constants/envs';\r\nimport { MINIMUM_REQUIREMENTS_INFO } from '../../../constants/genericConstants';\r\nimport './WelcomeScreenNewUser.scss';\r\n\r\n\r\nconst WELCOME_LINKS = {\r\n STARTER_KIT: 'https://wax.atomichub.io/market?collection_name=crypto4shots&order=asc&schema_name=cs.startpack&sort=price&symbol=WAX',\r\n WEAPONS: 'https://wax.atomichub.io/market?collection_name=crypto4shots&order=asc&schema_name=levelweapons&sort=price&symbol=WAX',\r\n CHARACTERS: 'https://wax.atomichub.io/market?collection_name=crypto4shots&order=asc&schema_name=cscharacters&sort=price&symbol=WAX',\r\n ENERGY_CELLS: 'https://wax.atomichub.io/market?collection_name=crypto4shots&match=cell&order=asc&schema_name=cs.gameitems&sort=price&symbol=WAX',\r\n SHIELDS: 'https://wax.atomichub.io/market?collection_name=crypto4shots&match=shield&order=asc&schema_name=cs.gameitems&sort=price&symbol=WAX',\r\n SKINS: 'https://wax.atomichub.io/market?collection_name=crypto4shots&match=skin&order=asc&schema_name=skins.cschar&sort=price&symbol=WAX',\r\n CONDENSERS: 'https://wax.atomichub.io/market?collection_name=crypto4shots&match=condenser&order=asc&schema_name=cs.gameboost&sort=price&symbol=WAX',\r\n WP: 'https://peakd.com/@cryptoshots.nft/crypto-shots-whitepaper',\r\n};\r\n\r\n\r\nconst HotItemsMsg = ({ hotItemsCount, showBoomInventory }) => (

    \r\n

    One or more NFTs are getting teleported to your inventory.. ⌛


    \r\n

    There is a 12 hour cooldown for NFTs unless they are new mints\r\n
    (ie. blending, pack opening, purchase via \r\n \r\n $BOOM\r\n \r\n ).\r\n
    The cooldown is in place to prevent players from sharing items during the day.\r\n

    \r\n
    \r\n
    \r\n

    In the wait time you can still purchase NFTs with \r\n $BOOM\r\n .
    These are not subject to cooldown.\r\n

    \r\n \r\n PURCHASE NFTS \r\n \r\n
    \r\n
    );\r\n\r\nconst NewPlayerMsg = ({ showBoomInventory, chainLogin }) => {\r\n const isWax = chainLogin === 'wax';\r\n\r\n return (
    \r\n
    \r\n
    \r\n
      \r\n

      GET a STARTER KIT to start playing and earn!!


        Pew Pew!   💥

      \r\n
      \r\n
    • Want to pick up more GUNS? Get some WEAPON NFTs

    • \r\n
    • Want more play TIME? Get some CHARACTERS

    • \r\n
    • Want more AMMO? Get some CELLS

    • \r\n {!isWax &&
      \r\n (available only on Wax for now)\r\n
      }\r\n
      \r\n
    • Longer LIFE? Get some SHIELDS or SKILL SKINS

    • \r\n
    • Boost your REWARD$? Get some CONDENSERS
    • \r\n
      \r\n


      \r\n

      \r\n No NFTs? \r\n Play FOR FREE\r\n  borrowing for FREE the assets of another user!\r\n

      \r\n

      Doubts? Check out our \r\n \r\n WHITEPAPER\r\n \r\n

      \r\n
    \r\n
    \r\n window.open('https://hive.crypto-shots.com', '_blank')\r\n }\r\n >\r\n PURCHASE NFTS with {\r\n isWax\r\n ? $BOOM (no cooldown here!)\r\n : DOOM\r\n }\r\n \r\n
    \r\n
    \r\n
    );\r\n};\r\n\r\n\r\nexport const WelcomeScreenNewUser = ({ name, hotNfts, showBoomInventory }) => {\r\n isTestnet && console.log('Displaying welcome screen.', hotNfts);\r\n\r\n const UserState = useSelector((store) => store.user);\r\n const { chainLogin } = UserState;\r\n\r\n const hasMinReqWarning = (Object.keys(hotNfts)[0] || '') === MINIMUM_REQUIREMENTS_INFO;\r\n const hotItemsCount = Object.keys(hotNfts).length - 1; // remove -1 to test \r\n\r\n const createUserAndShowInventory = async () => {\r\n invoke(window, 'fetchUserData');\r\n showBoomInventory(true);\r\n };\r\n\r\n return
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {(chainLogin === 'skl' || chainLogin === 'eth') && <>



    }\r\n

    WELCOME {name} !! 😎

    \r\n {(chainLogin === 'skl' || chainLogin === 'eth')\r\n ? <>\r\n \r\n \r\n \r\n \r\n : <>{(hotItemsCount >= 0 && !hasMinReqWarning)\r\n ? \r\n : \r\n }\r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    ;\r\n};\r\n","import React from 'react';\r\nimport { isMainnet, isTestnet } from '../../../constants/envs';\r\n\r\n\r\nconst getUsernameLink = (waxAddr) => isMainnet\r\n ? `https://wax.atomichub.io/profile/${waxAddr}`\r\n : `https://wax-test.atomichub.io/profile/${waxAddr}`;\r\n\r\nexport const ScholarshipPane = ({ data }) => {\r\n const {\r\n isTeacher = false, scholarName = '', teacherCut = 0,\r\n isScholar = false, teacherName = '', scholarCut = 0,\r\n scholarKeepsNfts, scholarPreviousBoomStake,\r\n } = (data || {});\r\n isTestnet && console.log('Inventory Scholarship panel - data:', { data });\r\n if (!isTeacher && !isScholar) return null;\r\n return (\r\n
    \r\n

    \r\n {isTeacher\r\n && Welcome Teacher!   {scholarName\r\n } is your SCHOLAR, they are playing for you and you keep {teacherCut\r\n }% of the igBOOM rewards{\r\n scholarKeepsNfts ? . They keep the NFTs :  and the NFTs}.\r\n \r\n }\r\n

    \r\n

    \r\n {isScholar\r\n && Welcome Scholar!   {teacherName\r\n } is your TEACHER, you play with their inventory (below) and keep {scholarCut\r\n }% of the igBOOM rewards{\r\n scholarKeepsNfts ?  and the NFTs : . They keep the NFTs}.\r\n \r\n }\r\n

    \r\n
    \r\n );\r\n};\r\n","import { HIVE_TEMPLATES } from \"../../../../constants/hiveNfts\";\r\n\r\n// # HIVE\r\n\r\nconst MIN_MINTS = {\r\n // ## NFT Packs\r\n // 1st level\r\n [HIVE_TEMPLATES['MYTHIC_PACK'].name]: 0, // amount: 80\r\n [HIVE_TEMPLATES['STARTER_PACK'].name]: 80, // 300\r\n // 2nd level\r\n [HIVE_TEMPLATES['LEV_1_PACK_COMMON'].name]: 380, // 150\r\n [HIVE_TEMPLATES['LEV_2_PACK_EPIC'].name]: 530, // 50\r\n // 3rd level\r\n [HIVE_TEMPLATES['LEV_2_PACK_COMMON'].name]: 580, // 150\r\n [HIVE_TEMPLATES['LEV_2_PACK_RARE'].name]: 730, // 50\r\n \r\n\r\n // ## Gaming Assets\r\n\r\n // 1st level\r\n [HIVE_TEMPLATES.FORCE_FIELD.name]: 0, // amount: 501 // 2nd level\r\n [HIVE_TEMPLATES.MYTHIC_AMMO.name]: 501, // +80 =\r\n [HIVE_TEMPLATES.LEGENDARY_AMMO.name]: 581, // 300 +20\r\n [HIVE_TEMPLATES.BASE_GUN.name]: 901, // 540\r\n [HIVE_TEMPLATES.LASER_RIFLE.name]: 1441, // 380\r\n [HIVE_TEMPLATES.LASER_SHOTGUN.name]: 1821, // 380\r\n [HIVE_TEMPLATES.VANCE_TYRRELL.name]: 2201, // 460\r\n [HIVE_TEMPLATES.MASHA_TALASHOVA.name]: 2661, // 380\r\n // NOTE: 3042-3076 taken by broken NFTs\r\n 'BROKEN': 3041, // 34\r\n\r\n // HALLOWEEN SKINS (PVP):\r\n [HIVE_TEMPLATES.ELEKTRA_L2_SKIN.name]: 3076, // 15 (Muran - common)\r\n [HIVE_TEMPLATES.JUSTICE_L2_SKIN.name]: 3091, // 10 (Venga - epic)\r\n [HIVE_TEMPLATES.UTOPIA_L2_SKIN.name]: 3101, // 5 (Theta - rare)\r\n\r\n // 3rd lev shield\r\n [HIVE_TEMPLATES.FORCE_FIELD_L2.name]: 3106, // 150\r\n\r\n // 2nd level items\r\n [HIVE_TEMPLATES.SAVAGE.name]: 3256, // 300\r\n [HIVE_TEMPLATES.TREMOR.name]: 3556, // 250\r\n [HIVE_TEMPLATES.VORTEX.name]: 3806, // 200\r\n [HIVE_TEMPLATES.IVAN_BARRICK.name]: 4006, // 400\r\n [HIVE_TEMPLATES.MINTA_HANI.name]: 4406, // 50\r\n\r\n // 3rd level items\r\n [HIVE_TEMPLATES.MURAN.name]: 4456, // 300\r\n [HIVE_TEMPLATES.THETA.name]: 4756, // 250\r\n [HIVE_TEMPLATES.VENGA.name]: 5006, // 200\r\n [HIVE_TEMPLATES.LEXI_CAYNE.name]: 5206, // 250\r\n [HIVE_TEMPLATES.EVELYN_MOORE.name]: 5456, // 200\r\n\r\n // // CYBERGIRLS\r\n [HIVE_TEMPLATES.KIARA_JANUARY.name]: 5656, // 20\r\n [HIVE_TEMPLATES.KIARA_FEBRUARY.name]: 5676, // 20\r\n [HIVE_TEMPLATES.KIARA_MARCH.name]: 5696, // 20\r\n [HIVE_TEMPLATES.KIARA_APRIL.name]: 5716, // 20\r\n [HIVE_TEMPLATES.KIARA_MAY.name]: 5736, // 20\r\n [HIVE_TEMPLATES.KIARA_JUNE.name]: 5756, // 20\r\n [HIVE_TEMPLATES.KIARA_JULY.name]: 5776, // 20\r\n [HIVE_TEMPLATES.KIARA_AUGUST.name]: 5796, // 20\r\n [HIVE_TEMPLATES.KARINA_JANUARY.name]: 5816, // 20\r\n [HIVE_TEMPLATES.KARINA_FEBRUARY.name]: 5836, // 20\r\n [HIVE_TEMPLATES.KARINA_MARCH.name]: 5856, // 20\r\n [HIVE_TEMPLATES.KARINA_APRIL.name]: 5876, // 20\r\n [HIVE_TEMPLATES.KARINA_MAY.name]: 5896, // 20\r\n [HIVE_TEMPLATES.KARINA_JUNE.name]: 5916, // 20\r\n [HIVE_TEMPLATES.KARINA_JULY.name]: 5936, // 20\r\n [HIVE_TEMPLATES.KARINA_AUGUST.name]: 5956, // 20\r\n // // Incorrect images:\r\n // // [HIVE_TEMPLATES.MARTE_JANUARY.name]: 5976, // 20\r\n // // [HIVE_TEMPLATES.MARTE_FEBRUARY.name]: 5996, // 20\r\n // // [HIVE_TEMPLATES.MARTE_MARCH.name]: 6016, // 20\r\n [HIVE_TEMPLATES.MARTE_APRIL.name]: 6036, // 20\r\n [HIVE_TEMPLATES.MARTE_MAY.name]: 6056, // 20\r\n [HIVE_TEMPLATES.MARTE_JUNE.name]: 6076, // 20\r\n [HIVE_TEMPLATES.MARTE_JULY.name]: 6096, // 20\r\n [HIVE_TEMPLATES.MARTE_AUGUST.name]: 6116, // 20\r\n // Fixes for broken 3 above:\r\n [HIVE_TEMPLATES.MARTE_JANUARY.name]: 6136, // 20\r\n [HIVE_TEMPLATES.MARTE_FEBRUARY.name]: 6156, // 20\r\n [HIVE_TEMPLATES.MARTE_MARCH.name]: 6176, // 20\r\n // PS. new cybergirls\r\n [HIVE_TEMPLATES.KIARA_SEPTEMBER.name]: 6396, // 20\r\n [HIVE_TEMPLATES.KIARA_OCTOBER.name]: 6416, // 20\r\n [HIVE_TEMPLATES.KIARA_NOVEMBER.name]: 6436, // 20\r\n [HIVE_TEMPLATES.KIARA_DECEMBER.name]: 6456, // 20\r\n [HIVE_TEMPLATES.KARINA_SEPTEMBER.name]: 6476, // 20\r\n [HIVE_TEMPLATES.KARINA_OCTOBER.name]: 6496, // 20\r\n [HIVE_TEMPLATES.KARINA_NOVEMBER.name]: 6516, // 20\r\n [HIVE_TEMPLATES.KARINA_DECEMBER.name]: 6536, // 20\r\n [HIVE_TEMPLATES.MARTE_SEPTEMBER.name]: 6556, // 20\r\n [HIVE_TEMPLATES.MARTE_OCTOBER.name]: 6576, // 20\r\n [HIVE_TEMPLATES.MARTE_NOVEMBER.name]: 6596, // 20\r\n [HIVE_TEMPLATES.MARTE_DECEMBER.name]: 6616, // 20\r\n\r\n // PVP PASS\r\n [HIVE_TEMPLATES.PVP_ALPHA_PASS.name]: 6196, // 50++ --> 6396\r\n\r\n [HIVE_TEMPLATES.FORCE_FIELD_L0.name]: 6636, // 500\r\n [HIVE_TEMPLATES.TORCH.name]: 7136, // 160\r\n};\r\n// NOTE: the MIN MINT is actually +1 from the bottom above\r\n\r\nexport const fixMintNumber = ({ name, mint }) => {\r\n const minMint = MIN_MINTS[name];\r\n if (minMint) return mint - minMint;\r\n return mint;\r\n};\r\n","import React from 'react';\r\nimport { get } from 'lodash';\r\nimport { useSelector } from 'react-redux';\r\nimport { fixMintNumber } from './utils/minMint';\r\nimport { AccountLinking } from './AccountLinking';\r\nimport { capitalize, getPlayerUsername } from '../../../generalUtils/utils';\r\nimport { linkedHiveAccount } from '../../../reducers/InventoryReducer';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport './HiveInventory.scss';\r\nimport { unlinkAccount } from '../../../sagas/helpers/login/linking';\r\nimport { useState } from 'react';\r\n\r\n\r\nconst fixDescription = ({ schema, name }) => {\r\n if (schema === 'game.items' && name === 'Force Field, level-1') return 'Life shield against the boss of the 2nd level.';\r\n return 'n/a';\r\n};\r\n\r\nconst NftData = ({ data }) => {\r\n const { mint, img, name, previousOwner, schema, description } = data;\r\n const mintNumber = fixMintNumber({ name, mint });\r\n const underscoredName = name.replace(/ /g, '_');\r\n const s3Img = `https://play.crypto-shots.com/nft-images/hive/${schema}/${underscoredName}.gif`;\r\n return (\r\n \r\n {img && \r\n
    \r\n {`${name}\r\n
    \r\n }\r\n
    \r\n
    \r\n

    {name}

    \r\n

    MINT # {mintNumber}

    \r\n
    \r\n
    \r\n

    \r\n Schema: {schema}\r\n

    \r\n

    \r\n Prev. owner: {previousOwner || 'n/a'}\r\n

    \r\n

    \r\n {description || fixDescription({ schema, name })}\r\n

    \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n\r\nexport const BuyHiveNFts = () => {\r\n return (
    \r\n
    \r\n TRADE OUR NFTs   |   OPEN PACKS\r\n
    on  \r\n \r\n hive.crypto-shots.com\r\n \r\n
    \r\n
    \r\n TRADE OUR NFTs and PACKS
    on  \r\n \r\n NFTM.ART\r\n \r\n
    \r\n
    );\r\n};\r\n\r\n\r\nconst extractCategories = ({ hiveNfts = [] }) => {\r\n const categories = [];\r\n hiveNfts.forEach(nft => { categories.push(nft.schema); });\r\n const noDupes = Array.from(new Set(categories));\r\n return noDupes.reverse();\r\n}\r\n\r\nconst parseSchemaName = (category = '') => {\r\n const [part1, part2] = category.split('.');\r\n return `${capitalize(part1)} ${capitalize(part2) || ''}`;\r\n}\r\n\r\nconst HiveItems = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const hiveData = get(InventoryState, 'hive', {});\r\n const { nfts: hiveNfts, username: hiveUsername, teacher } = hiveData;\r\n const foundCategories = extractCategories({ hiveNfts });\r\n\r\n const [unlinkWip, setUnlinkWip] = useState(false);\r\n\r\n const unlinkChain = async () => {\r\n setUnlinkWip(true);\r\n try {\r\n const currentAuthUser = getPlayerUsername({ UserState, InventoryState });\r\n const ok = window.confirm(`Are you sure?\\n\\nUnlink your HIVE account ${hiveUsername\r\n }\\nfrom your ${chainLogin.toUpperCase()} account ${currentAuthUser}?`);\r\n if (!ok) return;\r\n\r\n const { result, err, hiveErr } = await unlinkAccount({\r\n currentAuthUser, inputAccount: hiveUsername, tab: 'hive',\r\n });\r\n // Unlink Failure\r\n if (err) alert(`Failed to unlink Hive account ${hiveUsername}: ${err}`);\r\n // Unlink Success\r\n else {\r\n storeAppDispatch(linkedHiveAccount({ hiveAccount: null }));\r\n // Hive DB Failure\r\n if (hiveErr) alert('Hive account unlinked in our Database but not in Hive DB. Please contact support.');\r\n // Hive DB Success\r\n else console.log('Hive account unlink success - Hive tx:', result);\r\n }\r\n } catch (err) {\r\n console.error('Something broke unlinking chain:', err);\r\n alert('Uh oh, something broke..');\r\n } finally {\r\n setUnlinkWip(false);\r\n }\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n MY NFTs\r\n {hiveUsername && \r\n @{hiveUsername}\r\n \r\n \r\n {unlinkWip\r\n ? \r\n : UNLINK ACCOUNT}\r\n \r\n }\r\n {teacher &&
    \r\n (borrowed from @{teacher}\r\n )\r\n
    \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n



    \r\n
    \r\n {hiveNfts.length\r\n ? foundCategories.map(category => <>\r\n
    \r\n {parseSchemaName(category)}\r\n
    \r\n

    \r\n {hiveNfts.filter(({ schema }) => schema === category).map(nft => )}\r\n

    \r\n )\r\n :
    \r\n

    No Hive NFTs found

    \r\n

    Note: Hive NFTs listed for sale won't appear here.

    \r\n
    \r\n }\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport const HiveInventory = () => {\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const { username } = get(InventoryState, 'hive', {});\r\n\r\n return (\r\n \r\n {username\r\n ? \r\n : <>\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n }\r\n \r\n );\r\n};\r\n","import { isLocal } from '../../../../constants/envs';\r\nimport { cacheBustParam } from '../../../../helpers/client';\r\n\r\n// Why not working??\r\nexport const waxPurchItems = {\r\n // 493725: { name: 'L1 pack S', priceWax: 380 },\r\n};\r\n\r\nconst fetchWaxPrices = () => {\r\n isLocal && console.debug('fetching wax prices..');\r\n if (isLocal) return;\r\n fetch(`/json/waxPr.json${cacheBustParam()}`)\r\n .then(res => res.json())\r\n .then((data = {}) => {\r\n isLocal && console.debug('Wax prices:', data);\r\n Object.entries(data).forEach(([key, value]) => { waxPurchItems[key] = value; });\r\n })\r\n .catch(err => console.error('wax prices fetch err:', err));\r\n};\r\nfetchWaxPrices();\r\n\r\n\r\nexport const isWaxBuyItem = template => Object.keys(waxPurchItems).includes(template);\r\n","import React from 'react';\r\nimport { UserService } from '../../../services/UserService';\r\nimport { processInventory } from '../../../sagas/helpers/inventory/processInventory';\r\nimport { fetchBoomBalance } from '../../../sagas/helpers/wallet/waxUtils';\r\nimport { setPlayerInventory } from '../../../reducers/InventoryReducer';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport { setPlayerWaxTokensBalances } from '../../../reducers/WalletReducer';\r\nimport { getCachedPrices, getItemPrice } from '../../../sagas/helpers/inventory/marketplacePrices';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { transferAndMint } from '../../../sagas/helpers/inventory/transferAndMint';\r\nimport { isInventoryDisabled } from \"../../../config/appRemoteStatus\";\r\nimport { get } from 'lodash';\r\nimport { capitalize, isValidNumber, nap } from '../../../generalUtils/utils';\r\nimport { isWaxBuyItem, waxPurchItems } from './utils/waxPurchItems';\r\nimport { useSelector } from 'react-redux';\r\nimport { useState } from 'react';\r\nimport './Tile.scss';\r\nimport { getWaxNftPathS3 } from '../../../sagas/helpers/inventory/extractNfts';\r\nimport { ALL_NFTS_FLAT } from '../../../constants/templateIds';\r\nimport Swal from 'sweetalert2';\r\n\r\nconst NEW_PURCHASE_WAIT_SEC = 60;\r\n\r\n\r\nconst AhLink = ({ tid }) => {\r\n const AH_TEMPLATE_LINK = `https://wax.atomichub.io/explorer/template/crypto4shots/${tid}`;\r\n return AH;\r\n};\r\n\r\nconst DisplayPrice = ({ price, nftTemplate }) => {\r\n if (isWaxBuyItem(nftTemplate)) {\r\n const cost = get(waxPurchItems, `${nftTemplate}.priceWax`);\r\n return
    {cost} WAX
    \r\n }\r\n const hasPriceInChainTable = isValidNumber(price);\r\n return hasPriceInChainTable\r\n ?
    {JSON.stringify(price)} BOOM
    \r\n : N/A in $BOOM;\r\n};\r\n\r\n\r\nexport const Tile = ({ name, data }) => {\r\n const UserState = useSelector((store) => store.user);\r\n const [lastPurchaseTs, setLastPurchaseTs] = useState(null);\r\n\r\n const fetchUserCsAssets = async () => {\r\n await nap(5 * 1000); // wait for new NFT to be in inventory\r\n const { err, csNfts, hotNfts, scholarship } = await processInventory({ username: UserService.authName });\r\n if (err) return;\r\n const currentState = {\r\n csAssets: { csNfts, hotNfts }, refresh: true,\r\n scholarship,\r\n };\r\n storeAppDispatch(setPlayerInventory(currentState));\r\n };\r\n\r\n const onHandlePurchase = async ({ template }) => {\r\n setLastPurchaseTs(Date.now());\r\n // puchase count check\r\n const { value, MAX_ALLOWED } = get(window, 'totNftsMintsToday', {});\r\n if (value > MAX_ALLOWED) {\r\n Swal.fire({ text: `Cannot purchase more items until midnight UTC. You already got ${MAX_ALLOWED} today.`})\r\n return;\r\n }\r\n if (isInventoryDisabled()) {\r\n Swal.fire({ text: `The Inventory purchases are temporarily disabled.\\n\\nPlease try again in a bit.`})\r\n return;\r\n }\r\n const isWaxBuy = isWaxBuyItem(template);\r\n let purchasePrice;\r\n if (isWaxBuy) {\r\n purchasePrice = get(waxPurchItems, `${template}.priceWax`);\r\n } else {\r\n isLocal && console.debug('Fetching BOOM price..', { template });\r\n const { price, err } = await getItemPrice({ templateId: template });\r\n if (err) {\r\n Swal.fire({text: `Unable to fetch prices, please try in a bit.`})\r\n return; \r\n }\r\n purchasePrice = price;\r\n }\r\n const currency = isWaxBuy ? 'WAX' : 'BOOM';\r\n const isOk = window.confirm(`🛒 Purchase item ${template} for ${purchasePrice} ${currency}? 🛒`);\r\n if (!isOk) return;\r\n if (lastPurchaseTs && ((Date.now() - lastPurchaseTs) < (NEW_PURCHASE_WAIT_SEC * 1000))) {\r\n Swal.fire({text: `Please leave at least ${NEW_PURCHASE_WAIT_SEC} between purchases.`})\r\n return;\r\n }\r\n isLocal && console.debug('Initiating user transfer and telling BE to mint');\r\n const purchaseErr = await transferAndMint({\r\n UserService, UserState,\r\n template, price: purchasePrice, currency\r\n });\r\n if (purchaseErr) return;\r\n await nap(2 * 1000);\r\n try {\r\n isLocal && console.debug('Refreshing inventory..');\r\n fetchUserCsAssets(); // no await\r\n isLocal && console.debug('Refreshing balances..');\r\n const boomAmount = await fetchBoomBalance(UserService.authName);\r\n const savingsAmount = await Promise.resolve(0); // TEMP for savings @@ @@ @@ @@\r\n storeAppDispatch(setPlayerWaxTokensBalances({\r\n tokens: { boom: boomAmount },\r\n stakedSavings: { boom: savingsAmount }\r\n }));\r\n isLocal && console.debug('Post-purchase ops completed.');\r\n } catch (err) { console.error('Caught in post-purchase:', err); }\r\n };\r\n\r\n const onPurchaseClick = async ({ nftTemplate, category = '' }) => {\r\n if (!isWaxBuyItem(nftTemplate)) {\r\n const availableItems = await getCachedPrices({ idsOnly: true });\r\n const categoryLc = category.toLowerCase();\r\n const categoryName = categoryLc.endsWith('ss') ? categoryLc : (categoryLc.endsWith('s') ? categoryLc.slice(0, -1) : categoryLc);\r\n if (!availableItems.includes(nftTemplate)) {\r\n const itemName = capitalize(categoryName.replace(/_/g, ' '));\r\n Swal.fire({text: `${itemName} ${nftTemplate} not available yet ❌`})\r\n return;\r\n }\r\n }\r\n onHandlePurchase({ template: nftTemplate });\r\n };\r\n\r\n const {\r\n template, schema, nftName, img, s3Img, amount = 1, category, price, // user owned item\r\n ID, NAME, OG_NAME, IMG, SCHEMA, // user missing item\r\n } = data;\r\n const nftTemplate = template || ID;\r\n const nameOverride = ALL_NFTS_FLAT.find(({ ID }) => ID === nftTemplate)?.NAME; // PS. useless now because override applied higher up - cybergirls collapsed into 1\r\n const nftDisplayName = nameOverride || nftName || NAME;\r\n // https://ipfs.io/ipfs/, https://ipfs.atomichub.io/ipfs/\r\n const ipfsImg = (IMG && `https://gateway.pinata.cloud/ipfs/${IMG}`);\r\n const s3ImgFromConfig = SCHEMA && `https://play.crypto-shots.com/nft-images/wax/${\r\n getWaxNftPathS3({ schema: SCHEMA, name: OG_NAME || NAME, template_id: ID })}`;\r\n const nftImage = s3Img || s3ImgFromConfig || img || ipfsImg;\r\n const shouldDisplayAmount = (!ID && nftImage) && category !== 'OTHERS';\r\n const displayAmount = shouldDisplayAmount ? amount : '';\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n

    \r\n {nftDisplayName}\r\n

    \r\n

    \r\n {nftImage &&\r\n \r\n {`${name}\r\n \r\n }\r\n

    \r\n

    \r\n {displayAmount}\r\n

    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React, { Component } from 'react';\r\nimport { get } from 'lodash';\r\n\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { ITEMS_BY_CATEGORY } from '../../../constants/templateIds';\r\nimport { Tile } from '../Tile/Tile';\r\nimport { getItemPrice } from '../../../sagas/helpers/inventory/marketplacePrices';\r\nimport './Category.scss';\r\n\r\n\r\nconst getMissingItemsList = ({ userNftsArr = {}, categoryId }) => {\r\n const userTemplateIdsForCurrentCategory = Object.keys(userNftsArr)\r\n .map((key) => get(userNftsArr, `${key}.template`));\r\n const allNftsForCurrentCategory = ITEMS_BY_CATEGORY[categoryId];\r\n const userMissingItems = Object.values(allNftsForCurrentCategory).map((nftDetails) => {\r\n if (userTemplateIdsForCurrentCategory.includes(nftDetails?.ID)) return null;\r\n else return nftDetails;\r\n }).filter(el => !!el);\r\n return userMissingItems;\r\n};\r\n\r\nconst prepRowItems = ({ isOpen, missingItemsList, userNfts }) => {\r\n if (isOpen) return missingItemsList.map((nftObj) => {\r\n const key = nftObj.template || nftObj?.ID;\r\n return \r\n });\r\n else if (Object.keys(userNfts).length === 0) return (\r\n
    \r\n none\r\n
    \r\n );\r\n return Object.keys(userNfts).map(\r\n (item = '') => {\r\n const data = userNfts[item];\r\n const key = data.template || data?.ID;\r\n item.toLowerCase().includes('teacher') && console.log('[D] Teacher:', { key, data }); // @@\r\n return \r\n })\r\n};\r\n\r\nconst prepSchemas = ({ schemas = [] }) => {\r\n const allSchemas = schemas.map(({ schema, SCHEMA }) => schema || SCHEMA);\r\n const noDupes = Array.from(new Set(allSchemas));\r\n const AH_MARKET_LINK = 'https://wax.atomichub.io/market?collection_name=crypto4shots&order=asc&sort=price&symbol=WAX&schema_name=';\r\n return (\r\n \r\n {noDupes.map((schema = '') => <>\r\n \r\n {schema}\r\n    \r\n )}\r\n \r\n );\r\n};\r\n\r\n\r\nexport class Category extends Component {\r\n constructor(props) {\r\n super(props);\r\n const ownedSchemas = prepSchemas({ schemas: Object.values(this.props.data || {}) });\r\n this.state = {\r\n missingItemsOpen: false,\r\n categorySchemas: ownedSchemas,\r\n };\r\n }\r\n\r\n onTabClick = async ({ userNftsArr: data = {}, categoryId }) => {\r\n // OWNED ITEMS EXPANDED\r\n if (this.state.missingItemsOpen) {\r\n isLocal && console.log('owned items:', { data });\r\n const ownedSchemas = prepSchemas({ schemas: Object.values(data) });\r\n this.setState((state) => ({\r\n ...state,\r\n missingItemsOpen: false,\r\n missingItemsList: [],\r\n categorySchemas: ownedSchemas,\r\n }));\r\n return;\r\n }\r\n // MISSING ITEMS EXPANDED\r\n const missingItemsList = await getMissingItemsList({ userNftsArr: data, categoryId });\r\n // ADD PRICE\r\n for (let id = 0; id < missingItemsList.length; id++) {\r\n const currentNft = missingItemsList[id];\r\n const templateId = currentNft.ID;\r\n const { price } = await getItemPrice({ templateId });\r\n currentNft.price = price;\r\n }\r\n isLocal && console.log('missing items:', { missingItemsList });\r\n const missingItemsSchemas = prepSchemas({ schemas: missingItemsList });\r\n this.setState((state) => ({\r\n ...state,\r\n missingItemsOpen: true,\r\n missingItemsList,\r\n categorySchemas: missingItemsSchemas,\r\n }));\r\n };\r\n\r\n render() {\r\n const { name, data } = this.props;\r\n\r\n const categoryId = name.replace(/ /g, '_');\r\n const itemsInCategory = ITEMS_BY_CATEGORY[categoryId];\r\n const maxItems = Object.keys(itemsInCategory).length;\r\n const userItemsCount = Object.keys(data).length;\r\n\r\n if (name === 'OTHERS' && !userItemsCount) return null; // hide Others category if empty\r\n\r\n const itemsRow = prepRowItems({\r\n isOpen: this.state.missingItemsOpen,\r\n missingItemsList: this.state.missingItemsList,\r\n userNfts: data,\r\n });\r\n const missingItemsCount = name === 'OTHERS' ? 0 : Math.max(0, maxItems - userItemsCount);\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n {name}\r\n {this.state.categorySchemas}\r\n
    \r\n
    \r\n
    \r\n {\r\n // /* TAB */\r\n missingItemsCount === 0 ?\r\n (

    \r\n {userItemsCount > 0 ? You got {\r\n maxItems > 1 ? `all ${maxItems}` : 'it'\r\n } !! 😎 : <>soon!}\r\n

    ) :\r\n this.onTabClick({ userNftsArr: data, categoryId })}\r\n >\r\n {!this.state.missingItemsOpen ?\r\n \r\n \r\n 0 ? \"missing-items-count\" : \"\"}`}>\r\n {missingItemsCount}\r\n \r\n   items missing  \r\n \r\n : \r\n Your {userItemsCount > 0 ? userItemsCount : ''} NFTs\r\n \r\n }\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n {/* TAB ITEMS */}\r\n <>{itemsRow}\r\n
    \r\n
    \r\n );\r\n }\r\n};\r\n","import React from 'react';\r\nimport { ALL_NFTS_FLAT, ITEMS_BY_CATEGORY } from '../../constants/templateIds';\r\nimport { Category } from '../../components/Inventory/Category/Category';\r\n\r\n\r\nexport const ActiveInventory = ({ csNfts }) => {\r\n let result = {};\r\n // init categories\r\n const allCategories = Object.keys(ITEMS_BY_CATEGORY);\r\n allCategories.forEach(category => { result[category] = {}; });\r\n // add category and price to user items\r\n csNfts.forEach((nft = {}) => {\r\n const { name, category, img, s3Img, template_id, schema, price } = nft;\r\n const fixedName = ALL_NFTS_FLAT.find(nft => nft.ID === template_id)?.NAME || name;\r\n if (result[category][fixedName]) {\r\n result[category][fixedName].amount++;\r\n } else {\r\n result[category][fixedName] = {\r\n nftName: fixedName, img, s3Img, amount: 1, template: template_id, schema,\r\n category, price: price || 'n/a', // THE FIELDS ADDED HERE\r\n };\r\n }\r\n });\r\n // Put empty categories at the bottom\r\n const categoriesWithItems = {};\r\n const emptyCategories = {};\r\n Object.keys(result).forEach((category) => {\r\n if (Object.keys(result[category]).length > 0) {\r\n categoriesWithItems[category] = result[category];\r\n } else {\r\n emptyCategories[category] = result[category];\r\n }\r\n });\r\n result = { ...categoriesWithItems, ...emptyCategories };\r\n return (<>{allCategories.map((categoryName, index) => {\r\n return (\r\n );\r\n })});\r\n};\r\n","import React from 'react';\r\n\r\nexport const HotAssets = ({ hotNfts = {} }) => {\r\n const names = Object.keys(hotNfts);\r\n const values = Object.values(hotNfts);\r\n return (\r\n

    \r\n {names.map((name, id) => {values[id]}x {name}  )}\r\n

    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { get } from 'lodash';\r\nimport { UserService } from '../../../services/UserService';\r\nimport { COOLDOWN_HOURS } from '../../../sagas/helpers/inventory/constants';\r\nimport { ActiveInventory } from '../ActiveInventory';\r\nimport { HotAssets } from '../HotAssets';\r\nimport { isTestnet } from '../../../constants/envs';\r\nimport { AccountLinking } from './AccountLinking';\r\nimport { getPlayerUsername } from '../../../generalUtils/utils';\r\nimport { storeAppDispatch } from '../../../GlobalState/Store';\r\nimport { linkedWaxAccount as linkedWaxAccountData } from '../../../reducers/InventoryReducer';\r\nimport { unlinkAccount } from '../../../sagas/helpers/login/linking';\r\nimport { useState } from 'react';\r\n\r\n\r\nexport const WaxInventory = () => {\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const coolDownCount = get(InventoryState, 'csAssets.hotNfts')\r\n ? Object.keys(InventoryState.csAssets.hotNfts).length\r\n : 0;\r\n const waxNfts = get(InventoryState, 'csAssets.csNfts', []);\r\n const waxHotNfts = get(InventoryState, 'csAssets.hotNfts', {});\r\n \r\n const linkedWaxAccount = get(InventoryState, 'hive.linkedWaxAccount');\r\n const bloksLink = linkedWaxAccount && <>\r\n {linkedWaxAccount}\r\n

    's

    \r\n\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n\r\n const WalletState = useSelector((store) => store.wallet);\r\n const boomTot = +WalletState.tokens.boom;\r\n const boomDisplayValue = boomTot ? {boomTot.toFixed(4)} $BOOM\r\n : n/a ( see bloks );\r\n\r\n\r\n const [unlinkWip, setUnlinkWip] = useState(false);\r\n\r\n const unlinkChain = async () => {\r\n setUnlinkWip(true);\r\n try {\r\n const currentAuthUser = getPlayerUsername({ UserState, InventoryState });\r\n const ok = window.confirm(`Are you sure?\\n\\nUnlink your WAX account ${linkedWaxAccount\r\n }\\nfrom your ${chainLogin.toUpperCase()} account ${\r\n chainLogin === 'hive' ? '@' : ''}${currentAuthUser}?`);\r\n if (!ok) return;\r\n\r\n const { result, err, hiveErr } = await unlinkAccount({\r\n currentAuthUser, inputAccount: linkedWaxAccount, tab: 'wax',\r\n });\r\n // Unlink Failure\r\n if (err) alert(`Failed to unlink Hive account ${linkedWaxAccount}: ${err}`);\r\n // Unlink Success\r\n else {\r\n storeAppDispatch(linkedWaxAccountData({ waxAccount: null }));\r\n // Hive DB Failure\r\n if (hiveErr) alert('Wax account unlinked in our Database but not on Hive, please contact support.');\r\n // Hive DB Success\r\n else console.log('Wax account unlink success - Hive tx:', result);\r\n }\r\n } catch (err) {\r\n console.error('Something broke unlinking chain:', err);\r\n alert('Uh oh, something broke..');\r\n } finally {\r\n setUnlinkWip(false);\r\n }\r\n };\r\n\r\n // ACCOUNT LINKING\r\n if (chainLogin === 'hive' && (waxNfts.length + Object.keys(waxHotNfts).length) === 0) {\r\n return (
    \r\n
    \r\n \r\n
    \r\n
    );\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    \r\n {linkedWaxAccount ? bloksLink : 'TOTAL'} NFTs:  {waxNfts.length}\r\n

    \r\n
    \r\n
    \r\n
    \r\n

    \r\n On their way:  {coolDownCount}   ({`${COOLDOWN_HOURS}hs cooldown`})\r\n

    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n {unlinkWip\r\n ? \r\n : UNLINK ACCOUNT}\r\n \r\n
    \r\n
    \r\n
    \r\n

    \r\n \r\n Your AtomicHub\r\n \r\n

    \r\n
    \r\n Available for purchases:\r\n

    {boomDisplayValue}

    \r\n \r\n \r\n BUY $BOOM\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { AccountLinking } from './AccountLinking';\r\n\r\n\r\nexport const BtcInventory = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = UserState.chainLogin;\r\n\r\n if (chainLogin === 'hive') {\r\n return (
    \r\n
    \r\n \r\n
    \r\n
    );\r\n }\r\n\r\n return (\r\n
    \r\n YOUR ORDINALS:\r\n
    \r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { get } from 'lodash';\r\nimport { Animated } from \"react-animated-css\";\r\n\r\nimport RefreshIcon from '../../images/icons/refresh.png';\r\nimport { UserService } from '../../services/UserService';\r\nimport { processInventory } from '../../sagas/helpers/inventory/processInventory';\r\nimport { setPlayerInventory } from '../../reducers/InventoryReducer';\r\nimport { storeAppDispatch } from '../../GlobalState/Store';\r\nimport { WelcomeScreenNewUser } from './welcome/WelcomeScreenNewUser';\r\nimport { ScholarshipPane } from './Scholarships/ScholarshipPane';\r\nimport { isReactLayer, isTestnet } from '../../constants/envs';\r\nimport { HiveInventory } from './chains/HiveInventory';\r\nimport { WaxInventory } from './chains/WaxInventory';\r\nimport { BtcInventory } from './chains/BtcInventory';\r\nimport { getPlayerUsername } from '../../generalUtils/utils';\r\nimport { askPvePlayerJoinTourney } from '../../services/notifications/joinTourney';\r\nimport './Inventory.scss';\r\n\r\n\r\nconst ChainChoice = ({ choseChain, activeBtn = 1 }) => {\r\n const [whichActiveBtn, setActiveBtn] = useState(activeBtn);\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const waxNftsCount = get(InventoryState, 'csAssets.csNfts.length', 0);\r\n const hiveNftsCount = get(InventoryState, 'hive.nfts.length', 0);\r\n\r\n const ethBtnStyle = {\r\n width: whichActiveBtn === 4 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 4 ? 'bold' : 'auto',\r\n };\r\n const btcBtnStyle = {\r\n width: whichActiveBtn === 3 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 3 ? 'bold' : 'auto',\r\n };\r\n const hiveBtnStyle = {\r\n width: whichActiveBtn === 2 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 2 ? 'bold' : 'auto',\r\n };\r\n const waxBtnStyle = {\r\n width: whichActiveBtn === 1 ? '170px' : '150px',\r\n fontWeight: whichActiveBtn === 1 ? 'bold' : 'auto',\r\n };\r\n\r\n const handleEthClick = () => {\r\n choseChain(4);\r\n setActiveBtn(4);\r\n }\r\n const handleBtcClick = () => {\r\n alert('To link your LN address go to the Tokens section'); // ALERT\r\n choseChain(3);\r\n setActiveBtn(3);\r\n }\r\n const handleHiveClick = () => {\r\n choseChain(2);\r\n setActiveBtn(2);\r\n }\r\n const handleWaxClick = () => {\r\n choseChain(1);\r\n setActiveBtn(1);\r\n }\r\n\r\n return (\r\n \r\n \r\n BTC ({0})\r\n
    \r\n \r\n HIVE ({hiveNftsCount})\r\n
    \r\n \r\n WAX ({waxNftsCount})\r\n
    \r\n \r\n ETH ({0})\r\n \r\n \r\n );\r\n};\r\n\r\nexport const Inventory = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const [shouldShowInventory, showBoomInventory] = useState(false);\r\n const chainLogin = UserState.chainLogin;\r\n const isWaxLogin = chainLogin === 'wax';\r\n const [whichActiveChain, setActiveChain] = useState(isWaxLogin ? 1 : 2);\r\n \r\n const canBeFullyUsed = UserState.isLogged && get(InventoryState, 'csAssets.csNfts.length');\r\n const scholarshipData = get(InventoryState, 'scholarship', {});\r\n\r\n const PlayState = useSelector((store) => store.play);\r\n const isPvp = PlayState.isPvpGameMode;\r\n\r\n useEffect(() => {\r\n // ask PVE player to join active F2E pvp tourney\r\n askPvePlayerJoinTourney({ isPvp });\r\n }, []);\r\n\r\n\r\n let previousRefresh = Date.now();\r\n\r\n const fetchUserCsAssets = async () => {\r\n if (!canBeFullyUsed) return;\r\n if ((Date.now() - previousRefresh) < 5 * 1000) return;\r\n previousRefresh = Date.now();\r\n const { err, csNfts, hotNfts, scholarship } = await processInventory({ username: UserService.authName });\r\n if (err) return;\r\n isTestnet && console.debug(`Fetched ${csNfts.length} NFTs. Dispatching..`);\r\n const currentState = {\r\n csAssets: { csNfts, hotNfts }, refresh: true,\r\n scholarship,\r\n };\r\n storeAppDispatch(setPlayerInventory(currentState));\r\n\r\n // TODO:\r\n // ADD HIVE @@@\r\n // @@@ and re-display it\r\n };\r\n\r\n if (!UserState.isLogged) return

    ?!

    ;\r\n const hasNfts = get(InventoryState, 'csAssets.csNfts.length', 0) > 0 || get(InventoryState, 'hive.nfts.length', 0);\r\n const shouldDisplayWelcome = !hasNfts && !shouldShowInventory;\r\n\r\n return (\r\n
    \r\n \r\n {!shouldDisplayWelcome && }\r\n
    \r\n
    \r\n {(whichActiveChain === 1 && isWaxLogin) && \r\n \"Refresh\"\r\n }\r\n
    \r\n
    \r\n \r\n {scholarshipData && }\r\n \r\n {shouldDisplayWelcome\r\n ? \r\n : <>\r\n {whichActiveChain === 1 && }\r\n {whichActiveChain === 2 && }\r\n {whichActiveChain === 3 && }\r\n \r\n }\r\n
    \r\n \r\n \r\n \r\n );\r\n}\r\n","import { Redirect, Route } from 'react-router-dom';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { get } from 'lodash';\r\nimport { isLocal } from '../constants/envs';\r\nimport { isPriviledgedUser } from './authUtils';\r\n\r\n\r\nconst ProtectedRoute = ({ component: Component, ...rest }) => {\r\n const UserState = useSelector((store) => store.user);\r\n const InventoryState = useSelector((store) => store.inventory);\r\n const { csAssets: waxAssets = {}, hive = {}, skale = {}, eth = {} } = InventoryState;\r\n const { nfts: hiveNfts = [], username: hiveUsername } = hive;\r\n const { nfts: skaleNfts = [], username: skaleUsername } = skale;\r\n const { nfts: ethNfts = [], username: ethUsername } = eth;\r\n // NFTs counting\r\n const hasWaxNfts = (waxAssets?.csNfts.length + Object.keys(waxAssets?.hotNfts || {}).length) > 0;\r\n const hasHiveNfts = hiveNfts.length > 0;\r\n const hasSkaleNfts = skaleNfts.length > 0;\r\n const hasEthNfts = ethNfts.length > 0;\r\n const hasNfts = hasWaxNfts || hasHiveNfts || hasSkaleNfts || hasEthNfts;\r\n // username\r\n const hasUsername = hiveUsername || skaleUsername || ethUsername;\r\n // Can be used: login, nfts, username\r\n const canBeFullyUsed = UserState.isLogged && (hasNfts || hasUsername);\r\n const canUseAdminPanel = (props) => get(props, 'location.pathname') === 'admin'\r\n && isPriviledgedUser(UserState.name);\r\n\r\n return (\r\n {\r\n isLocal && console.debug('Rendering component for:',\r\n {\r\n locationObj: props.location,\r\n user: UserState.name,\r\n isAdmin: isPriviledgedUser(UserState.name),\r\n }\r\n );\r\n if (canUseAdminPanel(props)) {\r\n return \r\n } if (canBeFullyUsed) {\r\n return \r\n } else {\r\n isLocal && console.error('{cant be fully used}');\r\n return \r\n }\r\n }\r\n } />\r\n )\r\n}\r\n\r\nexport default ProtectedRoute;\r\n","export const ENTRIES_SEPARATOR = ',';\r\n\r\nexport const BOOM_AMOUNT_SEPARATOR = ':';\r\nexport const TOKEN_INITIAL_SEPARATOR = '_';\r\nexport const TRANSFER_PARTIES_SEPARATOR = '->';\r\n\r\n\r\nexport const cleanUserList = (usersToRankReset) => {\r\n const userArray = usersToRankReset.split(ENTRIES_SEPARATOR)\r\n .filter(e => !!e).map(el => el.trim());\r\n const withoutDupes = Array.from(new Set(userArray));\r\n return withoutDupes;\r\n};\r\n\r\nconst reverseTxt = (txt = '') => txt.split('').reverse().join('');\r\n\r\nexport const generateChecksum = ({ account, player }) => {\r\n const reverseAcc = reverseTxt(account);\r\n const reversePlayer = reverseTxt(player);\r\n const encoded = btoa(`${reverseAcc}.${reversePlayer}`).replace(/=/g, '');\r\n return reverseTxt(encoded);\r\n};\r\n\r\nexport const cleanTransfersList = (savingsTransfers) => {\r\n const transfersArray = savingsTransfers.split(ENTRIES_SEPARATOR)\r\n .filter(e => !!e).map(el => el.trim());\r\n const withoutDupes = Array.from(new Set(transfersArray));\r\n const result = withoutDupes.map((transfer = '', id) => {\r\n try {\r\n const [totalTxt, parties] = transfer.split(BOOM_AMOUNT_SEPARATOR);\r\n const [amountTxt, tokenInitial = 'B'] = totalTxt.split(TOKEN_INITIAL_SEPARATOR);\r\n const [sender, receiver] = parties.split(TRANSFER_PARTIES_SEPARATOR);\r\n return ({ sender, receiver, amount: +amountTxt, tokenInitial });\r\n } catch (xx) {\r\n return ({ error: `Something broke parsing transfer #${id}: ${xx}` });\r\n }\r\n });\r\n return result;\r\n};\r\n","import { get } from 'lodash';\r\nimport React from 'react';\r\nimport { useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport hive from '@hiveio/hive-js';\r\n\r\nimport { ADMINS, COMMUNITY_MANAGERS, MODS } from '../../config/accounts';\r\nimport { isLocal } from '../../constants/envs';\r\nimport { nap } from '../../generalUtils/utils';\r\nimport { storeAppDispatch } from '../../GlobalState/Store';\r\nimport { client } from '../../helpers/client';\r\nimport {\r\n setFailedUsersEndSchool, setFailedUsersRank,\r\n setUiMessageRank, setUiMessageSchool,\r\n} from '../../reducers/AdminPaneReducer';\r\nimport {\r\n generateChecksum, cleanUserList, cleanTransfersList,\r\n ENTRIES_SEPARATOR, BOOM_AMOUNT_SEPARATOR, TRANSFER_PARTIES_SEPARATOR,\r\n} from './utils';\r\nimport './AdminPane.scss';\r\nimport { notifyOfRankReset, notifyOfStakeTransfer } from '../../services/monitoring/discordNotifications';\r\n\r\n\r\nconst sendRankResetRequest = async ({ currentUser, me }) => {\r\n let player = currentUser.replace('@', '');\r\n const checksum = generateChecksum({ account: me, player });\r\n const userChain = currentUser.startsWith('@') ? 'hive' : 'wax';\r\n const payload = { account: me, player, checksum, userChain };\r\n isLocal && console.debug('Sending rank reset api request with payload:', payload);\r\n try {\r\n const resetResult = await client.post('/api/user/rank-reset', payload);\r\n isLocal && console.debug('Rank reset result:', resetResult);\r\n return ({ resetResult });\r\n } catch (err) {\r\n console.error('Caught error for rank reset api request:', err);\r\n return ({ err });\r\n }\r\n};\r\n\r\nconst sendSavingsTransferRequest = async ({ account, scholar, teacher, amount, tokenInitial }) => {\r\n const payload = { account, scholar, teacher, amount, tokenInitial };\r\n isLocal && console.debug('Sending savings transfer api request with payload:', payload);\r\n try {\r\n const transferResult = await client.post('/api/admin/end-of-school', payload);\r\n isLocal && console.debug('Savings transfer result:', transferResult);\r\n return ({ transferResult });\r\n } catch (err) {\r\n console.error('Caught error for savings transfer api request:', err);\r\n return ({ err });\r\n }\r\n};\r\n\r\n\r\nexport const AdminPane = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const isSuperAdmin = ADMINS.includes(UserState.name);\r\n const isTrustedDelegate = COMMUNITY_MANAGERS.includes(UserState.name);\r\n const isMod = MODS.includes(UserState.name);\r\n \r\n const [usersToRankReset, setUsersToRankReset] = useState(''); // input text ranks\r\n const rankResetUsersArr = cleanUserList(usersToRankReset);\r\n const [savingsTransfers, setSavingsTransfer] = useState(''); // input text school\r\n const savingTransfersList = cleanTransfersList(savingsTransfers);\r\n \r\n const AdminState = useSelector((store) => store.adminPane);\r\n const {\r\n messageUiRank, failedUsersRankArr,\r\n messageUiSchool, failedUsersEndSchoolArr,\r\n } = AdminState;\r\n \r\n\r\n const resetUsers = async () => {\r\n // validation\r\n let valid = true;\r\n rankResetUsersArr.forEach((currentUser = '') => {\r\n if (currentUser.startsWith('@')) {\r\n const error = hive.utils.validateAccountName(currentUser.replace('@', ''));\r\n if (error) {\r\n storeAppDispatch(setUiMessageRank({ msg: `Incorrect Hive user ${currentUser}: ${error}. Execution stopped.` }));\r\n valid = false;\r\n }\r\n }\r\n else if (currentUser.length < 5 || currentUser.length > 12) {\r\n storeAppDispatch(setUiMessageRank({ msg: `Incorrect Wax user ${currentUser}: wrong length. Execution stopped.` }));\r\n valid = false;\r\n }\r\n });\r\n if (!valid) return;\r\n // api calls\r\n const errors = [];\r\n const toNotify = [];\r\n for (let id = 0; id < rankResetUsersArr.length; id++) {\r\n let currentUser = rankResetUsersArr[id];\r\n isLocal && console.debug(`Resetting rank for ${currentUser}`);\r\n storeAppDispatch(setUiMessageRank({ msg: `Resetting rank for ${currentUser}` }));\r\n let err, resp = {};\r\n try {\r\n resp = await sendRankResetRequest({ currentUser, me: UserState.name });\r\n err = resp.err;\r\n if (!err) toNotify.push(currentUser);\r\n isLocal && console.debug('Rank reset response:', { resp });\r\n } catch (caughtErr) {\r\n console.error('Failed to rank reset:', { caughtErr, resp: resp.resetResult });\r\n err = `Caught: ${caughtErr}`;\r\n }\r\n if (err) {\r\n const errMsg = JSON.stringify(get(err, 'response.data.error') || err);\r\n errors.push({ id, currentUser, err: errMsg });\r\n }\r\n await nap(1000);\r\n }\r\n if (toNotify.length) {\r\n notifyOfRankReset({ resetter: UserState.name, accountsReset: toNotify });\r\n }\r\n if (errors.length) {\r\n isLocal && console.debug(`Dispatching ${errors.length} errors..`);\r\n storeAppDispatch(setFailedUsersRank({ failedUsersRankArr: errors }));\r\n } else storeAppDispatch(setUiMessageRank({ msg: '✔️ ✔️ ✔️' }));\r\n };\r\n\r\n const sendTransfers = async () => {\r\n // validation\r\n let valid = true;\r\n savingTransfersList.forEach((currentTransfer = '', id) => {\r\n const { sender, receiver, amount, tokenInitial, error } = currentTransfer;\r\n if (error) {\r\n storeAppDispatch(setUiMessageSchool({ msg: error }));\r\n valid = false;\r\n }\r\n const invalidSender = sender.startsWith('@')\r\n ? hive.utils.validateAccountName(sender.replace('@', ''))\r\n : (sender.length < 5 || sender.length > 12);\r\n const invalidReceiver = receiver.startsWith('@')\r\n ? hive.utils.validateAccountName(receiver.replace('@', ''))\r\n : (receiver.length < 5 || receiver.length > 12);\r\n const wrongToken = tokenInitial !== 'B' && tokenInitial !== 'M';\r\n const wrongAmount = isNaN(amount) || amount <=0;\r\n const transferToSelf = sender === receiver;\r\n const isInvalidTransfer = invalidSender || invalidReceiver || transferToSelf || wrongToken || wrongAmount;\r\n if (isInvalidTransfer) {\r\n console.error('Invalid transfer:', { invalidSender, invalidReceiver, transferToSelf, wrongToken, wrongAmount });\r\n storeAppDispatch(setUiMessageSchool({ msg: `Invalid tranfer #${id} - fix the issue to start the batch execution` }));\r\n valid = false;\r\n }\r\n });\r\n if (!valid) return;\r\n // api calls\r\n const errors = [];\r\n const toNotify = [];\r\n for (let id = 0; id < savingTransfersList.length; id++) {\r\n const currentTransfer = savingTransfersList[id];\r\n const { sender, receiver, amount, tokenInitial } = currentTransfer;\r\n isLocal && console.debug('Sending transfer request for', { currentTransfer });\r\n storeAppDispatch(setUiMessageSchool({\r\n msg: `Transfering savings: ${amount} ${tokenInitial} from ${sender} to ${receiver}`,\r\n }));\r\n let err, resp = {};\r\n try {\r\n resp = await sendSavingsTransferRequest({\r\n account: UserState.name, scholar: sender, teacher: receiver, amount, tokenInitial,\r\n });\r\n err = resp.err;\r\n if (!err) toNotify.push(JSON.stringify(currentTransfer));\r\n isLocal && console.debug('Savings transfer response:', { resp });\r\n } catch (caughtErr) {\r\n console.error('Failed to transfer savings:', { caughtErr, resp: resp.transferResult });\r\n err = `Caught: ${caughtErr}`;\r\n }\r\n if (err) {\r\n const errMsg = JSON.stringify(get(err, 'response.data.error') || err);\r\n errors.push({ id, currentTransfer, err: errMsg });\r\n }\r\n await nap(1000);\r\n }\r\n if (toNotify.length) {\r\n notifyOfStakeTransfer({ transferer: UserState.name, transfers: toNotify });\r\n }\r\n if (errors.length) {\r\n isLocal && console.debug(`Dispatching ${errors.length} errors..`);\r\n storeAppDispatch(setFailedUsersEndSchool({ failedUsersEndSchoolArr: errors }));\r\n } else storeAppDispatch(setUiMessageSchool({ msg: '✔️ ✔️ ✔️' }));\r\n };\r\n\r\n const clearLogs = (type) => {\r\n if (type === 'rank') {\r\n if (!messageUiRank.length && !failedUsersRankArr.length) return;\r\n storeAppDispatch(setUiMessageRank());\r\n storeAppDispatch(setFailedUsersRank());\r\n } else if (type === 'school') {\r\n if (!messageUiSchool.length && !failedUsersEndSchoolArr.length) return;\r\n storeAppDispatch(setUiMessageSchool());\r\n storeAppDispatch(setFailedUsersEndSchool());\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n

    Welcome {isSuperAdmin ? 'super-admin' : 'mod'} {UserState.name}

    \r\n
    \r\n
    \r\n
    \r\n {\r\n (isSuperAdmin || isMod) &&
    \r\n

    RANK RESET


    \r\n
    \r\n
    \r\n \r\n

    \r\n setUsersToRankReset(e.target.value)}\r\n />
    \r\n ADDRESSES READY TO RESET:   {rankResetUsersArr.length}

    \r\n \r\n START RESET\r\n      \r\n clearLogs('rank')}\r\n className={messageUiRank.length ? undefined : 'disabled'}\r\n >\r\n CLEAR LOGS\r\n

    \r\n
      \r\n {messageUiRank.map((msg) =>
    • {msg}
    • )}\r\n

    \r\n Server errors: {failedUsersRankArr.length &&
      \r\n {failedUsersRankArr.map(\r\n ({ id, currentUser, err } = {}) =>
    • \r\n #{id}: {currentUser} - error: {err}\r\n
    • \r\n )}\r\n
    }\r\n
    \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n {\r\n (isSuperAdmin || isTrustedDelegate) &&
    \r\n

    STAKE TRANSFER


    \r\n
    \r\n
    \r\n \r\n

    \r\n setSavingsTransfer(e.target.value)}\r\n />
    \r\n TRANSFERS TO EXECUTE:   {savingTransfersList.length}

    \r\n \r\n START TRANSFERS\r\n      \r\n clearLogs('school')}\r\n className={messageUiSchool.length ? undefined : 'disabled'}\r\n >\r\n CLEAR LOGS\r\n

    \r\n
      \r\n {messageUiSchool.map((msg) =>
    • {msg}
    • )}\r\n

    \r\n Server errors: {failedUsersEndSchoolArr.length &&
      \r\n {failedUsersEndSchoolArr.map(\r\n ({ id, currentTransfer = {}, err } = {}) => {\r\n const { sender, receiver, amount, tokenInitial } = currentTransfer;\r\n return
    • \r\n #{id}: {amount} {tokenInitial} savings from {sender} to {receiver} - error: {err}\r\n
    • \r\n }\r\n )}\r\n
    }\r\n
    \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import { get } from 'lodash';\r\nimport React from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { isLocal } from '../../constants/envs';\r\nimport { ITEMS_BY_CATEGORY } from '../../constants/templateIds';\r\nimport './GameUiOverlay.scss';\r\n\r\nconst { BADGES/*, SCHOLARSHIPS*/ } = ITEMS_BY_CATEGORY;\r\n\r\nconst getBadgeIcons = ({ waxNfts }) => {\r\n try {\r\n const badgeValues = [...Object.values(BADGES)];\r\n const nftsValues = Object.values(waxNfts);\r\n const icons = badgeValues.map(({ ID, NAME, IMG }) => {\r\n const userHasThisNft = !!nftsValues.find(nft => nft.template_id === ID);\r\n isLocal && console.debug('User has NFT?', { NAME, userHasThisNft });\r\n if (userHasThisNft) {\r\n isLocal && console.debug('Found badge:', NAME);\r\n return ({ ID, IMG, NAME });\r\n }\r\n return null;\r\n }).filter(el => !!el);\r\n return icons;\r\n } catch (err) {\r\n console.error('Broken in getBadgeIcons:', err);\r\n return [];\r\n }\r\n};\r\n\r\n\r\nexport const GameUiOverlay = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const { isLogged } = UserState;\r\n\r\n const GameOverlayState = useSelector((store) => store.gameOverlay);\r\n const badges = GameOverlayState.badges;\r\n\r\n const InventoryState = useSelector((store) => store.inventory);\r\n\r\n const waxScholarshipData = get(InventoryState, 'scholarship', {});\r\n const { isScholar: isWaxScholar } = waxScholarshipData;\r\n\r\n const waxNfts = get(InventoryState, 'csAssets.csNfts', []);\r\n const hiveData = get(InventoryState, 'hive', {});\r\n const { nfts: hiveNfts = [], teacher: hiveTeacher } = hiveData;\r\n\r\n if (!isLogged || (!waxNfts.length && !hiveNfts.length)) return null;\r\n\r\n isLocal && console.debug('GameOverlay component props:',\r\n { badges },\r\n { waxNfts: waxNfts.length, hiveNfts: hiveNfts?.length, isScholar: !!(isWaxScholar || hiveTeacher) },\r\n );\r\n \r\n const icons = getBadgeIcons({ waxNfts });\r\n\r\n return (\r\n \r\n {/* ----------- PS. NOW HIDDEN. Would make more sense with game badges. ------- */}\r\n {/* ----------- REUSE THIS COMPONENT FOR MAINTENANCE FEES STUFF? ------- */}\r\n

    \r\n \r\n BADGES\r\n \r\n

    \r\n {icons.map(({ ID, IMG: hash, NAME }) => \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","\r\nexport const PVP_BANNER_SRC = 'https://files.peakd.com/file/peakd-hive/gaottantacinque/23tvD6QisoLdoChsyyfmXPoWGYGDc8jWLrB2pY4nzhDXjpL8qvc88C1GAxkBSyddWg8TT.png';\r\n\r\nexport const TOURNAMENTS_CONFIG_FILENAME = './tournament-times.json';\r\n","import { useEffect, useState } from 'react';\r\nimport { useSelector } from 'react-redux';\r\nimport { isLocal } from '../../../../constants/envs';\r\nimport { REMOTE_JSON_PATH } from '../../Prizes/config';\r\nimport { PVP_BANNER_SRC, TOURNAMENTS_CONFIG_FILENAME } from './config';\r\nimport { PrizesCurrency } from '../Shared/PrizesCurrency';\r\nimport './PvpPrizes.scss';\r\n\r\n\r\nexport const PvpPrizes = () => {\r\n const UserState = useSelector((store) => store.user);\r\n const chainLogin = localStorage.getItem('chainParam') || UserState.chainLogin;\r\n // const [chainData, setChainData] = useState({ chainLogin: chainLogin.toUpperCase() });\r\n \r\n const [tournamentsConfig, setTournamentsConfig] = useState({});\r\n\r\n useEffect(() => {\r\n // Fetch Prizes Config\r\n const fetchPvePrizes = async () => {\r\n const url = isLocal\r\n ? `./${TOURNAMENTS_CONFIG_FILENAME}` // uses package.json > proxy\r\n : `${REMOTE_JSON_PATH}/${TOURNAMENTS_CONFIG_FILENAME}`;\r\n try {\r\n const json = await fetch(url).then(res => res.json());\r\n setTournamentsConfig(json);\r\n } catch (err) { console.error(`Unable to fetch pve prizes: ${err}`); }\r\n };\r\n fetchPvePrizes();\r\n }, []);\r\n\r\n return (\r\n
    \r\n
    \r\n

    Automated PVP CRYPTO PRIZES, on top of our tokens

    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nconst REWARD_PER_WIN = 1;\r\n\r\nconst PvpInfo = ({ chainLogin = '', tournamentsConfig = {} }) => {\r\n const streamers = tournamentsConfig.tournaments?.map(\r\n ({ streamer, IS_TEST } = {}) => {\r\n const { displayName, streamUrl = '' } = streamer;\r\n return displayName && !IS_TEST && ({ name: displayName, url: streamUrl.replace('https://', '').replace('www.', '') })\r\n }).filter(el => !!el);\r\n return (\r\n
    \r\n

    REWARD for each 5-min Tournament match:\r\n
    {REWARD_PER_WIN}

    \r\n

    REQUIREMENTS to earn:\r\n
    - PvP Pass, unless Free-To-Earn\r\n
    - 4 mins match, at least 1.0 KDR, your team won

    \r\n

    STREAMERS:\r\n {\r\n streamers?.map(\r\n ({ name, url } = {}) =>

    \r\n - {name} @ {url}\r\n
    \r\n )\r\n }\r\n

    \r\n
    \r\n );\r\n};\r\n\r\nconst PvpBanner = () => {\r\n return (\r\n
    \r\n
    \r\n \"pvp-banner\"/\r\n
    \r\n );\r\n};\r\n\r\nconst HostedTourneys = ({ tournamentsConfig = {}, chainLogin = '' }) => {\r\n const allTourneys = tournamentsConfig.tournaments || [];\r\n const hostedTourneys = allTourneys.filter(tourney => !tourney.IS_TEST && tourney.headless);\r\n const { sponsor = {} } = hostedTourneys[0] || {};\r\n const { sponsorSymbol, projectName, sponsorDiscordInvite: discord } = sponsor;\r\n\r\n return (\r\n
    \r\n

    \r\n Weekly Hosted Tournaments\r\n

    SPONSOR REWARD: $\r\n {sponsorSymbol}\r\n \r\n
    from {projectName}\r\n
    \r\n

    \r\n {hostedTourneys.map(tourney => )}\r\n
    \r\n );\r\n};\r\n\r\nconst HeadlessTourneys = ({ tournamentsConfig = {}, chainLogin = '' }) => {\r\n const allTourneys = tournamentsConfig.tournaments || [];\r\n const headlessTourneys = allTourneys.filter(tourney => !tourney.IS_TEST && !tourney.headless);\r\n const { sponsor = {} } = headlessTourneys[0] || {};\r\n const { sponsorSymbol, projectName, sponsorDiscordInvite: discord } = sponsor;\r\n return (\r\n
    \r\n

    \r\n Weekly Headless Tournaments\r\n

    SPONSOR REWARD: $\r\n {sponsorSymbol}\r\n \r\n
    from {projectName}\r\n
    \r\n

    \r\n {headlessTourneys.map(tourney => )}\r\n
    \r\n );\r\n};\r\n\r\nconst TourneyDetails = ({ tourney = {}, chainLogin = '' }) => {\r\n const {\r\n day = '', start,\r\n headless = false,\r\n streamer = {},\r\n sponsor = {},\r\n rewardMultiplier: multi = 1,\r\n tournamentRegionOverride = 'USW',\r\n autoRewardsOnTourneyEnd, // false,\r\n raffleEnabled, // false,\r\n skipPvpPassCheck, // false\r\n anyoneCreateCustomRoom, // false,\r\n } = tourney;\r\n\r\n const [hh, mm, ss] = start.split(':');\r\n const PRIZES = headless\r\n ? { KDR: multi * 3, KILLS: multi * 2, WINS: multi * 1, RAFFLE: raffleEnabled ? (multi * 1) : 0 }\r\n : { KDR: (multi * 5), KILLS: (multi * 4), WINS: (multi * 3), RAFFLE: raffleEnabled ? (multi * 1) : 0 };\r\n\r\n return (\r\n
    \r\n {day.toUpperCase()}\r\n
    {hh}:{mm} UTC in {tournamentRegionOverride || 'USW'}\r\n
    Prizes in :\r\n {autoRewardsOnTourneyEnd\r\n ? <>\r\n
    \r\n Top KDR: {PRIZES.KDR}, Most Kills: {PRIZES.KILLS}\r\n , Most Wins: {PRIZES.WINS}. Raffled: {PRIZES.RAFFLE}\r\n \r\n : none\r\n }\r\n {skipPvpPassCheck &&
    FREE-TO-EARN
    }\r\n {multi > 1 &&
    PRIZES X{multi}
    }\r\n
    \r\n
    \r\n );\r\n};\r\n","import { LeaderboardPrizes } from '../Prizes/LeaderboardPrizes';\r\nimport { PvpPrizes } from './PVP/PvpPrizes';\r\nimport './StandaloneAds.scss';\r\n\r\n\r\nexport const StandaloneAds = () => {\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n};","import { Menu } from './components/Menu/Menu';\r\nimport { BrowserRouter, Redirect, Route, Switch } from 'react-router-dom';\r\nimport { Wallet } from './pages/Wallet/Wallet';\r\nimport { Play } from './pages/Play/Play';\r\nimport { LandingPage } from './pages/LandingPage/LandingPage';\r\nimport { Leaderboard } from './pages/Leaderboard/Leaderboard';\r\nimport { Inventory } from './pages/Inventory/Inventory';\r\nimport ProtectedRoute from './routing/ProtectedRoute';\r\nimport { AdminPane } from './pages/AdminPane/AdminPane';\r\nimport { GameUiOverlay } from './pages/3dGameUI/GameUiOverlay';\r\nimport { useEffect } from 'react';\r\nimport { StandaloneAds } from './pages/Leaderboard/StandaloneAds/StandaloneAds';\r\nimport { handleStandaloneUrlParams } from './routing/standaloneUrlParams';\r\nimport './App.scss';\r\n\r\n\r\nfunction App() {\r\n useEffect(() => {\r\n window.process = {\r\n ...window.process,\r\n };\r\n }, []);\r\n\r\n const { isAdsApp } = handleStandaloneUrlParams();\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default App;\r\n","export const handleStandaloneUrlParams = () => {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const isAdsApp = urlParams.has('ads');\r\n const chainParam = urlParams.get('chain');\r\n if (chainParam) localStorage.setItem('chainParam', chainParam);\r\n return ({ isAdsApp });\r\n};\r\n","import stringHash from 'string-hash';\r\nimport { isLocal } from '../constants/envs';\r\nimport { setPercentLoaded, setWrapperData } from '../reducers/PlayReducer';\r\nimport { storeAppDispatch } from './Store';\r\nimport { windowSetChecksum } from '../generalUtils/secure/checksums';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\n// BRIDGE TO VANILLA\r\nexport const setBridgeVanillaToRedux = () => {\r\n // -- percent loaded\r\n const handlePcLoad = ({ amount }) => {\r\n const payload = { isPercentLoaded: amount };\r\n storeAppDispatch(setPercentLoaded(payload));\r\n };\r\n window.setPercentLoaded = handlePcLoad;\r\n windowSetChecksum({ key: 'setPercentLoaded', value: handlePcLoad });\r\n // -- redux data\r\n const handleReduxData = ({ data, token }) => {\r\n const expectedBody = btoa(new Date().toISOString().substring(0, 17)).replace(/=/g, '');\r\n const expected = stringHash(expectedBody);\r\n if (!isLocal && (token !== expected)) {\r\n Swal.fire({text: \"deggalf SO dna PI ,tnuoccA [st]\".split('').reverse().join('')})\r\n return;\r\n }\r\n const payload = { wrapperData: data };\r\n isLocal && console.debug('wrapper data being dispatched:', { payload });\r\n storeAppDispatch(setWrapperData(payload));\r\n };\r\n window.setWrapperData = handleReduxData;\r\n windowSetChecksum({ key: 'setWrapperData', value: handleReduxData });\r\n};\r\n\r\n\r\n// TEST UTILITY\r\n//\r\n// SEE ALSO: src\\reducers\\PlayReducer.js\r\n//\r\n// const dataToDispatch = {\r\n// apiResponse: cloneDeep(data),\r\n// gameData: cloneDeep(gameData),\r\n// sessionData: {\r\n// ...cloneDeep(sessionData),\r\n// // UPDATED\r\n// playerLevel,\r\n// totalKills,\r\n// playerStake,\r\n// // DELETE attributes that may cause issues because updated right after redux dispatch\r\n// isLimitedResNewstarter: undefined,\r\n// hiveNfts: undefined,\r\n// inventory: undefined,\r\n// scholarCut: undefined,\r\n// },\r\n// unityLevel,\r\n// };\r\nwindow.testWrappedData = () => isLocal && window.setWrapperData({ data: {\r\n \"apiResponse\": {\r\n \"gameStats\": {\r\n \"level1\": {\r\n \"totalKills\": 18,\r\n \"bestTime\": {\r\n \"easy\": {\r\n \"result\": \"won\",\r\n \"matchId\": \"crypto5shots_1659816315756\",\r\n \"time\": 33164\r\n },\r\n \"medium\": {},\r\n \"hard\": {}\r\n }\r\n },\r\n \"level0\": {\r\n \"bestTime\": {\r\n \"easy\": {\r\n \"result\": \"won\",\r\n \"matchId\": \"crypto5shots_1656671180151\",\r\n \"time\": 63060\r\n },\r\n \"medium\": {\r\n \"result\": \"won\",\r\n \"matchId\": \"crypto5shots_1656828907059\",\r\n \"time\": 103145\r\n },\r\n \"hard\": {}\r\n },\r\n \"average_difficulty\": {},\r\n \"totalKills\": 393,\r\n \"average_time_mins\": {},\r\n \"resultsCount\": {}\r\n },\r\n \"level2\": {\r\n \"totalKills\": 12,\r\n \"bestTime\": {\r\n \"easy\": {\r\n \"result\": \"won\",\r\n \"matchId\": \"crypto5shots_1659515398812\",\r\n \"time\": 112208\r\n },\r\n \"medium\": {},\r\n \"hard\": {}\r\n }\r\n }\r\n },\r\n \"marsRewardsToClaim\": {\r\n \"validTimeout\": [],\r\n \"lost\": [\r\n { amount: 0.4000000001, timestamp: 1669988651153 },\r\n { amount: 0.4, timestamp: 1669989075927 },\r\n { amount: 0.2, timestamp: 1669989107395 },\r\n { amount: 0.155, timestamp: 1670182002024 },\r\n { amount: 0.1, timestamp: 1670182002024 },\r\n { amount: 0.2, timestamp: 1670182002024 },\r\n { amount: 0.3, timestamp: 1670182002024 },\r\n { amount: 0.4, timestamp: 1670182002024 },\r\n ],\r\n \"won\": [\r\n { amount: 5.4525, timestamp: 1670183178993 },\r\n ],\r\n \"unstaked\": []\r\n },\r\n \"boomRewardsToClaim\": {\r\n \"validTimeout\": [],\r\n \"lost\": [],\r\n \"won\": [\r\n { amount: 42.4, timestamp: 1669988151153 },\r\n ],\r\n \"unstaked\": []\r\n },\r\n \"playTimeSince0utc\": {\r\n \"gun\": 0,\r\n \"shotgun\": 0,\r\n \"playing\": 0,\r\n \"base\": 0,\r\n \"rifle\": 0\r\n },\r\n \"currentMatch\": {\r\n \"gameLevel\": null,\r\n \"startTime\": null,\r\n \"jwtToken\": \"xxx\",\r\n \"weaponsTime\": {\r\n \"gun\": 0,\r\n \"shotgun\": 0,\r\n \"base\": 0,\r\n \"rifle\": 0\r\n },\r\n \"monthDay\": \"2022-08-06\",\r\n \"elapsedTime\": 0\r\n },\r\n \"joinDate\": null,\r\n \"lastMatch\": {\r\n \"difficulty\": 0,\r\n \"finalScore\": {\r\n \"result\": \"won\",\r\n \"reward\": \"0.22949999999999998 BOOM\"\r\n },\r\n \"monthDay\": \"2022-08-06\",\r\n \"gameLevel\": 1,\r\n \"startTime\": 1659816282592,\r\n \"endTime\": 1659816315756,\r\n \"matchID\": \"crypto5shots_1659816315756\"\r\n },\r\n \"purchases\": {\r\n \"ammoInGame\": {},\r\n \"totalBoomSpent\": 0,\r\n \"inGameMarketplace\": {}\r\n },\r\n \"isBlacklisted\": false,\r\n \"nftsToClaim\": [],\r\n \"teacher\": \"crypto1shots\",\r\n \"transactionStats\": {\r\n \"totBoomClaimedForCurrentDay\": 0.7505999999999999,\r\n \"totNftMintsForCurrentDay\": 0,\r\n \"totMarsClaimedForCurrentDay\": 0,\r\n \"dateOfLastMint\": null,\r\n \"claimFlag\": false,\r\n \"mintFlag\": false,\r\n \"totBoomClaimed\": 38.00314,\r\n \"totMarsClaimed\": 0.55848,\r\n \"totNftMints\": 0,\r\n \"dateOfLastClaim\": \"2022-08-06\"\r\n },\r\n \"account\": \"crypto5shots\",\r\n \"savings\": {\r\n \"boom\": {\r\n \"amount\": 1098.8123999999998,\r\n \"lastWithdrawTimestamp\": 1660014874383\r\n },\r\n \"mars\": {\r\n \"amount\": 18.85,\r\n \"lastWithdrawTimestamp\": 1660014874383\r\n }\r\n },\r\n \"hiveUsername\": null\r\n },\r\n \"gameData\": {\r\n \"startTimeTs\": null,\r\n \"difficulty\": null,\r\n \"kills\": [],\r\n \"weaponsUse\": {\r\n \"newWeaponInUse\": \"BG\",\r\n \"lastSwapTs\": null,\r\n \"BG\": {\r\n \"totUseMs\": 0\r\n },\r\n \"LG\": {\r\n \"totUseMs\": 0\r\n },\r\n \"LR\": {\r\n \"totUseMs\": 0\r\n },\r\n \"LS\": {\r\n \"totUseMs\": 0\r\n },\r\n \"SN\": {\r\n \"totUseMs\": 0\r\n }\r\n },\r\n \"teknoTimer\": {\r\n \"ts\": null\r\n },\r\n \"rewards\": {\r\n \"levelKills\": 12,\r\n \"boostsTot\": 2,\r\n \"stakedNfts\": 2,\r\n \"weapons\": 0.8,\r\n \"tekno\": 0.5,\r\n \"difficultyAdjustment\": -2,\r\n \"taxApplied\": 2,\r\n \"finalEarnings\": 8.2,\r\n \"breakdownPerKill\": [{\r\n enemyName: 'wing', weaponUsed: 'bg', percentageBoost: 0.1,\r\n enemyReward: 0.1, immortalReward: 0.1, killTotReward: 0.3,\r\n }, {\r\n enemyName: 'wing', weaponUsed: 'bg', percentageBoost: 0.1,\r\n enemyReward: 0.1, immortalReward: 0.1, killTotReward: 0.3,\r\n }],\r\n }\r\n },\r\n \"sessionData\": {\r\n \"account\": \"crypto5shots\",\r\n \"token\": \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3YXhBZGRyZXNzIjoiY3J5cHRvNXNob3RzIiwiaWF0IjoxNjU5OTk0NTcwLCJleHAiOjE2NjAwMTI1NzB9.qr2sOtlkQnpKN_bzku0S36qT5CI7ZAmg3kBcCxHtygQ\",\r\n // \"inventory\": undefined,\r\n // \"hiveNfts\": undefined,\r\n \"maxTime\": {\r\n \"weapons\": null,\r\n \"characters\": null\r\n },\r\n \"playerLevel\": 1,\r\n \"totalKills\": 423,\r\n \"playerStake\": 50.467,\r\n \"start3dPack\": \"XL\",\r\n \"canPlay2ndLevel\": false,\r\n \"matchCount\": 0,\r\n \"totalWins\": {\r\n \"level0\": 0,\r\n \"level1\": 0,\r\n \"level2\": 0,\r\n \"level3\": 0,\r\n \"level4\": 0\r\n },\r\n \"unlockedFastKills\": false,\r\n \"unlockedConsecutiveWins\": false,\r\n \"lastMatchInfo\": {\r\n resMatch: 'won',\r\n score: 2.31,\r\n killBalance: 12,\r\n remainingTime: '00:01:04',\r\n difficulty: 0,\r\n },\r\n },\r\n \"unityLevel\": 0\r\n }\r\n});\r\n","import { isLocal, isTestnet } from '../../../constants/envs';\r\nimport { nap } from '../../../generalUtils/utils';\r\n\r\n\r\n// SECURITY: allow only in mobile\r\nexport const isSmartphoneOrTablet = isTestnet || (window.innerWidth < 800);\r\n\r\n// canvas getter cached and mocked\r\nlet canvas;\r\nconst getCanvas = () => {\r\n if (canvas) return canvas;\r\n canvas = document.getElementById('unity-canvas');\r\n if (!canvas && isLocal) return ({ dispatchEvent: (ee) => console.log('Fake dispatch of:', ee) }); // mock\r\n return canvas;\r\n}\r\n\r\n\r\n// ## MOVE AROUND (WASD)\r\nconst moveEventDetails = ({ letter }) => {\r\n const eventDetails = {\r\n bubbles: true,\r\n shiftKey: false,\r\n ctrlKey: false,\r\n metaKey: false,\r\n };\r\n switch (letter) {\r\n case 'W': {\r\n eventDetails.key = 'w';\r\n eventDetails.keyCode = eventDetails.which = 87;\r\n eventDetails.code = 'KeyW';\r\n break;\r\n }\r\n case 'A': {\r\n eventDetails.key = 'a';\r\n eventDetails.keyCode = eventDetails.which = 65;\r\n eventDetails.code = 'KeyA';\r\n break;\r\n }\r\n case 'S': {\r\n eventDetails.key = 's';\r\n eventDetails.keyCode = eventDetails.which = 83;\r\n eventDetails.code = 'KeyS';\r\n break;\r\n }\r\n case 'D': {\r\n eventDetails.key = 'd';\r\n eventDetails.keyCode = eventDetails.which = 68;\r\n eventDetails.code = 'KeyD';\r\n break;\r\n }\r\n default: { throw new Error(`Unexpected letter ${letter}`); }\r\n }\r\n return eventDetails;\r\n};\r\n\r\nexport const startPressingKey = ({ letter }) => {\r\n if (!isSmartphoneOrTablet) return;\r\n getCanvas().dispatchEvent(new window.KeyboardEvent('keydown', moveEventDetails({ letter })));\r\n};\r\n\r\nexport const stopPressingKey = ({ letter }) => {\r\n if (!isSmartphoneOrTablet) return;\r\n getCanvas().dispatchEvent(new window.KeyboardEvent('keyup', moveEventDetails({ letter })));\r\n};\r\n\r\n\r\n// ## SHOOT\r\nconst shootStart = () => {\r\n if (!isSmartphoneOrTablet) return;\r\n getCanvas().dispatchEvent(\r\n new MouseEvent(\r\n 'mousedown',\r\n {\r\n clientX: window.innerWidth / 2,\r\n clientY: window.innerHeight / 2,\r\n bubbles: true,\r\n },\r\n ),\r\n );\r\n};\r\nconst shootEnd = () => {\r\n if (!isSmartphoneOrTablet) return;\r\n getCanvas().dispatchEvent(\r\n new MouseEvent(\r\n 'mouseup',\r\n {\r\n clientX: window.innerWidth / 2,\r\n clientY: window.innerHeight / 2,\r\n bubbles: true,\r\n },\r\n ),\r\n );\r\n};\r\n\r\n\r\n// ## CHANGE WAPON (Q and E)\r\nconst changeWeapon = async () => {\r\n if (!isSmartphoneOrTablet) return;\r\n const weaponConfig = {\r\n key: 'e',\r\n bubbles: true,\r\n keyCode: 69,\r\n which: 69,\r\n code: 'KeyE',\r\n shiftKey: false,\r\n ctrlKey: false,\r\n metaKey: false,\r\n };\r\n getCanvas().dispatchEvent(new window.KeyboardEvent('keydown', weaponConfig));\r\n await nap(200);\r\n getCanvas().dispatchEvent(new window.KeyboardEvent('keyup', weaponConfig));\r\n};\r\n\r\n// ## JUMP\r\nconst jump = async () => {\r\n if (!isSmartphoneOrTablet) return;\r\n const jumpConfig = {\r\n key: ' ',\r\n bubbles: true,\r\n keyCode: 32,\r\n which: 32,\r\n code: 'Space',\r\n shiftKey: false,\r\n ctrlKey: false,\r\n metaKey: false,\r\n };\r\n getCanvas().dispatchEvent(new window.KeyboardEvent('keydown', jumpConfig));\r\n await nap(200);\r\n getCanvas().dispatchEvent(new window.KeyboardEvent('keyup', jumpConfig));\r\n};\r\n\r\n\r\n// ## MOVE CAMERA\r\n// ??\r\n","import { JoyStick } from './controllersLib';\r\nimport { JOY_CONFIG, JOYSTICK_CHECK_RATE } from './config';\r\nimport { isSmartphoneOrTablet, startPressingKey, stopPressingKey } from './messages';\r\nimport { makeNotWritable } from '../../../generalUtils/security/utils';\r\nimport { isLocal } from '../../../constants/envs';\r\nimport { windowSetChecksum } from '../../../generalUtils/secure/checksums';\r\n\r\nwindow.joysticks = {};\r\n\r\nlet joySx;\r\nlet joyDx;\r\n\r\nlet joysticksTs;\r\nlet mobMatchCount = 0;\r\nlet element;\r\n\r\n\r\n// ## STOP\r\nexport const stopJoysticks = () => {\r\n if (!isSmartphoneOrTablet) return;\r\n clearInterval(joysticksTs);\r\n element.style.display = 'none';\r\n}\r\nwindow.joysticks.stop = stopJoysticks;\r\n\r\n\r\n// ## STATUS\r\nconst readJoyStatus = () => {\r\n // left controller - WASD\r\n const leftDir = joySx.GetDir();\r\n processWasdDir(leftDir);\r\n // console.log(mobMatchCount, '[O][.] JOY SX:', leftDir);\r\n\r\n // right controller\r\n const rightDir = joyDx.GetDir();\r\n // console.log(mobMatchCount, '[.][O] JOY dX:', rightDir);\r\n};\r\n\r\n\r\n// ## START / RESUME\r\nexport const startJoysticks = () => {\r\n if (!isSmartphoneOrTablet) return;\r\n mobMatchCount++;\r\n joysticksTs = setInterval(readJoyStatus, JOYSTICK_CHECK_RATE);\r\n};\r\nwindow.joysticks.start = startJoysticks;\r\n\r\n\r\n// ## INIT\r\nexport const initMobileControllers = () => {\r\n element = document.getElementById('joysticks');\r\n element.style.display = 'block';\r\n joySx = new JoyStick('joyDivSx', JOY_CONFIG);\r\n joyDx = new JoyStick('joyDivDx', JOY_CONFIG);\r\n startJoysticks();\r\n};\r\n\r\n\r\n// ## RESTART TEST @@\r\n// setTimeout(() => {\r\n// console.log('RESTARTING JOYSTICKS ----------');\r\n// stopJoysticks();\r\n// startJoysticks();\r\n// }, 5 * 1000);\r\n\r\n// (secured)\r\nmakeNotWritable({ parent: window, target: 'joysticks' });\r\nwindowSetChecksum({ key: 'joysticks', value: window.joysticks });\r\n\r\n// ------------------------------\r\n\r\n\r\n// ## PROCESSING\r\n\r\nlet lastPress = []; // eg. ['W', 'D']\r\nlet lastDirection = 'C';\r\n\r\nconst getLetters = ({ direction = '' }) => {\r\n const directions = direction.split('');\r\n return directions.map((letter) => {\r\n switch (letter) {\r\n case 'N': return 'W'; case 'W': return 'A'; case 'S': return 'S'; case 'E': return 'D';\r\n default: { throw new Error(`Unexpected letter: ${letter}`); }\r\n }\r\n });\r\n};\r\n\r\nconst cancelUnusedKeyPresses = ({ letterArr = [] } = {}) => {\r\n lastPress.forEach((oldLetter) => {\r\n if (!letterArr.includes(oldLetter)) {\r\n stopPressingKey({ letter: oldLetter });\r\n lastPress = lastPress.filter(existingLetter => existingLetter !== oldLetter);\r\n isLocal && console.log(`Stopped pressing ${oldLetter}. Last presses without old ones:`, lastPress);\r\n }\r\n });\r\n};\r\n\r\nconst dispatchKeyPresses = ({ letterArr }) => {\r\n letterArr.forEach((letter) => {\r\n if (lastPress.includes(letter)) return; // already pressed\r\n startPressingKey({ letter });\r\n lastPress.push(letter);\r\n isLocal && console.log(`Started pressing ${letter}. Updated last presses:`, lastPress);\r\n });\r\n};\r\n\r\nconst processWasdDir = (direction) => {\r\n // Logging\r\n if (lastDirection !== direction && isLocal) console.log('New direction detected:', direction);\r\n lastDirection = direction;\r\n // Events\r\n switch (direction) {\r\n case 'N': case 'NE': case 'E': case 'SE': case 'S': case 'SW': case 'W': case 'NW': {\r\n const letterArr = getLetters({ direction });\r\n cancelUnusedKeyPresses({ letterArr });\r\n dispatchKeyPresses({ letterArr });\r\n break;\r\n }\r\n case 'C': {\r\n cancelUnusedKeyPresses();\r\n lastPress = [];\r\n break;\r\n }\r\n default: console.error('Unexpected direction', direction);\r\n }\r\n};\r\n","/* eslint-disable */\r\n/*\r\n * Name : joy.js\r\n * @author : Roberto D'Amico (Bobboteck)\r\n * Last modified : 09.06.2020\r\n * Revision : 1.1.6\r\n *\r\n * Modification History:\r\n * Date Version Modified By Description\r\n * 2021-12-21 2.0.0 Roberto D'Amico New version of the project that integrates the callback functions, while \r\n * maintaining compatibility with previous versions. Fixed Issue #27 too, \r\n * thanks to @artisticfox8 for the suggestion.\r\n * 2020-06-09 1.1.6 Roberto D'Amico Fixed Issue #10 and #11\r\n * 2020-04-20 1.1.5 Roberto D'Amico Correct: Two sticks in a row, thanks to @liamw9534 for the suggestion\r\n * 2020-04-03 Roberto D'Amico Correct: InternalRadius when change the size of canvas, thanks to \r\n * @vanslipon for the suggestion\r\n * 2020-01-07 1.1.4 Roberto D'Amico Close #6 by implementing a new parameter to set the functionality of \r\n * auto-return to 0 position\r\n * 2019-11-18 1.1.3 Roberto D'Amico Close #5 correct indication of East direction\r\n * 2019-11-12 1.1.2 Roberto D'Amico Removed Fix #4 incorrectly introduced and restored operation with touch \r\n * devices\r\n * 2019-11-12 1.1.1 Roberto D'Amico Fixed Issue #4 - Now JoyStick work in any position in the page, not only \r\n * at 0,0\r\n * \r\n * The MIT License (MIT)\r\n *\r\n * This file is part of the JoyStick Project (https://github.com/bobboteck/JoyStick).\r\n *\tCopyright (c) 2015 Roberto D'Amico (Bobboteck).\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n * \r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n */\r\n\r\n export const StickStatus =\r\n {\r\n xPosition: 0,\r\n yPosition: 0,\r\n x: 0,\r\n y: 0,\r\n cardinalDirection: \"C\"\r\n };\r\n \r\n /**\r\n * @desc Principal object that draw a joystick, you only need to initialize the object and suggest the HTML container\r\n * @costructor\r\n * @param container {String} - HTML object that contains the Joystick\r\n * @param parameters (optional) - object with following keys:\r\n * title {String} (optional) - The ID of canvas (Default value is 'joystick')\r\n * width {Int} (optional) - The width of canvas, if not specified is setted at width of container object (Default value is the width of container object)\r\n * height {Int} (optional) - The height of canvas, if not specified is setted at height of container object (Default value is the height of container object)\r\n * internalFillColor {String} (optional) - Internal color of Stick (Default value is '#00AA00')\r\n * internalLineWidth {Int} (optional) - Border width of Stick (Default value is 2)\r\n * internalStrokeColor {String}(optional) - Border color of Stick (Default value is '#003300')\r\n * externalLineWidth {Int} (optional) - External reference circonference width (Default value is 2)\r\n * externalStrokeColor {String} (optional) - External reference circonference color (Default value is '#008000')\r\n * autoReturnToCenter {Bool} (optional) - Sets the behavior of the stick, whether or not, it should return to zero position when released (Default value is True and return to zero)\r\n * @param callback {StickStatus} - \r\n */\r\n export const JoyStick = (function(container, parameters, callback)\r\n {\r\n parameters = parameters || {};\r\n var title = (typeof parameters.title === \"undefined\" ? \"joystick\" : parameters.title),\r\n width = (typeof parameters.width === \"undefined\" ? 0 : parameters.width),\r\n height = (typeof parameters.height === \"undefined\" ? 0 : parameters.height),\r\n internalFillColor = (typeof parameters.internalFillColor === \"undefined\" ? \"#00AA00\" : parameters.internalFillColor),\r\n internalLineWidth = (typeof parameters.internalLineWidth === \"undefined\" ? 2 : parameters.internalLineWidth),\r\n internalStrokeColor = (typeof parameters.internalStrokeColor === \"undefined\" ? \"#003300\" : parameters.internalStrokeColor),\r\n externalLineWidth = (typeof parameters.externalLineWidth === \"undefined\" ? 2 : parameters.externalLineWidth),\r\n externalStrokeColor = (typeof parameters.externalStrokeColor === \"undefined\" ? \"#008000\" : parameters.externalStrokeColor),\r\n autoReturnToCenter = (typeof parameters.autoReturnToCenter === \"undefined\" ? true : parameters.autoReturnToCenter);\r\n \r\n callback = callback || function(StickStatus) {};\r\n \r\n // Create Canvas element and add it in the Container object\r\n var objContainer = document.getElementById(container);\r\n \r\n // Fixing Unable to preventDefault inside passive event listener due to target being treated as passive in Chrome [Thanks to https://github.com/artisticfox8 for this suggestion]\r\n objContainer.style.touchAction = \"none\";\r\n \r\n var canvas = document.createElement(\"canvas\");\r\n canvas.id = title;\r\n if(width === 0) { width = objContainer.clientWidth; }\r\n if(height === 0) { height = objContainer.clientHeight; }\r\n canvas.width = width;\r\n canvas.height = height;\r\n objContainer.appendChild(canvas);\r\n var context=canvas.getContext(\"2d\");\r\n \r\n var pressed = 0; // Bool - 1=Yes - 0=No\r\n var circumference = 2 * Math.PI;\r\n var internalRadius = (canvas.width-((canvas.width/2)+10))/2;\r\n var maxMoveStick = internalRadius + 5;\r\n var externalRadius = internalRadius + 30;\r\n var centerX = canvas.width / 2;\r\n var centerY = canvas.height / 2;\r\n var directionHorizontalLimitPos = canvas.width / 10;\r\n var directionHorizontalLimitNeg = directionHorizontalLimitPos * -1;\r\n var directionVerticalLimitPos = canvas.height / 10;\r\n var directionVerticalLimitNeg = directionVerticalLimitPos * -1;\r\n // Used to save current position of stick\r\n var movedX=centerX;\r\n var movedY=centerY;\r\n \r\n // Check if the device support the touch or not\r\n if(\"ontouchstart\" in document.documentElement)\r\n {\r\n canvas.addEventListener(\"touchstart\", onTouchStart, false);\r\n document.addEventListener(\"touchmove\", onTouchMove, false);\r\n document.addEventListener(\"touchend\", onTouchEnd, false);\r\n }\r\n else\r\n {\r\n canvas.addEventListener(\"mousedown\", onMouseDown, false);\r\n document.addEventListener(\"mousemove\", onMouseMove, false);\r\n document.addEventListener(\"mouseup\", onMouseUp, false);\r\n }\r\n // Draw the object\r\n drawExternal();\r\n drawInternal();\r\n \r\n /******************************************************\r\n * Private methods\r\n *****************************************************/\r\n \r\n /**\r\n * @desc Draw the external circle used as reference position\r\n */\r\n function drawExternal()\r\n {\r\n context.beginPath();\r\n context.arc(centerX, centerY, externalRadius, 0, circumference, false);\r\n context.lineWidth = externalLineWidth;\r\n context.strokeStyle = externalStrokeColor;\r\n context.stroke();\r\n }\r\n \r\n /**\r\n * @desc Draw the internal stick in the current position the user have moved it\r\n */\r\n function drawInternal()\r\n {\r\n context.beginPath();\r\n if(movedX canvas.width) { movedX = canvas.width-(maxMoveStick); }\r\n if(movedY canvas.height) { movedY = canvas.height-(maxMoveStick); }\r\n context.arc(movedX, movedY, internalRadius, 0, circumference, false);\r\n // create radial gradient\r\n var grd = context.createRadialGradient(centerX, centerY, 5, centerX, centerY, 200);\r\n // Light color\r\n grd.addColorStop(0, internalFillColor);\r\n // Dark color\r\n grd.addColorStop(1, internalStrokeColor);\r\n context.fillStyle = grd;\r\n context.fill();\r\n context.lineWidth = internalLineWidth;\r\n context.strokeStyle = internalStrokeColor;\r\n context.stroke();\r\n }\r\n \r\n /**\r\n * @desc Events for manage touch\r\n */\r\n function onTouchStart(event) \r\n {\r\n pressed = 1;\r\n }\r\n \r\n function onTouchMove(event)\r\n {\r\n if(pressed === 1 && event.targetTouches[0].target === canvas)\r\n {\r\n movedX = event.targetTouches[0].pageX;\r\n movedY = event.targetTouches[0].pageY;\r\n // Manage offset\r\n if(canvas.offsetParent.tagName.toUpperCase() === \"BODY\")\r\n {\r\n movedX -= canvas.offsetLeft;\r\n movedY -= canvas.offsetTop;\r\n }\r\n else\r\n {\r\n movedX -= canvas.offsetParent.offsetLeft;\r\n movedY -= canvas.offsetParent.offsetTop;\r\n }\r\n // Delete canvas\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n // Redraw object\r\n drawExternal();\r\n drawInternal();\r\n \r\n // Set attribute of callback\r\n StickStatus.xPosition = movedX;\r\n StickStatus.yPosition = movedY;\r\n StickStatus.x = (100*((movedX - centerX)/maxMoveStick)).toFixed();\r\n StickStatus.y = ((100*((movedY - centerY)/maxMoveStick))*-1).toFixed();\r\n StickStatus.cardinalDirection = getCardinalDirection();\r\n callback(StickStatus);\r\n }\r\n } \r\n \r\n function onTouchEnd(event) \r\n {\r\n pressed = 0;\r\n // If required reset position store variable\r\n if(autoReturnToCenter)\r\n {\r\n movedX = centerX;\r\n movedY = centerY;\r\n }\r\n // Delete canvas\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n // Redraw object\r\n drawExternal();\r\n drawInternal();\r\n \r\n // Set attribute of callback\r\n StickStatus.xPosition = movedX;\r\n StickStatus.yPosition = movedY;\r\n StickStatus.x = (100*((movedX - centerX)/maxMoveStick)).toFixed();\r\n StickStatus.y = ((100*((movedY - centerY)/maxMoveStick))*-1).toFixed();\r\n StickStatus.cardinalDirection = getCardinalDirection();\r\n callback(StickStatus);\r\n }\r\n \r\n /**\r\n * @desc Events for manage mouse\r\n */\r\n function onMouseDown(event) \r\n {\r\n pressed = 1;\r\n }\r\n \r\n /* To simplify this code there was a new experimental feature here: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/offsetX , but it present only in Mouse case not metod presents in Touch case :-( */\r\n function onMouseMove(event) \r\n {\r\n if(pressed === 1)\r\n {\r\n movedX = event.pageX;\r\n movedY = event.pageY;\r\n // Manage offset\r\n if(canvas.offsetParent.tagName.toUpperCase() === \"BODY\")\r\n {\r\n movedX -= canvas.offsetLeft;\r\n movedY -= canvas.offsetTop;\r\n }\r\n else\r\n {\r\n movedX -= canvas.offsetParent.offsetLeft;\r\n movedY -= canvas.offsetParent.offsetTop;\r\n }\r\n // Delete canvas\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n // Redraw object\r\n drawExternal();\r\n drawInternal();\r\n \r\n // Set attribute of callback\r\n StickStatus.xPosition = movedX;\r\n StickStatus.yPosition = movedY;\r\n StickStatus.x = (100*((movedX - centerX)/maxMoveStick)).toFixed();\r\n StickStatus.y = ((100*((movedY - centerY)/maxMoveStick))*-1).toFixed();\r\n StickStatus.cardinalDirection = getCardinalDirection();\r\n callback(StickStatus);\r\n }\r\n }\r\n \r\n function onMouseUp(event) \r\n {\r\n pressed = 0;\r\n // If required reset position store variable\r\n if(autoReturnToCenter)\r\n {\r\n movedX = centerX;\r\n movedY = centerY;\r\n }\r\n // Delete canvas\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n // Redraw object\r\n drawExternal();\r\n drawInternal();\r\n \r\n // Set attribute of callback\r\n StickStatus.xPosition = movedX;\r\n StickStatus.yPosition = movedY;\r\n StickStatus.x = (100*((movedX - centerX)/maxMoveStick)).toFixed();\r\n StickStatus.y = ((100*((movedY - centerY)/maxMoveStick))*-1).toFixed();\r\n StickStatus.cardinalDirection = getCardinalDirection();\r\n callback(StickStatus);\r\n }\r\n \r\n function getCardinalDirection()\r\n {\r\n let result = \"\";\r\n let orizontal = movedX - centerX;\r\n let vertical = movedY - centerY;\r\n \r\n if(vertical >= directionVerticalLimitNeg && vertical <= directionVerticalLimitPos)\r\n {\r\n result = \"C\";\r\n }\r\n if(vertical < directionVerticalLimitNeg)\r\n {\r\n result = \"N\";\r\n }\r\n if(vertical > directionVerticalLimitPos)\r\n {\r\n result = \"S\";\r\n }\r\n \r\n if(orizontal < directionHorizontalLimitNeg)\r\n {\r\n if(result === \"C\")\r\n { \r\n result = \"W\";\r\n }\r\n else\r\n {\r\n result += \"W\";\r\n }\r\n }\r\n if(orizontal > directionHorizontalLimitPos)\r\n {\r\n if(result === \"C\")\r\n { \r\n result = \"E\";\r\n }\r\n else\r\n {\r\n result += \"E\";\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n \r\n /******************************************************\r\n * Public methods\r\n *****************************************************/\r\n \r\n /**\r\n * @desc The width of canvas\r\n * @return Number of pixel width \r\n */\r\n this.GetWidth = function () \r\n {\r\n return canvas.width;\r\n };\r\n \r\n /**\r\n * @desc The height of canvas\r\n * @return Number of pixel height\r\n */\r\n this.GetHeight = function () \r\n {\r\n return canvas.height;\r\n };\r\n \r\n /**\r\n * @desc The X position of the cursor relative to the canvas that contains it and to its dimensions\r\n * @return Number that indicate relative position\r\n */\r\n this.GetPosX = function ()\r\n {\r\n return movedX;\r\n };\r\n \r\n /**\r\n * @desc The Y position of the cursor relative to the canvas that contains it and to its dimensions\r\n * @return Number that indicate relative position\r\n */\r\n this.GetPosY = function ()\r\n {\r\n return movedY;\r\n };\r\n \r\n /**\r\n * @desc Normalizzed value of X move of stick\r\n * @return Integer from -100 to +100\r\n */\r\n this.GetX = function ()\r\n {\r\n return (100*((movedX - centerX)/maxMoveStick)).toFixed();\r\n };\r\n \r\n /**\r\n * @desc Normalizzed value of Y move of stick\r\n * @return Integer from -100 to +100\r\n */\r\n this.GetY = function ()\r\n {\r\n return ((100*((movedY - centerY)/maxMoveStick))*-1).toFixed();\r\n };\r\n \r\n /**\r\n * @desc Get the direction of the cursor as a string that indicates the cardinal points where this is oriented\r\n * @return String of cardinal point N, NE, E, SE, S, SW, W, NW and C when it is placed in the center\r\n */\r\n this.GetDir = function()\r\n {\r\n return getCardinalDirection();\r\n };\r\n });\r\n ","\r\n// ## FOR TESTS and maybe also PLAYER PREFERENCES\r\n// localStorage.setItem('joyOverrides', JSON.stringify({\r\n// joystickCheckRate: 400,\r\n// });\r\nconst joyOverrides = () => {\r\n const joyOverridesFromLs = localStorage.getItem('joyOverrides') || '{}';\r\n let resultJson = {};\r\n try {\r\n resultJson = JSON.parse(joyOverridesFromLs);\r\n } catch (err) {\r\n console.error('Unable to parse joy overrides:', err);\r\n }\r\n return resultJson;\r\n};\r\n\r\nexport const JOY_CONFIG = {\r\n internalFillColor: 'rgba(100,100,20,0.3)',\r\n internalStrokeColor: 'blue',\r\n externalStrokeColor: 'blue',\r\n externalLineWidth: 5,\r\n};\r\nexport const JOYSTICK_CHECK_RATE = joyOverrides().joystickCheckRate || 300;\r\n","\r\n// Eg. makeNotWritable({ parent: window, target: 'someObj' });\r\nexport const makeNotWritable = ({ parent = {}, target = '' }) => {\r\n try {\r\n const pristine = parent[target];\r\n if (!parent || !target || !pristine) {\r\n const stack = new Error().stack;\r\n console.error('Unable to make unwritable. Argument missing!', stack);\r\n return;\r\n }\r\n try {\r\n Object.freeze(pristine);\r\n Object.defineProperty(parent, target, { value: pristine, writable: false });\r\n } catch (_) {}\r\n } catch (err) {\r\n const stack = new Error().stack;\r\n console.error('Caught error in makeNotWritable', stack);\r\n }\r\n};\r\n","\r\nexport const OXY_RECHARGE_SECONDS = 60;\r\nexport const LIFE_RECHARGE_PC = 50;\r\n\r\nexport const RESOURCES_COST = {\r\n AMMO: {\r\n MARS: 6,\r\n BOOM: 3, // L2\r\n },\r\n OXY: {\r\n MARS: 4,\r\n BOOM: 2, // L2\r\n },\r\n LIFE: {\r\n MARS: 4,\r\n BOOM: 2, // L2\r\n },\r\n};\r\n","import { get } from 'lodash';\r\nimport { WAX_ACCOUNTS } from '../../config/accounts';\r\nimport { TOKEN_ACCOUNT } from '../../config/contractNames';\r\nimport { CURRENCIES } from '../../constants/currencies';\r\nimport { isLocal, isTestnet } from '../../constants/envs';\r\nimport { flyingSessionLogin, UserService, WaxFlyingSession } from '../UserService';\r\nimport { RESOURCES_COST, OXY_RECHARGE_SECONDS, LIFE_RECHARGE_PC } from './RESOURCES_COST';\r\nimport { windowSetChecksum } from '../../generalUtils/secure/checksums';\r\nimport Swal from 'sweetalert2';\r\n\r\n\r\nconst startPurchase = ({ cost, tokenName, reason }) => new Promise(async (resolve) => {\r\n if (!cost || !tokenName || !reason) {\r\n throw new Error(`Unexpected input for in-game resource purchase: ${cost} ${tokenName} ${reason}`);\r\n }\r\n const quantity = isTestnet ? `${(0.1).toFixed(4)} BOOM` : `${cost.toFixed(4)} ${tokenName}`;\r\n const targetWallet = WAX_ACCOUNTS.IG_RESOURCES_PAYMENTS;\r\n isLocal && console.debug('ig resouce payment:', { cost, tokenName, reason });\r\n\r\n let waxSession = UserService;\r\n const isHiveUser = localStorage.getItem('chainLogin') !== 'wax';\r\n if (window.isFreeTrial || (isHiveUser && !UserService.authName)) {\r\n isLocal && console.debug('creating side session for wax tokens payment for hive user');\r\n waxSession = WaxFlyingSession;\r\n const isLoggedIn = await flyingSessionLogin(waxSession);\r\n if (!isLoggedIn) return resolve({ err: 'still not logged in for wax tokens payment' });\r\n }\r\n isLocal && console.debug('Expected user to sign tx:', waxSession.authName);\r\n waxSession.session.signTransaction(\r\n {\r\n actions: [{\r\n account: TOKEN_ACCOUNT,\r\n name: 'transfer',\r\n authorization: [{\r\n actor: waxSession.authName,\r\n permission: 'active'\r\n }],\r\n data: {\r\n from: waxSession.authName,\r\n to: targetWallet,\r\n quantity,\r\n memo: `In-game resource purchase: ${reason}`,\r\n }\r\n }]\r\n },\r\n { blocksBehind: 3, expireSeconds: 30 }\r\n )\r\n .then(async (response = { status: '' }) => {\r\n isLocal && console.log('Transaction outcome:', response.status);\r\n if (response.status !== 'executed') {\r\n console.error('in-game resource payment failed:', JSON.stringify({ response }));\r\n Swal.fire({text: `Payment failed.\\n\\n${JSON.stringify(response.status)}`});\r\n resolve({ err: (response.status || 'payment-ko') });\r\n return;\r\n }\r\n isLocal && console.debug('Tx success.', { response });\r\n resolve({});\r\n })\r\n .catch((err) => {\r\n console.error('in-game resource payment caught error:', JSON.stringify({ err }));\r\n const errMsg = get(err, 'cause.message');\r\n const errMsg2 = get(err, 'cause.json.error.details[0].message');\r\n const errMsg3 = get(err, 'cause.json.message');\r\n Swal.fire({text: `Payment failed.\\n\\n${errMsg || errMsg2 || errMsg3 || JSON.stringify(err)}`})\r\n resolve({ err });\r\n });\r\n});\r\n\r\n\r\n// const { err } = await window.spendTokens({ tokenInitial, reason }); // confirm price + exec\r\nconst spendTokens = async ({ tokenInitial, reason }) => {\r\n let isOk = false;\r\n const tokenName = CURRENCIES[tokenInitial];\r\n const cost = RESOURCES_COST[reason][tokenName];\r\n isLocal && console.debug('Spending:', { cost, tokenName, reason });\r\n switch (reason) {\r\n case 'AMMO': {\r\n isOk = window.confirm(`Spend ${cost} ${tokenName} to 1/3 recharge ALL your weapons?`);\r\n break;\r\n }\r\n case 'OXY': {\r\n isOk = window.confirm(`Spend ${cost} ${tokenName} to add ${OXY_RECHARGE_SECONDS} of Oxygen to your tank?`);\r\n break;\r\n }\r\n case 'LIFE': {\r\n isOk = window.confirm(`Spend ${cost} ${tokenName} to recharge ${LIFE_RECHARGE_PC}% of your total health?`);\r\n break;\r\n }\r\n default: {\r\n Swal.fire({text: `Unexpected purchase reason ${reason} for token $${tokenInitial}`})\r\n return ({ err: 'unexpected-purchase' });\r\n }\r\n }\r\n if (!isOk) return ({ err: 'user-canceled' });\r\n isLocal && console.debug('Starting purchase..');\r\n const { err } = await startPurchase({ cost, tokenName, reason });\r\n isLocal && console.debug('Payment done.', { err });\r\n return ({ err, OXY_RECHARGE_SECONDS, LIFE_RECHARGE_PC });\r\n};\r\nwindow.spendTokens = spendTokens;\r\nwindowSetChecksum({ key: 'spendTokens', value: spendTokens });\r\n\r\n// FREEZE\r\nconst originaValue = window.spendTokens;\r\ntry {\r\n Object.defineProperty(window, 'spendTokens',\r\n { value: originaValue, writable: false },\r\n );\r\n} catch (_) { }\r\n\r\n// INIT\r\nexport const initPaymentsBridge = () => console.log('Payments bridge ready.');\r\n","import { setBridgeVanillaToRedux } from '../../GlobalState/extReduxBridge';\r\nimport { isSmartphoneOrTablet } from '../../pages/Play/joysticks/messages';\r\nimport { initMobileControllers } from '../../pages/Play/joysticks/joysticks';\r\nimport { toast } from 'react-toastify';\r\nimport { isLocal, isMainnet, isTestnet } from '../../constants/envs';\r\nimport { initPaymentsBridge } from '../../services/microPayments/buyResources';\r\nimport { REACT_UI_VERSION } from '../../config/version.json';\r\n\r\n\r\n// ---- BROWSER ----\r\n\r\nexport const browserCustomize = () => {\r\n // ## VERSIONING\r\n setupVersion();\r\n\r\n // ## REDUX BRIDGE between the 2 JS layers\r\n isLocal && console.debug('Setting up Redux bridge..');\r\n setBridgeVanillaToRedux();\r\n\r\n // ## MOBILE CONTROLLERS\r\n isLocal && console.debug('Setting up Mobile controllers..');\r\n // NOTE: PLAYTEST ONLY for now, and only on mobile\r\n isTestnet && isSmartphoneOrTablet && initMobileControllers();\r\n \r\n // ## LOGGING\r\n isLocal && console.debug('Setting up Logging..');\r\n if (isMainnet) {\r\n console.log = console.debug = () => { };\r\n } else {\r\n // const originalConsoleLog = console.log;\r\n // console.log = (...args) => {\r\n // const url = args[0];\r\n // if (!url || url.includes('PHANTOM DEBUG')) return;\r\n // originalConsoleLog(...args);\r\n // };\r\n }\r\n\r\n // ## Toast config\r\n toast.configure({\r\n autoClose: 2500,\r\n });\r\n\r\n // ## BRIDGE MICRO PAYMENTS\r\n initPaymentsBridge();\r\n};\r\n\r\n\r\nconst setupVersion = () => {\r\n console.log('[version] setting up ReactUI version...', REACT_UI_VERSION);\r\n // -- Add Wrapper Version\r\n if (window.version) {\r\n window.version.reactUI = REACT_UI_VERSION;\r\n } else {\r\n window.version = { reactUI: REACT_UI_VERSION };\r\n }\r\n // -- LocalStorage update\r\n const lsData = window.localStorage.getItem('version');\r\n if (lsData) {\r\n const versions = JSON.parse(lsData);\r\n versions.reactUI = REACT_UI_VERSION;\r\n window.localStorage.setItem('version', JSON.stringify(versions));\r\n } else {\r\n window.localStorage.setItem('version', JSON.stringify(window.version));\r\n }\r\n // -- Anti Tampering...\r\n // ...\r\n};\r\n","const reportWebVitals = onPerfEntry => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport App from './App';\r\nimport { getCurrentEnvName } from './constants/envs';\r\nimport { browserCustomize } from './generalUtils/browser/browser';\r\nimport Store from './GlobalState/Store';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport { detectUrlParams } from './generalUtils/browser/urlParams';\r\n\r\n\r\n// url params\r\ndetectUrlParams();\r\n\r\n\r\n// ## REACT INIT\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('react-app'),\r\n);\r\n\r\n\r\n// ## ENV\r\nexport const envName = getCurrentEnvName();\r\nconsole.log('Env:', envName)\r\n\r\n\r\n// ## DEBUG\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nenvName === 'local' && reportWebVitals();\r\n\r\n// ## GLOBAL ERROR HANDLER\r\nconst errHandler = (type) => (err) => {\r\n console.error(`Caught ${type} error:`, err, '\\n Redirecting back home..');\r\n setTimeout(() => {\r\n // dangerous for their gaming session and balances\r\n const okRedirect = window.confirm(`Oops, a ${type} error occurred. Do you want to refresh the page?`);\r\n if (okRedirect) {\r\n localStorage.clear();\r\n window.location.href = '/';\r\n }\r\n }, 1 * 1000);\r\n}\r\ndocument.addEventListener('error', errHandler('global'));\r\ndocument.addEventListener('login-error', errHandler('login'));\r\n\r\n\r\n// Customizations\r\nbrowserCustomize();\r\n"],"sourceRoot":""}