{"version":3,"sources":["bootstrap.ts","components/Layout.component.tsx","helpers/useContract.hook.ts","constants/chainIds.ts","constants/addresses.ts","features/shopkeeper/useShopkeeper.hook.ts","features/shopkeeper/Shopkeeper.page.tsx","features/shopkeeper/mutations.ts","features/site/components/ChainIdGuard.component.tsx","constants/queryKeys.ts","features/web3/svg/Svg.tsx","features/web3/types.ts","features/web3/svg/icons/BinanceChain.tsx","features/web3/svg/icons/Coin98.tsx","features/web3/svg/icons/MathWallet.tsx","features/web3/svg/icons/Metamask.tsx","features/web3/svg/icons/SafePal.tsx","features/web3/svg/icons/TokenPocket.tsx","features/web3/svg/icons/TrustWallet.tsx","features/web3/svg/icons/WalletConnect.tsx","features/web3/config.ts","features/web3/utils.ts","features/web3/wallet.ts","constants/urls.ts","features/web3/useAuth.hook.ts","features/web3/WalletCard.component.tsx","features/web3/ConnectWalletModal.tsx","routes.tsx","theme.ts","features/site/components/Header.component.tsx","components/loading/Spinner.component.tsx","features/shopkeeper/queries.ts","features/tokendistributor/queries/queryKeys.ts","features/tokendistributor/queries/selectors.ts","features/tokendistributor/queries/useTokenDistributorContract.hook.ts","features/tokendistributor/queries/adminQueries.ts","features/site/components/Sidebar.component.tsx","features/site/components/SiteContainer.component.tsx","features/site/useScrollOnRouteChange.hook.ts","features/site/Admin.layout.tsx","features/site/Site.layout.tsx","components/loading/Dots.component.tsx","helpers/tokenQueries.ts","components/ApprovalButton.component.tsx","helpers/numbers.ts","features/tokendistributor/parseContributors.ts","features/tokendistributor/queries/adminMutations.ts","features/tokendistributor/components/CreateDistribution.component.tsx","components/DatePicker.component.tsx","helpers/dates.ts","features/tokendistributor/components/Deposit.component.tsx","features/tokendistributor/CreateStepper.page.tsx","features/tokendistributor/Distribute.page.tsx","features/tokendistributor/SingleDistribution.page.tsx","features/tokendistributor/queries/userMutations.ts","features/tokendistributor/queries/userQueries.ts","features/tokendistributor/TokenDistributor.page.tsx","features/web3/useEagerConnect.hook.ts","App.tsx","Providers.component.tsx","reportWebVitals.ts","index.tsx"],"names":["formatBigNumber","value","decimals","precision","Number","utils","formatUnits","toFixed","BigNumber","prototype","mulDiv","multiplier","divisor","from","gt","this","mul","div","Zero","amount","formatted","newFormatted","String","toBigNumber","parseUnits","error","console","Box","styled","space","layout","flexbox","border","position","color","shadow","zIndex","order","background","typography","Flex","grid","isAddress","getAddress","useContract","address","ABI","useWeb3React","library","account","useMemo","AddressZero","Error","Contract","getSigner","connectUnchecked","getProviderOrSigner","getContract","undefined","useTokenContract","tokenAddress","ERC20_ABI","BSC_MAINNET_ID","SUPPORTED_CHAINS","isSupportedChain","chainId","includes","chainIdMap","USDAddresses","tokenDistributorAddresses","shopkeeperAddresses","useTokenDistributorAddress","invariant","abi","useShopkeeperContractAddress","useShopkeeperAddress","useShopkeeperContract","BuyMoreCredits","React","useState","setAmount","setAddress","handlers","useRef","contract","enqueueSnackbar","useSnackbar","useMutation","a","inputAddress","grantToAddress","buy","tx","wait","status","onSuccess","variant","useBuyCredits","mutate","isLoading","addressError","Title","mt","Group","spacing","ActionIcon","size","onClick","current","decrement","NumberInput","hideControls","onChange","val","handlersRef","min","styles","input","width","textAlign","increment","TextInput","e","currentTarget","label","placeholder","Button","loading","disabled","Boolean","uppercase","GrantAccess","grantCreationRoleTo","_","useGrantCreationPerms","grant","Refund","refundUnused","useClaimRefund","refund","ShopkeeperPage","ChainIdGuard","children","Text","ENTITIES","PROVIDERS","FEATURES","rotate","keyframes","spinStyle","css","Svg","svg","spin","defaultProps","xmlns","ConnectorNames","Icon","props","viewBox","d","fill","fillRule","clipRule","opacity","connectorLocalStorageKey","connectors","title","icon","Metamask","connectorId","Injected","priority","WalletConnect","TrustWallet","MathWallet","TokenPocket","BinanceChain","BSC","SafePal","Coin98","injected","InjectedConnector","supportedChainIds","walletconnect","WalletConnectConnector","rpc","qrcode","bscConnector","BscConnector","connectorsByName","getLibrary","provider","ethers","providers","Web3Provider","pollingInterval","setupNetwork","window","ethereum","request","method","params","toString","chainName","nativeCurrency","name","symbol","rpcUrls","blockExplorerUrls","useAuth","activate","deactivate","queryClient","useQueryClient","login","useCallback","connectorID","connector","UnsupportedChainIdError","localStorage","removeItem","NoEthereumProviderError","NoBscProviderError","UserRejectedRequestErrorInjected","UserRejectedRequestErrorWalletConnect","walletConnectProvider","message","logout","removeQueries","getItem","close","WalletButton","WalletCard","walletConfig","closeModal","isIOS","test","navigator","userAgent","MSStream","setItem","id","toLocaleLowerCase","mb","ml","ConnectWalletButton","openModal","walletAddress","slice","fullWidth","rightIcon","leftIcon","ConnectWalletModal","isOpen","setIsOpen","Modal","opened","onClose","modal","maxWidth","map","wallet","sm","PAGE_URLS","breakpoints","xs","tablet","md","lg","xl","fontSizes","body","small","subtitle","theme","colors","primary","secondary","backgroundPrimary","backgroundSecondary","backgroundTertiary","textPrimary","textSecondary","white","cardBackgroundPrimary","live","gold","upcoming","mediaQueries","Logo","isTablet","useMediaQuery","isLargeDesktop","to","LargeHeader","useChainName","justifyContent","alignItems","mr","Header","Spinner","mx","shopkeeperKeys","all","feature","detail","entity","availableCredit","isBuyer","useHasBuyerRole","useQuery","BUYER_ROLE","buyerRole","hasRole","enabled","staleTime","Infinity","tokenDistributorKeys","list","allInfo","variable","hasCreatorRole","useUncompletedDistribution","walletDistributionIds","distributionId","deposits","contributors","selectActiveDistributions","distributions","filter","abandoned","wrangleDistribution","contractDistributionInfo","i","distributionToken","totalRaised","totalDistributionTokenWithdrawn","paused","isSettingUp","creator","useTokenDistributorContract","useHasCreatorRole","CREATOR_ROLE","creatorRole","TEMPORARY_CREATOR_ROLE","tempCreatorRole","useIsBuyerOrCreator","hasBuyerRole","data","useDeposits","getDeposits","totalDeposited","reduce","acc","add","depositId","unlockTime","sort","b","useAllDistributionInfo","select","getDistributions","result","item","useTokenDistribution","length","selectDistributionById","MenuItems","text","url","requiresRole","SidebarBase","hasBuyerOrCreatorRoles","useAvailableCredit","Navbar","Section","height","toNumber","grow","style","isActive","cursor","py","align","Sidebar","padding","base","SiteContainer","minHeight","useScrollOnRouteChange","location","useLocation","useEffect","setTimeout","scroll","top","left","behavior","pathname","AdminLayout","AppShell","header","px","navbar","main","backgroundColor","colorScheme","dark","gray","SiteLayout","Dots","span","erc20Keys","contractAddress","balanceOf","allowance","spender","useTokenAllowance","DEFAULT_APPROVAL_AMOUNT","constants","MaxUint256","ApprovalButton","buttonReplaces","minAllowance","tokenAllowance","gte","approve","setQueriesData","invalidateQueries","useApproval","isApproving","formatK","Numeral","format","formatNumber","number","scale","isNaN","num","parseFloat","toLocaleString","toPrecision","parseContributors","parsedText","parsedContributors","numLines","split","pattern","RegExp","addresses","matches","matchAll","match","push","parseRawContributors","uniqueAddresses","uniq","pluck","groupBy","prop","totalContributions","totalDistinctContributors","addContributors","addTx","useAddContributors","onError","amountHuman","deposit","depositTx","receipt","useMakeDeposit","setQueryData","prev","CreateTokenDistribution","onComplete","pastedContributors","setPastedContributors","contributorError","setContributorError","tokenAddressError","setTokenAddressError","setResult","setName","setTokenAddress","isComplete","setIsComplete","shopkeeperAddress","usdAddress","useUSDAddress","shopkeeperContract","distributionName","distributionTokenAddress","grantAndCreate","createTx","events","args","create","variables","useCreateDistribution","createDistribution","mutateAsync","createDistributionLoading","addContributorsLoading","setDistributionId","Set","addedContributorAddresses","setAddedContributorAddresses","useTokenDecimals","numTokenDecimals","parsed","allAddressesAdded","every","contributor","has","allDataProvided","onCreateDistribution","splitEvery","createBatch","addBatches","c","batch","remainingContributors","batches","Textarea","autosize","minRows","flexDirection","DatePicker","generatePicker","dateFnsGenerateConfig","secondsToHuman","seconds","date","Date","secondsToNow","formatDistanceToNow","DepositButton","distribution","timestampInSeconds","makeDeposit","isMakeDepositLoading","tokenDistributorAddress","Deposits","isError","pl","Table","striped","isInPast","isFuture","component","ContributorInfo","getContributors","useContributorAddresses","contributorAddresses","Spoiler","maxHeight","showLabel","hideLabel","Card","weight","AbandonedAlertBox","p","Alert","SetupAlertBox","onAbandon","start","useStartDistribution","startDistribution","isStartLoading","abandon","useAbandonDistribution","abandonDistribution","isAbandonLoading","navigate","useNavigate","Deposit","setSeconds","setMinutes","time","setTime","Math","floor","withBorder","Anchor","target","rel","href","required","showTime","gradient","deg","CreateStepper","uncompletedDistribution","active","setActive","Stepper","breakpoint","Step","description","DistributePage","selectedDistribution","setSelectedDistribution","distributionInfo","Select","SingleDistributionPage","useParams","pendingReward","withdraw","useClaimTokens","claimTokens","useTokenDistributions","distributionLength","numDistributions","allDistributionIds","distributionIds","version","useWalletDistributionIds","userInfo","tokensWithdrawn","pendingTokens","Column","ClaimButton","claim","isClaimLoading","nextUnlockDate","depositDates","dropWhile","isPast","useNextUnlockDate","noTokensToClaim","isZero","formatDistanceToNowStrict","TokenDistributorPage","isDesktop","rowKey","dataSource","dataIndex","render","snipped","row","index","_binanceChainListener","Promise","resolve","Object","defineProperty","get","bsc","set","useEagerConnect","isConnectorBinanceChain","isBinanceChainDefined","Reflect","then","App","path","element","memo","RQProvider","QueryClient","queryCache","QueryCache","errorMessage","defaultOptions","queries","notifyOnChangeProps","retry","client","AllTheProviders","anchorOrigin","vertical","horizontal","dense","isMobile","autoHideDuration","maxSnack","MantineProvider","reskinStyled","initialIsOpen","reportWebVitals","onPerfEntry","Function","getCLS","getFCP","getFID","getLCP","getTTFB","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.638e7d06.chunk.js","sourcesContent":["import { Zero } from \"@ethersproject/constants\"\nimport { parseUnits } from \"@ethersproject/units\"\nimport { BigNumber, BigNumberish, utils } from \"ethers\"\n\nconst formatBigNumber = (value: BigNumber, decimals: number, precision = 2): string =>\n Number(utils.formatUnits(value, decimals)).toFixed(precision)\n\nBigNumber.prototype.mulDiv = function (multiplier: BigNumberish, divisor: BigNumberish): BigNumber {\n return BigNumber.from(divisor).gt(0) ? BigNumber.from(this).mul(multiplier).div(divisor) : Zero\n}\n\n// Returns a string which has a precision of decimals. Will truncate additional\n// zeroes making this useful to format user input\n// Use bn.toFixed(0) to parse as BUSD with no decimals\n// ONLY WORKS WHEN THE TOKEN HAS 18 DECIMALS IN THE CONTRACT\nBigNumber.prototype.toFixed = function (decimals: BigNumberish = 18): string {\n const amount = BigNumber.from(this)\n let precision = Number(decimals)\n\n let formatted = formatBigNumber(amount, 18, precision)\n\n while (precision >= 0) {\n const newFormatted = formatBigNumber(amount, 18, precision)\n if (Number(newFormatted) !== Number(formatted)) {\n return formatted\n }\n formatted = newFormatted\n precision--\n }\n return formatted\n}\n\nString.prototype.toBigNumber = function (decimals: BigNumberish): BigNumber {\n try {\n return parseUnits(this as string, decimals)\n } catch (error) {\n console.error(`Failed to parse input amount: \"${this}\"`, error)\n }\n return BigNumber.from(0)\n}\n\n// if (typeof window !== \"undefined\" && process.env.NODE_ENV === \"development\") {\n// const whyDidYouRender = require(\"@welldone-software/why-did-you-render\")\n\n// // See https://github.com/welldone-software/why-did-you-render#options\n// whyDidYouRender(React, {\n// trackAllPureComponents: true,\n// trackHooks: true,\n// logOwnerReasons: true,\n// collapseGroups: true,\n// })\n// }\n","import React from \"react\"\nimport styled from \"styled-components\"\nimport {\n order,\n OrderProps,\n background,\n BackgroundProps,\n position,\n PositionProps,\n border,\n BorderProps,\n flexbox,\n FlexboxProps,\n space,\n layout,\n shadow,\n ShadowProps,\n SpaceProps,\n LayoutProps,\n color,\n ColorProps,\n zIndex,\n ZIndexProps,\n typography,\n TypographyProps,\n grid,\n GridProps,\n} from \"styled-system\"\n\nexport interface IBoxProps\n extends BorderProps,\n FlexboxProps,\n SpaceProps,\n LayoutProps,\n ZIndexProps,\n PositionProps,\n OrderProps,\n ShadowProps,\n BackgroundProps,\n ColorProps,\n TypographyProps {\n children?: React.ReactNode\n}\n\nexport const Box = styled.div`\n ${space};\n ${layout};\n ${flexbox};\n ${border};\n ${position};\n ${color};\n ${shadow};\n ${zIndex};\n ${order};\n ${background};\n ${typography};\n`\n\nexport const Flex = styled(Box)`\n display: flex;\n`\n\nexport const Grid = styled(Box)`\n ${grid};\n display: grid;\n`\n","import ERC20_ABI from \"constants/abis/erc20.json\"\n\nimport { getAddress } from \"@ethersproject/address\"\nimport { AddressZero } from \"@ethersproject/constants\"\nimport { Contract } from \"@ethersproject/contracts\"\nimport { Web3Provider, JsonRpcSigner } from \"@ethersproject/providers\"\nimport { useWeb3React } from \"@web3-react/core\"\nimport { useMemo } from \"react\"\n\n// returns the checksummed address if the address is valid, otherwise returns false\nexport function isAddress(value: any): string | false {\n try {\n return getAddress(value)\n } catch {\n return false\n }\n}\n// account is not optional\nexport function getSigner(library: Web3Provider, account: string): JsonRpcSigner {\n return library.getSigner(account).connectUnchecked()\n}\n\n// account is optional\nexport function getProviderOrSigner(\n library: Web3Provider,\n account?: string\n): Web3Provider | JsonRpcSigner {\n return account ? getSigner(library, account) : library\n}\n\n// account is optional\nexport function getContract(\n address: string,\n ABI: any,\n library: Web3Provider,\n account?: string\n): Contract {\n if (!isAddress(address) || address === AddressZero) {\n throw Error(`Invalid 'address' parameter '${address}'.`)\n }\n\n return new Contract(address, ABI, getProviderOrSigner(library, account) as any)\n}\n\nexport function useContract(address: string | undefined, ABI: any): Contract | null {\n const { library, account } = useWeb3React()\n\n return useMemo(() => {\n if (!address || !ABI || !library || !isAddress(address)) return null\n try {\n return getContract(address, ABI, library, account ? account : undefined)\n } catch (error) {\n console.error(\"Failed to get contract\", error)\n throw error\n }\n }, [address, ABI, library, account])\n}\n\nexport function useTokenContract(tokenAddress?: string): Contract | null {\n return useContract(tokenAddress, ERC20_ABI)\n}\n","import { useWeb3React } from \"@web3-react/core\"\n\nexport const BSC_MAINNET_ID = 56\nexport const ETH_MAINNET_ID = 1\n\nexport const DEFAULT_NETWORK_ID = BSC_MAINNET_ID\n\ntype SupportedChain = typeof BSC_MAINNET_ID | typeof ETH_MAINNET_ID\n\nexport const SUPPORTED_CHAINS = [BSC_MAINNET_ID, ETH_MAINNET_ID]\n\nexport const isSupportedChain = (chainId?: number): chainId is SupportedChain => {\n if (chainId === undefined) {\n return false\n }\n return SUPPORTED_CHAINS.includes(chainId)\n}\n\nconst chainIdMap = {\n [BSC_MAINNET_ID]: \"BSC Mainnet\",\n [ETH_MAINNET_ID]: \"Ethereum Mainnet\",\n}\n\nexport const useChainName = () => {\n const { chainId } = useWeb3React()\n if (!isSupportedChain(chainId)) {\n return null\n }\n\n return chainIdMap[chainId]\n}\n","import { ETH_MAINNET_ID, BSC_MAINNET_ID, isSupportedChain } from \"constants/chainIds\"\n\nimport { useWeb3React } from \"@web3-react/core\"\nimport invariant from \"tiny-invariant\"\n\n// Addresses should NEVER be imported directly. They should always be reliant\n// on the chainId.\n\nconst USDAddresses = {\n // BUSD\n [BSC_MAINNET_ID]: \"0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56\",\n // USDT\n [ETH_MAINNET_ID]: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n}\n\nconst tokenDistributorAddresses = {\n [BSC_MAINNET_ID]: \"0xb6Bd6bfC70723f385159F5bE9dEF1A7bFf4e175c\",\n [ETH_MAINNET_ID]: \"0x3B163d70C0da61c6E18ff988F8e4251de2A6b22a\",\n}\n\nconst shopkeeperAddresses = {\n [BSC_MAINNET_ID]: \"0xF90d6A98fB2F21a68F35095bCCfb35173D53C836\",\n [ETH_MAINNET_ID]: \"0xeBc71Cc01Fb873C87F63719fC807f0252cb77291\",\n}\n\n// Returns the USD stablecoin address. BUSD on BSC and USDT on ETH.\nexport const useUSDAddress = () => {\n const { chainId } = useWeb3React()\n invariant(isSupportedChain(chainId), `Chain id ${chainId} not supported`)\n\n const address = USDAddresses[chainId]\n invariant(address, `USD address on chain id ${chainId} not supported!`)\n\n return address\n}\n\nexport const useTokenDistributorAddress = () => {\n const { chainId } = useWeb3React()\n invariant(isSupportedChain(chainId), `Chain id ${chainId} not supported`)\n\n const address = tokenDistributorAddresses[chainId]\n invariant(address, `Token distributor address on chain id ${chainId} not supported!`)\n\n return address\n}\n\nexport const useShopkeeperAddress = () => {\n const { chainId } = useWeb3React()\n invariant(isSupportedChain(chainId), `Chain id ${chainId} not supported`)\n\n const address = shopkeeperAddresses[chainId]\n invariant(address, `Shopkeeper address on chain id ${chainId} not supported!`)\n\n return address\n}\n","import { useShopkeeperAddress } from \"constants/addresses\"\n\nimport { useContract } from \"helpers/useContract.hook\"\n\nconst abi = [\n \"function availableCredit() external view returns (uint256)\",\n \"function buy(uint256 _amount, address _wallet) external\",\n \"function grantCreationRoleTo(address _wallet) external\",\n \"function hasUsedPerms(address _wallet) external view returns (bool)\",\n \"function refundUnused(address _wallet) external\",\n \"function BUYER_ROLE() view returns (bytes32)\",\n \"function hasRole(bytes32 role, address account) external view returns (bool)\",\n \"function grantAndCreate(string calldata name, address distributionToken, address[] calldata contributors, uint256[] calldata amounts) external\",\n \"event LogCreateDistribution (address indexed creator, uint256 indexed distributionId, string indexed name, address distributionToken)\",\n \"event Bought(address indexed buyer, uint256 amount)\",\n \"event SpentCredit(address indexed grantedTo)\",\n \"event Refund(address indexed wallet)\",\n \"event Withdraw(address indexed tokenAddress, uint256 amount)\",\n \"event PriceChanged(uint256 price)\",\n \"event CreditChanged(uint256 newCredit)\",\n]\n\nexport const useShopkeeperContractAddress = () => {\n const contractAddress = useShopkeeperAddress()\n\n return contractAddress\n}\n\nexport const useShopkeeperContract = () => {\n const contractAddress = useShopkeeperContractAddress()\n return useContract(contractAddress, abi)\n}\n","import {\n Button,\n TextInput,\n Text,\n Title,\n Group,\n ActionIcon,\n NumberInput,\n NumberInputHandlers,\n} from \"@mantine/core\"\nimport { useWeb3React } from \"@web3-react/core\"\nimport { DatePicker } from \"components/DatePicker.component\"\nimport { Box, Flex } from \"components/Layout.component\"\nimport { Dots } from \"components/loading/Dots.component\"\nimport { Spinner } from \"components/loading/Spinner.component\"\nimport setMinutes from \"date-fns/setMinutes\"\nimport setSeconds from \"date-fns/setSeconds\"\nimport { secondsToHuman } from \"helpers/dates\"\nimport { useApproval, useTokenAllowance } from \"helpers/tokenQueries\"\nimport { isAddress } from \"helpers/useContract.hook\"\nimport React from \"react\"\nimport invariant from \"tiny-invariant\"\n\nimport { useBuyCredits, useGrantCreationPerms, useClaimRefund } from \"./mutations\"\n\nconst BuyMoreCredits = () => {\n const [amount, setAmount] = React.useState(1)\n const [address, setAddress] = React.useState(\"\")\n const handlers = React.useRef(null)\n const { mutate: buy, isLoading } = useBuyCredits()\n\n const addressError = isAddress(address) ? \"\" : \"Address is not valid\"\n\n return (\n \n Buy Credits\n \n \n handlers?.current?.decrement()}>\n -\n \n val && setAmount(val)}\n handlersRef={handlers}\n min={1}\n styles={{ input: { width: 54, textAlign: \"center\" } }}\n />\n handlers?.current?.increment()}>\n +\n \n \n \n \n setAddress(e.currentTarget.value)}\n label=\"Grant to address (optional)\"\n placeholder=\"0x0Ef82...\"\n error={address && addressError}\n />\n \n \n {\n buy(\n { amount, inputAddress: address ? address : undefined },\n {\n onSuccess: () => {\n setAmount(1)\n setAddress(\"\")\n },\n }\n )\n }}\n >\n Buy\n \n \n \n )\n}\n\nconst GrantAccess = () => {\n const [address, setAddress] = React.useState(\"\")\n const { mutate: grant } = useGrantCreationPerms()\n const addressError = isAddress(address) ? \"\" : \"Address is not valid\"\n\n return (\n \n Grant access\n \n setAddress(e.currentTarget.value)}\n label=\"Grant to creation permissions to address\"\n placeholder=\"0x0Ef82...\"\n error={address && addressError}\n />\n \n \n {\n grant(address, {\n onSuccess: () => {\n setAddress(\"\")\n },\n })\n }}\n >\n Grant\n \n \n \n )\n}\n\nconst Refund = () => {\n const [address, setAddress] = React.useState(\"\")\n const { mutate: refund } = useClaimRefund()\n const addressError = isAddress(address) ? \"\" : \"Address is not valid\"\n\n return (\n \n Refund\n \n setAddress(e.currentTarget.value)}\n label=\"Revoke creation permission and refund credit\"\n placeholder=\"0x0Ef82...\"\n error={address && addressError}\n />\n \n \n {\n refund(address, {\n onSuccess: () => {\n setAddress(\"\")\n },\n })\n }}\n >\n Revoke & refund\n \n \n \n )\n}\n\nconst ShopkeeperPage = () => {\n return (\n \n Shopkeeper\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default ShopkeeperPage\n","import { AddressZero } from \"@ethersproject/constants\"\nimport { isAddress } from \"helpers/useContract.hook\"\nimport { useSnackbar } from \"notistack\"\nimport { useMutation } from \"react-query\"\nimport invariant from \"tiny-invariant\"\n\nimport { useShopkeeperContract } from \"./useShopkeeper.hook\"\n\ninterface IBuyCredits {\n amount: number\n inputAddress?: string\n}\nexport const useBuyCredits = () => {\n const contract = useShopkeeperContract()\n const { enqueueSnackbar } = useSnackbar()\n\n return useMutation(\n async ({ amount, inputAddress }: IBuyCredits) => {\n invariant(contract, \"Contract not given\")\n const grantToAddress = inputAddress || AddressZero\n invariant(\n isAddress(grantToAddress),\n \"Grant to address must be valid address or left unspecfiied\"\n )\n\n const tx = await contract.buy(amount, grantToAddress)\n const receipt = await tx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Buy credit transaction failed\")\n }\n\n return amount\n },\n {\n onSuccess: (amount: number, { inputAddress }) => {\n enqueueSnackbar(`Bought ${amount} credits`, { variant: \"success\" })\n if (inputAddress) {\n enqueueSnackbar(`Granted creation permission to ${inputAddress}`, { variant: \"success\" })\n }\n },\n }\n )\n}\n\nexport const useGrantCreationPerms = () => {\n const contract = useShopkeeperContract()\n const { enqueueSnackbar } = useSnackbar()\n\n return useMutation(\n async (grantToAddress: string) => {\n invariant(contract, \"Contract not given\")\n invariant(isAddress(grantToAddress), \"Grant to address must be valid address\")\n\n const tx = await contract.grantCreationRoleTo(grantToAddress)\n const receipt = await tx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Grant creation permission transaction failed\")\n }\n },\n {\n onSuccess: (_, grantToAddress) => {\n {\n enqueueSnackbar(`Granted creation permission to ${grantToAddress}`, {\n variant: \"success\",\n })\n }\n },\n }\n )\n}\nexport const useClaimRefund = () => {\n const contract = useShopkeeperContract()\n const { enqueueSnackbar } = useSnackbar()\n\n return useMutation(\n async (address: string) => {\n invariant(contract, \"Contract not given\")\n invariant(isAddress(address), \"Address must be valid address\")\n\n const tx = await contract.refundUnused(address)\n const receipt = await tx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Refund transaction failed\")\n }\n },\n {\n onSuccess: (_, address) => {\n {\n enqueueSnackbar(`Claimed refund and revoked perms of ${address}`, {\n variant: \"success\",\n })\n }\n },\n }\n )\n}\n\nexport const useCheckHasUsed = () => {\n const contract = useShopkeeperContract()\n\n return useMutation(async (addressToCheck: string) => {\n invariant(contract, \"Contract not given\")\n invariant(isAddress(addressToCheck), \"Address must be valid address\")\n\n const hasUsed = await contract.hasUsedPerms(addressToCheck)\n return hasUsed as boolean\n })\n}\n","import { isSupportedChain } from \"constants/chainIds\"\n\nimport { Text } from \"@mantine/core\"\nimport { useWeb3React } from \"@web3-react/core\"\nimport React from \"react\"\n\nexport const ChainIdGuard: React.FC = ({ children }) => {\n const { chainId } = useWeb3React()\n if (!isSupportedChain(chainId)) {\n return Please connect on BSC or ETH to continue\n }\n\n return <>{children}\n}\n","export const ENTITIES = {\n LIST: \"list\",\n ITEM: \"item\",\n}\n\nexport const PROVIDERS = {\n WEB3: \"web3\",\n BACKEND: \"backend\",\n}\n\nexport const FEATURES = {\n ERC20: \"erc20\",\n DEAL_BACKEND: \"dealBackend\",\n DEAL_CONTRACT: \"dealContract\",\n SALE_BACKEND: \"saleBackend\",\n STAKED_SFEX: \"stakedSfex\",\n FARMING: \"farming\",\n NOTIFICATION: \"notification\",\n SHOWCASE: \"showcase\",\n SHOPKEEPER: \"shopkeeper\",\n}\n","import styled, { css, keyframes } from \"styled-components\"\nimport { space } from \"styled-system\"\n\nimport { SvgProps } from \"./types\"\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`\n\nconst spinStyle = css`\n animation: ${rotate} 2s linear infinite;\n`\n\n// fill: ${({ theme, color }) => getThemeValue(`colors.${color}`, color)(theme)};\nconst Svg = styled.svg`\n align-self: center; // Safari fix\n flex-shrink: 0;\n ${({ spin }) => spin && spinStyle}\n ${space}\n`\n\nSvg.defaultProps = {\n color: \"text\",\n width: \"20px\",\n xmlns: \"http://www.w3.org/2000/svg\",\n spin: false,\n}\n\nexport default Svg\n","import { FC } from \"react\"\n\nimport { SvgProps } from \"./svg\"\nexport enum ConnectorNames {\n Injected = \"injected\",\n WalletConnect = \"walletconnect\",\n BSC = \"bsc\",\n}\nexport interface Config {\n title: string\n icon: FC\n connectorId: ConnectorNames\n priority: number\n}\nexport type Login = (connectorId: ConnectorNames) => void\n","import React from \"react\"\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\n\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n )\n}\n\nexport default Icon\n","import React from \"react\"\nimport Svg from \"../Svg\"\nimport { SvgProps } from \"../types\"\n\nconst Icon: React.FC = (props) => {\n return (\n \n \n \n )\n}\n\nexport default Icon\n","import BinanceChain from \"./svg/icons/BinanceChain\"\nimport Coin98 from \"./svg/icons/Coin98\"\nimport MathWallet from \"./svg/icons/MathWallet\"\nimport Metamask from \"./svg/icons/Metamask\"\nimport SafePal from \"./svg/icons/SafePal\"\nimport TokenPocket from \"./svg/icons/TokenPocket\"\nimport TrustWallet from \"./svg/icons/TrustWallet\"\nimport WalletConnect from \"./svg/icons/WalletConnect\"\nimport { Config, ConnectorNames } from \"./types\"\n\nexport const connectorLocalStorageKey = \"connectorId\"\nexport const walletLocalStorageKey = \"wallet\"\n\nexport const connectors: Config[] = [\n {\n title: \"Metamask\",\n icon: Metamask,\n connectorId: ConnectorNames.Injected,\n priority: 1,\n },\n {\n title: \"WalletConnect\",\n icon: WalletConnect,\n connectorId: ConnectorNames.WalletConnect,\n priority: 2,\n },\n {\n title: \"Trust Wallet\",\n icon: TrustWallet,\n connectorId: ConnectorNames.Injected,\n priority: 3,\n },\n {\n title: \"MathWallet\",\n icon: MathWallet,\n connectorId: ConnectorNames.Injected,\n priority: 999,\n },\n {\n title: \"TokenPocket\",\n icon: TokenPocket,\n connectorId: ConnectorNames.Injected,\n priority: 999,\n },\n\n {\n title: \"Binance Chain\",\n icon: BinanceChain,\n connectorId: ConnectorNames.BSC,\n priority: 999,\n },\n {\n title: \"SafePal\",\n icon: SafePal,\n connectorId: ConnectorNames.Injected,\n priority: 999,\n },\n {\n title: \"Coin98\",\n icon: Coin98,\n connectorId: ConnectorNames.Injected,\n priority: 999,\n },\n]\n","import { BSC_MAINNET_ID, SUPPORTED_CHAINS } from \"constants/chainIds\"\n\nimport { BscConnector } from \"@binance-chain/bsc-connector\"\nimport { InjectedConnector } from \"@web3-react/injected-connector\"\nimport { WalletConnectConnector } from \"@web3-react/walletconnect-connector\"\nimport { ethers } from \"ethers\"\n\nimport { ConnectorNames } from \"./types\"\n\nconst POLLING_INTERVAL = 12000\n\nconst injected = new InjectedConnector({ supportedChainIds: SUPPORTED_CHAINS })\n\nconst walletconnect = new WalletConnectConnector({\n rpc: { [BSC_MAINNET_ID]: \"https://bsc-dataseed.binance.org/\" },\n qrcode: true,\n})\n\nconst bscConnector = new BscConnector({ supportedChainIds: [BSC_MAINNET_ID] })\n\nexport const connectorsByName: { [connectorName in ConnectorNames]: any } = {\n [ConnectorNames.Injected]: injected,\n [ConnectorNames.WalletConnect]: walletconnect,\n [ConnectorNames.BSC]: bscConnector,\n}\n\nexport const getLibrary = (provider: any): ethers.providers.Web3Provider => {\n const library = new ethers.providers.Web3Provider(provider)\n library.pollingInterval = POLLING_INTERVAL\n return library\n}\n\n/**\n * BSC Wallet requires a different sign method\n * @see https://docs.binance.org/smart-chain/wallet/wallet_api.html#binancechainbnbsignaddress-string-message-string-promisepublickey-string-signature-string\n */\nexport const signMessage = async (\n provider: any,\n account: string,\n message: string\n): Promise => {\n if (window.BinanceChain) {\n const { signature } = await window.BinanceChain.bnbSign(account, message)\n return signature\n }\n\n /**\n * Wallet Connect does not sign the message correctly unless you use their method\n * @see https://github.com/WalletConnect/walletconnect-monorepo/issues/462\n */\n if (provider.provider?.wc) {\n const wcMessage = ethers.utils.hexlify(ethers.utils.toUtf8Bytes(message))\n const signature = await provider.provider?.wc.signPersonalMessage([wcMessage, account])\n return signature\n }\n\n return provider.getSigner(account).signMessage(message)\n}\n","// Set of helper functions to facilitate wallet setup\n\nimport { BSC_MAINNET_ID } from \"constants/chainIds\"\nimport { BSCSCAN_URL } from \"constants/urls\"\n\n/**\n * Prompt the user to add BSC as a network on Metamask, or switch to BSC if the wallet is on a different network\n */\nexport const setupNetwork = async () => {\n const provider = window.ethereum\n if (provider) {\n try {\n await provider.request({\n method: \"wallet_addEthereumChain\",\n params: [\n {\n chainId: `0x${BSC_MAINNET_ID.toString(16)}`,\n chainName: \"Binance Smart Chain Mainnet\",\n nativeCurrency: {\n name: \"BNB\",\n symbol: \"bnb\",\n decimals: 18,\n },\n rpcUrls: [\"https://bsc-dataseed1.binance.org\"],\n blockExplorerUrls: [`${BSCSCAN_URL}/`],\n },\n ],\n })\n return true\n } catch (error) {\n console.error(\"Failed to setup the network in Metamask:\", error)\n return false\n }\n } else {\n console.error(\"Can't setup the BSC network on metamask because window.ethereum is undefined\")\n return false\n }\n}\n","export const BSCSCAN_URL = \"https://bscscan.com\"\n","import { PROVIDERS } from \"constants/queryKeys\"\n\nimport { NoBscProviderError } from \"@binance-chain/bsc-connector\"\nimport { useWeb3React, UnsupportedChainIdError } from \"@web3-react/core\"\nimport {\n NoEthereumProviderError,\n UserRejectedRequestError as UserRejectedRequestErrorInjected,\n} from \"@web3-react/injected-connector\"\nimport {\n UserRejectedRequestError as UserRejectedRequestErrorWalletConnect,\n WalletConnectConnector,\n} from \"@web3-react/walletconnect-connector\"\nimport { useSnackbar } from \"notistack\"\nimport { useCallback } from \"react\"\nimport { useQueryClient } from \"react-query\"\n\nimport { connectorLocalStorageKey } from \"./config\"\nimport { ConnectorNames } from \"./types\"\nimport { connectorsByName } from \"./utils\"\nimport { setupNetwork } from \"./wallet\"\n\nconst useAuth = () => {\n const { activate, deactivate, account } = useWeb3React()\n const { enqueueSnackbar } = useSnackbar()\n const queryClient = useQueryClient()\n\n const login = useCallback(\n (connectorID: ConnectorNames) => {\n const connector = connectorsByName[connectorID]\n if (connector) {\n activate(connector, async (error: Error) => {\n if (error instanceof UnsupportedChainIdError) {\n const hasSetup = await setupNetwork()\n if (hasSetup) {\n activate(connector)\n }\n } else {\n window.localStorage.removeItem(connectorLocalStorageKey)\n if (error instanceof NoEthereumProviderError || error instanceof NoBscProviderError) {\n // enqueueSnackbar(\"Provider Error\", \"No provider was found\")\n enqueueSnackbar(`No provider was found`, { variant: \"error\" })\n } else if (\n error instanceof UserRejectedRequestErrorInjected ||\n error instanceof UserRejectedRequestErrorWalletConnect\n ) {\n if (connector instanceof WalletConnectConnector) {\n const walletConnector = connector as WalletConnectConnector\n walletConnector.walletConnectProvider = null\n }\n // toastError(\"Authorization Error\", \"Please authorize to access your account\")\n enqueueSnackbar(\"Please authorize to access your account\", { variant: \"error\" })\n } else {\n // toastError(error.name, error.message)\n enqueueSnackbar(error.message, { variant: \"error\" })\n }\n }\n })\n } else {\n // toastError(\"Unable to find connector\", \"The connector config is wrong\")\n enqueueSnackbar(\"The connector config is wrong\", { variant: \"error\" })\n }\n },\n [activate, enqueueSnackbar]\n )\n\n const logout = useCallback(() => {\n // remove all cached data from our provider/wallet\n queryClient.removeQueries([{ provider: PROVIDERS.WEB3, account }])\n deactivate()\n // This localStorage key is set by @web3-react/walletconnect-connector\n if (window.localStorage.getItem(\"walletconnect\")) {\n connectorsByName.walletconnect.close()\n connectorsByName.walletconnect.walletConnectProvider = null\n }\n window.localStorage.removeItem(connectorLocalStorageKey)\n }, [deactivate, queryClient, account])\n\n return { login, logout }\n}\n\nexport default useAuth\n","import { Text } from \"@mantine/core\"\nimport { Flex, Box } from \"components/Layout.component\"\nimport React from \"react\"\nimport styled from \"styled-components\"\n\nimport { connectorLocalStorageKey, walletLocalStorageKey } from \"./config\"\nimport { Config, ConnectorNames, Login } from \"./types\"\n\ninterface Props {\n walletConfig: Config\n login: Login\n closeModal: () => void\n}\n\nconst WalletButton = styled(Flex)`\n cursor: pointer;\n width: 100%;\n border-radius: 4px;\n border: 1px solid black;\n padding: 6px 8px;\n align-items: center;\n`\n\nexport const WalletCard: React.FC = ({ login, walletConfig, closeModal }) => {\n const { title, icon: Icon } = walletConfig\n\n return (\n {\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream\n\n // Since iOS does not support Trust Wallet we fall back to WalletConnect\n if (walletConfig.title === \"Trust Wallet\" && isIOS) {\n login(ConnectorNames.WalletConnect)\n } else {\n login(walletConfig.connectorId)\n }\n\n localStorage.setItem(walletLocalStorageKey, walletConfig.title)\n localStorage.setItem(connectorLocalStorageKey, walletConfig.connectorId)\n closeModal()\n }}\n id={`wallet-connect-${title.toLocaleLowerCase()}`}\n >\n \n \n {title}\n \n \n )\n}\n","import { Modal, Group, Button } from \"@mantine/core\"\nimport { useWeb3React } from \"@web3-react/core\"\nimport { Box } from \"components/Layout.component\"\nimport useAuth from \"features/web3/useAuth.hook\"\nimport React, { useState } from \"react\"\nimport { BiWallet } from \"react-icons/bi\"\nimport { BsCircleFill } from \"react-icons/bs\"\n\nimport { WalletCard } from \"./WalletCard.component\"\nimport { connectors } from \"./config\"\nimport { Config } from \"./types\"\n\nconst ConnectWalletButton: React.FC<{ openModal: () => void; logout: () => void }> = ({\n openModal,\n logout,\n}) => {\n const { account } = useWeb3React()\n\n if (account) {\n const walletAddress = `${account.slice(0, 6)}...${account.slice(-4)}`\n return (\n \n )\n }\n return (\n \n )\n}\n\n// A modal component that allows the user to connect their wallet\nexport function ConnectWalletModal() {\n const [isOpen, setIsOpen] = useState(false)\n const { login, logout } = useAuth()\n\n return (\n <>\n setIsOpen(false)}\n title=\"Choose Wallet\"\n styles={{\n modal: {\n width: \"100%\",\n maxWidth: \"400px\",\n },\n }}\n >\n {connectors.map((wallet: Config) => (\n \n setIsOpen(false)} />\n \n ))}\n \n\n \n setIsOpen(true)} />\n \n \n )\n}\n","export const PAGE_URLS = {\n HOME: \"/\",\n TOKEN_DISTRIBUTOR: \"/\",\n ADMIN: \"/admin\",\n CREATE_TOKEN_DISTRIBUTION: \"/admin/create\",\n DISTRIBUTE_TOKENS: \"/admin/distribute\",\n SHOPKEEPER: \"/admin/buy\",\n}\n","const breakpoints: any = [\"576px\", \"768px\", \"992px\", \"1200px\", \"1400px\"]\nbreakpoints.xs = breakpoints[0]\nbreakpoints.sm = breakpoints[1]\nbreakpoints.tablet = breakpoints[1]\nbreakpoints.md = breakpoints[2]\nbreakpoints.lg = breakpoints[3]\nbreakpoints.xl = breakpoints[4]\n\nconst fontSizes: any = [12, 14, 16, 20, 24, 32, 48, 72]\nfontSizes.body = fontSizes[2]\nfontSizes.small = fontSizes[1]\nfontSizes.xs = fontSizes[0]\nfontSizes.subtitle = fontSizes[3]\n\nconst colors = {\n primary: \"#1FCC92\",\n secondary: \"#0055FF\",\n backgroundPrimary: \"#3C1642\",\n backgroundSecondary: \"#4D2154\",\n backgroundTertiary: \"#311435\",\n textPrimary: \"#FFFFFF\",\n textSecondary: \"#000000\",\n white: \"#FFFFFF\",\n cardBackgroundPrimary: \"#421948\",\n live: \"#FF8080\",\n gold: \"#F59E0B\",\n upcoming: \"#CCCC52\",\n} as const\n\nexport const theme = {\n //idxes 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11\n space: [0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 96],\n colors: colors,\n fontSizes: fontSizes,\n breakpoints: breakpoints,\n mediaQueries: {\n xs: `(min-width: ${breakpoints[0]})`,\n sm: `(min-width: ${breakpoints[1]})`,\n tablet: `(min-width: ${breakpoints[1]})`,\n md: `(min-width: ${breakpoints[2]})`,\n lg: `(min-width: ${breakpoints[3]})`,\n xl: `(min-width: ${breakpoints[4]})`,\n },\n}\n\nexport type ColorKeys = keyof typeof colors\n","import { useChainName } from \"constants/chainIds\"\n\nimport { Title, Text } from \"@mantine/core\"\nimport { useMediaQuery } from \"@mantine/hooks\"\nimport { Flex, Box } from \"components/Layout.component\"\nimport { ConnectWalletModal } from \"features/web3/ConnectWalletModal\"\nimport React from \"react\"\nimport { Link } from \"react-router-dom\"\nimport { PAGE_URLS } from \"routes\"\nimport { theme } from \"theme\"\n\nconst Logo: React.FC = () => {\n // check to see if the screen is on a mobile device\n const isTablet = useMediaQuery(theme.mediaQueries.tablet)\n const isLargeDesktop = useMediaQuery(theme.mediaQueries.lg)\n return (\n \n MH Ventures\n \n )\n}\n\nconst LargeHeader: React.FC = () => {\n const chainName = useChainName()\n return (\n \n \n \n \n \n \n \n {chainName}\n \n \n \n \n \n )\n}\n\nexport const Header: React.FC = () => {\n return \n}\n","import React from \"react\"\nimport { OrbitSpinner as RESpinner } from \"react-epic-spinners\"\nimport { Flex } from \"components/Layout.component\"\n\nexport const Spinner = () => (\n \n \n \n)\n","import { ENTITIES, PROVIDERS, FEATURES } from \"constants/queryKeys\"\n\nimport { useWeb3React } from \"@web3-react/core\"\nimport { BigNumber } from \"ethers\"\nimport { useQuery } from \"react-query\"\nimport invariant from \"tiny-invariant\"\n\nimport { useShopkeeperContract } from \"./useShopkeeper.hook\"\n\nexport const shopkeeperKeys = {\n all: (chainId?: number) =>\n [{ feature: FEATURES.SHOPKEEPER, provider: PROVIDERS.WEB3, chainId }] as const,\n detail: {\n all: (chainId?: number) =>\n [{ ...shopkeeperKeys.all(chainId)[0], entity: ENTITIES.ITEM }] as const,\n availableCredit: (chainId?: number) =>\n [\n { ...shopkeeperKeys.all(chainId)[0], entity: ENTITIES.ITEM, value: \"availableCredit\" },\n ] as const,\n isBuyer: (chainId?: number, account?: string | null) =>\n [\n { ...shopkeeperKeys.all(chainId)[0], entity: ENTITIES.ITEM, value: \"isBuyer\", account },\n ] as const,\n },\n}\n\nexport const useAvailableCredit = () => {\n const { chainId } = useWeb3React()\n const { data: hasBuyerRole } = useHasBuyerRole()\n const contract = useShopkeeperContract()\n\n return useQuery(\n shopkeeperKeys.detail.availableCredit(),\n async function () {\n invariant(chainId, \"chainId not given\")\n invariant(contract, \"contract not given\")\n\n return contract.availableCredit()\n },\n { enabled: Boolean(chainId) && Boolean(hasBuyerRole) && Boolean(contract) }\n )\n}\n\n// used to check if the user can interact with the shopkeeper contract\nexport const useHasBuyerRole = () => {\n const { account, chainId } = useWeb3React()\n const contract = useShopkeeperContract()\n\n return useQuery(\n shopkeeperKeys.detail.isBuyer(chainId, account),\n async () => {\n invariant(account, \"Account not given\")\n invariant(contract, \"contract not given\")\n\n const buyerRole = await contract.BUYER_ROLE()\n return contract.hasRole(buyerRole, account)\n },\n { enabled: Boolean(account) && Boolean(contract), staleTime: Infinity }\n )\n}\n","import { ENTITIES, PROVIDERS } from \"constants/queryKeys\"\n\nexport const tokenDistributorKeys = {\n all: (chainId?: number) =>\n [{ feature: \"tokenDistributor\", provider: PROVIDERS.WEB3, chainId }] as const,\n list: (account?: string | null, chainId?: number) =>\n [{ ...tokenDistributorKeys.all(chainId)[0], entity: ENTITIES.LIST, account }] as const,\n allInfo: (chainId?: number) =>\n [\n { ...tokenDistributorKeys.all(chainId)[0], entity: ENTITIES.LIST, variable: \"allInfo\" },\n ] as const,\n hasCreatorRole: (account?: string | null, chainId?: number) =>\n [\n {\n ...tokenDistributorKeys.all(chainId)[0],\n account,\n variable: \"hasCreatorRole\",\n },\n ] as const,\n useUncompletedDistribution: (account?: string | null, chainId?: number) =>\n [\n {\n ...tokenDistributorKeys.all(chainId)[0],\n account,\n variable: \"useUncompletedDistribution\",\n },\n ] as const,\n walletDistributionIds: (account?: string | null, chainId?: number) =>\n [\n {\n ...tokenDistributorKeys.all(chainId)[0],\n account,\n variable: \"walletDistributionIds\",\n },\n ] as const,\n detail: {\n all: (distributionId?: string, chainId?: number) =>\n [\n {\n ...tokenDistributorKeys.all(chainId)[0],\n entity: ENTITIES.ITEM,\n distributionId,\n chainId,\n },\n ] as const,\n deposits: (distributionId?: string, chainId?: number) =>\n [\n {\n ...tokenDistributorKeys.detail.all(distributionId, chainId)[0],\n variable: \"deposits\",\n },\n ] as const,\n contributors: (distributionId?: string, chainId?: number) =>\n [\n {\n ...tokenDistributorKeys.detail.all(distributionId, chainId)[0],\n variable: \"contributors\",\n },\n ] as const,\n },\n}\n","import type { IDistributionInfo } from \"./types\"\n\nexport const selectPendingDistribution =\n (creator?: string | null) => (distributions: IDistributionInfo[]) => {\n if (!creator) {\n return null\n }\n\n const result = distributions.filter(\n (d: IDistributionInfo) => d.isSettingUp && !d.abandoned && d.creator === creator\n )\n return result.length ? result[0] : null\n }\n\nexport const selectDistributionById =\n (distributionId: string | null) => (distributions: IDistributionInfo[]) => {\n if (!distributionId) {\n return null\n }\n const result = distributions.filter((d) => d.distributionId === Number(distributionId))\n return result.length ? result[0] : null\n }\n\nexport const selectActiveDistributions = (distributions: IDistributionInfo[]) =>\n distributions.filter((d) => !d.abandoned)\n\nexport const wrangleDistribution = (\n contractDistributionInfo: any[],\n i: number\n): IDistributionInfo => {\n const [\n name,\n distributionToken,\n totalRaised,\n totalDistributionTokenWithdrawn,\n paused,\n isSettingUp,\n creator,\n abandoned,\n ] = contractDistributionInfo\n\n return {\n distributionId: i,\n name,\n distributionToken,\n totalRaised,\n totalDistributionTokenWithdrawn,\n paused,\n isSettingUp,\n creator,\n abandoned,\n }\n}\n","import { useTokenDistributorAddress } from \"constants/addresses\"\n\nimport { useContract } from \"helpers/useContract.hook\"\n\nconst abi = [\n //\n // roles\n \"function CREATOR_ROLE() view returns (bytes32)\",\n \"function TEMPORARY_CREATOR_ROLE() view returns (bytes32)\",\n \"function hasRole(bytes32 role, address account) external view returns (bool)\",\n //\n // events\n \"event Withdraw(address indexed user, uint256 indexed distributionId, uint256 amount)\",\n /// @dev Depositor does not have to be (and is usually not) a contributor\n \"event Deposit(address indexed depositor, uint256 indexed distributionId, uint256 amount)\",\n \"event UndoDeposit(address indexed withdrawer, uint256 indexed distributionId, uint256 depositIndex, uint256 amount)\",\n \"event WithdrawIncorrectlySentFunds(address indexed tokenAddress, uint256 amount)\",\n `event LogCreateDistribution(\n address indexed creator,\n uint256 indexed distributionId,\n string indexed name,\n address distributionToken\n )`,\n \"event LogStartDistribution(address indexed creator, uint256 indexed distributionId)\",\n \"event LogAddContributors(address indexed user, uint256 indexed distributionId, uint256 contributorCount)\",\n \"event LogPauseDistribution(address indexed user, uint256 indexed distributionId, bool isPaused)\",\n \"event LogAbandonDistribution(address indexed user, uint256 indexed distributionId)\",\n //\n // views\n // info of a specific distribution\n `function distributions(uint256 distributionId) view returns (\n string name,\n address distributionToken,\n uint256 totalRaised,\n uint256 totalDistributionTokenWithdrawn,\n bool paused,\n bool isSettingUp,\n address creator,\n bool abandoned\n )`,\n // total number of distributions\n \"function distributionLength() external view returns (uint256)\",\n // contributors for a specfiic distribution\n \"function getContributors(uint256 _distributionId) external view returns (address[] memory)\",\n // deposits for a specific distribution\n \"function getDeposits(uint256 _distributionId) external view returns (tuple(uint256 amount, uint256 unlockTime)[])\",\n // info for all distributions\n `function getDistributions() external view returns (\n tuple(\n string name,\n address distributionToken,\n uint256 totalRaised,\n uint256 totalDistributionTokenWithdrawn,\n bool paused,\n bool isSettingUp,\n address creator,\n bool abandoned\n )[]\n )`,\n // distribution ids for which _wallet is a contributor that have been started\n // but not abandoned\n `function getDistributionIdsForWallet(address _wallet) view returns (uint256[] memory)`,\n // information about a specific user\n \"function userInfo(uint256 distributionId, address wallet) view returns (tuple(uint256 rewardWithdrawn, uint256 amountContributed) user)\",\n // The total amount deposited for a distribution including future unlocks\n \"function totalDeposited(uint256 _distributionId) public view returns (uint256)\",\n // amount of tokens left to claim for a user\n \"function pendingReward(uint256 _distributionId, address _user) view returns (int256)\",\n //\n // mutations (admin)\n // create a distribution. This can usually only be called once by a temporary\n // creator. Contributors can be max 200 in length. More can be added with add\n // contributors\n \"function create(string calldata name, address distributionToken, address[] calldata contributors, uint256[] calldata amounts) external\",\n // add contributors in batches of 200\n \"function addContributors(uint256 distributionId, address[] calldata contributors, uint256[] calldata amounts) public\",\n // start a distribution, allowing users to claim tokens. Can only be called by\n // superadmin or the distribution's creator\n \"function start(uint256 _distributionId) external\",\n // deposit tokens into a vest (can be called by anyone)\n \"function deposit(uint256 _distributionId, uint256 _amount, uint256 _unlockTime) external\",\n // change whether distribution is paused. Paused distributions block\n // withdrawing for users. Only callable by EDITOR_ROLE\n \"function setPaused(uint256 _distributionId, bool _paused) external\",\n // Abandon a distribution. All deposits must be undone first. Can only be called by creator or\n // superadmin\n \"function abandon(uint256 _distributionId) external\",\n //\n // mutations (user)\n // claim tokens\n \"function withdraw(uint256 _distributionId, uint256 _amount)\",\n]\n\nexport const useTokenDistributorContract = () => {\n const contractAddress = useTokenDistributorAddress()\n return useContract(contractAddress, abi)\n}\n","import { useWeb3React } from \"@web3-react/core\"\nimport { BigNumber, BigNumberish } from \"ethers\"\nimport { useHasBuyerRole } from \"features/shopkeeper/queries\"\nimport { useQuery, UseQueryResult } from \"react-query\"\nimport invariant from \"tiny-invariant\"\n\nimport { tokenDistributorKeys } from \"./queryKeys\"\nimport {\n selectPendingDistribution,\n wrangleDistribution,\n selectDistributionById,\n selectActiveDistributions,\n} from \"./selectors\"\nimport type { IDistributionInfo, IDeposits, IDeposit } from \"./types\"\nimport { useTokenDistributorContract } from \"./useTokenDistributorContract.hook\"\n\n// used to check if the user has the creator or temp role which is used to create new distributions\nexport const useHasCreatorRole = () => {\n const { account, chainId } = useWeb3React()\n const contract = useTokenDistributorContract()\n\n return useQuery(\n tokenDistributorKeys.hasCreatorRole(account, chainId),\n async () => {\n invariant(account, \"Account not given\")\n invariant(contract, \"Contract not given\")\n\n const creatorRole = await contract.CREATOR_ROLE()\n const userHasCreatorRole = await contract.hasRole(creatorRole, account)\n if (userHasCreatorRole) {\n return true\n }\n const tempCreatorRole = await contract.TEMPORARY_CREATOR_ROLE()\n return contract.hasRole(tempCreatorRole, account)\n },\n { enabled: Boolean(account) && Boolean(contract), staleTime: 30_000 }\n )\n}\n\nexport const useIsBuyerOrCreator = () => {\n const { data: hasBuyerRole } = useHasBuyerRole()\n const { data: hasCreatorRole } = useHasCreatorRole()\n\n if (hasBuyerRole === undefined || hasCreatorRole === undefined) {\n return null\n }\n\n return hasBuyerRole || hasCreatorRole\n}\n\n// gets all deposits for a distribution id\nexport const useDeposits = (distributionId: BigNumberish) => {\n const { chainId } = useWeb3React()\n const contract = useTokenDistributorContract()\n\n return useQuery(\n tokenDistributorKeys.detail.deposits(distributionId.toString(), chainId),\n async () => {\n invariant(contract, \"Contract not given\")\n\n const deposits = await contract.getDeposits(distributionId)\n // whilst the contract returns a named tuple, sometimes accessing them by keys\n // doesn't work. So here we access them by indexes\n const totalDeposited = deposits.reduce(\n (acc: BigNumber, [amount, _]: any) => acc.add(amount),\n BigNumber.from(0)\n )\n\n return {\n deposits: deposits\n .map((d: any, i: number) => ({\n depositId: i,\n amount: d[0],\n unlockTime: d[1],\n }))\n // sort earliest to latest\n .sort((a: IDeposit, b: IDeposit) => (a.unlockTime.gt(b.unlockTime) ? 1 : -1)),\n totalDeposited,\n }\n },\n // query options\n {\n enabled: Boolean(contract),\n }\n )\n}\n\ninterface IUseAllDistributionInfo {\n (select?: (data: IDistributionInfo[]) => T): UseQueryResult\n}\n\nexport const useAllDistributionInfo: IUseAllDistributionInfo = (select) => {\n const { chainId } = useWeb3React()\n const contract = useTokenDistributorContract()\n\n return useQuery(\n // query key\n tokenDistributorKeys.allInfo(chainId),\n // return function\n async () => {\n invariant(chainId !== undefined, \"ChainId must be supplied\")\n invariant(contract, \"contract not given\")\n\n const result = await contract.getDistributions()\n // we can use i here as the ids are consistent with indexes\n return result.map((item: any[], i: number) => wrangleDistribution(item, i))\n },\n // query options\n {\n enabled: Boolean(contract) && chainId !== undefined,\n select,\n }\n )\n}\n\n// returns the pending distribution for a user if they have one and null\n// otherwise\nexport const useUncompletedDistribution = () => {\n const { account } = useWeb3React()\n return useAllDistributionInfo(selectPendingDistribution(account))\n}\n\n// gets information for a specific distribution\nexport const useTokenDistribution = (distributionId: string | null) => {\n return useAllDistributionInfo(selectDistributionById(distributionId))\n}\n\n// gets all distributions that havent been abandoned\nexport const useActiveTokenDistributions = () => {\n return useAllDistributionInfo(selectActiveDistributions)\n}\n\nexport const useContributorAddresses = (distributionId: BigNumberish) => {\n const { chainId } = useWeb3React()\n const contract = useTokenDistributorContract()\n\n return useQuery(\n // query key\n tokenDistributorKeys.detail.contributors(distributionId.toString(), chainId),\n // return function\n async () => {\n invariant(chainId !== undefined, \"ChainId must be supplied\")\n invariant(contract, \"contract not given\")\n\n return contract.getContributors(distributionId)\n },\n // query options\n {\n enabled: Boolean(contract) && chainId !== undefined,\n // this never changes\n staleTime: Infinity,\n }\n )\n}\n","import { Navbar, Text, Title } from \"@mantine/core\"\nimport { useMediaQuery } from \"@mantine/hooks\"\nimport { Flex, Box } from \"components/Layout.component\"\nimport { Spinner } from \"components/loading/Spinner.component\"\nimport { useAvailableCredit, useHasBuyerRole } from \"features/shopkeeper/queries\"\nimport { useIsBuyerOrCreator } from \"features/tokendistributor/queries/adminQueries\"\nimport { ConnectWalletModal } from \"features/web3/ConnectWalletModal\"\nimport React from \"react\"\nimport { NavLink, Link, useLocation } from \"react-router-dom\"\nimport { PAGE_URLS } from \"routes\"\nimport styled from \"styled-components\"\nimport { theme } from \"theme\"\n\ntype ROLES = \"buyer\" | \"creatorOrBuyer\"\n\ninterface IMenuItem {\n text: string\n url: string\n external?: boolean\n requiresRole?: ROLES\n}\n\nexport const MenuItems: IMenuItem[] = [\n { text: \"Deposit Tokens\", url: PAGE_URLS.DISTRIBUTE_TOKENS },\n {\n text: \"Create Distribution\",\n url: PAGE_URLS.CREATE_TOKEN_DISTRIBUTION,\n requiresRole: \"creatorOrBuyer\",\n },\n { text: \"Shopkeeper\", url: PAGE_URLS.SHOPKEEPER, requiresRole: \"buyer\" },\n // { text: \"Private deals\", url: PAGE_URLS.PRIVATE_DEALS },\n // { text: \"Launchpad\", url: PAGE_URLS.LAUNCHPAD },\n // { text: \"NFTs\", url: PAGE_URLS.SALES },\n // { text: \"Staking\", url: PAGE_URLS.STAKING },\n // { text: \"FAQ\", url: PAGE_URLS.FAQ },\n // { text: \"Claim Tokens\", url: PAGE_URLS.TOKEN_DISTRIBUTOR },\n]\n\nconst SidebarBase = () => {\n const { data: hasBuyerRole } = useHasBuyerRole()\n const hasBuyerOrCreatorRoles = useIsBuyerOrCreator()\n const { data: availableCredit, isLoading } = useAvailableCredit()\n\n if (hasBuyerRole === undefined || hasBuyerOrCreatorRoles === undefined || isLoading) {\n return \n }\n\n return (\n <>\n {availableCredit && (\n \n \n Available credits: {availableCredit.toNumber()}\n \n \n )}\n \n {MenuItems.map((item: IMenuItem) => {\n if (item.requiresRole === \"buyer\" && !hasBuyerRole) {\n return null\n }\n if (item.requiresRole === \"creatorOrBuyer\" && !hasBuyerOrCreatorRoles) {\n return null\n }\n return (\n ({\n color: isActive ? \"#FFFFFF\" : \"#E2BEE8\",\n opacity: isActive ? 1 : 0.5,\n cursor: \"pointer\",\n })}\n >\n \n {item.text}\n \n \n )\n })}\n \n \n )\n}\n\nexport const Sidebar = () => {\n return (\n \n \n \n )\n}\n","import { Box } from \"components/Layout.component\"\nimport React from \"react\"\n\nexport const SiteContainer: React.FC = ({ children }) => {\n return (\n \n {children}\n \n )\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router-dom\"\n\nexport const useScrollOnRouteChange = () => {\n const location = useLocation()\n useEffect(() => {\n setTimeout(() => {\n window.scroll({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n })\n }, 50)\n }, [location.pathname])\n}\n","import { AppShell, Header as MantineHeader } from \"@mantine/core\"\nimport { Box } from \"components/Layout.component\"\nimport React from \"react\"\nimport { Outlet } from \"react-router-dom\"\n\nimport { ChainIdGuard } from \"./components/ChainIdGuard.component\"\nimport { Header } from \"./components/Header.component\"\nimport { Sidebar } from \"./components/Sidebar.component\"\nimport { SiteContainer } from \"./components/SiteContainer.component\"\nimport { useScrollOnRouteChange } from \"./useScrollOnRouteChange.hook\"\n\nexport const AdminLayout: React.FC = () => {\n useScrollOnRouteChange()\n return (\n \n \n
\n \n \n }\n navbar={\n \n \n \n }\n styles={(theme) => ({\n main: {\n backgroundColor:\n theme.colorScheme === \"dark\" ? theme.colors.dark[8] : theme.colors.gray[0],\n },\n })}\n >\n \n \n \n \n \n \n \n \n )\n}\n","import { AppShell, Header as MantineHeader } from \"@mantine/core\"\nimport { Box } from \"components/Layout.component\"\nimport React from \"react\"\nimport { Outlet } from \"react-router-dom\"\n\nimport { ChainIdGuard } from \"./components/ChainIdGuard.component\"\nimport { Header } from \"./components/Header.component\"\nimport { SiteContainer } from \"./components/SiteContainer.component\"\nimport { useScrollOnRouteChange } from \"./useScrollOnRouteChange.hook\"\n\nexport const SiteLayout: React.FC = () => {\n useScrollOnRouteChange()\n return (\n \n \n
\n \n \n }\n styles={(theme) => ({\n main: {\n backgroundColor:\n theme.colorScheme === \"dark\" ? theme.colors.dark[8] : theme.colors.gray[0],\n },\n })}\n >\n \n \n \n \n \n \n \n \n )\n}\n","import styled from \"styled-components\"\n\nexport const Dots = styled.span`\n &::after {\n display: inline-block;\n animation: ellipsis 1.25s infinite;\n content: \".\";\n width: 1em;\n text-align: left;\n }\n @keyframes ellipsis {\n 0% {\n content: \".\";\n }\n 33% {\n content: \"..\";\n }\n 66% {\n content: \"...\";\n }\n }\n`\n","import { PROVIDERS, ENTITIES, FEATURES } from \"constants/queryKeys\"\n\nimport { useWeb3React } from \"@web3-react/core\"\nimport { ethers, BigNumber } from \"ethers\"\nimport { useSnackbar } from \"notistack\"\nimport { useQuery, useMutation, useQueryClient } from \"react-query\"\nimport invariant from \"tiny-invariant\"\n\nimport { useTokenContract, isAddress } from \"./useContract.hook\"\n\ninterface ISpecificAccount {\n contractAddress: string\n account?: string | null\n}\n\ninterface IAllowance extends ISpecificAccount {\n spender: string\n}\n\nexport const erc20Keys = {\n all: [{ feature: FEATURES.ERC20, provider: PROVIDERS.WEB3 }] as const,\n detail: {\n all: (contractAddress: string) =>\n [{ ...erc20Keys.all[0], contractAddress, entity: ENTITIES.ITEM }] as const,\n // does not rely on account\n decimals: ({ contractAddress }: { contractAddress: string }) =>\n [{ ...erc20Keys.all[0], contractAddress, variable: \"decimals\" }] as const,\n // relies on account\n balanceOf: ({ contractAddress, account }: ISpecificAccount) =>\n [{ ...erc20Keys.all[0], contractAddress, account, variable: \"balanceOf\" }] as const,\n // relies on account and spender\n allowance: ({ contractAddress, account, spender }: IAllowance) =>\n [{ ...erc20Keys.all[0], contractAddress, account, spender, variable: \"allowance\" }] as const,\n },\n}\n\nexport const useTokenBalance = (tokenAddress: string) => {\n const { account } = useWeb3React()\n const contract = useTokenContract(tokenAddress)\n\n return useQuery(\n erc20Keys.detail.balanceOf({ contractAddress: tokenAddress, account }),\n async () => {\n invariant(account, \"Account not given\")\n invariant(contract, \"Contract not given\")\n invariant(isAddress(tokenAddress), \"Token address is invalid\")\n\n return contract.balanceOf(account)\n },\n {\n enabled: Boolean(account) && Boolean(contract) && Boolean(isAddress(tokenAddress)),\n }\n )\n}\n\nexport const useTokenDecimals = (tokenAddress: string) => {\n const contract = useTokenContract(tokenAddress)\n\n // return type is a number as the ABI specifies uint8 return value\n return useQuery(\n erc20Keys.detail.decimals({ contractAddress: tokenAddress }),\n async () => {\n invariant(contract, \"Contract not given\")\n\n return contract.decimals()\n },\n {\n enabled: Boolean(contract) && Boolean(isAddress(tokenAddress)),\n // this value can never change\n staleTime: Infinity,\n }\n )\n}\n\nexport const useTokenAllowance = (tokenAddress: string, spender: string) => {\n const { account } = useWeb3React()\n const contract = useTokenContract(tokenAddress)\n\n return useQuery(\n erc20Keys.detail.allowance({ contractAddress: tokenAddress, account, spender }),\n async () => {\n invariant(account, \"Account not given\")\n invariant(contract, \"Contract not given\")\n invariant(isAddress(spender), \"Spender address is invalid\")\n invariant(isAddress(tokenAddress), \"Token address is invalid\")\n\n return contract.allowance(account, spender)\n },\n {\n enabled: Boolean(account) && Boolean(isAddress(tokenAddress)) && Boolean(isAddress(spender)),\n }\n )\n}\n\nconst DEFAULT_APPROVAL_AMOUNT = ethers.constants.MaxUint256\n\nexport const useApproval = (tokenAddress: string, spender: string) => {\n const { account } = useWeb3React()\n const { data: allowance } = useTokenAllowance(tokenAddress, spender)\n const { enqueueSnackbar } = useSnackbar()\n const queryClient = useQueryClient()\n const contract = useTokenContract(tokenAddress)\n\n return useMutation(\n async () => {\n invariant(contract, \"Contract not given\")\n invariant(isAddress(spender), \"Spender address is invalid\")\n invariant(isAddress(tokenAddress), \"Token address is invalid\")\n\n if (allowance && allowance.gte(DEFAULT_APPROVAL_AMOUNT)) {\n return\n }\n\n const tx = await contract.approve(spender, DEFAULT_APPROVAL_AMOUNT)\n await tx.wait()\n\n return DEFAULT_APPROVAL_AMOUNT\n },\n {\n onSuccess: (result) => {\n enqueueSnackbar(`Approval success`, { variant: \"success\" })\n // update new allowance\n queryClient.setQueriesData(\n erc20Keys.detail.allowance({ contractAddress: tokenAddress, account, spender }),\n () => result\n )\n // invalidate old allowance. We need to return this to await it\n return queryClient.invalidateQueries(\n erc20Keys.detail.allowance({ contractAddress: tokenAddress, account, spender })\n )\n },\n }\n )\n}\n","import { Button } from \"@mantine/core\"\nimport { Dots } from \"components/loading/Dots.component\"\nimport { BigNumber } from \"ethers\"\nimport { useApproval, useTokenAllowance } from \"helpers/tokenQueries\"\nimport { isAddress } from \"helpers/useContract.hook\"\nimport React from \"react\"\n\ninterface IApprovalButtonProps {\n tokenAddress: string\n contractAddress: string\n buttonReplaces: JSX.Element\n disabled?: boolean\n minAllowance: BigNumber\n}\n\nexport const ApprovalButton: React.FC = ({\n tokenAddress,\n contractAddress,\n buttonReplaces,\n disabled,\n minAllowance,\n}) => {\n const { data: tokenAllowance } = useTokenAllowance(tokenAddress, contractAddress)\n const { mutate: approve, isLoading: isApproving } = useApproval(tokenAddress, contractAddress)\n\n if (disabled) {\n return buttonReplaces\n }\n\n // required so UI looks decent whilst token address is being input\n if (!isAddress(tokenAddress)) {\n return buttonReplaces\n }\n\n // not sure if this is the best way to represent the allowance loading\n if (!tokenAllowance) {\n return \n )\n}\n","import { parseUnits } from \"@ethersproject/units\"\nimport { BigNumber } from \"ethers\"\nimport Numeral from \"numeral\"\n\n// try to parse a user entered amount for a given token\nexport function tryParseAmount(value?: string, tokenDecimals?: number): BigNumber | undefined {\n if (!value || !tokenDecimals) {\n return undefined\n }\n try {\n const typedValueParsed = parseUnits(value, tokenDecimals)\n if (typedValueParsed.toString() !== \"0\") {\n return typedValueParsed\n }\n } catch (error) {\n // should fail if the user specifies too many decimal places of precision (or maybe exceed max uint?)\n console.error(`Failed to parse input amount: \"${value}\"`, error)\n }\n // necessary for all paths to return a value\n return undefined\n}\n\nconst formatK = (value: string) => {\n return Numeral(value).format(\"0.[00]a\")\n}\n\nexport const formatNumber = (number: any, scale = true) => {\n if (isNaN(number) || number === \"\" || number === undefined) {\n return \"0\"\n }\n const num = parseFloat(number)\n\n if (num > 500000000 && scale) {\n return formatK(num.toFixed(0))\n }\n\n if (num === 0) {\n return \"0\"\n }\n\n if (num < 0.0001 && num > 0) {\n return \"< 0.0001\"\n }\n\n if (num > 1000) {\n return \"\" + Number(parseFloat(String(num)).toFixed(0)).toLocaleString()\n }\n\n return parseFloat(String(num)).toPrecision(4)\n}\n","import { BigNumber, ethers } from \"ethers\"\nimport { groupBy, prop, uniq, pluck } from \"ramda\"\n\nimport type { IContributor } from \"./types\"\n\nconst TOKEN_ASSUMED_NUM_DECIMALS = 18\n\n// parses contributors string into list containing addresses including\n// duplicates\nconst parseRawContributors = (parsedText: string) => {\n if (parsedText === \"\") {\n return []\n }\n\n const numLines = parsedText.split(\"\\n\").length\n // the 'g' flag indicates this is stateful. It remembers the last match index\n const pattern = RegExp(/(0x[0-9a-fA-F]{40}).+?([0-9.]+)/, \"g\")\n const addresses: IContributor[] = []\n // returns a string iterator of matches\n const matches = parsedText.matchAll(pattern)\n for (const match of matches) {\n addresses.push({\n address: ethers.utils.getAddress(match[1]),\n value: ethers.utils.parseUnits(match[2], TOKEN_ASSUMED_NUM_DECIMALS),\n })\n }\n\n if (addresses.length !== numLines) {\n throw new Error(`${numLines} lines in input but only found ${addresses.length} contributors`)\n }\n\n return addresses\n}\n\nexport interface IParseContributorResult {\n contributors: IContributor[]\n // number of parsed contributors (incl duplicates)\n totalContributions: number\n // number of unique contributors\n totalDistinctContributors: number\n // sum of total input\n totalRaised: BigNumber\n}\n\n// parses contributors and dedupes them, summing their values\nexport const parseContributors = (parsedText: string): IParseContributorResult => {\n const parsedContributors = parseRawContributors(parsedText)\n // ensure addresses returned in the same order\n const uniqueAddresses = uniq(pluck(\"address\", parsedContributors))\n // remove duplicates addresses and sum their values\n const contributors = groupBy(prop(\"address\"), parsedContributors)\n\n const result = uniqueAddresses.map((address: string) => {\n return {\n address,\n value: pluck(\"value\", contributors[address]).reduce((a, b) => a.add(b), BigNumber.from(0)),\n }\n })\n\n return {\n contributors: result,\n totalContributions: parsedContributors.length,\n totalDistinctContributors: result.length,\n totalRaised: result.reduce((a, b) => a.add(b.value), BigNumber.from(0)),\n }\n}\n","import { useWeb3React } from \"@web3-react/core\"\nimport { BigNumber, BigNumberish, Contract } from \"ethers\"\nimport { useHasBuyerRole } from \"features/shopkeeper/queries\"\nimport { useShopkeeperContract } from \"features/shopkeeper/useShopkeeper.hook\"\nimport { useSnackbar } from \"notistack\"\nimport { useQueryClient, useMutation } from \"react-query\"\nimport invariant from \"tiny-invariant\"\n\nimport type { IContributor } from \"../types\"\n\nimport { useHasCreatorRole } from \"./adminQueries\"\nimport { tokenDistributorKeys } from \"./queryKeys\"\nimport { IDistributionInfo, IDeposits } from \"./types\"\nimport { useTokenDistributorContract } from \"./useTokenDistributorContract.hook\"\n\nexport const useStartDistribution = (distributionId: BigNumberish) => {\n const contract = useTokenDistributorContract()\n const queryClient = useQueryClient()\n const { enqueueSnackbar } = useSnackbar()\n const { chainId, account } = useWeb3React()\n\n return useMutation(\n async () => {\n invariant(contract, \"Token distributor contract not given\")\n const tx = await contract.start(distributionId)\n\n const receipt = await tx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Transaction failed\")\n }\n },\n {\n onError: (error: any) => {\n enqueueSnackbar(error?.data?.message || error.message || error, {\n variant: \"error\",\n })\n },\n onSuccess: () => {\n enqueueSnackbar(`Distribution started`, {\n variant: \"success\",\n })\n if (account) {\n queryClient.invalidateQueries(tokenDistributorKeys.hasCreatorRole(account, chainId))\n }\n if (chainId) {\n // optimistically update isSettingUp for a nicer UI\n queryClient.setQueryData(\n tokenDistributorKeys.allInfo(chainId),\n (prev) =>\n prev\n ? prev.map((d) => ({\n ...d,\n isSettingUp: d.distributionId === distributionId ? false : d.isSettingUp,\n }))\n : []\n )\n }\n },\n }\n )\n}\n\nexport const useAbandonDistribution = (distributionId: BigNumberish) => {\n const contract = useTokenDistributorContract()\n const queryClient = useQueryClient()\n const { enqueueSnackbar } = useSnackbar()\n const { chainId } = useWeb3React()\n\n return useMutation(\n async () => {\n invariant(contract, \"Token distributor contract not given\")\n const tx = await contract.abandon(distributionId)\n\n const receipt = await tx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Transaction failed\")\n }\n },\n {\n onError: (error: any) => {\n enqueueSnackbar(error?.data?.message || error.message || error, {\n variant: \"error\",\n })\n },\n onSuccess: () => {\n enqueueSnackbar(`Distribution abandoned and credit refunded`, {\n variant: \"success\",\n })\n if (chainId) {\n // optimistically update isSettingUp for a nicer UI\n queryClient.setQueryData(\n tokenDistributorKeys.allInfo(chainId),\n (prev) =>\n prev\n ? prev.map((d) => ({\n ...d,\n abandoned: d.distributionId === distributionId ? true : d.abandoned,\n }))\n : []\n )\n }\n },\n }\n )\n}\n\ninterface ICreateMutationParams {\n distributionName: string\n contributors: IContributor[]\n distributionTokenAddress: string\n}\n\nexport const useCreateDistribution = () => {\n const { enqueueSnackbar } = useSnackbar()\n const contract = useTokenDistributorContract()\n const shopkeeperContract = useShopkeeperContract()\n const { data: hasBuyerRole } = useHasBuyerRole()\n const { data: hasCreatorRole } = useHasCreatorRole()\n const queryClient = useQueryClient()\n const { chainId, account } = useWeb3React()\n\n return useMutation(\n async ({ distributionName, distributionTokenAddress, contributors }: ICreateMutationParams) => {\n invariant(contract, \"Token distributor contract not given\")\n invariant(\n contributors.length <= 200,\n `can only create/add 200 contributors in each tx. Received: ${contributors.length}`\n )\n\n // when user is a buyer (paying credits)\n if (hasBuyerRole && !hasCreatorRole) {\n invariant(shopkeeperContract, \"Shopkeeper contract not given\")\n const createTx = await shopkeeperContract.grantAndCreate(\n distributionName,\n distributionTokenAddress,\n contributors.map(({ address }) => address),\n contributors.map(({ value }) => value)\n )\n const receipt = await createTx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Transaction failed\")\n }\n const distributionId = receipt.events[2].args[1]\n return distributionId\n }\n\n // when user is a creator (doesnt use credits)\n const createTx = await contract.create(\n distributionName,\n distributionTokenAddress,\n contributors.map(({ address }) => address),\n contributors.map(({ value }) => value)\n )\n\n const receipt = await createTx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Transaction failed\")\n }\n\n // Note that these are different events to the buyer path\n const distributionId = receipt.events[0].args[1]\n return distributionId\n },\n {\n onError: (error: any) => {\n enqueueSnackbar(error?.data?.message || error.message || error, {\n variant: \"error\",\n })\n },\n onSuccess: (distributionId: BigNumber, variables) => {\n enqueueSnackbar(`Distribution created with id: ${distributionId}`, {\n variant: \"success\",\n })\n invariant(account, \"account not given\")\n // optimistically update this as we know it exists now\n queryClient.setQueryData(\n tokenDistributorKeys.allInfo(chainId),\n (prev) =>\n prev\n ? [\n ...prev,\n {\n distributionId,\n name: variables.distributionName,\n distributionToken: variables.distributionTokenAddress,\n totalRaised: BigNumber.from(0),\n totalDistributionTokenWithdrawn: BigNumber.from(0),\n paused: false,\n isSettingUp: true,\n creator: account,\n abandoned: false,\n },\n ]\n : []\n )\n },\n }\n )\n}\ninterface IAddMutationParams {\n distributionId: BigNumberish\n contributors: IContributor[]\n}\n\ninterface IAddContributorsParams extends IAddMutationParams {\n contract: Contract\n}\n\nasync function addContributors({ contract, distributionId, contributors }: IAddContributorsParams) {\n if (contributors.length > 200) {\n throw new Error(\n `can only create/add 200 contributors in each tx. Received: ${contributors.length}`\n )\n }\n\n const addTx = await contract.addContributors(\n distributionId,\n contributors.map(({ address }) => address),\n contributors.map(({ value }) => value)\n )\n\n const receipt = await addTx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Transaction failed\")\n }\n\n return contributors\n}\n\nexport const useAddContributors = () => {\n const { enqueueSnackbar } = useSnackbar()\n const contract = useTokenDistributorContract()\n\n return useMutation(\n ({ distributionId, contributors }: IAddMutationParams) => {\n invariant(contract, \"Contract not given\")\n\n return addContributors({\n contract,\n distributionId,\n contributors,\n })\n },\n {\n onError: (error: any) => {\n enqueueSnackbar(error?.data?.message || error.message || error, {\n variant: \"error\",\n })\n },\n onSuccess: (contributors: IContributor[]) => {\n enqueueSnackbar(`Added ${contributors.length} contributors`, {\n variant: \"success\",\n })\n },\n }\n )\n}\n\ninterface IDepositParams {\n distributionId: BigNumberish\n unlockTime: BigNumberish\n amountHuman: string\n contract: Contract\n}\n\nasync function deposit({ contract, distributionId, amountHuman, unlockTime }: IDepositParams) {\n const depositTx = await contract.deposit(distributionId, amountHuman.toBigNumber(18), unlockTime)\n const receipt = await depositTx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Transaction failed\")\n }\n return receipt\n}\n\nexport const useMakeDeposit = () => {\n const queryClient = useQueryClient()\n const { enqueueSnackbar } = useSnackbar()\n const contract = useTokenDistributorContract()\n const { chainId } = useWeb3React()\n\n return useMutation(\n ({ distributionId, amountHuman, unlockTime }: Omit) => {\n invariant(contract, \"Contract not given\")\n\n return deposit({\n contract,\n distributionId,\n amountHuman,\n unlockTime,\n })\n },\n {\n onError: (error: any) => {\n enqueueSnackbar(error?.data?.message || error.message || error, {\n variant: \"error\",\n })\n },\n onSuccess: (result, { distributionId, amountHuman, unlockTime }) => {\n enqueueSnackbar(`Deposit created`, {\n variant: \"success\",\n })\n // optimistically update deposits\n queryClient.setQueryData(\n tokenDistributorKeys.detail.deposits(distributionId.toString(), chainId),\n (prev) =>\n prev === undefined\n ? {\n deposits: [\n {\n depositId: 0,\n amount: amountHuman.toBigNumber(18),\n unlockTime: BigNumber.from(unlockTime),\n },\n ],\n totalDeposited: amountHuman.toBigNumber(18),\n }\n : {\n ...prev,\n deposits: [\n ...prev.deposits,\n {\n depositId: prev.deposits.length,\n amount: amountHuman.toBigNumber(18),\n unlockTime: BigNumber.from(unlockTime),\n },\n ].sort((a, b) => (a.unlockTime.gt(b.unlockTime) ? 1 : -1)),\n }\n )\n return queryClient.invalidateQueries(\n tokenDistributorKeys.detail.deposits(distributionId.toString())\n )\n },\n }\n )\n}\n","import { useUSDAddress } from \"constants/addresses\"\n\nimport { Textarea, TextInput, Button, Text, Title } from \"@mantine/core\"\nimport { ApprovalButton } from \"components/ApprovalButton.component\"\nimport { Box, Flex } from \"components/Layout.component\"\nimport { BigNumber, ethers } from \"ethers\"\nimport { useHasBuyerRole } from \"features/shopkeeper/queries\"\nimport { useShopkeeperContractAddress } from \"features/shopkeeper/useShopkeeper.hook\"\nimport { formatNumber } from \"helpers/numbers\"\nimport { useTokenDecimals } from \"helpers/tokenQueries\"\nimport { splitEvery } from \"ramda\"\nimport React from \"react\"\n\nimport { parseContributors, IParseContributorResult } from \"../parseContributors\"\nimport { useAddContributors, useCreateDistribution } from \"../queries/adminMutations\"\n\ninterface ICreateTokenDistributionProps {\n onComplete?: () => void\n}\n\nexport const CreateTokenDistribution: React.FC = ({\n onComplete,\n}) => {\n const [pastedContributors, setPastedContributors] = React.useState(\"\")\n const [contributorError, setContributorError] = React.useState(\"\")\n const [tokenAddressError, setTokenAddressError] = React.useState(\"\")\n const [result, setResult] = React.useState()\n const [name, setName] = React.useState(\"\")\n const [tokenAddress, setTokenAddress] = React.useState(\"\")\n const [isComplete, setIsComplete] = React.useState(false)\n const shopkeeperAddress = useShopkeeperContractAddress()\n const usdAddress = useUSDAddress()\n\n const { mutateAsync: createDistribution, isLoading: createDistributionLoading } =\n useCreateDistribution()\n const { mutateAsync: addContributors, isLoading: addContributorsLoading } = useAddContributors()\n const [distributionId, setDistributionId] = React.useState(null)\n const [addedContributorAddresses, setAddedContributorAddresses] = React.useState>(\n new Set()\n )\n const { data: numTokenDecimals } = useTokenDecimals(tokenAddress)\n const { data: hasBuyerRole } = useHasBuyerRole()\n\n React.useEffect(() => {\n try {\n const parsed = parseContributors(pastedContributors)\n setResult(parsed)\n setContributorError(\"\")\n } catch (e: any) {\n setContributorError(e.message)\n }\n }, [pastedContributors])\n\n React.useEffect(() => {\n if (!tokenAddress) {\n return\n }\n try {\n ethers.utils.getAddress(tokenAddress)\n setTokenAddressError(\"\")\n } catch (e: any) {\n setTokenAddressError(e.message)\n }\n }, [tokenAddress])\n\n const allAddressesAdded = result?.contributors.every((contributor) =>\n addedContributorAddresses.has(contributor.address)\n )\n\n const allDataProvided =\n tokenAddress &&\n name &&\n !tokenAddressError &&\n !contributorError &&\n result &&\n result.contributors.length > 0 &&\n !allAddressesAdded &&\n numTokenDecimals &&\n numTokenDecimals === 18\n\n const onCreateDistribution = async () => {\n if (!allDataProvided) {\n console.error(\"missing information required to create distribution\")\n return\n }\n\n const [createBatch, ...addBatches] = splitEvery(200, result.contributors)\n\n // happy path if no errors in creation/adding of contributors\n if (distributionId === null) {\n const distributionId = await createDistribution({\n distributionName: name,\n distributionTokenAddress: ethers.utils.getAddress(tokenAddress),\n contributors: createBatch,\n })\n setDistributionId(distributionId)\n setAddedContributorAddresses(new Set(createBatch.map((c) => c.address)))\n\n for (const batch of addBatches) {\n await addContributors({\n distributionId,\n contributors: batch,\n })\n setAddedContributorAddresses((prev) => new Set([...prev, ...batch.map((c) => c.address)]))\n }\n setIsComplete(true)\n onComplete && onComplete()\n return\n }\n\n // if distribution was created in first tx but one or more of add\n // contributor txes failed\n const remainingContributors = result.contributors.filter(\n (c) => !addedContributorAddresses.has(c.address)\n )\n const batches = splitEvery(200, remainingContributors)\n for (const batch of batches) {\n await addContributors({\n distributionId,\n contributors: batch,\n })\n setAddedContributorAddresses((prev) => new Set([...prev, ...batch.map((c) => c.address)]))\n }\n }\n\n return (\n \n \n Paste contributors\n \n \n \n Enter one address and the amount they contributed on each line.\n \n setPastedContributors(e.currentTarget.value)}\n minRows={11}\n />\n \n \n \n {result && (\n \n \n Total Contributions:\n {formatNumber(result?.totalContributions)}\n \n \n Total Distinct Contributors:\n {result?.totalDistinctContributors}\n \n \n Total Raised:\n ${result?.totalRaised.toFixed(4)}\n \n \n )}\n \n Distribution name\n \n setName(e.currentTarget.value)}\n />\n \n \n Distribution Token Address\n \n \n setTokenAddress(e.currentTarget.value)}\n />\n {numTokenDecimals && (\n \n \n Number of token decimals (MUST be equal to 18): {numTokenDecimals}\n \n \n )}\n \n \n \n Create\n \n }\n />\n \n \n \n \n \n \n \n )\n}\n","import generatePicker from \"antd/es/date-picker/generatePicker\"\nimport dateFnsGenerateConfig from \"rc-picker/lib/generate/dateFns\"\nimport \"antd/es/date-picker/style/index\"\n\nexport const DatePicker = generatePicker(dateFnsGenerateConfig)\n","import format from \"date-fns/format\"\nimport formatDistanceToNow from \"date-fns/formatDistanceToNow\"\n\n// iso string to human readable string\nexport const isoToHuman = (isoDate: string) => {\n const date = new Date(isoDate)\n return format(date, \"PP @ p\")\n}\n\n// used for formatting block timestamps\nexport const secondsToHuman = (seconds: number) => {\n const date = new Date(seconds * 1000)\n return format(date, \"PP @ p\")\n}\n\nexport const secondsToNow = (seconds: number) => {\n return formatDistanceToNow(new Date(seconds * 1000))\n}\n","import { useTokenDistributorAddress } from \"constants/addresses\"\n\nimport {\n Table,\n Alert,\n Spoiler,\n Text,\n Title,\n Anchor,\n TextInput,\n Button,\n Checkbox,\n Card,\n Group,\n SimpleGrid,\n} from \"@mantine/core\"\nimport { ApprovalButton } from \"components/ApprovalButton.component\"\nimport { DatePicker } from \"components/DatePicker.component\"\nimport { Box, Flex } from \"components/Layout.component\"\nimport { Spinner } from \"components/loading/Spinner.component\"\nimport isFuture from \"date-fns/isFuture\"\nimport setMinutes from \"date-fns/setMinutes\"\nimport setSeconds from \"date-fns/setSeconds\"\nimport { BigNumber, BigNumberish } from \"ethers\"\nimport { secondsToNow, secondsToHuman } from \"helpers/dates\"\nimport { formatNumber } from \"helpers/numbers\"\nimport React from \"react\"\nimport { useNavigate } from \"react-router-dom\"\nimport invariant from \"tiny-invariant\"\n\nimport {\n useMakeDeposit,\n useStartDistribution,\n useAbandonDistribution,\n} from \"../queries/adminMutations\"\nimport { useContributorAddresses, useDeposits } from \"../queries/adminQueries\"\nimport type { IDistributionInfo } from \"../queries/types\"\n\ninterface IDepositButtonProps {\n distribution: IDistributionInfo\n amount: string\n timestampInSeconds: number\n}\n\nconst DepositButton: React.FC = ({\n distribution,\n amount,\n timestampInSeconds,\n}) => {\n const { mutate: makeDeposit, isLoading: isMakeDepositLoading } = useMakeDeposit()\n const tokenDistributorAddress = useTokenDistributorAddress()\n return (\n {\n invariant(distribution, \"distribution not given\")\n invariant(amount.length, \"amount not given\")\n invariant(timestampInSeconds, \"time must be in the future\")\n makeDeposit({\n distributionId: distribution.distributionId,\n amountHuman: amount,\n unlockTime: timestampInSeconds,\n })\n }}\n >\n Deposit\n \n }\n />\n )\n}\n\nconst Deposits: React.FC<{ distributionId: BigNumberish }> = ({ distributionId }) => {\n const { data: deposits, isLoading, isError } = useDeposits(distributionId)\n if (!deposits || isError) {\n return null\n }\n\n if (isLoading) {\n return (\n \n \n \n )\n }\n\n return (\n <>\n \n Deposits\n \n \n \n \n \n \n \n \n \n \n \n {deposits.deposits.map(({ amount, unlockTime, depositId }) => {\n const isInPast = !isFuture(new Date(unlockTime.toNumber() * 1000))\n return (\n \n \n \n \n \n )\n })}\n \n
Total deposited: {deposits.totalDeposited.toFixed(6)}
Unlock timeAmountDeposit id
\n {secondsToHuman(unlockTime.toNumber())}{\" \"}\n \n {!isInPast && `(${secondsToNow(unlockTime.toNumber())})`}\n \n {amount.toFixed(2)}{depositId}
\n \n )\n}\n\nconst ContributorInfo: React.FC<{ distributionId: BigNumberish }> = ({ distributionId }) => {\n const { data: contributorAddresses } = useContributorAddresses(distributionId)\n if (!contributorAddresses) {\n return null\n }\n\n return (\n \n \n Contributors\n {contributorAddresses.map((address) => (\n {address}\n ))}\n \n \n )\n}\n\nconst AbandonedAlertBox = () => (\n \n \n This distribution has been abandoned and cannot be edited\n \n \n)\n\nconst SetupAlertBox: React.FC<{ distribution: IDistributionInfo; onAbandon?: () => void }> = ({\n distribution,\n onAbandon,\n}) => {\n const { mutate: startDistribution, isLoading: isStartLoading } = useStartDistribution(\n distribution.distributionId\n )\n const { mutate: abandonDistribution, isLoading: isAbandonLoading } = useAbandonDistribution(\n distribution.distributionId\n )\n const navigate = useNavigate()\n\n if (distribution.abandoned) {\n return \n }\n\n if (!distribution.isSettingUp) {\n return null\n }\n return (\n \n \n \n This distribution is still in setup mode and is NOT being shown to users.\n \n Start the distribution to finalise setup. Tokens can be deposited at any time.\n \n If you made a mistake you can abandon your distribution and start again.\n \n \n startDistribution(undefined, {\n onSuccess: () => navigate(`/admin/distribute/${distribution.distributionId}`),\n })\n }\n >\n Start distribution\n \n \n \n abandonDistribution(undefined, { onSuccess: () => onAbandon && onAbandon() })\n }\n >\n Abandon distribution\n \n \n \n \n \n \n )\n}\n\nexport const Deposit: React.FC<{ distribution: IDistributionInfo; onAbandon?: () => void }> = ({\n distribution,\n onAbandon,\n}) => {\n const [amount, setAmount] = React.useState(\"\")\n const [time, setTime] = React.useState(setSeconds(setMinutes(new Date(), 0), 0))\n const timestampInSeconds = Math.floor(Number(time) / 1000)\n const isInPast = !isFuture(new Date(timestampInSeconds * 1000))\n\n return (\n \n \n \n \n \n \n \n {distribution.name}\n \n Distribution id: {distribution.distributionId.toString()}\n \n {distribution.distributionToken}\n \n \n \n\n Fundraise amount: ${formatNumber(distribution.totalRaised.toFixed(2))}\n \n Num tokens withdrawn: {distribution.totalDistributionTokenWithdrawn.toFixed(6)}\n \n Created by: {distribution.creator}\n\n \n \n \n\n \n \n \n\n \n \n Amount\n \n setAmount(e.currentTarget.value)} required />\n \n \n\n \n Unlock Date & Time\n \n setTime(date)}\n value={time}\n />\n \n \n\n \n {isInPast ? (\n Date is in the past\n ) : (\n \n {secondsToNow(timestampInSeconds)} from now\n \n )}\n \n \n\n \n \n \n \n )\n}\n","import { Stepper, Text } from \"@mantine/core\"\nimport { Box, Flex } from \"components/Layout.component\"\nimport { Spinner } from \"components/loading/Spinner.component\"\nimport { useIsBuyerOrCreator } from \"features/tokendistributor/queries/adminQueries\"\nimport React from \"react\"\n\nimport { CreateTokenDistribution } from \"./components/CreateDistribution.component\"\nimport { Deposit } from \"./components/Deposit.component\"\nimport { useUncompletedDistribution } from \"./queries/adminQueries\"\n\nfunction CreateStepper() {\n const { data: uncompletedDistribution, isLoading } = useUncompletedDistribution()\n const hasBuyerOrCreatorRoles = useIsBuyerOrCreator()\n const [active, setActive] = React.useState(0)\n\n React.useEffect(() => {\n if (uncompletedDistribution) {\n if (uncompletedDistribution.abandoned) {\n setActive(0)\n } else {\n setActive(1)\n }\n }\n }, [setActive, uncompletedDistribution])\n\n if (isLoading) {\n return \n }\n\n return (\n <>\n \n \n \n \n {hasBuyerOrCreatorRoles ? (\n setActive(1)} />\n ) : (\n \n You do not have the required permissions to create a token distribution. Ask an\n admin to grant you temporary access.\n \n )}\n \n \n \n \n {uncompletedDistribution ? (\n setActive(0)} distribution={uncompletedDistribution} />\n ) : (\n \n )}\n \n \n \n \n \n )\n}\n\nexport default CreateStepper\n","import { Select, Title } from \"@mantine/core\"\nimport { Box, Flex } from \"components/Layout.component\"\nimport { Spinner } from \"components/loading/Spinner.component\"\nimport React from \"react\"\n\nimport { Deposit } from \"./components/Deposit.component\"\nimport { useTokenDistribution, useActiveTokenDistributions } from \"./queries/adminQueries\"\n\nconst DistributePage = () => {\n const [selectedDistribution, setSelectedDistribution] = React.useState(null)\n const { data: distributionInfo } = useTokenDistribution(selectedDistribution)\n const { data: distributions } = useActiveTokenDistributions()\n\n if (!distributions) {\n return \n }\n\n return (\n \n Distribute Tokens\n\n \n \n ({\n value: item.distributionId.toString(),\n label: item.name,\n }))}\n value={selectedDistribution}\n onChange={setSelectedDistribution}\n />\n \n \n {distributionInfo && }\n \n )\n}\n\nexport default DistributePage\n","import { Text } from \"@mantine/core\"\nimport { Spinner } from \"components/loading/Spinner.component\"\nimport React from \"react\"\nimport { useParams } from \"react-router-dom\"\n\nimport { Deposit } from \"./components/Deposit.component\"\nimport { useTokenDistribution } from \"./queries/adminQueries\"\n\nconst SingleDistributionPage = () => {\n const { distributionId } = useParams()\n const { data: distributionInfo, isLoading } = useTokenDistribution(distributionId || null)\n\n if (isLoading) {\n return \n }\n if (!distributionInfo) {\n return (\n \n An error occurred fetching the distribution. Double check the id. Are you sure it exists?\n \n )\n }\n\n return \n}\nexport default SingleDistributionPage\n","import { useWeb3React } from \"@web3-react/core\"\nimport { Contract } from \"ethers\"\nimport { useQueryClient, useMutation } from \"react-query\"\n\nimport { tokenDistributorKeys } from \"./queryKeys\"\nimport { useTokenDistributorContract } from \"./useTokenDistributorContract.hook\"\n\ninterface IClaimTokens {\n contract: Contract | null | undefined\n account: string | null | undefined\n distributionId: string\n}\n\nasync function claimTokens({ contract, account, distributionId }: IClaimTokens) {\n if (!contract || !account) {\n throw new Error(\"Contract or account not given\")\n }\n\n const pendingReward = await contract.pendingReward(distributionId, account)\n const tx = await contract.withdraw(distributionId, pendingReward)\n const receipt = await tx.wait()\n if (receipt.status !== 1) {\n throw new Error(\"Transaction failed\")\n }\n return pendingReward\n}\n\nexport const useClaimTokens = () => {\n const queryClient = useQueryClient()\n const { account } = useWeb3React()\n const contract = useTokenDistributorContract()\n\n return useMutation(\n (distributionId: string) => {\n return claimTokens({ contract, account, distributionId })\n },\n {\n onSuccess: () => {\n // return here to make sure it's awaited\n return queryClient.invalidateQueries(tokenDistributorKeys.list(account))\n },\n }\n )\n}\n","import { useWeb3React } from \"@web3-react/core\"\nimport isPast from \"date-fns/isPast\"\nimport { dropWhile } from \"ramda\"\nimport { useQuery } from \"react-query\"\nimport invariant from \"tiny-invariant\"\n\nimport type { IUserTokenDistribution } from \"../types\"\n\nimport { useDeposits } from \"./adminQueries\"\nimport { tokenDistributorKeys } from \"./queryKeys\"\nimport { useTokenDistributorContract } from \"./useTokenDistributorContract.hook\"\n\n// we get these separately because it's an expensive view call (iterates over\n// all contributors in all contributions) and we think calling it many times may\n// get us rate limited by a node\nconst useWalletDistributionIds = () => {\n const { account, chainId } = useWeb3React()\n const contract = useTokenDistributorContract()\n\n return useQuery(\n // query key\n tokenDistributorKeys.walletDistributionIds(account, chainId),\n // return function\n async () => {\n invariant(contract, \"Contract not given\")\n invariant(account, \"Account not given\")\n\n const numDistributions = await contract.distributionLength()\n const allDistributionIds = []\n for (let i = 0; i < numDistributions; i++) {\n const contributors = await contract.getContributors(i)\n if (contributors.includes(account)) {\n allDistributionIds.push(i)\n }\n }\n\n const distributionIds = []\n for (const distributionId of allDistributionIds) {\n if (contract.version === 1) {\n distributionIds.push(distributionId)\n continue\n }\n\n const distribution = await contract.distributions(distributionId)\n const paused = distribution[4]\n const isSettingUp = distribution[5]\n const abandoned = distribution[7]\n if (!isSettingUp && !abandoned && !paused) {\n distributionIds.push(distributionId)\n }\n }\n\n return distributionIds\n },\n {\n enabled: Boolean(account) && Boolean(contract),\n // this rarely changes\n staleTime: 60_000,\n }\n )\n}\n\nexport const useTokenDistributions = () => {\n const { account, chainId } = useWeb3React()\n const contract = useTokenDistributorContract()\n const { data: distributionIds } = useWalletDistributionIds()\n\n return useQuery(\n // query key\n tokenDistributorKeys.list(account, chainId),\n // return function\n async () => {\n invariant(distributionIds, \"DistributionIds not given\")\n invariant(contract, \"Contract not given\")\n\n const result: IUserTokenDistribution[] = []\n for (const distributionId of distributionIds) {\n const distributionInfo = await contract.distributions(distributionId)\n const userInfo = await contract.userInfo(distributionId, account)\n const pendingReward = await contract.pendingReward(distributionId, account)\n\n result.push({\n distributionId: distributionId.toString(),\n name: distributionInfo[0],\n tokenAddress: distributionInfo[1],\n tokensWithdrawn: userInfo[0],\n pendingTokens: pendingReward,\n })\n }\n\n return result\n },\n // query options\n {\n enabled: Boolean(account) && Boolean(contract) && Boolean(distributionIds),\n }\n )\n}\n\nexport const useNextUnlockDate = (distributionId: string) => {\n const { data: deposits } = useDeposits(distributionId)\n\n if (!deposits) {\n return null\n }\n\n const depositDates = deposits.deposits.map(\n (deposit) => new Date(deposit.unlockTime.toNumber() * 1000)\n )\n const nextUnlockDate = dropWhile(isPast, depositDates)[0]\n\n return nextUnlockDate || null\n}\n","import { Button, Text, Title } from \"@mantine/core\"\nimport { useMediaQuery } from \"@mantine/hooks\"\nimport { Table } from \"antd\"\nimport { Box } from \"components/Layout.component\"\nimport formatDistanceToNowStrict from \"date-fns/formatDistanceToNowStrict\"\nimport { BigNumber } from \"ethers\"\nimport { formatNumber } from \"helpers/numbers\"\nimport React from \"react\"\nimport { theme } from \"theme\"\n\nimport { useClaimTokens } from \"./queries/userMutations\"\nimport { useNextUnlockDate, useTokenDistributions } from \"./queries/userQueries\"\nimport type { IUserTokenDistribution } from \"./types\"\n\nconst { Column } = Table\n\nconst ClaimButton: React.FC<{ distribution: IUserTokenDistribution }> = ({ distribution }) => {\n const { mutate: claim, isLoading: isClaimLoading } = useClaimTokens()\n const nextUnlockDate = useNextUnlockDate(distribution.distributionId.toString())\n\n const noTokensToClaim = distribution.pendingTokens.isZero()\n\n return (\n claim(distribution.distributionId)}\n >\n {noTokensToClaim && nextUnlockDate\n ? `Next unlock in ${formatDistanceToNowStrict(nextUnlockDate)}`\n : \"Claim\"}\n \n )\n}\n\n// when changing column names make sure you update the CSS styles for mobile\n// above as we inject the row names via CSS\nconst TokenDistributorPage = () => {\n const { data: distributions, isLoading } = useTokenDistributions()\n const isDesktop = useMediaQuery(theme.mediaQueries.sm)\n\n return (\n \n \n Token Distributor\n \n \n \n {value}}\n />\n {\n const snipped = `${value.slice(0, 6)}...${value.slice(-4)}`\n return (\n \n {snipped}\n \n )\n }}\n />\n {formatNumber(value.toFixed(4))}}\n />\n {formatNumber(value.toFixed(4))}}\n />\n {\n return \n }}\n />\n
\n
\n
\n )\n}\n\nexport default TokenDistributorPage\n","import { useEffect } from \"react\"\n\nimport { connectorLocalStorageKey } from \"./config\"\nimport { ConnectorNames } from \"./types\"\nimport useAuth from \"./useAuth.hook\"\n\nconst _binanceChainListener = async () =>\n new Promise((resolve) =>\n Object.defineProperty(window, \"BinanceChain\", {\n get() {\n return this.bsc\n },\n set(bsc) {\n this.bsc = bsc\n\n resolve()\n },\n })\n )\n\nconst useEagerConnect = () => {\n const { login } = useAuth()\n\n useEffect(() => {\n const connectorId = window.localStorage.getItem(connectorLocalStorageKey) as ConnectorNames\n\n if (connectorId) {\n const isConnectorBinanceChain = connectorId === ConnectorNames.BSC\n const isBinanceChainDefined = Reflect.has(window, \"BinanceChain\")\n\n // Currently BSC extension doesn't always inject in time.\n // We must check to see if it exists, and if not, wait for it before proceeding.\n if (isConnectorBinanceChain && !isBinanceChainDefined) {\n _binanceChainListener().then(() => login(connectorId))\n\n return\n }\n\n login(connectorId)\n }\n }, [login])\n}\n\nexport default useEagerConnect\n","import \"./bootstrap\"\nimport \"./App.scss\"\n\nimport \"./reset.scss\"\nimport Shopkeeper from \"features/shopkeeper/Shopkeeper.page\"\nimport { AdminLayout } from \"features/site/Admin.layout\"\nimport { SiteLayout } from \"features/site/Site.layout\"\nimport CreateStepper from \"features/tokendistributor/CreateStepper.page\"\nimport DistributeTokens from \"features/tokendistributor/Distribute.page\"\nimport SingleDistribution from \"features/tokendistributor/SingleDistribution.page\"\nimport TokenDistributor from \"features/tokendistributor/TokenDistributor.page\"\nimport useEagerConnect from \"features/web3/useEagerConnect.hook\"\nimport React from \"react\"\nimport { BrowserRouter, Routes, Route, Navigate } from \"react-router-dom\"\nimport { PAGE_URLS } from \"routes\"\n\nfunction App() {\n useEagerConnect()\n\n return (\n \n \n {/* containts the header and footer of the site */}\n }>\n } />\n \n\n }>\n } />\n\n } />\n } />\n } />\n \n } />\n \n \n )\n}\n\nexport default React.memo(App)\n","import { MantineProvider } from \"@mantine/core\"\nimport { Web3ReactProvider } from \"@web3-react/core\"\nimport { getLibrary } from \"features/web3/utils\"\nimport { SnackbarProvider, useSnackbar } from \"notistack\"\nimport React from \"react\"\nimport { isMobile } from \"react-device-detect\"\nimport { QueryClient, QueryClientProvider, QueryCache } from \"react-query\"\nimport { ReactQueryDevtools } from \"react-query/devtools\"\nimport { ThemeProvider as StyledComponentsThemeProvider } from \"styled-components\"\nimport { theme as reskinStyled } from \"theme\"\n\ninterface AllTheProviders {\n children: React.ReactNode\n}\n\nconst HEADER_NOT_FOUND_ERROR = \"header not found\"\n\nconst RQProvider: React.FC = ({ children }) => {\n const { enqueueSnackbar } = useSnackbar()\n const queryClient = React.useMemo(\n () =>\n new QueryClient({\n queryCache: new QueryCache({\n onError: (error: any) => {\n const errorMessage = error.data?.message || error.message || error\n // These errors occur frequently, so we don't want to show them to\n // the user\n if (errorMessage === HEADER_NOT_FOUND_ERROR) {\n console.error(\"Multiple header not found messages suppressed\")\n return\n }\n\n enqueueSnackbar(errorMessage, {\n variant: \"error\",\n })\n },\n }),\n defaultOptions: {\n queries: { notifyOnChangeProps: \"tracked\", retry: 3 },\n },\n }),\n [enqueueSnackbar]\n )\n\n return {children}\n}\n\nexport const AllTheProviders: React.FC = ({ children }) => {\n return (\n \n \n \n \n \n \n {children}\n \n \n \n \n \n )\n}\n","import { ReportHandler } from \"web-vitals\"\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(({ getCLS, getFCP, getFID, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\n\nimport App from \"./App\"\nimport { AllTheProviders } from \"./Providers.component\"\nimport reportWebVitals from \"./reportWebVitals\"\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\")\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}