~Webmodule~ to include a "Buy button" with streamlined crypto-pay transaction.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1 line
33KB

  1. {"version":3,"sources":["components/ConnectWallet.tsx","components/DisconnectWallet.tsx","config.ts","components/BuyButton.tsx","App.tsx","serviceWorker.js","index.js"],"names":["ConnectButton","Tezos","setWallet","setContract","setUserAddress","setUserBalance","setBeaconConnection","setStorage","setPublicToken","wallet","useState","loadingNano","setLoadingNano","setup","userAddress","a","tz","getBalance","balance","toNumber","connectWallet","requestPermissions","network","type","NetworkType","MAINNET","rpcUrl","getPKH","console","log","connectNano","TransportU2F","create","transport","ledgerSigner","LedgerSigner","setSignerProvider","signer","publicKeyHash","useEffect","BeaconWallet","name","preferredNetwork","disableDefaultEvents","eventHandlers","BeaconEvent","PAIR_INIT","handler","defaultEventCallbacks","PAIR_SUCCESS","data","publicKey","setWalletProvider","client","getActiveAccount","className","onClick","disabled","DisconnectButton","disconnectWallet","removeAllAccounts","removeAllPeers","destroy","config","defaultTezPrice","last_updated_at","usd","usd_24h_change","usd_24h_vol","usd_market_cap","defaultTokenPrice","storageLimitSurcharge","lpTokenDecimals","FLORENCENET","CUSTOM","ButtonState","BeaconConnection","BuyButton","FA2address","swapContract","sender","receiver","amountUsd","redirectSuccess","tezUsd","setTezUsd","tezPool","setTezPool","tokenPool","setTokenPool","fiat2Token","setFiat2Token","symbol","decimals","tokenDetails","setTokenDetails","CALCULATING_PRICE","status","setStatus","opHash","setOpHash","tezMultiplyer","tokenMultiplyer","setTokenMultiplyer","initTokenContract","coinContract","at","newContract","storage","newStorage","assets","token_metadata","get","metdata","totalSupply","parseInt","total_supply","bytes2Char","description","thumbnailUri","shouldPreferSymbol","coinContractAddress","error","getTezosPrice","getPoolSizes","READY_TO_PAY","fetch","then","res","json","tezos","item","code","parseFloat","tez_pool","token_pool","buyMethod","makePayment","window","location","href","contract","transfer_params","from_","txs","to_","token_id","amount","Math","round","methods","transfer","send","op","AWAITING_CONFIRMATION","confirmation","App","fa2Contract","setTezos","undefined","publicToken","userBalance","isNaN","id","Boolean","hostname","match","appNodes","document","getElementsByClassName","TezosToolkit","i","length","appNode","ReactDOM","render","StrictMode","dataset"],"mappings":"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","file":"static/js/main.10484aec.chunk.js","sourcesContent":["import React, { Dispatch, SetStateAction, useState, useEffect } from \"react\";\nimport { TezosToolkit } from \"@taquito/taquito\";\nimport { BeaconWallet } from \"@taquito/beacon-wallet\";\nimport {\n NetworkType,\n BeaconEvent,\n defaultEventCallbacks\n} from \"@airgap/beacon-sdk\";\nimport TransportU2F from \"@ledgerhq/hw-transport-u2f\";\nimport { LedgerSigner } from \"@taquito/ledger-signer\";\n\ntype ButtonProps = {\n Tezos: TezosToolkit;\n setContract: Dispatch<SetStateAction<any>>;\n setWallet: Dispatch<SetStateAction<any>>;\n setUserAddress: Dispatch<SetStateAction<string>>;\n setUserBalance: Dispatch<SetStateAction<number>>;\n setStorage: Dispatch<SetStateAction<number>>;\n// contractAddress: string;\n setBeaconConnection: Dispatch<SetStateAction<boolean>>;\n setPublicToken: Dispatch<SetStateAction<string | null>>;\n wallet: BeaconWallet;\n};\n\nconst ConnectButton = ({\n Tezos,\n setContract,\n setWallet,\n setUserAddress,\n setUserBalance,\n setStorage,\n// contractAddress,\n setBeaconConnection,\n setPublicToken,\n wallet\n}: ButtonProps): JSX.Element => {\n const [loadingNano, setLoadingNano] = useState<boolean>(false);\n\n const setup = async (userAddress: string): Promise<void> => {\n setUserAddress(userAddress);\n // updates balance\n const balance = await Tezos.tz.getBalance(userAddress);\n setUserBalance(balance.toNumber());\n // creates contract instance\n //const contract = await Tezos.wallet.at(contractAddress);\n //const storage: any = await contract.storage();\n //setContract(contract);\n //setStorage(storage.toNumber());\n };\n\n const connectWallet = async (): Promise<void> => {\n try {\n await wallet.requestPermissions({\n network: {\n type: NetworkType.MAINNET,\n rpcUrl: \"https://mainnet.api.tez.ie/\"\n }\n });\n // gets user's address\n const userAddress = await wallet.getPKH();\n await setup(userAddress);\n setBeaconConnection(true);\n } catch (error) {\n console.log(error);\n }\n };\n\n const connectNano = async (): Promise<void> => {\n try {\n setLoadingNano(true);\n const transport = await TransportU2F.create();\n const ledgerSigner = new LedgerSigner(transport, \"44'/1729'/0'/0'\", true);\n\n Tezos.setSignerProvider(ledgerSigner);\n\n //Get the public key and the public key hash from the Ledger\n const userAddress = await Tezos.signer.publicKeyHash();\n await setup(userAddress);\n } catch (error) {\n console.log(\"Error!\", error);\n setLoadingNano(false);\n }\n };\n\n useEffect(() => {\n (async () => {\n // creates a wallet instance\n const wallet = new BeaconWallet({\n name: \"Taquito Boilerplate\",\n preferredNetwork: NetworkType.MAINNET,\n disableDefaultEvents: true, // Disable all events / UI. This also disables the pairing alert.\n eventHandlers: {\n // To keep the pairing alert, we have to add the following default event handlers back\n [BeaconEvent.PAIR_INIT]: {\n handler: defaultEventCallbacks.PAIR_INIT\n },\n [BeaconEvent.PAIR_SUCCESS]: {\n handler: data => setPublicToken(data.publicKey)\n }\n }\n });\n Tezos.setWalletProvider(wallet);\n setWallet(wallet);\n // checks if wallet was connected before\n const activeAccount = await wallet.client.getActiveAccount();\n if (activeAccount) {\n const userAddress = await wallet.getPKH();\n await setup(userAddress);\n setBeaconConnection(true);\n }\n })();\n }, []);\n\n return (\n <div className=\"buttons\">\n <button className=\"button\" onClick={connectWallet}>\n <span>\n <i className=\"fas fa-wallet\"></i>&nbsp; Connect with wallet\n </span>\n </button>\n <button className=\"button\" disabled={loadingNano} onClick={connectNano}>\n {loadingNano ? (\n <span>\n <i className=\"fas fa-spinner fa-spin\"></i>&nbsp; Loading, please\n wait\n </span>\n ) : (\n <span>\n <i className=\"fab fa-usb\"></i>&nbsp; Connect with Ledger Nano\n </span>\n )}\n </button>\n </div>\n );\n};\n\nexport default ConnectButton;\n","import React, { Dispatch, SetStateAction } from \"react\";\nimport { BeaconWallet } from \"@taquito/beacon-wallet\";\nimport { TezosToolkit } from \"@taquito/taquito\";\n\ninterface ButtonProps {\n wallet: BeaconWallet | null;\n setPublicToken: Dispatch<SetStateAction<string | null>>;\n setUserAddress: Dispatch<SetStateAction<string>>;\n setUserBalance: Dispatch<SetStateAction<number>>;\n setWallet: Dispatch<SetStateAction<any>>;\n //setTezos: Dispatch<SetStateAction<TezosToolkit>>;\n setBeaconConnection: Dispatch<SetStateAction<boolean>>;\n}\n\nconst DisconnectButton = ({\n wallet,\n setPublicToken,\n setUserAddress,\n setUserBalance,\n setWallet,\n //setTezos,\n setBeaconConnection\n}: ButtonProps): JSX.Element => {\n const disconnectWallet = async (): Promise<void> => {\n //window.localStorage.clear();\n setUserAddress(\"\");\n setUserBalance(0);\n setWallet(null);\n //const tezosTK = new TezosToolkit(\"https://api.tez.ie/rpc/granadanet\");\n //setTezos(tezosTK);\n setBeaconConnection(false);\n setPublicToken(null);\n console.log(\"disconnecting wallet\");\n if (wallet) {\n await wallet.client.removeAllAccounts();\n await wallet.client.removeAllPeers();\n await wallet.client.destroy();\n }\n };\n\n return (\n <div className=\"buttons\">\n <button className=\"button\" onClick={disconnectWallet}>\n <i className=\"fas fa-times\"></i>&nbsp; Disconnect wallet\n </button>\n </div>\n );\n};\n\nexport default DisconnectButton;\n","import { NetworkType } from \"@airgap/beacon-sdk\";\n\nconst config = {\n network: NetworkType.MAINNET,\n rpcUrl: \"\",\n defaultTezPrice: {\n last_updated_at: 1621264908,\n usd: 5.24,\n usd_24h_change: -10.701803732742505,\n usd_24h_vol: 410319278.74019855,\n usd_market_cap: 4367588701.058423,\n },\n defaultTokenPrice: {\n last_updated_at: 1621264908,\n usd: 0.0,\n usd_24h_change: 0,\n usd_24h_vol: 0,\n usd_market_cap: 0,\n },\n storageLimitSurcharge: 1.2, // multiplier\n lpTokenDecimals: 1000000\n};\n\nswitch (config.network) {\n case NetworkType.MAINNET:\n config.rpcUrl = \"https://mainnet.api.tez.ie\";\n break;\n case NetworkType.FLORENCENET:\n config.rpcUrl = \"https://rpc.florence.tzstats.com/\";\n break;\n case NetworkType.CUSTOM:\n config.rpcUrl = \"http://localhost:8732/\";\n break;\n}\n\nexport default config;\n","import React, { Dispatch, SetStateAction, useState, useEffect } from \"react\";\n\nimport { TezosToolkit } from \"@taquito/taquito\";\nimport { BeaconWallet } from \"@taquito/beacon-wallet\";\nimport { bytes2Char } from '@taquito/utils';\n\n\nimport config from \"./../config\";\n\n\ninterface BuyButtonProps {\n Tezos: TezosToolkit,\n FA2address: string,\n swapContract: string,\n sender: string,\n receiver: string,\n amountUsd: number,\n redirectSuccess: string\n}\n\ninterface CoinGeckoPrice {\n last_updated_at: number;\n usd: number;\n usd_24h_change: number;\n usd_24h_vol: number;\n usd_market_cap: number;\n}\n\nenum ButtonState {\n CALCULATING_PRICE,\n READY_TO_PAY,\n AWAITING_CONFIRMATION\n}\n\n// interface TokenDetails {\n// \n// }\n\nconst BuyButton = ({\n Tezos,\n FA2address,\n swapContract,\n sender,\n receiver,\n amountUsd,\n redirectSuccess\n}: BuyButtonProps ): JSX.Element => {\n \n const [tezUsd, setTezUsd] = useState<CoinGeckoPrice>(config.defaultTezPrice);\n const [tezPool, setTezPool] = useState<number>(0);\n const [tokenPool, setTokenPool] = useState<number>(0);\n const [fiat2Token, setFiat2Token] = useState<number>(0);\n const [tokenDetails, setTokenDetails] = useState<any>({\n symbol:\"\",\n decimals:6\n });\n const [status, setStatus] = useState<ButtonState>(ButtonState.CALCULATING_PRICE);\n const [opHash, setOpHash] = useState<string>(\"\");\n const tezMultiplyer = 10 ** 6;\n const [tokenMultiplyer, setTokenMultiplyer] = useState<number>(10 ** 6);\n\n \n async function initTokenContract(coinContract:string) {\n try {\n const newContract = await Tezos.wallet.at(coinContract);\n const newStorage: any = await newContract.storage();\n const metdata: any = await newStorage.assets.token_metadata.get(0);\n console.log(metdata);\n const tokenDetails = {\n totalSupply: parseInt(newStorage.assets.total_supply),\n name: bytes2Char(metdata['token_info'].get('name')),\n symbol: bytes2Char(metdata['token_info'].get('symbol')),\n description: bytes2Char(metdata['token_info'].get('description')),\n thumbnailUri: bytes2Char(metdata['token_info'].get('thumbnailUri')),\n decimals: parseInt(bytes2Char(metdata['token_info'].get('decimals'))),\n shouldPreferSymbol: bytes2Char(metdata['token_info'].get('shouldPreferSymbol')) === 'true',\n coinContractAddress: coinContract,\n swapContract: swapContract,\n }\n setTokenMultiplyer(10 ** tokenDetails.decimals)\n setTokenDetails(tokenDetails)\n } catch (e) {\n console.error(e)\n }\n }\n \n useEffect(() => {\n (async () => {\n await initTokenContract(FA2address);\n })();\n },[])\n \n useEffect(() => {\n getTezosPrice();\n getPoolSizes();\n }, [tokenDetails])\n \n // calculate Price in Token\n useEffect(() => {\n if( tezUsd.usd > 0 &&\n tezPool > 0 &&\n tokenPool > 0 ) {\n setFiat2Token( tokenPool / tezPool / tezUsd.usd);\n if (status<ButtonState.READY_TO_PAY) {\n setStatus(ButtonState.READY_TO_PAY);\n }\n } else {\n \n }\n \n })\n \n const getTezosPrice = async (): Promise<void> => {\n // https://www.coingecko.com/en/api#explore-api\n fetch(\"https://api.coingecko.com/api/v3/simple/price?ids=tezos&vs_currencies=usd&include_market_cap=true&include_24hr_vol=true&include_24hr_change=true&include_last_updated_at=true\")\n .then(res => res.json())\n .then(res => setTezUsd(res.tezos))\n }\n \n const getPoolSizes = async (): Promise<void> => {\n \n fetch(\"https://api.tzkt.io/v1/contracts/\"+tokenDetails.swapContract+\"/storage\")\n .then(res => res.json())\n .then(item => {\n if (item.code == 400) { } else {\n setTezPool( parseFloat(item.storage.tez_pool) / tezMultiplyer);\n setTokenPool( parseFloat(item.storage.token_pool) / tokenMultiplyer);\n //console.log(tokenPool + \" -- \" + parseFloat(item.storage.token_pool)) \n }\n }\n )\n }\n \n const buyMethod = async (): Promise<void> => {\n makePayment().then(\n ()=>window.location.href = redirectSuccess,\n ()=>console.log(\"something went wrong\")\n );\n }\n \n const makePayment = async (): Promise<void> => {\n\tconst contract = await Tezos.wallet.at(FA2address);\n const transfer_params = [\n {\n from_: sender,\n txs: [{\n to_: receiver,\n token_id:0,\n amount: Math.round(amountUsd * fiat2Token * tokenMultiplyer)\n }]\n }\n ];\n \n \n const op = await contract.methods.transfer(transfer_params).send()\n .then((op)=>{\n setOpHash(op.opHash);\n setStatus(ButtonState.AWAITING_CONFIRMATION);\n op.confirmation(); \n });\n }\n \n return (<div className=\"freaPay\"><div className=\"info\">\n {status === ButtonState.CALCULATING_PRICE && <span>calculating price</span>}\n {status === ButtonState.READY_TO_PAY && <span>{amountUsd} USD = {amountUsd * fiat2Token} {tokenDetails.symbol}</span>}\n {status === ButtonState.AWAITING_CONFIRMATION && <span>waiting for confirmation of transaction hash {opHash}</span>}\n </div>\n {status === ButtonState.READY_TO_PAY && \n <button \n className=\"button pay-button\"\n onClick={buyMethod}>Pay\n </button>\n }\n </div>);\n \n// if (status == ButtonState.READY_TO_PAY) {\n// return (<div className=\"freaPay\"><div className=\"info\">{amountUsd} USD = {amountUsd * fiat2Token} {tokenDetails.symbol}</div>\n// <div className=\"buttons\">\n// \n// \n// <button\n// \tclassName=\"button pay-button\"\n// \tonClick={buyMethod}\n// \t >Pay {amountUsd * fiat2Token} {tokenDetails.symbol}\n// </button>\n// </div></div>\n// );\n// } else if (status == ButtonState.CALCULATING_PRICE) {\n// return (<div> calculating price</div>);\n// } else if (status == ButtonState.AWAITING_CONFIRMATION) {\n// return (<div>waiting for confirmation</div>);\n// } else return (<div>an error has occured...</div>);\n};\n\nexport default BuyButton; \n","import React, { useState, useEffect } from \"react\";\nimport { TezosToolkit } from \"@taquito/taquito\";\n\n\nimport \"./App.css\";\nimport ConnectButton from \"./components/ConnectWallet\";\nimport DisconnectButton from \"./components/DisconnectWallet\";\nimport qrcode from \"qrcode-generator\";\nimport UpdateContract from \"./components/UpdateContract\";\nimport Transfers from \"./components/Transfers\";\nimport BuyButton from \"./components/BuyButton\";\n\nenum BeaconConnection {\n NONE = \"\",\n LISTENING = \"Listening to P2P channel\",\n CONNECTED = \"Channel connected\",\n PERMISSION_REQUEST_SENT = \"Permission request sent, waiting for response\",\n PERMISSION_REQUEST_SUCCESS = \"Wallet is connected\"\n}\n\ntype AppProps = {\n swapContract: string,\n fa2Contract: string,\n receiver: string,\n amount: number,\n Tezos: TezosToolkit\n setTezos: any, \n redirectSuccess: string\n}\n\nconst App = ({\n swapContract,\n fa2Contract,\n receiver,\n amount,\n Tezos,\n setTezos,\n redirectSuccess\n}: AppProps) => {\n \n const [contract, setContract] = useState<any>(undefined);\n const [publicToken, setPublicToken] = useState<string | null>(\"\");\n const [wallet, setWallet] = useState<any>(null);\n const [userAddress, setUserAddress] = useState<string>(\"\");\n const [userBalance, setUserBalance] = useState<number>(0);\n const [storage, setStorage] = useState<number>(0);\n const [copiedPublicToken, setCopiedPublicToken] = useState<boolean>(false);\n const [beaconConnection, setBeaconConnection] = useState<boolean>(false);\n\n \n const generateQrCode = (): { __html: string } => {\n const qr = qrcode(0, \"L\");\n qr.addData(publicToken || \"\");\n qr.make();\n\n return { __html: qr.createImgTag(4) };\n };\n \n\n\n if (publicToken && (!userAddress || isNaN(userBalance))) {\n return (\n <div className=\"main-box\">\nconnecting\n </div>\n );\n } else if (userAddress && !isNaN(userBalance)) {\n return (\n <div className=\"main-box\">\n\n\n <div id=\"dialog\">\n <BuyButton\n Tezos={Tezos}\n sender={userAddress}\n FA2address={fa2Contract}\n swapContract={swapContract}\n receiver={receiver}\n amountUsd={amount}\n redirectSuccess={redirectSuccess}\n />\n <DisconnectButton \n wallet={wallet}\n setPublicToken={setPublicToken}\n setUserAddress={setUserAddress}\n setWallet={setWallet}\n setBeaconConnection={setBeaconConnection}\n setUserBalance={setUserBalance}\n />\n </div>\n </div>\n );\n } else if (!publicToken && !userAddress && !userBalance) {\n return (\n <div className=\"main-box\">\n <div id=\"dialog\">\n <ConnectButton\n Tezos={Tezos}\n setContract={setContract}\n setPublicToken={setPublicToken}\n setWallet={setWallet}\n setUserAddress={setUserAddress}\n setUserBalance={setUserBalance}\n setStorage={setStorage}\n// contractAddress={contractAddress}\n setBeaconConnection={setBeaconConnection}\n wallet={wallet}\n />\n </div>\n </div>\n );\n } else {\n return <div>An error has occurred</div>;\n }\n};\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React, {useState} from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App.tsx\";\nimport * as serviceWorker from \"./serviceWorker\";\n\nimport { TezosToolkit } from \"@taquito/taquito\";\nimport { BeaconWallet } from \"@taquito/beacon-wallet\";\nimport {\n NetworkType,\n BeaconEvent,\n defaultEventCallbacks\n} from \"@airgap/beacon-sdk\";\n\n\nconst appNodes = document.getElementsByClassName(\"pay-button\");\n\nfunction setPublicToken(pubKey) {\n console.log(\"successfully connected to \"+pubKey);\n}\n\nif (appNodes) {\n// const [Tezos, setTezos] = useState<TezosToolkit>(\n// new TezosToolkit(\"https://mainnet.api.tez.ie/\")\n// );\n const Tezos = new TezosToolkit(\"https://mainnet.api.tez.ie/\");\n// const wallet = new BeaconWallet({\n// name: \"freaPay\",\n// preferredNetwork: NetworkType.MAINNET,\n// disableDefaultEvents: true, // Disable all events / UI. This also disables the pairing alert.\n// eventHandlers: {\n// // To keep the pairing alert, we have to add the following default event handlers back\n// [BeaconEvent.PAIR_INIT]: {\n// handler: defaultEventCallbacks.PAIR_INIT\n// },\n// [BeaconEvent.PAIR_SUCCESS]: {\n// handler: data => setPublicToken(data.publicKey)\n// }\n// }\n// });\n\n for (var i = 0; i<appNodes.length; i++) {\n let appNode = appNodes[i];\n \n ReactDOM.render(\n <React.StrictMode>\n <App \n swapContract={appNode.dataset.swapContract}\n fa2Contract={appNode.dataset.fa2Contract}\n receiver={appNode.dataset.receiver}\n amount={appNode.dataset.amount}\n redirectSuccess={appNode.dataset.redirectSuccess}\n Tezos={Tezos}\n \n />\n </React.StrictMode>,\n appNode\n //document.getElementsByClassName(\"c\")\n );\n }\n}\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n//serviceWorker.unregister();\n"],"sourceRoot":""}