{"version":3,"sources":["services/etherspot.js","constants/storageConstants.js","constants/chainConstants.js","constants/assetConstants.js","utils/common.js","services/storage.js","assets/aurora.png","services/wallet.js","components/ChainSelect.js","utils/theme.js","components/Modal.js","providers/WalletProvider.js","components/AssetSelect.js","components/Send.js","components/Receive.js","components/History.js","services/collabNfts.js","components/CollabNfts.js","utils/walletConnect.js","providers/WalletConnectProvider.js","components/Wallet.js","containers/App.js","index.js"],"names":["torusWalletProvider","torusWalletAddress","STORAGE_MAIN_KEY","STORAGE_KEY","CHAIN","ETHEREUM_MAINNET","ETHEREUM_KOVAN","POLYGON","AURORA","AURORA_TESTNET","POLYGON_MUMBAI","ADDRESS_ZERO","ethers","constants","AddressZero","COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET","COLLAB_NFT_CONTRACT_ADDRESS_POLYGON_MUMBAI_TESTNET","COLLAB_BOT_ADDRESS","isCaseInsensitiveMatch","a","b","toLowerCase","pause","multiplier","Promise","resolve","setTimeout","formatNumber","value","Intl","NumberFormat","maximumFractionDigits","format","isValidAddress","input","utils","getAddress","e","getErc20TransferData","to","contractAbi","erc20Abi","method","params","Interface","encodeFunctionData","buildTransactions","chain","asset","receiver","amount","data","parseUnits","decimals","address","chainToNativeAsset","undefined","setItem","key","localStorage","getItem","LocalSessionStorage","prefix","setSession","walletAddress","session","JSON","stringify","getSession","result","raw","parse","err","resetSession","SessionStorage","sessionStorageInstance","testnetSessionStorageInstance","etherspotSdkInstances","chainToNetworkName","NetworkNames","Matic","Mainnet","Kovan","Aurora","AuroraTest","Mumbai","testnetNetworks","getEnvForChain","includes","EnvNames","TestNets","MainNets","createTorusWalletProvider","torus","Torus","init","showTorusButton","login","provider","createEtherspotInstance","Error","Web3WalletProvider","connect","connectedTorusProvider","networkName","env","sessionStorage","Sdk","omitWalletProviderNetworkCheck","projectKey","computeContractAccount","getEtherspotChainInstance","getEtherspotFirstInstance","Object","keys","getEtherspotAssets","etherspotInstance","tokens","getTokenListTokens","name","map","logoURI","token","iconUrl","nativeAsset","some","symbol","getEtherspotBalances","assets","filter","tokenAddresses","balances","getAccountBalances","items","balance","assetAddress","gt","estimateEtherspotTransactions","transactions","clearGatewayBatch","etherspotAccount","state","account","excludeManualDeployment","AccountStates","UnDeployed","batchDeployAccount","transaction","batchExecuteAccountTransaction","estimateGatewayBatch","estimation","estimatedGas","estimatedGasPrice","BigNumber","from","mul","sendEtherspotTransactions","waitForHash","submitGatewayBatch","batchHash","hash","reject","temporaryBatchSubscription","notifications$","pipe","notification","type","NotificationTypes","GatewayBatchUpdated","getGatewaySubmittedBatch","submittedBatch","failedStates","GatewayTransactionStates","Canceling","Canceled","Reverted","finishSubscription","unsubscribe","subscribe","signEtherspotTransaction","encodeExecuteAccountTransaction","getSubmittedEtherspotBatch","signMessageWithEtherspotProvider","message","signMessage","signed","console","log","nftAbi","buildTestnetNftFromAuroraToPolygonMigrationTransactions","tokenId","accountAddress","nftContract","registerContract","encodeTransferFrom","buildBurnNftTransaction","contractAddress","encodeBurn","getNftBalanceAndTokenId","callBalanceOf","then","val","toNumber","callTokenOfOwnerByIndex","getNftBalance","connectCollabBot","getAccountMembers","accounts","member","error","batchAddAccountOwner","owner","disconnectCollabBot","batchRemoveAccountOwner","isCollabBotConnected","AccountMemberStates","Added","auroraImage","chainToChainId","chainIdToChain","32","1","137","80001","1313161554","1313161555","chainToChainDetails","title","chainId","rpcUrl","explorerUrl","historyExplorerUrl","transactionExplorerUrl","connectWallet","restoreSession","sessionExists","getWalletAddress","getEtherspotAccountAddress","getSupportedAssets","getBalances","signTransaction","messageBytes","isHexString","toUtf8String","signTypedData","typedData","sendAsync","canSignWithWallet","Deployed","isEtherspotAccountDeployed","getSupportedChains","Wrapper","styled","div","Network","$isCurrent","ChainIcon","img","ChainSelect","onChange","chains","currentChain","onClick","src","fontWeight","color","ModalWrapper","ModalContentWrapper","CloseButton","FiX","Modal","modalContent","children","isVisible","onClose","isOpen","onRequestClose","contentElement","props","style","size","WalletContext","React","createContext","WalletProvider","supportedChains","useState","connectionError","setConnectionError","isConnecting","setIsConnecting","setAddress","setChain","setAssets","balancesPerChain","setBalancesPerChain","isFetchingAssetsAndBalances","setIsFetchingAssetsAndBalances","isEstimating","setIsEstimating","isSendingTransaction","setIsSendingTransaction","transactionsErrorMessage","setTransactionsErrorMessage","transactionsEstimate","setTransactionsEstimate","sentTransactions","setSentTransactions","useCallback","isInitial","supportedChain","useEffect","fetchAssetsAndBalances","fetchedAssets","fetchedBalances","estimateTransactions","chainToEstimate","estimate","sendTransactions","chainToSend","sent","resetSentTransactions","viewTransaction","alert","window","open","focus","wallet","useMemo","isConnected","Provider","useWallet","useContext","$clickable","AssetIcon","$marginRight","AssetSelectEntry","AssetBalance","AssetSelect","currentAsset","assetSelectVisible","setAssetSelectVisible","assetsWithBalances","assetBalance","find","formatUnits","assetsWithPositiveBalances","showAssetSelect","length","SendButton","disabled","RecipientWrapper","AddressInputWrapper","AddressInput","AssetWrapper","AssetInputWrapper","AssetValueInput","ErrorMessage","$marginTop","Fee","TransactionSent","ViewTransaction","CloseTransactionSent","numberInProgressRegex","Send","setAsset","setAmount","addressOrEnsName","setAddressOrEnsName","balanceBN","isAmountPresent","Number","validAmount","test","validAddressOrEnsName","isAmountAboveBalance","sendFieldsValid","debouncedEstimateTransactions","isSubmitDisabled","showFee","newChain","placeholder","el","normalizedAmount","replace","trim","startsWith","normalizeAmount","target","newAsset","formatEther","StyleQrCode","QRCode","Address","Receive","ViewHistory","History","mintCollabNftToAddress","axios","post","headers","requestCollabNftMigration","registerCollabUser","collabId","ListWrapper","Nft","Button","$disabled","Link","BotConnection","collabNftAssetPerChain","CollabNFTS","nftMintingStarted","botAutoConnectionStarted","isLoading","setIsLoading","isMigrating","setIsMigrating","isBurning","setIsBurning","nftsPerChain","setNftsPerChain","isNftMinting","setIsNftMinting","isBotConnected","setIsBotConnected","botAutoConnectionStatus","useRef","onChainSelected","fetchNfts","current","tokenAddress","onMigrateClick","migrationTransactions","smartReloadNfts","nonZeroValue","cb","i","onBurnClick","migrationTransaction","chainNfts","mumbaiExplorerAddressHistory","className","index","href","parseMessageSignParamsFromCallRequest","callRequest","callRequestParams","reverse","displayMessage","parseCallRequest","requestParams","displayParams","label","slice","parsed","ModalTitle","p","CallRequestDetailsRow","CallRequestConfirm","CallRequestReject","DeploymentWarning","WalletConnectContext","walletConnectStorageService","sessions","sessionsRaw","clientMeta","description","url","icons","activeConnectors","WalletConnectProvider","qrScannerVisible","setQrScannerVisible","pendingConnector","setPendingConnector","pendingCallRequest","setPendingCallRequest","setConnectorListeners","connector","on","payload","peerId","storedSessions","WalletConnect","peerMeta","sessionData","approveSession","establishedConnector","activeConnectorsWithoutMatchingPeerId","approveSessionError","scan","removeItem","rejectPendingCallRequest","callId","id","matchingConnector","activeConnector","rejectRequest","isTransaction","approvePendingCallRequest","approveRequest","providerData","delay","onError","onScan","uri","width","marginBottom","TabsContent","TabsButton","$active","TabsNavigation","ConnectWalletButton","TAB","Wallet","urlSearchParams","URLSearchParams","location","search","fromEntries","entries","referralCode","useParams","activeTab","setActiveTab","setNftMintingStarted","setBotAutoConnectionStarted","useWalletConnect","processReferralCode","setAppElement","GlobalStyle","createGlobalStyle","App","exact","path","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.a14a1e4f.chunk.js","sourcesContent":["import {\n EnvNames,\n NetworkNames,\n Sdk,\n Web3WalletProvider,\n SessionStorage,\n AccountStates,\n GatewayTransactionStates,\n addressesEqual,\n NotificationTypes,\n AccountMemberStates,\n} from 'etherspot';\nimport Torus from '@toruslabs/torus-embed';\nimport { BigNumber } from 'ethers';\nimport { isValidAddress, toChecksumAddress } from 'ethereumjs-util';\nimport { map } from 'rxjs/operators';\n\n// constants\nimport { CHAIN } from '../constants/chainConstants';\nimport {\n ADDRESS_ZERO,\n COLLAB_LOCKER_CONTRACT_ADDRESS_AURORA_TESTNET,\n COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET,\n COLLAB_NFT_CONTRACT_ADDRESS_POLYGON_MUMBAI_TESTNET,\n COLLAB_BOT_ADDRESS,\n} from '../constants/assetConstants'\n\n// utils\nimport { isCaseInsensitiveMatch } from '../utils/common';\n\n// services\nimport { getItem, setItem } from './storage';\nimport { chainToNativeAsset } from './wallet'\n\n\nclass LocalSessionStorage extends SessionStorage {\n prefix;\n\n constructor (prefix) {\n super();\n this.prefix = prefix;\n }\n\n setSession = async (walletAddress, session) => {\n if (walletAddress) {\n setItem(`@${this.prefix ?? ''}etherspotSession:${walletAddress}`, JSON.stringify(session))\n setItem(`@${this.prefix ?? ''}etherspotSessionExists`, true);\n }\n }\n\n getSession = (walletAddress) => {\n let result = null;\n\n try {\n const raw = getItem(`@${this.prefix ?? ''}etherspotSession:${walletAddress}`)\n result = raw ? JSON.parse(raw) : null\n } catch (err) {\n //\n }\n\n return result\n }\n\n resetSession = (walletAddress) => {\n setItem(`@${this.prefix ?? ''}etherspotSession:${walletAddress}`, '');\n setItem(`@${this.prefix ?? ''}etherspotSessionExists`, '');\n }\n}\n\nconst sessionStorageInstance = new LocalSessionStorage();\nconst testnetSessionStorageInstance = new LocalSessionStorage('testnet-');\n\nlet etherspotSdkInstances = {};\n\nconst chainToNetworkName = {\n [CHAIN.POLYGON]: NetworkNames.Matic,\n [CHAIN.ETHEREUM_MAINNET]: NetworkNames.Mainnet,\n [CHAIN.ETHEREUM_KOVAN]: NetworkNames.Kovan,\n [CHAIN.AURORA]: NetworkNames.Aurora,\n [CHAIN.AURORA_TESTNET]: NetworkNames.AuroraTest,\n [CHAIN.POLYGON_MUMBAI]: NetworkNames.Mumbai,\n};\n\nconst testnetNetworks = [\n CHAIN.ETHEREUM_KOVAN,\n CHAIN.AURORA_TESTNET,\n CHAIN.POLYGON_MUMBAI,\n];\n\nconst getEnvForChain = (chain) => {\n if (testnetNetworks.includes(chain)) return EnvNames.TestNets;\n\n return EnvNames.MainNets;\n};\n\nlet torusWalletProvider;\nlet torusWalletAddress;\n\nconst createTorusWalletProvider = async () => {\n if (torusWalletProvider) return torusWalletProvider;\n\n const torus = new Torus();\n await torus.init({ showTorusButton: false });\n ([torusWalletAddress] = await torus.login());\n\n torusWalletProvider = torus.provider;\n}\n\nexport const getTorusWalletProvider = () => torusWalletProvider;\n\nexport const getTorusWalletAddress = () => torusWalletAddress;\n\nexport const createEtherspotInstance = async (chain) => {\n await createTorusWalletProvider();\n if (!torusWalletProvider) {\n throw new Error('Failed to get wallet provider, please try again.');\n }\n\n const connectedTorusProvider = await Web3WalletProvider.connect(torusWalletProvider);\n if (!connectedTorusProvider) {\n throw new Error('Failed to connect to wallet provider, please try again.');\n }\n\n\n const networkName = chainToNetworkName[chain];\n if (!networkName) {\n throw new Error('Unsupported network.');\n }\n\n const env = getEnvForChain(chain);\n if (!env) {\n throw new Error('Unsupported network.');\n }\n\n const sessionStorage = env === EnvNames.MainNets\n ? sessionStorageInstance\n : testnetSessionStorageInstance;\n\n etherspotSdkInstances[chain] = new Sdk(connectedTorusProvider, {\n sessionStorage,\n env,\n networkName,\n omitWalletProviderNetworkCheck: true,\n projectKey: '2bae9e8ec5f246f1b80472b9f4e1a9b3',\n });\n\n return etherspotSdkInstances[chain].computeContractAccount();\n}\n\nexport const etherspotSessionExists = () => {\n return !!getItem('@etherspotSessionExists');\n}\n\nexport const getEtherspotChainInstance = (chain) => etherspotSdkInstances[chain];\n\nexport const getEtherspotFirstInstance = () => etherspotSdkInstances[Object.keys(etherspotSdkInstances)[0]];\n\nexport const getEtherspotAccountAddress = (chain) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) return null;\n\n return etherspotInstance.state.account.address;\n}\n\nexport const getEtherspotAssets = async (chain) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) return [];\n\n let tokens = [];\n try {\n tokens = await etherspotInstance.getTokenListTokens({ name: 'PillarTokens' });\n\n tokens = tokens.map(({ logoURI, ...token }) => ({ ...token, iconUrl: logoURI }));\n\n const nativeAsset = chainToNativeAsset[chain];\n if (!tokens.some(({ symbol }) => isCaseInsensitiveMatch(symbol, nativeAsset.symbol))) {\n tokens = [nativeAsset, ...tokens];\n }\n } catch (err) {\n //\n }\n\n return tokens;\n}\n\nexport const getEtherspotAsset = async (chain, assetAddress) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) return [];\n\n let tokens = [];\n try {\n tokens = await etherspotInstance.getTokenListTokens({ name: 'PillarTokens' });\n\n tokens = tokens.map(({ logoURI, ...token }) => ({ ...token, iconUrl: logoURI }));\n\n const nativeAsset = chainToNativeAsset[chain];\n if (!tokens.some(({ symbol }) => isCaseInsensitiveMatch(symbol, nativeAsset.symbol))) {\n tokens = [nativeAsset, ...tokens];\n }\n } catch (err) {\n //\n }\n\n return tokens.find(({ address }) => addressesEqual(address, assetAddress));\n}\n\nexport const getEtherspotBalances = async (chain, assets) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) return [];\n\n const nativeAsset = chainToNativeAsset[chain];\n const tokens = assets?.filter(({ symbol }) => !isCaseInsensitiveMatch(symbol, nativeAsset.symbol));\n const tokenAddresses = tokens?.map(({ address }) => address);\n\n let balances = [];\n try {\n const { items } = await etherspotInstance.getAccountBalances({ tokens: tokenAddresses });\n balances = items\n .map(({ token, balance }) => {\n const assetAddress = token ?? ADDRESS_ZERO; // zero address for native asset of token null\n return { assetAddress, balance };\n })\n .filter(({ balance }) => balance && balance.gt(0));\n } catch (err) {\n //\n }\n\n return balances;\n}\n\nexport const resolveEns = (nameOrHashOrAddress) => {\n const etherspotInstance = getEtherspotFirstInstance();\n if (!etherspotInstance) return null;\n\n const nameOrHashOrChecksumAddress = nameOrHashOrAddress.startsWith('0x') && isValidAddress(nameOrHashOrAddress)\n ? toChecksumAddress(nameOrHashOrAddress)\n : nameOrHashOrAddress;\n\n try {\n return etherspotInstance.getENSNode({ nameOrHashOrAddress: nameOrHashOrChecksumAddress })\n } catch (err) {\n console.log('err: ', err)\n //\n }\n\n return null;\n}\n\nexport const estimateEtherspotTransactions = async (chain, transactions) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n etherspotInstance.clearGatewayBatch();\n\n const { account: etherspotAccount } = etherspotInstance.state;\n\n const excludeManualDeployment = [CHAIN.AURORA, CHAIN.AURORA_TESTNET].includes(chain);\n if (etherspotAccount.state === AccountStates.UnDeployed && !excludeManualDeployment) {\n /**\n * batchDeployAccount on back-end additionally checks if account is deployed\n * regardless of our state check and either skips or adds deployment transaction.\n */\n await etherspotInstance.batchDeployAccount();\n }\n\n for (const transaction of transactions) {\n await etherspotInstance.batchExecuteAccountTransaction(transaction);\n }\n\n const { estimation } = await etherspotInstance.estimateGatewayBatch();\n\n const { estimatedGas, estimatedGasPrice } = estimation;\n\n return BigNumber.from(estimatedGasPrice).mul(estimatedGas);\n}\n\nexport const sendEtherspotTransactions = async (chain, transactions, waitForHash) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n await estimateEtherspotTransactions(chain, transactions);\n\n const { hash: batchHash } = await etherspotInstance.submitGatewayBatch();\n\n if (!waitForHash) return { batchHash };\n\n let temporaryBatchSubscription;\n\n return new Promise((resolve, reject) => {\n temporaryBatchSubscription = etherspotInstance.notifications$\n .pipe(map(async (notification) => {\n if (notification.type === NotificationTypes.GatewayBatchUpdated) {\n const submittedBatch = await etherspotInstance.getGatewaySubmittedBatch({ hash: batchHash });\n\n const failedStates = [\n GatewayTransactionStates.Canceling,\n GatewayTransactionStates.Canceled,\n GatewayTransactionStates.Reverted,\n ];\n\n let finishSubscription;\n if (submittedBatch?.transaction?.state && failedStates.includes(submittedBatch?.transaction?.state)) {\n finishSubscription = () => reject(submittedBatch.transaction.state);\n } else if (submittedBatch?.transaction?.hash) {\n finishSubscription = () => resolve({ batchHash, hash: submittedBatch.transaction.hash });\n }\n\n if (finishSubscription) {\n if (temporaryBatchSubscription) temporaryBatchSubscription.unsubscribe();\n finishSubscription();\n }\n }\n }))\n .subscribe();\n });\n}\n\nexport const signEtherspotTransaction = async (chain, transaction) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n return etherspotInstance.encodeExecuteAccountTransaction(transaction);\n}\n\nexport const getSubmittedEtherspotBatch = async (chain, batchHash) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) return null;\n\n const { transaction } = await etherspotInstance.getGatewaySubmittedBatch({ hash: batchHash });\n\n return transaction?.hash;\n}\n\nexport const signMessageWithEtherspotProvider = async (message) => {\n const etherspotInstance = getEtherspotFirstInstance();\n if (!etherspotInstance) return null;\n\n let signed;\n try {\n signed = await etherspotInstance.signMessage({ message });\n } catch (err) {\n console.log('err: ', err)\n //\n }\n\n return signed;\n}\n\nconst nftAbi = [\n 'function approve(address approver, uint256 tokenId)', //\n 'function transferFrom(address from, address to, uint256 tokenId)',\n 'function burn(uint256 tokenId)',\n 'function balanceOf(address owner) view returns (uint balance)',\n 'function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint tokenId)',\n];\n/*\nconst lockerAbi = [\n 'function migrateTokenToNear(address _token, uint256 _tokenId, string calldata _nearRecipientAccountId)',\n];\n*/\n\nexport const buildTestnetNftFromAuroraToPolygonMigrationTransactions = async (tokenId) => {\n const etherspotInstance = getEtherspotChainInstance(CHAIN.AURORA_TESTNET);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const { accountAddress } = etherspotInstance.state;\n\n const nftContract = etherspotInstance.registerContract('nftContract', nftAbi, COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET);\n // const lockerContract = etherspotInstance.registerContract('lockerContract', lockerAbi, COLLAB_LOCKER_CONTRACT_ADDRESS_AURORA_TESTNET);\n\n return [\n nftContract.encodeTransferFrom(accountAddress, COLLAB_LOCKER_CONTRACT_ADDRESS_AURORA_TESTNET, tokenId),\n // nftContract.encodeApprove(COLLAB_LOCKER_CONTRACT_ADDRESS_AURORA_TESTNET, tokenId),\n // lockerContract.encodeMigrateTokenToNear(COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET, tokenId, ''),\n ];\n}\n\nexport const buildBurnNftTransaction = async (chain, tokenId) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const contractAddress =\n chain === CHAIN.AURORA_TESTNET\n ? COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET\n : COLLAB_NFT_CONTRACT_ADDRESS_POLYGON_MUMBAI_TESTNET;\n\n const nftContract = etherspotInstance.registerContract('nftContract', nftAbi, contractAddress);\n\n return nftContract.encodeBurn(tokenId);\n}\n\nexport const getTokenId = async (chain, contractAddress, index) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const { accountAddress } = etherspotInstance.state;\n\n const nftContract = etherspotInstance.registerContract('nftContract', nftAbi, contractAddress);\n\n return nftContract.callTokenOfOwnerByIndex(accountAddress, index).then(val => val.toNumber());\n}\n\nexport const getNftBalanceAndTokenId = async (chain, contractAddress) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const { accountAddress } = etherspotInstance.state;\n\n const nftContract = etherspotInstance.registerContract('nftContract', nftAbi, contractAddress);\n\n const balance = await nftContract.callBalanceOf(accountAddress).then(val => val.toNumber());\n let tokenId;\n\n if (balance) {\n tokenId = await nftContract.callTokenOfOwnerByIndex(accountAddress, 0).then(val => val.toNumber());\n }\n\n return {\n balance,\n tokenId,\n };\n}\n\nexport const getNftBalance = async (chain, contractAddress) => {\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const { accountAddress } = etherspotInstance.state;\n\n const nftContract = etherspotInstance.registerContract('nftContract', nftAbi, contractAddress);\n\n return nftContract.callBalanceOf(accountAddress).then(val => val.toNumber());\n}\n\nexport const connectCollabBot = async () => {\n const etherspotInstance = getEtherspotChainInstance(CHAIN.AURORA_TESTNET);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const { accountAddress } = etherspotInstance.state;\n const { items: accounts } = await etherspotInstance.getAccountMembers({\n account: accountAddress,\n });\n\n const isBotAdded = accounts.some(account => {\n return isCaseInsensitiveMatch(account.member.address, COLLAB_BOT_ADDRESS);\n });\n\n if (isBotAdded) {\n console.error('Bot is already added');\n return;\n }\n\n await etherspotInstance.batchAddAccountOwner({\n owner: COLLAB_BOT_ADDRESS,\n });\n\n await etherspotInstance.estimateGatewayBatch();\n await etherspotInstance.submitGatewayBatch();\n}\n\nexport const disconnectCollabBot = async () => {\n const etherspotInstance = getEtherspotChainInstance(CHAIN.AURORA_TESTNET);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const { accountAddress } = etherspotInstance.state;\n const { items: accounts } = await etherspotInstance.getAccountMembers({\n account: accountAddress,\n });\n\n const isBotAdded = accounts.some(account => {\n return isCaseInsensitiveMatch(account.member.address, COLLAB_BOT_ADDRESS);\n });\n\n if (!isBotAdded) return;\n\n await etherspotInstance.batchRemoveAccountOwner({\n owner: COLLAB_BOT_ADDRESS,\n });\n\n await etherspotInstance.estimateGatewayBatch();\n await etherspotInstance.submitGatewayBatch();\n}\n\nexport const isCollabBotConnected = async () => {\n const etherspotInstance = getEtherspotChainInstance(CHAIN.AURORA_TESTNET);\n if (!etherspotInstance) throw new Error('Failed to get SDK instance');\n\n const { accountAddress } = etherspotInstance.state;\n const { items: accounts } = await etherspotInstance.getAccountMembers({\n account: accountAddress,\n });\n console.log('accounts', accounts);\n\n // is bot added\n return accounts.some(account => {\n return account.state === AccountMemberStates.Added\n && isCaseInsensitiveMatch(account.member.address, COLLAB_BOT_ADDRESS);\n });\n}\n\nexport const isEtherspotAccountDeployed = (chain) => {\n // always deployed on aurora\n if ([CHAIN.AURORA_TESTNET, CHAIN.AURORA].includes(chain)) return true;\n\n const etherspotInstance = getEtherspotChainInstance(chain);\n if (!etherspotInstance) return false;\n\n return etherspotInstance.state.account.state === AccountStates.Deployed;\n}\n","export const STORAGE_MAIN_KEY = '@etherspotWebWallet';\nexport const STORAGE_KEY = {\n MINTED_COLLAB_NFT_TOKEN_ID: 'mintedCollabNftTokenId',\n ADDED_COLLAB_BOT: 'addedCollabBot',\n};\n","export const CHAIN = {\n ETHEREUM_MAINNET: 'ETHEREUM_MAINNET',\n ETHEREUM_KOVAN: 'ETHEREUM_KOVAN',\n POLYGON: 'POLYGON',\n AURORA: 'AURORA',\n AURORA_TESTNET: 'AURORA_TESTNET',\n POLYGON_MUMBAI: 'POLYGON_MUMBAI',\n};\n","import { ethers } from 'ethers';\n\nexport const ADDRESS_ZERO = ethers.constants.AddressZero;\nexport const COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET = '0x7F7b0fDe4f03A43E08DE9499d0229aD6b78887E7';\nexport const COLLAB_NFT_CONTRACT_ADDRESS_POLYGON_MUMBAI_TESTNET = '0x8F685656F7b1D31Dd6cD219eC6cc7989eB9F89fC';\nexport const COLLAB_LOCKER_CONTRACT_ADDRESS_AURORA_TESTNET = '0x78a8BD8ed2C20147cE81D941b4a51d01f0021Ec9';\nexport const COLLAB_BOT_ADDRESS = '0x1F62583538CDB2CB3656Ed43A46693F92DDa6302';\n","import { ethers } from 'ethers';\n\n// abi\nimport erc20Abi from '../abi/erc20.json'\n\n// services\nimport { chainToNativeAsset } from '../services/wallet'\n\n\nexport const isCaseInsensitiveMatch = (a, b) => {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.toLowerCase() === b.toLowerCase();\n};\n\nexport const pause = (multiplier) => new Promise(resolve => setTimeout(resolve, (multiplier || 1) * 1000));\n\nexport const formatNumber = (value) => new Intl.NumberFormat('en-US', { maximumFractionDigits: 2 }).format(value);\n\nconst supportedDomains = [\n 'eth',\n 'crypto',\n 'zil',\n];\n\nexport const isValidEnsName = (input) => {\n if (!input || !input.toString().includes('.')) return false;\n\n const domain = input.split('.').pop().toLowerCase();\n\n return supportedDomains.includes(domain);\n};\n\nexport const isValidAddress = (input) => {\n if (!input) return false;\n\n try {\n ethers.utils.getAddress(input);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nexport const isValidAddressOrEnsName = (input) => isValidEnsName(input) || isValidAddress(input);\n\nexport const encodeContractMethod = (contractAbi, method, params) => {\n const contractInterface = new ethers.utils.Interface(contractAbi);\n return contractInterface.encodeFunctionData(method, params);\n};\n\nexport const getErc20TransferData = (to, value) => encodeContractMethod(\n erc20Abi,\n 'transfer',\n [to, value],\n);\n\nexport const buildTransactions = (chain, asset, receiver, amount) => {\n let value = ethers.utils.parseUnits(amount, asset.decimals);\n\n let data;\n let to = receiver;\n if (asset.address !== chainToNativeAsset[chain].address) {\n to = asset.address;\n data = getErc20TransferData(receiver, value);\n value = undefined;\n }\n\n return [{ to, value, data }];\n}\n","// constants\nimport { STORAGE_MAIN_KEY } from '../constants/storageConstants'\n\nexport const setItem = (key, value) => localStorage.setItem(`${STORAGE_MAIN_KEY}:${key}`, value);\n\nexport const getItem = (key) => localStorage.getItem(`${STORAGE_MAIN_KEY}:${key}`);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAABQGlDQ1BVMjc5MEIAACiRnY6/SwJxHIafrxlSFAodbsWBBA0qdhFhtKhBBEEiRWoRneevwOzr3dGPvam/oMWtsaWloMnW1iJorz8gBAlKruEqnQp6l8/DwwufFzwBXcqaF9ir22ZmKalmc3nV98IQE3gYI6Iblkyk0ysA37cvAjqPCID7iC5l7XJrMnC1MWtEm/Ojp68LFr9nuFiyDOAD0A1p2iB2gNChLW0QJ4BiZnN5EGeAUnH5AlAKLrcAxVzLpEA8AAGjqhdBPAPhQp+v9PHXXwDfujYXjyX/WPqP2KUjGyC1L4/N3UrVVhNS1krqct2IhlUtpk1DNpdX3XY7iABE8K7n5CrED8Cj99z2IlyHwN/ouakU+Mtwuyl1U/8ZIDpeqzyjuTxiwuCb47THwXcDXdNx3puO0z2HgSdoNT4BaAxagEKwX7IAAAAJcEhZcwAACxMAAAsTAQCanBgAAAXtaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA3LjEtYzAwMCA3OS5kYWJhY2JiLCAyMDIxLzA0LzE0LTAwOjM5OjQ0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuNSAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjEtMDktMzBUMDk6MjI6MzgrMDM6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDktMzBUMDk6MjI6MzgrMDM6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTA5LTMwVDA5OjIyOjM4KzAzOjAwIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmY2Mjk0MzYxLTM1Y2EtNGVmNC05N2UzLTMwNmUyNzY2MDFhYyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmZhZDFmMjVhLWQzODItNmQ0Yi05OGZkLTYwNDFhMjc4ZThkYSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmIwMjY1NWU1LTIyZDEtNDUzYy1iMTVlLTljODc2M2Y4OWM3YiIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJVMjc5MEIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmIwMjY1NWU1LTIyZDEtNDUzYy1iMTVlLTljODc2M2Y4OWM3YiIgc3RFdnQ6d2hlbj0iMjAyMS0wOS0zMFQwOToyMjozOCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmY2Mjk0MzYxLTM1Y2EtNGVmNC05N2UzLTMwNmUyNzY2MDFhYyIgc3RFdnQ6d2hlbj0iMjAyMS0wOS0zMFQwOToyMjozOCswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKE1hY2ludG9zaCki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\"","import { utils } from 'ethers';\nimport { isHexString } from '@walletconnect/utils';\n\n// constants\nimport { CHAIN } from '../constants/chainConstants'\nimport { ADDRESS_ZERO } from '../constants/assetConstants'\n\n// services\nimport {\n createEtherspotInstance,\n etherspotSessionExists,\n getEtherspotAccountAddress,\n getEtherspotAsset,\n getEtherspotAssets,\n getEtherspotBalances,\n getTorusWalletAddress,\n getTorusWalletProvider,\n isEtherspotAccountDeployed,\n signEtherspotTransaction,\n signMessageWithEtherspotProvider,\n} from './etherspot'\n\n// assets\nimport auroraImage from '../assets/aurora.png';\n\n\nexport const chainToNativeAsset = {\n [CHAIN.ETHEREUM_MAINNET]: {\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n address: ADDRESS_ZERO,\n iconUrl: 'https://tokens.1inch.exchange/0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.png',\n },\n [CHAIN.ETHEREUM_KOVAN]: {\n name: 'ETH (Kovan)',\n symbol: 'ETH',\n decimals: 18,\n address: ADDRESS_ZERO,\n iconUrl: 'https://tokens.1inch.exchange/0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.png',\n },\n [CHAIN.POLYGON]: {\n name: 'Matic',\n symbol: 'MATIC',\n decimals: 18,\n address: ADDRESS_ZERO,\n iconUrl: 'https://tokens.1inch.exchange/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0.png',\n },\n [CHAIN.POLYGON_MUMBAI]: {\n name: 'Matic (Mumbai)',\n symbol: 'MATIC',\n decimals: 18,\n address: ADDRESS_ZERO,\n iconUrl: 'https://tokens.1inch.exchange/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0.png',\n },\n [CHAIN.AURORA]: {\n name: 'Aurora ETH',\n symbol: 'aETH',\n decimals: 18,\n address: ADDRESS_ZERO,\n iconUrl: auroraImage,\n },\n [CHAIN.AURORA_TESTNET]: {\n name: 'Aurora ETH (testnet)',\n symbol: 'aETH',\n decimals: 18,\n address: ADDRESS_ZERO,\n iconUrl: auroraImage,\n },\n};\n\nexport const chainToChainId = {\n [CHAIN.ETHEREUM_KOVAN]: 32,\n [CHAIN.ETHEREUM_MAINNET]: 1,\n [CHAIN.POLYGON]: 137,\n [CHAIN.POLYGON_MUMBAI]: 80001,\n [CHAIN.AURORA]: 1313161554,\n [CHAIN.AURORA_TESTNET]: 1313161555,\n};\n\nexport const chainIdToChain = {\n 32: CHAIN.ETHEREUM_KOVAN,\n 1: CHAIN.ETHEREUM_MAINNET,\n 137: CHAIN.POLYGON,\n 80001: CHAIN.POLYGON_MUMBAI,\n 1313161554: CHAIN.AURORA,\n 1313161555: CHAIN.AURORA_TESTNET,\n};\n\nexport const chainToChainDetails = {\n [CHAIN.ETHEREUM_KOVAN]: {\n title: 'Kovan (testnet)',\n chainId: chainToChainId[CHAIN.ETHEREUM_KOVAN],\n rpcUrl: 'https://kovan.infura.io/v3/31a9622172b644d8844cbff3fc17eefd',\n iconUrl: chainToNativeAsset[CHAIN.ETHEREUM_KOVAN].iconUrl,\n explorerUrl: 'https://kovan.etherscan.io/',\n historyExplorerUrl: 'https://kovan.etherscan.io/address',\n transactionExplorerUrl: 'https://kovan.etherscan.io/tx',\n },\n [CHAIN.ETHEREUM_MAINNET]: {\n title: 'Ethereum',\n rpcUrl: 'https://homestead.infura.io/v3/31a9622172b644d8844cbff3fc17eefd',\n iconUrl: chainToNativeAsset[CHAIN.ETHEREUM_MAINNET].iconUrl,\n explorerUrl: 'https://etherscan.io/',\n historyExplorerUrl: 'https://etherscan.io/address',\n transactionExplorerUrl: 'https://etherscan.io/tx',\n },\n [CHAIN.POLYGON]: {\n title: 'Polygon',\n chainId: chainToChainId[CHAIN.POLYGON],\n rpcUrl: 'https://polygon-rpc.com/',\n iconUrl: chainToNativeAsset[CHAIN.POLYGON].iconUrl,\n explorerUrl: 'https://polygonscan.com/',\n historyExplorerUrl: 'https://polygonscan.com/address',\n transactionExplorerUrl: 'https://polygonscan.com/tx',\n },\n [CHAIN.POLYGON_MUMBAI]: {\n title: 'Mumbai (testnet)',\n chainId: chainToChainId[CHAIN.POLYGON_MUMBAI],\n rpcUrl: 'https://polygon-mumbai.infura.io/v3/31a9622172b644d8844cbff3fc17eefd',\n iconUrl: chainToNativeAsset[CHAIN.POLYGON].iconUrl,\n explorerUrl: 'https://mumbai.polygonscan.com/',\n historyExplorerUrl: 'https://mumbai.polygonscan.com/address',\n transactionExplorerUrl: 'https://mumbai.polygonscan.com/tx',\n },\n [CHAIN.AURORA]: {\n title: 'Aurora',\n chainId: chainToChainId[CHAIN.AURORA],\n rpcUrl: 'https://mainnet.aurora.dev/',\n iconUrl: chainToNativeAsset[CHAIN.AURORA].iconUrl,\n explorerUrl: null,\n historyExplorerUrl: null,\n transactionExplorerUrl: null,\n },\n [CHAIN.AURORA_TESTNET]: {\n title: 'Aurora (testnet)',\n chainId: chainToChainId[CHAIN.AURORA_TESTNET],\n rpcUrl: 'https://testnet.aurora.dev/',\n iconUrl: chainToNativeAsset[CHAIN.AURORA_TESTNET].iconUrl,\n explorerUrl: 'https://explorer.testnet.aurora.dev/',\n historyExplorerUrl: 'https://explorer.testnet.aurora.dev/address',\n transactionExplorerUrl: 'https://explorer.testnet.aurora.dev/tx',\n },\n};\n\nexport const connectWallet = async (chain, restoreSession) => {\n const sessionExists = etherspotSessionExists();\n if (restoreSession && !sessionExists) return;\n\n await createEtherspotInstance(chain);\n};\n\nexport const getWalletAddress = (chain) => getEtherspotAccountAddress(chain);\n\nexport const getSupportedAssets = (chain) => getEtherspotAssets(chain);\n\nexport const getSupportedAsset = (chain, assetAddress) => getEtherspotAsset(chain, assetAddress);\n\nexport const getBalances = async (chain, assets) => getEtherspotBalances(chain, assets);\n\nexport const signTransaction = async (chain, transaction) => signEtherspotTransaction(chain, transaction);\n\nexport const signMessage = (message) => {\n const messageBytes = isHexString(message)\n ? utils.toUtf8String(message)\n : message;\n\n return signMessageWithEtherspotProvider(messageBytes);\n}\n\nexport const signTypedData = async (typedData) => new Promise((\n resolve,\n reject,\n) => {\n /**\n * Note: won't work if typed data domain chain ID is different from connected Torus provider,\n * this is native protection to not sign something on other chain\n */\n const from = getTorusWalletAddress();\n const provider = getTorusWalletProvider();\n\n provider.sendAsync({\n from,\n params: [from, typedData],\n method: 'eth_signTypedData_v4',\n }, (error, result) => {\n if (error || result.error) {\n reject(error?.message ?? result?.error?.message ?? 'Unknown Error');\n return;\n }\n\n resolve(result.result);\n })\n});\n\n\nexport const canSignWithWallet = (chain) => isEtherspotAccountDeployed(chain);\n\nexport const getSupportedChains = () => [\n CHAIN.AURORA_TESTNET,\n CHAIN.AURORA,\n CHAIN.POLYGON,\n CHAIN.POLYGON_MUMBAI,\n CHAIN.ETHEREUM_MAINNET,\n];\n","import styled from 'styled-components';\n\n// services\nimport { chainToChainDetails, getSupportedChains } from '../services/wallet'\n\n\nconst Wrapper = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n padding-left: 10px;\n margin-bottom: 50px;\n`;\n\nconst Network = styled.div`\n display: flex;\n align-items: center;\n margin-right: 35px;\n ${({ $isCurrent }) => $isCurrent && `border-bottom: 1px solid #000;`}\n ${({ $isCurrent }) => !$isCurrent && `cursor: pointer; &:hover { border-bottom: 1px solid #000; }`}\n`;\n\nconst ChainIcon = styled.img`\n height: 20px;\n margin-right: 5px;\n`;\n\nexport const ChainSelect = ({ onChange, chains, value: currentChain }) => (\n \n {(chains ?? getSupportedChains()).map((chain) => (\n onChange(chain)}>\n \n {chainToChainDetails[chain].title}\n \n ))}\n \n);\n","export const fontWeight = {\n regular: 400,\n bold: 700,\n};\n\nexport const fontFamily = {\n default: 'Lato',\n};\n\nexport const color = {\n red: '#f43b40',\n orange: '#f76e30',\n linearRed: 'linear-gradient(90deg, #f43b40, #f76e30)',\n};\n","import ReactModal from 'react-modal';\nimport styled from 'styled-components';\nimport { FiX } from \"react-icons/fi\";\n\n// utils\nimport { color } from '../utils/theme'\n\n\nconst ModalWrapper = styled.div`\n display: flex;\n background: #fff;\n align-items: center;\n justify-content: center;\n margin-top: 70px;\n`;\n\nconst ModalContentWrapper = styled.div`\n padding: 15px;\n border: 3px solid ${color.orange};\n border-radius: 15px;\n width: 400px;\n position: relative;\n`;\n\nconst CloseButton = styled(FiX)`\n position: absolute;\n top: -50px;\n right: 0;\n cursor: pointer;\n padding: 5px;\n\n &:hover {\n opacity: 0.3;\n }\n`;\n\nexport const Modal = ({ children: modalContent, isVisible, onClose }) => (\n (\n \n \n \n {children}\n \n \n )}\n >\n {modalContent}\n \n);\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\n\n// services\nimport {\n chainToChainDetails,\n connectWallet,\n getBalances,\n getSupportedAssets,\n getSupportedChains,\n getWalletAddress\n} from '../services/wallet'\nimport {\n estimateEtherspotTransactions,\n getSubmittedEtherspotBatch,\n sendEtherspotTransactions\n} from '../services/etherspot'\n\nexport const WalletContext = React.createContext(null);\n\nexport const WalletProvider = ({ children }) => {\n const supportedChains = getSupportedChains();\n\n const [connectionError, setConnectionError] = useState(null);\n const [isConnecting, setIsConnecting] = useState(true);\n const [address, setAddress] = useState(null);\n const [chain, setChain] = useState(supportedChains[0]);\n const [assets, setAssets] = useState([]);\n const [balancesPerChain, setBalancesPerChain] = useState({});\n const [isFetchingAssetsAndBalances, setIsFetchingAssetsAndBalances] = useState(false);\n\n const [isEstimating, setIsEstimating] = useState(false);\n const [isSendingTransaction, setIsSendingTransaction] = useState(false);\n const [transactionsErrorMessage, setTransactionsErrorMessage] = useState(null);\n const [transactionsEstimate, setTransactionsEstimate] = useState(null);\n const [sentTransactions, setSentTransactions] = useState(null);\n\n const connect = useCallback(async (isInitial = false) => {\n if (isConnecting && !isInitial) return;\n setIsConnecting(true);\n setConnectionError(null);\n\n try {\n // connect to all supported\n for (const supportedChain of supportedChains) {\n await connectWallet(supportedChain, isInitial);\n }\n\n // details from active\n const walletAddress = getWalletAddress(chain);\n setAddress(walletAddress);\n } catch (error) {\n setConnectionError(error?.message ?? 'Unable to connect, please try again.');\n }\n\n setIsConnecting(false);\n }, [isConnecting, chain]); // eslint-disable-line\n\n // initial session restore\n useEffect(() => {\n connect(true);\n }, []); // eslint-disable-line\n\n const fetchAssetsAndBalances = useCallback(async () => {\n if (!address) return;\n setIsFetchingAssetsAndBalances(true);\n const fetchedAssets = await getSupportedAssets(chain);\n setAssets(fetchedAssets);\n\n const fetchedBalances = await getBalances(chain, fetchedAssets);\n setBalancesPerChain({ [chain]: fetchedBalances, ...balancesPerChain });\n setIsFetchingAssetsAndBalances(false);\n }, [address, chain]); // eslint-disable-line\n\n const estimateTransactions = async (chainToEstimate, transactions) => {\n setTransactionsErrorMessage(null);\n setTransactionsEstimate(null);\n setIsEstimating(true);\n\n try {\n const estimate = await estimateEtherspotTransactions(chainToEstimate, transactions);\n setTransactionsEstimate(estimate);\n } catch (e) {\n setTransactionsErrorMessage(e?.message ?? 'Failed to estimate');\n }\n\n setIsEstimating(false);\n };\n\n const sendTransactions = useCallback(async (chainToSend, transactions, waitForHash) => {\n if (isSendingTransaction) return;\n\n setTransactionsEstimate(null);\n setSentTransactions(null);\n setTransactionsErrorMessage(null);\n setIsSendingTransaction(true);\n\n let sent;\n try {\n sent = await sendEtherspotTransactions(chainToSend, transactions, waitForHash);\n setSentTransactions(sent);\n setIsSendingTransaction(false);\n } catch (e) {\n console.log(e);\n setTransactionsErrorMessage(e?.message ?? 'Failed to send');\n }\n\n setIsSendingTransaction(false);\n return sent;\n }, [isSendingTransaction]);\n\n const resetSentTransactions = useCallback(() => setSentTransactions(null), []);\n\n const viewTransaction = useCallback(async ({ hash, batchHash }) => {\n const { transactionExplorerUrl } = chainToChainDetails[chain];\n if (!transactionExplorerUrl) {\n alert('No blockachain explorer available!');\n return;\n }\n\n if (!hash && batchHash) {\n hash = await getSubmittedEtherspotBatch(chain, batchHash);\n }\n\n if (!hash) {\n alert('Transaction hash not yet available!');\n return;\n }\n\n window.open(`${transactionExplorerUrl}/${hash}`, '_blank').focus();\n }, [chain]);\n\n // initial session restore\n useEffect(() => {\n fetchAssetsAndBalances();\n }, [fetchAssetsAndBalances]);\n\n const wallet = useMemo(() => ({\n isConnecting,\n isConnected: !!address,\n connectionError,\n address,\n connect,\n assets,\n balances: balancesPerChain?.[chain] ?? [],\n chain,\n setChain,\n transactionsEstimate,\n transactionsErrorMessage,\n isEstimating,\n estimateTransactions,\n sendTransactions,\n isSendingTransaction,\n sentTransactions,\n resetSentTransactions,\n viewTransaction,\n isFetchingAssetsAndBalances,\n }), [\n isConnecting,\n connectionError,\n address,\n connect,\n assets,\n balancesPerChain,\n chain,\n setChain,\n transactionsEstimate,\n transactionsErrorMessage,\n isEstimating,\n sendTransactions,\n isSendingTransaction,\n sentTransactions,\n resetSentTransactions,\n viewTransaction,\n isFetchingAssetsAndBalances,\n ]);\n\n return (\n \n {children}\n \n )\n};\n\nexport const useWallet = () => React.useContext(WalletContext)?.wallet ?? {}\n","import styled from 'styled-components';\nimport { useState } from 'react';\nimport { ethers } from 'ethers'\n\n// components\nimport { Modal } from './Modal'\n\n// utils\nimport { color } from '../utils/theme'\nimport { formatNumber, isCaseInsensitiveMatch } from '../utils/common'\n\n// hooks\nimport { useWallet } from '../providers/WalletProvider'\n\n\nconst Wrapper = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n padding-left: 10px;\n\n ${({ $clickable }) => $clickable && `\n cursor: pointer;\n &:hover {\n opacity: 0.5;\n }\n `};\n`;\n\nconst AssetIcon = styled.img`\n height: 30px;\n ${({ $marginRight }) => $marginRight && `margin-right: ${$marginRight}px;`};\n`;\n\nconst AssetSelectEntry = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n padding-bottom: 15px;\n margin-bottom: 15px;\n border-bottom: 1px solid ${color.orange};\n cursor: pointer;\n\n &:hover {\n opacity: 0.5;\n }\n`;\n\nconst AssetBalance = styled.div`\n flex: 1;\n text-align: right;\n font-size: 14px;\n`;\n\nexport const AssetSelect = ({ onChange, value: currentAsset }) => {\n const { assets, balances } = useWallet();\n const [assetSelectVisible, setAssetSelectVisible] = useState(false);\n\n const onAssetSelect = (newAsset) => {\n onChange(newAsset);\n setAssetSelectVisible(false);\n }\n\n const assetsWithBalances = assets?.map((asset) => {\n const assetBalance = balances.find((balance) => isCaseInsensitiveMatch(\n asset.address,\n balance.assetAddress,\n ));\n\n const balance = assetBalance\n ? ethers.utils.formatUnits(assetBalance.balance, asset.decimals)\n : 0;\n\n return { ...asset, balance };\n });\n\n const assetsWithPositiveBalances = assetsWithBalances?.filter(({ balance }) => balance > 0);\n\n const showAssetSelect = assetsWithPositiveBalances?.length > 1;\n\n return (\n \n assetsWithPositiveBalances?.length && setAssetSelectVisible(true)} />\n {showAssetSelect && (\n setAssetSelectVisible(false)}\n >\n {assetsWithPositiveBalances.map((asset) => (\n onAssetSelect(asset)}>\n \n {asset.name}\n Balance: {formatNumber(asset.balance)} {asset.symbol}\n \n ))}\n \n )}\n \n )\n};\n","import styled from 'styled-components'\nimport { ethers } from 'ethers'\nimport { useCallback, useEffect, useState } from 'react'\n\n\n// components\nimport { ChainSelect } from './ChainSelect'\nimport { AssetSelect } from './AssetSelect'\n\n// services\nimport { chainToNativeAsset } from '../services/wallet'\n\n// utils\nimport { color } from '../utils/theme';\nimport {\n buildTransactions,\n formatNumber,\n isCaseInsensitiveMatch,\n isValidAddress,\n} from '../utils/common'\n\n// hooks\nimport { useWallet } from '../providers/WalletProvider'\n\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst SendButton = styled.div`\n margin-top: 20px;\n background: ${color.linearRed};\n color: #fff;\n text-align: center;\n border-radius: 15px;\n margin-left: 10px;\n height: 30px;\n padding: 8px 35px;\n line-height: 30px;\n cursor: pointer;\n\n ${({ disabled }) => disabled && 'opacity: 0.5;'}\n ${({ disabled }) => !disabled && `\n &:hover {\n opacity: 0.5;\n }\n `}\n`;\n\nconst RecipientWrapper = styled.div`\n margin-bottom: 30px;\n`;\n\nconst AddressInputWrapper = styled.div`\n border: 3px solid ${color.orange};\n padding: 5px 10px;\n display: flex;\n height: 30px;\n border-radius: 15px;\n width: 300px;\n margin-bottom: 8px;\n`;\n\nconst AddressInput = styled.input`\n border: none;\n flex: 1;\n font-size: 18px;\n text-align: right;\n`;\n\nconst AssetWrapper = styled.div`\n margin-bottom: 35px;\n`;\n\nconst AssetInputWrapper = styled.div`\n border: 3px solid ${color.orange};\n padding: 5px 10px;\n display: flex;\n height: 30px;\n border-radius: 15px;\n width: 300px;\n margin: 4px 0 8px 0;\n`;\n\nconst AssetValueInput = styled.input`\n border: none;\n flex: 1;\n font-size: 18px;\n text-align: right;\n`;\n\nconst AssetBalance = styled.div`\n text-align: right;\n margin-bottom: 2px;\n font-weight: 700;\n font-size: 14px;\n`;\n\nconst ErrorMessage = styled.div`\n color: #ff0000;\n font-size: 14px;\n ${({ $marginTop }) => $marginTop && `margin-top: ${$marginTop}px;`}\n`;\n\nconst Fee = styled.div`\n margin-top: 30px;\n font-size: 14px;\n font-weight: 700;\n`;\n\nconst TransactionSent = styled.div`\n font-size: 18px;\n font-weight: 700;\n`;\n\nconst ViewTransaction = styled.div`\n font-size: 14px;\n margin-top: 15px;\n cursor: pointer;\n background: ${color.linearRed};\n color: #fff;\n padding: 10px 20px;\n border-radius: 15px;\n\n &:hover {\n opacity: 0.5;\n }\n`;\n\nconst CloseTransactionSent = styled.div`\n font-size: 12px;\n margin-top: 12px;\n cursor: pointer;\n font-weight: 700;\n\n &:hover {\n opacity: 0.5;\n }\n`;\n\nconst numberInProgressRegex = /^\\d*\\.?\\d*$/;\n\nconst normalizeAmount = (amount) => {\n let result = amount.replace(/,/g, '.').replace(/\\s/g, '');\n\n // Trip leading and trailing spaces\n result = result.trim();\n\n // Trim leading zeros, but allow '0' & '0.'\n if (result.startsWith('0')) {\n result = result.replace(/^0+/, '');\n if (result === '') {\n result = '0';\n }\n }\n\n // Ensure 0 before decimal point\n if (result.startsWith('.')) {\n result = `0${result}`;\n }\n\n return result;\n}\n\nexport const Send = () => {\n const {\n chain,\n setChain,\n balances,\n transactionsEstimate,\n transactionsErrorMessage,\n estimateTransactions,\n sendTransactions,\n isSendingTransaction,\n sentTransactions,\n resetSentTransactions,\n viewTransaction,\n } = useWallet();\n const [asset, setAsset] = useState(chainToNativeAsset[chain]);\n const [amount, setAmount] = useState('');\n const [addressOrEnsName, setAddressOrEnsName] = useState('');\n\n useEffect(() => {\n setAsset(chainToNativeAsset[chain]);\n setAmount('');\n }, [chain]);\n\n const onChainSelected = (newChain) => {\n setChain(newChain);\n };\n\n const onAssetSelected = (newAsset) => {\n setAsset(newAsset);\n };\n\n const onAmountChange = (el) => {\n const normalizedAmount = normalizeAmount(el?.target?.value ?? '')\n setAmount(normalizedAmount);\n }\n\n const onAddressOrEnsChange = (el) => {\n setAddressOrEnsName(el?.target?.value ?? '');\n }\n\n const { balance: balanceBN } = balances?.find((balance) => isCaseInsensitiveMatch(balance.assetAddress, asset.address)) ?? {};\n const balance = balanceBN ? ethers.utils.formatUnits(balanceBN, asset.decimals) : 0;\n\n const isAmountPresent = !!amount && Number(amount) > 0\n const validAmount = numberInProgressRegex.test(amount);\n const validAddressOrEnsName = isValidAddress(addressOrEnsName);\n\n const isAmountAboveBalance = isAmountPresent && validAmount\n ? ethers.utils.parseUnits(amount, asset.decimals).gt(balanceBN ?? 0)\n : false;\n\n const sendFieldsValid = isAmountPresent && validAmount && validAddressOrEnsName && !isAmountAboveBalance;\n\n const debouncedEstimateTransactions = useCallback(async () => {\n if (!sendFieldsValid) return;\n const transactions = buildTransactions(chain, asset, addressOrEnsName, amount);\n estimateTransactions(chain, transactions);\n }, [estimateTransactions, amount, addressOrEnsName, asset, sendFieldsValid, chain]);\n\n const onSendClick = () => {\n if (isSendingTransaction || isSubmitDisabled) return;\n const transactions = buildTransactions(chain, asset, addressOrEnsName, amount);\n sendTransactions(chain, transactions);\n };\n\n useEffect(() => {\n debouncedEstimateTransactions();\n }, [debouncedEstimateTransactions]);\n\n\n useEffect(() => {\n if (!sentTransactions) return;\n setAmount('');\n setAddressOrEnsName('');\n }, [sentTransactions, resetSentTransactions]);\n\n const isSubmitDisabled = !sendFieldsValid || !!transactionsErrorMessage || !transactionsEstimate || isSendingTransaction;\n const showFee = !!transactionsEstimate && !transactionsErrorMessage && sendFieldsValid;\n\n return (\n \n \n \n Balance: {formatNumber(balance)} {asset.symbol}\n \n \n \n \n {!validAmount && Invalid number}\n {isAmountAboveBalance && Amount above balance}\n \n \n \n \n \n {(addressOrEnsName !== '' && !validAddressOrEnsName) && Invalid address}\n \n {!!transactionsErrorMessage && {transactionsErrorMessage}}\n {showFee && Transaction fee: {formatNumber(ethers.utils.formatEther(transactionsEstimate))} {chainToNativeAsset[chain].symbol}}\n {!sentTransactions && (\n \n {isSendingTransaction ? 'Sending...' : 'Send'}\n \n )}\n {!!sentTransactions && (\n <>\n Transaction sent!\n viewTransaction({ batchHash: sentTransactions?.batchHash })}>View transaction\n resetSentTransactions()}>Close\n >\n )}\n \n )\n};\n","import styled from 'styled-components';\nimport QRCode from \"react-qr-code\";\n\n// hooks\n\n// utils\nimport { color } from '../utils/theme'\nimport { useWallet } from '../providers/WalletProvider'\n\n\nconst Wrapper = styled.div`\n`;\n\nconst StyleQrCode = styled(QRCode)`\n border: 3px solid ${color.orange};\n padding: 15px;\n border-radius: 10px;\n`;\n\nconst Address = styled.div`\n margin-top: 15px;\n`;\n\nexport const Receive = () => {\n const { address } = useWallet();\n\n return (\n \n \n {address}\n \n )\n};\n","import styled from 'styled-components';\n\n// components\nimport { ChainSelect } from './ChainSelect';\n\n// services\nimport { chainToChainDetails } from '../services/wallet';\n\n// hooks\nimport { useWallet } from '../providers/WalletProvider';\n\n// utils\nimport { color } from '../utils/theme';\n\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst ViewHistory = styled.div`\n font-size: 14px;\n margin-top: 15px;\n cursor: pointer;\n background: ${color.linearRed};\n color: #fff;\n padding: 10px 20px;\n border-radius: 15px;\n\n &:hover {\n opacity: 0.5;\n }\n`;\n\nexport const History = () => {\n const { chain, setChain, address } = useWallet();\n\n const { historyExplorerUrl } = chainToChainDetails[chain];\n\n const onChainSelected = (newChain) => {\n setChain(newChain);\n };\n\n const onViewHistoryClick = () => {\n window.open(`${historyExplorerUrl}/${address}`, '_blank').focus();\n };\n\n return (\n \n \n {!!historyExplorerUrl && View history on explorer}\n {!historyExplorerUrl && No history available yet}\n \n )\n};\n","import axios from 'axios';\n\nexport const mintCollabNftToAddress = async (address) => {\n try {\n const { data } = await axios.post(\n 'https://collab-land.herokuapp.com/aurora_mint',\n { address },\n { headers: {\n 'Content-Type': 'application/json',\n }\n }\n );\n\n return data?.tokenId;\n } catch (e) {\n //\n }\n\n return null;\n}\n\nexport const requestCollabNftMigration = async (address) => {\n try {\n const { data } = await axios.post(\n 'https://collab-land.herokuapp.com/polygon_mint',\n { address },\n { headers: {\n 'Content-Type': 'application/json',\n }\n }\n );\n\n return data;\n } catch (e) {\n //\n }\n\n return null;\n}\n\nexport const registerCollabUser = async (address, collabId) => {\n try {\n const { data } = await axios.post(\n 'https://api-qa.collab.land/etherspot/user-accounts',\n { address },\n { headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `AE ${collabId}`,\n }\n }\n );\n\n return data;\n } catch (e) {\n console.log(e);\n }\n\n return null;\n}\n","import styled from 'styled-components';\nimport { useCallback, useEffect, useState, useRef } from 'react'\n\n// constants\nimport {\n COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET,\n COLLAB_NFT_CONTRACT_ADDRESS_POLYGON_MUMBAI_TESTNET\n} from '../constants/assetConstants'\nimport { CHAIN } from '../constants/chainConstants'\nimport { STORAGE_KEY } from '../constants/storageConstants'\n\n// components\nimport { ChainSelect } from './ChainSelect';\n\n// hooks\nimport { useWallet } from '../providers/WalletProvider';\n\n// services\nimport { setItem } from '../services/storage';\nimport {\n getNftBalance,\n getNftBalanceAndTokenId,\n buildBurnNftTransaction,\n buildTestnetNftFromAuroraToPolygonMigrationTransactions,\n isCollabBotConnected,\n connectCollabBot,\n disconnectCollabBot,\n} from '../services/etherspot';\nimport { requestCollabNftMigration } from '../services/collabNfts';\nimport { chainToChainDetails } from '../services/wallet';\n\n// utils\nimport { pause } from '../utils/common';\n\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst ListWrapper = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n margin-top: 25px;\n`;\n\nconst Nft = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 200px;\n height: 200px;\n background: #8fb2ff;\n border-radius: 15px;\n`;\n\nconst Button = styled.div`\n font-size: 12px;\n margin-top: 20px;\n padding: 5px;\n cursor: pointer;\n border-radius: 10px;\n border: 1px solid #000;\n \n ${({ $disabled }) => $disabled && 'opacity: 0.5;'}\n ${({ $disabled }) => !$disabled && `\n &:hover {\n opacity: 0.5;\n }\n `}\n`;\n\nconst Link = styled.a`\n display: block;\n font-size: 12px;\n margin-top: 20px;\n padding: 5px;\n color: #000;\n cursor: pointer;\n border-radius: 10px;\n border: 1px solid #000;\n text-decoration: none;\n &:hover {\n opacity: 0.5;\n }\n`;\n\nconst BotConnection = styled.div`\n margin-top: -20px;\n margin-bottom: 20px;\n \n .connected {\n color: green;\n }\n\n .connect {\n color: green;\n }\n \n .link {\n font-size: 14px;\n\n span {\n text-decoration: none;\n &:hover {\n cursor: pointer;\n text-decoration: underline;\n }\n }\n }\n`;\n\nconst collabNftAssetPerChain = {\n [CHAIN.AURORA_TESTNET]: { symbol: 'COLLAB', address: COLLAB_NFT_CONTRACT_ADDRESS_AURORA_TESTNET },\n [CHAIN.POLYGON_MUMBAI]: { symbol: 'COLLAB', address: COLLAB_NFT_CONTRACT_ADDRESS_POLYGON_MUMBAI_TESTNET },\n};\n\nexport const CollabNFTS = ({ nftMintingStarted, botAutoConnectionStarted }) => {\n const { chain, setChain, sendTransactions, address: accountAddress } = useWallet();\n const [isLoading, setIsLoading] = useState(false);\n const [isMigrating, setIsMigrating] = useState(false);\n const [isBurning, setIsBurning] = useState(false);\n const [nftsPerChain, setNftsPerChain] = useState({});\n const [isNftMinting, setIsNftMinting] = useState(false);\n const [isBotConnected, setIsBotConnected] = useState(undefined);\n const botAutoConnectionStatus = useRef(undefined);\n\n const onChainSelected = (newChain) => {\n setChain(newChain);\n };\n\n const fetchNfts = useCallback(async () => {\n setIsLoading(true);\n\n const { balance, tokenId } = await getNftBalanceAndTokenId(chain, collabNftAssetPerChain[chain].address);\n\n if (!balance) {\n setIsLoading(false);\n setNftsPerChain((current) => ({ ...current, [chain]: [] }));\n return;\n }\n\n setIsLoading(false);\n setNftsPerChain((current) => ({\n ...current,\n [chain]: [{ tokenId, tokenAddress: collabNftAssetPerChain[chain].address }],\n }));\n }, [chain]);\n\n const onMigrateClick = async (tokenId) => {\n if (isMigrating) return;\n\n setIsMigrating(true);\n const migrationTransactions = await buildTestnetNftFromAuroraToPolygonMigrationTransactions(tokenId);\n await sendTransactions(CHAIN.AURORA_TESTNET, migrationTransactions);\n await pause(3);\n await requestCollabNftMigration(accountAddress);\n\n setNftsPerChain((current) => ({ ...current, [CHAIN.AURORA_TESTNET]: [] }));\n setIsMigrating(false);\n alert('Successfully migrated!')\n\n onChainSelected(CHAIN.POLYGON_MUMBAI);\n };\n\n const smartReloadNfts = useCallback(async (nonZeroValue, cb) => {\n for (const i of [1, 2, 3, 3, 3, 3, 3]) {\n await pause(i);\n const balance = await getNftBalance(chain, collabNftAssetPerChain[chain].address);\n if ((balance && nonZeroValue) || (!balance && !nonZeroValue)) {\n cb();\n fetchNfts();\n break;\n }\n }\n }, [chain, fetchNfts]);\n\n const onBurnClick = async (chain, tokenId) => {\n if (isBurning) return;\n\n setIsBurning(true);\n const migrationTransaction = await buildBurnNftTransaction(chain, tokenId);\n await sendTransactions(chain, [migrationTransaction]);\n\n if (chain === CHAIN.AURORA_TESTNET) {\n setItem(STORAGE_KEY.MINTED_COLLAB_NFT_TOKEN_ID, '');\n }\n\n smartReloadNfts(false, () => {\n setIsBurning(false);\n });\n alert('Burn transaction submitted');\n };\n\n useEffect(() => {\n fetchNfts();\n }, [chain, fetchNfts]);\n\n useEffect(() => {\n if (nftMintingStarted) {\n setIsNftMinting(true);\n smartReloadNfts(true, () => {\n setIsNftMinting(false);\n });\n }\n }, [nftMintingStarted, smartReloadNfts]);\n\n useEffect(() => {\n if (!botAutoConnectionStarted && botAutoConnectionStatus.current) {\n isCollabBotConnected().then(setIsBotConnected);\n }\n botAutoConnectionStatus.current = botAutoConnectionStarted;\n }, [botAutoConnectionStarted]);\n\n useEffect(() => {\n isCollabBotConnected().then(setIsBotConnected);\n }, []);\n\n const chainNfts = nftsPerChain[chain] ?? [];\n const mumbaiExplorerAddressHistory = chainToChainDetails[CHAIN.POLYGON_MUMBAI].historyExplorerUrl;\n\n return (\n \n {isBotConnected !== undefined && !botAutoConnectionStarted && (\n \n {isBotConnected && (\n <>\n Bot connected \n (disconnect)\n >\n )}\n {!isBotConnected && (\n <>\n Bot is not connected \n (connect)\n >\n )}\n \n )}\n {botAutoConnectionStarted && Connecting Collab.Land bot..}\n \n {isLoading && !isNftMinting && Loading...}\n {isNftMinting && Minting your NFT...}\n {!isLoading && !isNftMinting && !chainNfts.length && No NFTs}\n {!isLoading && !!chainNfts.length && (\n \n {chainNfts.map(({ tokenAddress, tokenId }, index) => (\n \n Collab NFT #{tokenId}\n {chain === CHAIN.AURORA_TESTNET && (\n <>\n \n \n >\n )}\n {chain === CHAIN.POLYGON_MUMBAI && (\n <>\n View on Explorer\n\n View on OpenSea\n >\n )}\n \n ))}\n \n )}\n \n )\n};\n","import { utils } from 'ethers';\nimport { chainToNativeAsset } from '../services/wallet'\n\nexport const parseMessageSignParamsFromCallRequest = (callRequest) => {\n const { method, params } = callRequest;\n\n let callRequestParams = [...params];\n if (method === 'personal_sign') {\n // different param order on PERSONAL_SIGN\n callRequestParams = callRequestParams.reverse();\n }\n\n const [address, message] = callRequestParams;\n\n let displayMessage;\n if (method === 'personal_sign') {\n try {\n displayMessage = utils.toUtf8String(message);\n } catch (e) {\n ([, displayMessage] = callRequestParams);\n }\n } else if (method.startsWith('eth_signTypedData')) {\n displayMessage = 'Typed data message';\n } else {\n ([, displayMessage] = callRequestParams);\n }\n\n return { address, message, displayMessage };\n};\n\nexport const parseCallRequest = async (chain, callRequest) => {\n const { params: requestParams } = callRequest;\n let displayParams = [{ label: 'Method', value: callRequest.method }];\n let transaction;\n let message;\n\n switch (callRequest.method) {\n case 'eth_sendTransaction':\n case 'eth_signTransaction':\n let { symbol } = chainToNativeAsset[chain];\n\n transaction = {\n to: requestParams[0].to,\n value: requestParams[0].value,\n data: requestParams[0].data,\n };\n\n displayParams = [\n ...displayParams,\n { label: 'From', value: requestParams[0].from },\n { label: 'To', value: requestParams[0].to },\n {\n label: 'Value',\n value: requestParams[0].value ? `${utils.formatUnits(requestParams[0].value)} ${symbol}` : '',\n },\n {\n label: 'Data',\n value: requestParams[0].data?.length > 100\n ? `${requestParams[0].data.slice(0, 50)}...${requestParams[0].data.slice(requestParams[0].data.length - 50, requestParams[0].data.length)}`\n : requestParams[0].data,\n },\n ];\n break;\n\n default:\n const parsed = parseMessageSignParamsFromCallRequest(callRequest);\n const { address, displayMessage } = parsed;\n ({ message } = parsed);\n displayParams = [\n ...displayParams,\n { label: 'Address', value: address },\n { label: 'Message', value: displayMessage },\n ];\n break;\n }\n\n return { displayParams, transaction, message };\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport WalletConnect from \"@walletconnect/client\";\nimport QrReader from 'react-camera-qr';\nimport styled from 'styled-components';\nimport { ethers } from 'ethers';\n\n// components\nimport { Modal } from '../components/Modal';\n\n// services\nimport { getItem, setItem } from '../services/storage';\nimport {\n canSignWithWallet,\n chainIdToChain,\n chainToNativeAsset,\n signMessage,\n signTransaction,\n signTypedData,\n} from '../services/wallet';\n\n// utils\nimport { color } from '../utils/theme';\nimport { parseCallRequest } from '../utils/walletConnect';\nimport { formatNumber } from '../utils/common';\n\n// hooks\nimport { useWallet } from './WalletProvider';\n\n\nconst ModalTitle = styled.p`\n text-align: center;\n font-weight: 700;\n margin-bottom: 15px;\n font-size: 20px;\n`;\n\nconst CallRequestDetailsRow = styled.p`\n margin-bottom: 15px;\n word-break: break-all;\n`;\n\nconst CallRequestConfirm = styled.div`\n margin-top: 30px;\n background: ${color.linearRed};\n color: #fff;\n text-align: center;\n border-radius: 15px;\n height: 30px;\n padding: 8px 35px;\n line-height: 30px;\n cursor: pointer;\n\n ${({ disabled }) => disabled && 'opacity: 0.5;'}\n ${({ disabled }) => !disabled && `\n &:hover {\n opacity: 0.5;\n }\n `}\n`;\n\nconst CallRequestReject = styled.div`\n margin: 10px 0px 20px;\n color: ${color.linearRed};\n text-align: center;\n cursor: pointer;\n\n ${({ disabled }) => disabled && 'opacity: 0.5;'}\n ${({ disabled }) => !disabled && `\n &:hover {\n opacity: 0.5;\n }\n `}\n`;\n\nconst DeploymentWarning = styled.p`\n margin: 30px 0;\n text-align: center;\n text-decoration: underline;\n`;\n\nexport const WalletConnectContext = React.createContext(null);\n\nconst walletConnectStorageService = ({\n getSessions: () => {\n let sessions = [];\n\n try {\n const sessionsRaw = getItem(`walletConnectSessions`)\n sessions = sessionsRaw ? JSON.parse(sessionsRaw) : [];\n } catch (err) {\n //\n }\n\n return sessions\n },\n\n setSessions: (sessions) => {\n setItem(`walletConnectSessions`, JSON.stringify(sessions));\n },\n});\n\nconst clientMeta = {\n name: 'Pillar Web Wallet',\n description: 'Pillar Web Wallet',\n url: 'https://pillar-web-wallet-mvp.netlify.app/',\n icons: ['https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/8c/36/c7/8c36c7d5-0698-97b5-13b2-a51564706cf5/AppIcon-1x_U007emarketing-85-220-0-6.png/460x0w.jpg'],\n};\n\nlet activeConnectors = [];\n\nexport const WalletConnectProvider = ({ children }) => {\n const [qrScannerVisible, setQrScannerVisible] = useState(false);\n const [pendingConnector, setPendingConnector] = useState(null);\n const [pendingCallRequest, setPendingCallRequest] = useState(null);\n const {\n address,\n estimateTransactions,\n transactionsEstimate,\n sendTransactions,\n isSendingTransaction,\n } = useWallet();\n\n const setConnectorListeners = useCallback(async (connector) => {\n connector.on('call_request', async (error, payload) => {\n if (error || !payload) {\n alert('WalletConnect request failed!');\n return;\n }\n\n const chain = chainIdToChain[connector.chainId];\n const parsed = await parseCallRequest(chain, payload);\n if (parsed.transaction) {\n estimateTransactions(chain, [parsed.transaction]);\n }\n\n setPendingCallRequest({ chain, peerId: connector.peerId, ...payload, ...parsed });\n });\n\n connector.on('disconnect', () => {\n activeConnectors = activeConnectors.filter(({ peerId }) => peerId !== connector.peerId);\n walletConnectStorageService.setSessions(activeConnectors.map(({ session }) => session));\n });\n }, [estimateTransactions]);\n\n useEffect(() => {\n const storedSessions = walletConnectStorageService.getSessions();\n\n activeConnectors = storedSessions.map((session) => {\n const connector = new WalletConnect({ session, clientMeta });\n setConnectorListeners(connector);\n return connector;\n });\n }, []); // eslint-disable-line\n\n useEffect(() => {\n if (!pendingConnector || !address) return;\n\n pendingConnector.on('session_request', (error, payload) => {\n if (error) {\n alert('Failed to connect!');\n return;\n }\n\n const { peerId, peerMeta, chainId } = payload?.params?.[0] || {};\n if (!peerId || !peerMeta) {\n alert('Failed to connect, peer data is missing!');\n return;\n }\n\n const sessionData = {\n accounts: [address],\n chainId: chainId ?? 1,\n };\n\n try {\n pendingConnector.approveSession(sessionData);\n\n const establishedConnector = new WalletConnect({ session: pendingConnector.session, clientMeta });\n setPendingConnector(null);\n\n const activeConnectorsWithoutMatchingPeerId = activeConnectors.filter(({ peerId }) => peerId !== establishedConnector.peerId);\n\n setConnectorListeners(establishedConnector);\n activeConnectors = [...activeConnectorsWithoutMatchingPeerId, establishedConnector];\n\n walletConnectStorageService.setSessions(activeConnectors.map(({ session }) => session));\n } catch (approveSessionError) {\n alert('Failed to establish session!');\n }\n });\n }, [pendingConnector, address]); // eslint-disable-line\n\n\n const handleScannerError = () => {\n setQrScannerVisible(false);\n alert('Scanner aborted!');\n }\n\n const handleScannerResult = (result) => {\n if (!result) return;\n\n if (!result.startsWith('wc:')) {\n alert('Failed to connect, wrong QR code!');\n return;\n }\n\n setQrScannerVisible(false);\n\n const connector = new WalletConnect({\n uri: result,\n clientMeta: {\n name: 'Pillar Web Wallet',\n description: 'Pillar Web Wallet',\n url: 'https://pillar-web-wallet-mvp.netlify.app/',\n icons: ['https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/8c/36/c7/8c36c7d5-0698-97b5-13b2-a51564706cf5/AppIcon-1x_U007emarketing-85-220-0-6.png/460x0w.jpg'],\n },\n });\n\n setPendingConnector(connector);\n };\n\n const scan = () => {\n // hack into WalletConnect lib to remove active connector that forbids multiple connections\n localStorage.removeItem('walletconnect');\n setQrScannerVisible(true);\n }\n\n const rejectPendingCallRequest = useCallback(() => {\n if (!pendingCallRequest || isSendingTransaction) return;\n\n const { peerId, id: callId } = pendingCallRequest;\n setPendingCallRequest(null);\n\n const matchingConnector = activeConnectors.find((activeConnector) => activeConnector.peerId === peerId);\n if (!matchingConnector) {\n return;\n }\n\n matchingConnector.rejectRequest({\n id: +callId,\n error: new Error('Call request rejected by user.'),\n });\n }, [isSendingTransaction, pendingCallRequest]);\n\n const isTransaction = useMemo(\n () => pendingCallRequest && pendingCallRequest.method === 'eth_sendTransaction',\n [pendingCallRequest],\n );\n\n const isSubmitDisabled = useMemo(() => {\n if (!pendingCallRequest) return true;\n\n if (!isTransaction) return !canSignWithWallet(pendingCallRequest.chain);\n\n return !transactionsEstimate || isSendingTransaction;\n } , [transactionsEstimate, isSendingTransaction, pendingCallRequest, isTransaction]);\n\n\n const approvePendingCallRequest = useCallback(async () => {\n if (!pendingCallRequest || isSubmitDisabled) return;\n\n const { peerId, id: callId, method, message, transaction, chain } = pendingCallRequest;\n setPendingCallRequest(null);\n\n const matchingConnector = activeConnectors.find((activeConnector) => activeConnector.peerId === peerId);\n if (!matchingConnector) {\n return;\n }\n\n let result;\n try {\n if (method === 'eth_sendTransaction') {\n ({ hash: result } = await sendTransactions(chain, [transaction], true));\n } else if (method === 'eth_signTransaction') {\n result = await signTransaction(chain, transaction);\n } else if (method.includes('signTypedData')) {\n result = await signTypedData(message);\n } else {\n result = await signMessage(message);\n }\n } catch (error) {\n //\n }\n\n if (!result) {\n alert('Failed to confirm.');\n matchingConnector.rejectRequest({\n id: +callId,\n error: new Error('Failed to sign a message.'),\n });\n return;\n }\n\n matchingConnector.approveRequest({\n id: +callId,\n result,\n });\n }, [isSubmitDisabled, pendingCallRequest, sendTransactions]);\n\n const providerData = useMemo(() => ({\n scan\n }), []);\n\n return (\n \n setQrScannerVisible(false)}\n >\n Scan QR code from your OpenSea connection page\n \n \n \n WalletConnect Call Request\n {!!pendingCallRequest?.displayParams && (\n <>\n {pendingCallRequest.displayParams.map(({ label, value }) => (\n {label}: {value}\n ))}\n {isTransaction && (\n \n Transaction fee: \n {!!transactionsEstimate && <>{formatNumber(ethers.utils.formatEther(transactionsEstimate))} {chainToNativeAsset[pendingCallRequest.chain].symbol}>}\n {!transactionsEstimate && `Estimating...`}\n \n )}\n >\n )}\n {!isTransaction && isSubmitDisabled && (\n \n Cannot sign with un-deployed wallet.
Wallet deployment happens on any first outgoing transaction.\n \n )}\n \n {isSendingTransaction ? 'Sending...' : 'Confirm'}\n \n Reject\n \n {children}\n \n )\n};\n\nexport const useWalletConnect = () => React.useContext(WalletConnectContext)?.providerData ?? {}\n","import { useCallback, useEffect, useState } from 'react'\nimport styled from 'styled-components';\nimport { useParams } from 'react-router-dom';\n\n// constants\nimport { STORAGE_KEY } from '../constants/storageConstants'\n\n// components\nimport { Send } from './Send';\nimport { Receive } from './Receive';\nimport { History } from './History';\nimport { CollabNFTS } from './CollabNfts';\n\n// hooks\nimport { useWallet } from '../providers/WalletProvider';\nimport { useWalletConnect } from '../providers/WalletConnectProvider';\n\n// services\nimport { mintCollabNftToAddress, registerCollabUser } from '../services/collabNfts';\nimport { getItem, setItem } from '../services/storage';\nimport { connectCollabBot } from '../services/etherspot';\n\n// utils\nimport { color, fontWeight } from '../utils/theme';\n\n\nconst Wrapper = styled.div`\n max-width: 600px;\n padding: 0 15px;\n margin: 50px auto 0;\n text-align: center;\n`;\n\nconst TabsContent = styled.div`\n max-width: 600px;\n padding: 0 15px;\n margin: 50px auto 0;\n text-align: center;\n`;\n\nconst TabsButton = styled.div`\n ${({ $active }) => $active && `text-decoration: underline;`}\n margin: 0 15px;\n cursor: pointer;\n font-weight: ${fontWeight.bold};\n\n &:hover {\n text-decoration: underline;\n }\n`;\n\nconst TabsNavigation = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst ConnectWalletButton = styled.div`\n background: ${color.linearRed};\n color: #fff;\n text-align: center;\n border-radius: 10px;\n height: 25px;\n padding: 15px;\n font-size: 20px;\n line-height: 25px;\n cursor: pointer;\n\n &:hover {\n opacity: 0.8;\n }\n`;\n\nconst ErrorMessage = styled.div`\n font-size: 14px;\n margin-top: 15px;\n color: ${color.red};\n`;\n\nconst TAB = {\n RECEIVE: 'RECEIVE',\n SEND: 'SEND',\n HISTORY: 'HISTORY',\n COLLAB_NFTS: 'COLLAB_NFTS',\n};\n\nexport const Wallet = () => {\n const urlSearchParams = new URLSearchParams(window.location.search);\n const urlParams = Object.fromEntries(urlSearchParams.entries());\n const { collabId } = urlParams;\n const { referralCode } = useParams();\n const [activeTab, setActiveTab] = useState(referralCode ? TAB.COLLAB_NFTS : TAB.RECEIVE);\n const [nftMintingStarted, setNftMintingStarted] = useState(false);\n const [botAutoConnectionStarted, setBotAutoConnectionStarted] = useState(false);\n const { scan } = useWalletConnect();\n\n const {\n address,\n isConnected,\n connect,\n isConnecting,\n connectionError,\n } = useWallet();\n\n const processReferralCode = useCallback(async () => {\n if (!address) return;\n\n // connect collab bot\n if (collabId && !getItem(STORAGE_KEY.ADDED_COLLAB_BOT)) {\n try {\n setBotAutoConnectionStarted(true);\n await connectCollabBot();\n await registerCollabUser(address, collabId);\n } catch (e) {\n console.log(e);\n } finally {\n setBotAutoConnectionStarted(false);\n setItem(STORAGE_KEY.ADDED_COLLAB_BOT, true);\n }\n }\n\n // mint item\n if (getItem(STORAGE_KEY.MINTED_COLLAB_NFT_TOKEN_ID)) return;\n setNftMintingStarted(true);\n const tokenId = await mintCollabNftToAddress(address);\n if (!tokenId) return;\n\n setItem(STORAGE_KEY.MINTED_COLLAB_NFT_TOKEN_ID, tokenId);\n setNftMintingStarted(false);\n }, [address, collabId]);\n\n useEffect(() => {\n if (!isConnected || !referralCode) return;\n if (referralCode === 'lisbon2021') processReferralCode();\n }, [isConnected, referralCode, processReferralCode]);\n\n if (!isConnected) {\n return (\n \n {isConnecting && Connecting...}\n {!isConnecting && ( connect()}>Connect Your Wallet)}\n {!!connectionError && ({connectionError})}\n \n );\n }\n\n return (\n \n \n setActiveTab(TAB.RECEIVE)}>My account\n setActiveTab(TAB.SEND)}>Send\n setActiveTab(TAB.HISTORY)}>History\n setActiveTab(TAB.COLLAB_NFTS)}>Collab NFTs\n Use WalletConnect\n \n \n {activeTab === TAB.RECEIVE && }\n {activeTab === TAB.SEND && }\n {activeTab === TAB.HISTORY && }\n {activeTab === TAB.COLLAB_NFTS && (\n \n )}\n \n \n )\n}\n","import { createGlobalStyle } from 'styled-components';\nimport Modal from 'react-modal';\nimport {\n BrowserRouter as Router,\n Switch,\n Route,\n} from 'react-router-dom';\n\n// components\nimport { Wallet } from '../components/Wallet'\n\n// utils\nimport { fontFamily, fontWeight } from '../utils/theme'\n\n// providers\nimport { WalletProvider } from '../providers/WalletProvider'\nimport { WalletConnectProvider } from '../providers/WalletConnectProvider'\n\n\nModal.setAppElement('#root');\n\nconst GlobalStyle = createGlobalStyle`\n * {\n margin: 0;\n padding: 0;\n }\n \n body, input {\n font-family: \"${fontFamily.default}\", sans;\n font-weight: ${fontWeight.regular};\n }\n \n b, strong {\n font-weight: ${fontWeight.bold};\n }\n\n &:focus {\n outline: none;\n }\n`;\n\nconst App = () => (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n >\n);\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\n// containers\nimport App from './containers/App'\n\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n"],"sourceRoot":""}