Search
Search

Transaction: 7dp9j2M...oLGT

Delegator
Status
Succeeded
Transaction Fee
0.00184 
Deposit Value
0 
Gas Used
18 Tgas
Attached Gas
18 Tgas
Created
August 24, 2023 at 9:47:15am
Hash
7dp9j2M499ZTA2aXhTigpkShsJY2hYMZ2kbfKAbNoLGT

Actions

Actions delegated for shiami.near:
Called method: 'set' in contract: social.near
Arguments:
{ "data": { "shiami.near": { "widget": { "walley": { "": "const nftAddress = \"0x2e0f4a4123d0072f46bf67127270a80114541d86\";\nconst NFTManagerABI = JSON.parse(\n fetch(\"https://raw.githubusercontent.com/test1883/files/main/NFTManager.json\")\n .body\n);\nconst walleyAddress = \"0x8ae53c3a6bf7762db9cc7603a290d769020e4e77\";\nconst WalleyABI = JSON.parse(\n fetch(\"https://raw.githubusercontent.com/test1883/files/main/Walley.json\")\n .body\n);\nState.init({\n general: {\n chainId: undefined,\n balance: 0,\n },\n store: {\n stores: [],\n storeName: \"\",\n storeAddress: \"\",\n isStore: false,\n storePendingTransactions: [],\n storePastTransactions: [],\n storeImages: {},\n openModal: 0,\n approvePassword: \"\",\n bill: { uploading: false, cid: null },\n totalAmount: 0,\n },\n user: {\n userPendingTransactions: [],\n userPastTransactions: [],\n openModal: 0,\n cancelPassword: \"\",\n openReceipt: 0,\n },\n homeInputs: {\n storeName: \"\",\n amount: 0,\n name: \"\",\n password: \"\",\n },\n storeInputs: {\n storeName: \"\",\n storeAddress: \"\",\n image: \"\",\n },\n search: {\n store: \"\",\n user: \"\",\n },\n storeName: \"\",\n view: \"home\",\n loading: true,\n loadingMsg: \"Fetching Data\",\n newTransaction: false,\n});\n\nconst cssFont = fetch(\n \"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800;900&display=swap\"\n).body;\n\nconst Root = styled.div`\n \n background: url(\"https://img.freepik.com/free-vector/abstract-black-shapes-background-design_1017-31904.jpg?w=826&t=st=1692784084~exp=1692784684~hmac=640a88623947cac46d90337f2d03281af01efcdcd5aa64901719774754bd75b3\");\n background-size: cover;\n display: flex;\n font-family: Poppins, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n ${cssFont}\n flex-direction: column;\n padding: 0;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n height: 100vh;\n width: 100vw;\n @media screen and (max-width: 600px) {\n background-position: 70% 70%;\n }\n`;\n\nconst WalleyTitle = styled.div`\n text-align: left;\n font-weight: 900;\n width: 100%;\n font-size: 30px;\n margin: 0px;\n padding: 5px;\n color: #fff; \n @media screen and (max-width: 600px) {\n text-align: center;\n }\n`;\n\nconst WalleyIndexContainer = styled.div`\n height: 100vh;\n color: #fff;\n width: 100%;\n padding: 20px;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyIndexBody = styled.div`\n display: flex;\n flex-direction: column;\n text-align: left;\n width: 500px;\n padding-left: 50px;\n @media screen and (max-width:600px) {\n width: 100%;\n padding-left: 0;\n align-items: center;\n }\n`;\n\nconst WalleyIndexDesc = styled.div`\n color: #fff;\n font-weight: 500;\n font-size: 50px;\n padding-bottom: 10px;\n margin-top: 50px;\n @media screen and (max-width: 400px) {\n margin-top: 150px;\n font-size: 40px;\n }\n`;\n\nconst WalleyIndexMain = styled.div`\n margin-top: 20px;\n width: 100%;\n padding: 20px;\n @media screen and (max-width: 600px) {\n text-align: center;\n position: fixed;\n bottom: 0px;\n left: 0px;\n }\n &>span {\n font-weight: 500;\n @media screen and (max-width: 600px) {\n display: none;\n width: 0px;\n }\n }\n &>button {\n border: none;\n background: #FA9703;\n color: white;\n margin-left: 20px;\n transition: all .2s ease-out;\n &:hover {\n scale: 1.05;\n background:#FA9703;\n }\n &:active {\n background:#FA9703;\n }\n @media screen and (max-width: 600px) {\n width: 100%;\n height: 50px;\n font-size: 15px;\n display: block;\n margin-left: 0px;\n }\n }\n`;\n\nconst WalleyHomeContainer = styled.div`\n background: url(\"https://img.freepik.com/free-vector/abstract-black-shapes-background-design_1017-31904.jpg?w=826&t=st=1692784084~exp=1692784684~hmac=640a88623947cac46d90337f2d03281af01efcdcd5aa64901719774754bd75b3\");\n background-size: cover;\n font-family: Poppins, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n height: 100vh;\n width: 100vw;\n ::placeholder {\n color: rgb(255, 255, 255, 0.5);\n }\n color: #fff;\n display: flex;\n flex-direction: column;\n position: fixed;\n top: 0px;\n @media screen and (max-width: 600px) {\n background-position: 70% 70%;\n }\n`;\n\nconst WalleyHomeHeader = styled.div`\n width: 100%;\n font-size: 30px;\n font-weight: 900;\n padding: 10px;\n padding-bottom: 0px;\n color: #fff;\n display: flex;\n flex-direction: column;\n justify-content: space-around;\n &>p {\n text-align: center;\n }\n\n`;\n\nconst WalleyHomeMain = styled.div`\n padding: 20px;\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 100%;\n align-items: space-between;\n`;\n\nconst WalleyNavbar = styled.div`\n padding: 20px;\n display: flex;\n flex-direction: column;\n position: relative;\n left: 0px;\n height: 100%;\n text-align: left;\n &>svg {\n text-align: left; \n padding: 0;\n width: 24px;\n }\n`;\n\nconst WalleyNavbarButton = styled.button`\n border: none;\n text-align: left;\n background: none;\n color: #fff;\n padding:0px;\n font-weight: 500;\n`;\n\nconst NavLine = styled.span`\n width: 1px;\n height: 70px;\n background: white;\n margin: 4px 0 4px 0;\n`;\nconst NavLineLast = styled.span`\n width: 1px;\n height: 100%;\n background: white;\n margin: 4px 0 4px 0;\n`;\n\nconst WalleyHomeBody = styled.div`\n width: 75%;\n`;\n\nconst WalleyBalance = styled.span`\n padding: 5px;\n font-weight: 500;\n font-size: 15px;\n width: 150px;\n background-color: #424242;\n border-radius: 30px;\n text-align: center;\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n &>svg {\n fill: #fff;\n }\n`;\n\nconst WalleyLoading = styled.div`\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000000;\n background: rgb(66, 66, 66, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n test-align: center;\n font-weight: 400;\n`;\n\nconst WalleyModal = styled.div`\n width: 400px;\n height: 400px;\n background: rgb(66, 66, 66);\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n &>img {\n width: 70px;\n height: 70px;\n }\n @media screen and (max-width: 500px) {\n width: 340px;\n height: 340px;\n }\n\n`;\n\nconst WalleyButton = styled.button`\n background-color: ${props.bg};\n color: ${props.color};\n display: block;\n border: none;\n`;\n\nconst WalleyHomeOverlay = styled.div`\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000000;\n background: rgb(66, 66, 66, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n test-align: center;\n`;\n\nconst WalleyHomeForm = styled.div`\n background: rgb(66, 66, 66);\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n width: 400px;\n height: 400px;\n text-align: center;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyStoreForm = styled.div`\n width: 200px;\n text-align: center;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyStoreImage = styled.img`\n width: 100px;\n height: 100px;\n text-align: center;\n`;\n\nconst WalleyInput = styled.input`\n display: block;\n width: 100%;\n padding: 10px;\n border-radius: 20px;\n background: none;\n border: 2px solid rgb(66, 66, 66);\n`;\n\nconst WalleyLabel = styled.p`\n width: 100%;\n`;\n\nconst WalleyStoreButton = styled.button`\n border: none;\n background: none;\n color: black;\n display: block;\n`;\n\nconst WalleyTransactions = styled.div`\n height: 100%;\n overflow: scroll;\n`;\n\nconst TransactionCard = styled.div`\n`;\n\nconst WalleyStoreBody = styled.div`\n`;\n\nconst sender = Ethers.send(\"eth_requestAccounts\", [])[0];\nconst updateBalance = (balance) => {\n State.update({ balance });\n};\nif (!sender) {\n return (\n <Root>\n <WalleyIndexContainer>\n <WalleyTitle>Walley.</WalleyTitle>\n <WalleyIndexBody>\n <WalleyIndexDesc>\n Go Phoneless With the Highly Secured NFT-based Wallet.\n </WalleyIndexDesc>\n <WalleyIndexMain>\n <span>Get Started -</span>\n <Web3Connect connectLabel=\"Connect Wallet\" />\n </WalleyIndexMain>\n </WalleyIndexBody>\n </WalleyIndexContainer>\n </Root>\n );\n}\nif (state.chainId === undefined && ethers !== undefined && sender) {\n Ethers.provider()\n .getNetwork()\n .then((chainIdData) => {\n if (chainIdData?.chainId) {\n State.update({ chainId: chainIdData.chainId });\n }\n });\n Ethers.provider()\n .getBalance(sender)\n .then((balance) => {\n updateBalance(Big(balance).div(Big(10).pow(18)).toFixed(5));\n });\n}\nif (state.chainId !== undefined && state.chainId !== 11155111) {\n return <p>Switch to Ethereum Sepolia</p>;\n}\nconst nftIface = new ethers.utils.Interface(NFTManagerABI);\nconst nftContract = new ethers.Contract(\n nftAddress,\n NFTManagerABI,\n Ethers.provider().getSigner()\n);\nconst walleyIface = new ethers.utils.Interface(WalleyABI);\nconst walleyContract = new ethers.Contract(\n walleyAddress,\n WalleyABI,\n Ethers.provider().getSigner()\n);\n//get stores data\nif (state.store.stores.length === 0 && nftContract && sender) {\n walleyContract.getToken().then((tokenId) => {\n console.log(tokenId);\n });\n State.update({ loading: true, loadingMsg: \"Fetching Stores\" });\n nftContract.getAllStores().then((stores) => {\n onTxInit();\n if (stores.length === 0) {\n State.update({ loading: false, loadingMsg: \"\" });\n } else {\n const storeState = state.store;\n storeState.stores = stores;\n let store;\n for (let i = 0; i < stores.length; i++) {\n store = stores[i];\n storeState.storeImages[store[0]] = store[2];\n if (store[1].toLowerCase() === sender) {\n storeState.isStore = true;\n storeState.storeName = store[0];\n storeState.storeAddress = store[1].toLowerCase();\n State.update({\n loading: true,\n loadingMsg: \"Fetching Store Transactions\",\n });\n nftContract.getStoreTransactions(store[1]).then((transactions) => {\n storeState.storePendingTransactions = [];\n storeState.storePastTransactions = [];\n transactions.map((txn) => {\n if (txn[8] === false) {\n storeState.storePendingTransactions.push(txn);\n } else {\n storeState.storePastTransactions.push(txn);\n }\n });\n });\n }\n if (i === stores.length - 1)\n State.update({ store: storeState, loading: false, loadingMsg: \"\" });\n }\n console.log(state.store);\n }\n });\n}\n\nconst onTxInit = () => {\n State.update({\n view: \"home\",\n loading: true,\n loadingMsg: \"Fetching transactions\",\n });\n nftContract.getMyTransactions({ from: sender }).then((transactions) => {\n const st = [];\n transactions.map((txn) => {\n if (txn[8] === false) st.push(txn);\n });\n State.update({\n user: { ...state.user, userPendingTransactions: st },\n loading: false,\n loadingMsg: \"\",\n });\n });\n};\n\nconst onTxPastClick = () => {\n State.update({\n view: \"txPast\",\n loading: true,\n loadingMsg: \"Fetching past transactions\",\n });\n nftContract.getMyTransactions({ from: sender }).then((transactions) => {\n const st = [];\n transactions.map((txn) => {\n if (txn[8] === true) st.push(txn);\n });\n State.update({\n user: { ...state.user, userPastTransactions: st },\n loading: false,\n loadingMsg: \"\",\n });\n });\n};\n\nconst widgetOptions = () => {\n const options = [];\n for (let i = 0; i < state.store.stores.length; i++)\n options.push({\n text: state.store.stores[i][0],\n value: state.store.stores[i][0],\n });\n console.log(options);\n return options;\n};\n\nconst homeInputUpdates = (value, field) => {\n const homeInputs = state.homeInputs;\n homeInputs[field] = value;\n State.update({ homeInputs });\n};\nconst storeInputUpdates = (value, field) => {\n const storeInputs = state.storeInputs;\n console.log(storeInputs);\n storeInputs[field] = value;\n console.log(storeInputs);\n State.update({ storeInputs });\n};\n\nconst addStore = () => {\n State.update({ loading: true, loadingMsg: \"Creating a new store\" });\n const stateT = state;\n const { storeName, storeAddress, image } = stateT.storeInputs;\n nftContract.addStore(storeName, storeAddress, image.cid).then((t) => {\n console.log(t);\n t.wait().then((r) => {\n stateT.store.stores.push([\n storeName,\n storeAddress.toLowerCase(),\n image.cid,\n ]);\n stateT.store.storeImages[storeName] = image.cid;\n\n stateT.storeInputs = {\n storeName: \"\",\n storeAddress: \"\",\n image: \"\",\n };\n stateT.loading = false;\n stateT.loadingMsg = \"\";\n if (storeAddress.toLowerCase() === sender) {\n // alert(\n // \"Warning - If you have any pending transactions, you won't be able to see them. But they can be completed at the store!\"\n // );\n stateT.store.isStore = true;\n stateT.store.storeAddress = storeAddress.toLowerCase();\n stateT.store.storeName = storeName;\n }\n State.update(stateT);\n });\n });\n};\n\nconst getStoreAddress = (storeName) => {\n const t = [];\n state.store.stores.map((store) => {\n if (store[0] === storeName) t.push(store[1]);\n });\n return t[0];\n};\n\nconst initTransaction = () => {\n State.update({\n loading: true,\n loadingMsg: \"Minting your NFT - Please Pay the gas price\",\n });\n const { storeName, amount, name, password } = state.homeInputs;\n console.log(password);\n walleyContract\n .mint(password, { from: sender })\n .then((tx) => {\n State.update({ loadingMsg: \"Waiting for confirmation\" });\n tx.wait().then((r) => {\n const tokenId = parseInt(r.logs[2].data, 16);\n State.update({\n loadingMsg:\n \"Creating your transaction - Please pay the amount you entered + gas\",\n });\n nftContract\n .initTransaction(\n walleyAddress,\n name,\n tokenId,\n `${amount * Math.pow(10, 18)}`,\n getStoreAddress(storeName),\n storeName,\n {\n from: sender,\n value: ethers.utils.parseUnits(`${amount}`, 18),\n }\n )\n .then((txInit) => {\n console.log(txInit);\n State.update({ loadingMsg: \"Waiting for the final confirmation\" });\n txInit.wait().then((res) => {\n console.log(res);\n State.update({\n loading: false,\n loadingMsg: \"\",\n userInput: {\n storeName: \"\",\n name: \"\",\n amount: \"\",\n password: \"\",\n },\n });\n });\n })\n .catch((err) => console.log(err));\n });\n })\n .catch((err) => console.log(err));\n};\n\nconst cancelTransaction = (tokenId) => {\n walleyContract.returnPass(tokenId).then((password) => {\n if (state.user.cancelPassword === password) {\n State.update({\n loading: true,\n loadingMsg: \"Cancelling your transaction - Pay for the gas\",\n });\n nftContract\n .cancelTransaction(walleyAddress, tokenId, { from: sender })\n .then((tx) => {\n State.update({ loadingMsg: \"Refunding your amount\" });\n tx.wait().then((r) => {\n const tmp = [];\n state.store.userPendingTransactions.map((trans) => {\n if (parseInt(trans[1], 16) !== tokenId) {\n tmp.push(trans);\n }\n });\n State.update({\n loading: false,\n loadingMsg: \"\",\n user: {\n ...state.user,\n userPendingTransactions: tmp,\n cancelPassword: \"\",\n openModal: 0,\n },\n });\n });\n });\n } else {\n console.log(\"Please re-check the password\");\n }\n });\n};\n\n// const billOnChange = (files) => {\n// if (files) {\n// console.log(files[0]);\n// State.update({\n// store: { ...state.store, bill: { uploading: true, amount: null } },\n// });\n// let reader = new FileReader();\n// reader.onloadend = () => {\n// let formdata = new FormData();\n// formdata.append(\"language\", \"eng\");\n// formdata.append(\"isOverlayRequired\", \"false\");\n// formdata.append(\"base64Image\", reader.result);\n// formdata.append(\"iscreatesearchablepdf\", \"false\");\n// formdata.append(\"scale\", \"true\");\n// formdata.append(\"isTable\", \"true\");\n// formdata.append(\"issearchablepdfhidetextlayer\", \"false\");\n// formdata.append(\"OCREngine\", \"3\");\n\n// let requestOptions = {\n// method: \"POST\",\n// headers: { apikey: \"K82213475788957\" },\n// body: formdata,\n// redirect: \"follow\",\n// };\n\n// fetch(\"https://api.ocr.space/parse/image\", requestOptions)\n// .then((response) => response.json())\n// .then((result) => parseReceipt(result))\n// .catch((error) => console.log(\"error\", error));\n// };\n// reader.readAsDataURL(files[0]);\n// }\n// };\n\n// const parseReceipt = (receiptObject) => {\n// console.log(receiptObject);\n// console.log(typeof receiptObject);\n// if (typeof receiptObject === \"object\") {\n// const receiptDetails = receiptObject.ParsedResults[0];\n// const receiptLines = receiptDetails.TextOverlay.Lines;\n// parseReceiptText(receiptDetails.ParsedText);\n// } else if (typeof receiptObject == \"string\") {\n// console.log(receipt);\n// }\n// };\n// const parseReceiptText = (receiptText) => {\n// // extremely reliant on this one receipt\n// let receiptContent = receiptText.split(\"\\t\\r\\n\").map((element) => {\n// return element.toLowerCase().replace(\"\\t\", \" \");\n// });\n\n// const receiptTotal = receiptContent[21].replace(/\\D/g, \"\");\n// const subTotal = receiptContent[\n// receiptContent.findIndex((v) => v.includes(\"subtotal\"))\n// ].replace(/\\D/g, \"\");\n// const VAT = receiptContent[20].replace(/\\D/g, \"\");\n// const receipt = {\n// store: receiptContent[0].split(\"\\t\")[1],\n// date: receiptContent[6].split(\" \")[0],\n// subtotal:\n// subTotal.substring(0, subTotal.length - 2) +\n// \".\" +\n// subTotal.substring(subTotal.length - 2),\n// total:\n// receiptTotal.substring(0, receiptTotal.length - 2) +\n// \".\" +\n// receiptTotal.substring(receiptTotal.length - 2),\n// vat: VAT.substring(0, VAT.length - 2) + \".\" + VAT.substring(VAT.length - 2),\n// };\n// console.log(receipt);\n// };\n\nconst approveTransaction = (tokenId) => {\n State.update({\n loading: true,\n loadingMsg: \"Checking the password\",\n });\n walleyContract.returnPass(tokenId).then((password) => {\n console.log(password);\n if (state.store.approvePassword === password) {\n State.update({\n loadingMsg: \"Approving your transaction - Pay for the gas\",\n });\n nftContract\n .approveTransaction(\n walleyAddress,\n tokenId,\n `${state.store.totalAmount * Math.pow(10, 18)}`,\n state.store.bill.cid,\n {\n from: sender,\n }\n )\n .then((tx) => {\n State.update({\n loadingMsg: \"Waiting for confirmation - Refunding the change\",\n });\n tx.wait().then((res) => {\n const tmp = [];\n const tmpAct = [];\n state.store.storePendingTransactions.map((trans) => {\n if (parseInt(trans[1], 16) !== tokenId) {\n tmp.push(trans);\n } else {\n tmpAct.push(trans);\n tmpAct[0][7] = state.store.bill.cid;\n tmpAct[0][8] = true;\n tmpAct[0][9] = state.store.totalAmount;\n }\n });\n State.update({\n store: {\n ...state.store,\n storePendingTransactions: tmp,\n storePastTransactions: [\n ...state.store.storePastTransactions,\n tmpAct,\n ],\n openModal: 0,\n approvePassword: \"\",\n bill: { uploading: false, amount: null },\n totalAmount: 0,\n },\n loadingMsg: \"\",\n loading: false,\n });\n });\n });\n } else {\n console.log(\"Please re-check the password\");\n State.update({ loading: false, loadingMsg: \"\" });\n }\n });\n};\n\nreturn (\n <WalleyHomeContainer>\n <WalleyHomeHeader>\n <p>Walley.</p>\n <WalleyBalance>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"18\"\n fill=\"none\"\n >\n <path\n d=\"M14.5156 0C17.9644 0 20 1.98459 20 5.3818H15.7689V5.41647C13.8052 5.41647 12.2133 6.96849 12.2133 8.883C12.2133 10.7975 13.8052 12.3495 15.7689 12.3495H20V12.6615C20 16.0154 17.9644 18 14.5156 18H5.48444C2.03556 18 0 16.0154 0 12.6615V5.33847C0 1.98459 2.03556 0 5.48444 0H14.5156ZM19.2533 6.87241C19.6657 6.87241 20 7.19834 20 7.60039V10.131C19.9952 10.5311 19.6637 10.8543 19.2533 10.8589H15.8489C14.8548 10.872 13.9855 10.2084 13.76 9.26432C13.6471 8.67829 13.8056 8.07357 14.1931 7.61222C14.5805 7.15087 15.1573 6.88007 15.7689 6.87241H19.2533ZM16.2489 8.04237H15.92C15.7181 8.04005 15.5236 8.11664 15.38 8.25504C15.2364 8.39344 15.1556 8.58213 15.1556 8.77901C15.1555 9.19205 15.4964 9.52823 15.92 9.53298H16.2489C16.6711 9.53298 17.0133 9.1993 17.0133 8.78767C17.0133 8.37605 16.6711 8.04237 16.2489 8.04237ZM10.3822 3.89119H4.73778C4.31903 3.89116 3.9782 4.2196 3.97333 4.62783C3.97333 5.04087 4.31415 5.37705 4.73778 5.3818H10.3822C10.8044 5.3818 11.1467 5.04812 11.1467 4.6365C11.1467 4.22487 10.8044 3.89119 10.3822 3.89119Z\"\n fill=\"#fff\"\n />\n </svg>{\" \"}\n {state.balance} ETH\n </WalleyBalance>\n </WalleyHomeHeader>\n <WalleyHomeMain>\n {state.loading ? (\n <WalleyLoading>\n <WalleyModal>\n <img src=\"https://svgshare.com/i/wuF.svg\" title=\"\" />\n <p>{state.loadingMsg}</p>\n </WalleyModal>\n </WalleyLoading>\n ) : (\n \"\"\n )}\n {!state.store.isStore ? (\n <>\n <WalleyNavbar>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n id=\"menu\"\n >\n <g data-name=\"Layer 2\">\n <g data-name=\"menu-2\">\n <rect\n width=\"24\"\n height=\"24\"\n opacity=\"0\"\n transform=\"rotate(180 12 12)\"\n ></rect>\n <circle cx=\"0\" cy=\"12\" r=\"1\"></circle>\n <rect\n width=\"14\"\n height=\"2\"\n x=\"3\"\n y=\"11\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n <rect\n width=\"18\"\n height=\"2\"\n x=\"0\"\n y=\"16\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n <rect\n width=\"18\"\n height=\"2\"\n x=\"0\"\n y=\"6\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n </g>\n </g>\n </svg>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"home\" })}>\n Home\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={onTxPastClick}>\n Receipts\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"addSt\" })}>\n Add a store\n </WalleyNavbarButton>\n <NavLineLast></NavLineLast>\n </WalleyNavbar>\n <WalleyHomeBody>\n {state.view === \"home\" ? (\n <>\n {state.newTxn ? (\n <WalleyHomeOverlay>\n <WalleyHomeForm>\n <Widget\n src=\"near/widget/Select\"\n props={{\n value: state.homeInputs.storeName,\n noLabel: true,\n placeholder:\n state.store.stores.length !== 0\n ? \"Select a store\"\n : \"No Store Available\",\n options: [...widgetOptions()],\n onChange: (value) => {\n homeInputUpdates(value.text, \"storeName\");\n },\n }}\n />\n <WalleyLabel>\n Enter the maximum amount you'd like to spend(in INR)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.amount}\n type=\"number\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"amount\")\n }\n placeholder=\"Amount(in INR)\"\n />\n <WalleyLabel>\n Name(will be asked at the store)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.name}\n type=\"text\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"name\")\n }\n placeholder=\"Name\"\n />\n <WalleyLabel>\n Set a password for the transaction(will be asked during\n checkout)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.password}\n type=\"password\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"password\")\n }\n placeholder=\"Password\"\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FFA500\"\n onClick={initTransaction}\n >\n Buy The Store NFT\n </WalleyButton>\n </WalleyHomeForm>\n </WalleyHomeOverlay>\n ) : (\n \"\"\n )}\n <WalleyInput\n value={state.search.store}\n onChange={(e) =>\n State.update({\n search: { ...state.search, store: e.target.value },\n })\n }\n placeholder=\"Search by Store Name\"\n />\n <WalleyButton onClick={() => State.update({ newTxn: true })}>\n Buy NFT\n </WalleyButton>\n <WalleyTransactions>\n {state.user.userPendingTransactions.length !== 0\n ? state.user.userPendingTransactions\n .filter((tx) => tx[6].includes(state.search.store))\n .map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Amount - {Big(tx[5]).toFixed(5)}</p>\n {state.user.openModal === parseInt(tx[1], 16) ? (\n <>\n <WalleyLabel>\n Enter the transacation password\n </WalleyLabel>\n <WalleyInput\n type=\"password\"\n value={state.user.cancelPassword}\n onChange={(e) =>\n State.update({\n user: {\n ...state.user,\n cancelPassword: e.target.value,\n },\n })\n }\n />\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openModal: 0,\n cancelPassword: \"\",\n },\n })\n }\n >\n Close\n </WalleyButton>\n <WalleyButton\n color=\"#white\"\n bg=\"red\"\n onClick={() =>\n cancelTransaction(parseInt(tx[1], 16))\n }\n >\n Cancel\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#white\"\n bg=\"red\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openModal: parseInt(tx[1], 16),\n cancelPassword: \"\",\n },\n })\n }\n >\n Cancel\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No pending transactions found\"}\n </WalleyTransactions>\n </>\n ) : state.view === \"txPast\" ? (\n <WalleyTransactions>\n {state.user.userPastTransactions.length !== 0\n ? state.user.userPastTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max Amount - {Big(tx[5]).toFixed(5)}</p>\n <p>Total Bill Amount - {Big(tx[9]).toFixed(5)}</p>\n {state.user.openReceipt === Big(tx[1]).toFixed(0) ? (\n <>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${tx[7]}`}\n alt={tx[7]}\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: 0,\n },\n })\n }\n >\n Close Receipt\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: Big(tx[1]).toFixed(0),\n },\n })\n }\n >\n Show Receipt\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No past transactions found\"}\n </WalleyTransactions>\n ) : (\n <WalleyStoreForm>\n <WalleyLabel>Store Name</WalleyLabel>\n <WalleyInput\n value={state.storeInputs.storeName}\n type=\"text\"\n onChange={(e) => {\n storeInputUpdates(e.target.value, \"storeName\");\n }}\n placeholder=\"Enter the Store Name\"\n />\n <WalleyLabel>Store Address</WalleyLabel>\n <WalleyInput\n value={state.storeInputs.storeAddress}\n type=\"text\"\n onChange={(e) =>\n storeInputUpdates(e.target.value, \"storeAddress\")\n }\n placeholder=\"Enter the Store Address\"\n />\n <WalleyStoreButton\n onClick={() => storeInputUpdates(sender, \"storeAddress\")}\n >\n Use current address(convert this account into a store)\n </WalleyStoreButton>\n <WalleyLabel>Add Cover Image</WalleyLabel>\n <IpfsImageUpload image={state.storeInputs.image} />\n <WalleyButton color=\"#000D1A\" bg=\"#FA9703\" onClick={addStore}>\n Add Store\n </WalleyButton>\n </WalleyStoreForm>\n )}\n </WalleyHomeBody>\n </>\n ) : (\n <>\n <WalleyNavbar>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\">\n <path\n d=\"M42.3795 1.00041H3.49873C-0.658836 0.841665 -0.658836 7.16116 3.49873 7.00242H42.2245C46.3065 7.16116 46.4652 1.00041 42.3833 1.00041H42.3795ZM3.49873 25.0009C-0.500093 25.0009 -0.500093 30.9991 3.49873 30.9991H25.4204C29.5024 30.9991 29.5024 25.0009 25.4204 25.0009H3.49873ZM3.49873 49.0014C-0.500093 49.0014 -0.500093 54.9996 3.49873 54.9996H52.6222C56.621 54.9996 56.621 49.0014 52.6222 49.0014H3.49873Z\"\n fill=\"white\"\n />\n </svg>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"home\" })}>\n Home\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton\n onClick={() => State.update({ view: \"txPast\" })}\n >\n Receipts\n </WalleyNavbarButton>\n <NavLineLast></NavLineLast>\n </WalleyNavbar>\n <WalleyStoreBody>\n <WalleyTransactions>\n {state.view === \"home\"\n ? state.store.storePendingTransactions.length !== 0\n ? state.store.storePendingTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max amount - {Big(tx[5]).toFixed(5)}</p>\n {state.store.openModal === parseInt(tx[1], 16) ? (\n <>\n <WalleyLabel>Please scan the bill - </WalleyLabel>\n <IpfsImageUpload image={state.store.bill} />\n {/*<Files\n multiple={false}\n accepts={[\"image/*\"]}\n minFileSize={1}\n clickable\n className=\"btn btn-outline-primary\"\n onChange={billOnChange}\n >\n {state.store.bill.uploading ? (\n <> Scanning </>\n ) : (\n \"Scan the bill\"\n )}\n </Files>*/}\n <WalleyLabel>Total Bill Amount</WalleyLabel>\n <WalleyInput\n value={state.store.totalAmount}\n onChange={(e) =>\n State.update({\n store: {\n ...state.store,\n totalAmount: e.target.value,\n },\n })\n }\n />\n <WalleyLabel>Transaction Password</WalleyLabel>\n <WalleyInput\n type=\"password\"\n value={state.store.approvePassword}\n onChange={(e) =>\n State.update({\n store: {\n ...state.store,\n approvePassword: e.target.value,\n },\n })\n }\n />\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() => {\n State.update({\n store: {\n ...state.store,\n approvePassword: \"\",\n bill: { uploading: false, cid: \"\" },\n totalAmount: null,\n openModal: 0,\n },\n });\n }}\n >\n Close\n </WalleyButton>\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() => {\n console.log(state.store.bill.cid);\n if (state.store.bill.cid) {\n approveTransaction(parseInt(tx[1], 16));\n } else {\n console.log(\"Please Upload the bill\");\n }\n }}\n >\n Approve\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() =>\n State.update({\n store: {\n ...state.store,\n approvePassword: \"\",\n bill: { uploading: false, amount: null },\n totalAmount: null,\n openModal: parseInt(tx[1], 16),\n },\n })\n }\n >\n Approve\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No pending transactions\"\n : state.store.storePastTransactions.length !== 0\n ? state.store.storePastTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max Amount - {Big(tx[5]).toFixed(5)}</p>\n\n <p>Total Bill Amount - {Big(tx[9]).toFixed(5)}</p>\n {state.user.openReceipt === Big(tx[1]).toFixed(0) ? (\n <>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${tx[7]}`}\n alt={tx[7]}\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: 0,\n },\n })\n }\n >\n Close Receipt\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: Big(tx[1]).toFixed(0),\n },\n })\n }\n >\n Show Receipt\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No past transactions found\"}\n </WalleyTransactions>\n </WalleyStoreBody>\n </>\n )}\n </WalleyHomeMain>\n </WalleyHomeContainer>\n);\n" } } } } }

Transaction Execution Plan

Convert Transaction To Receipt
Gas Burned:
2 Tgas
Tokens Burned:
0.00027 
Receipt:
Predecessor ID:
Receiver ID:
Gas Burned:
2 Tgas
Tokens Burned:
0.00027 
Actions delegated for shiami.near:
Called method: 'set' in contract: social.near
Arguments:
{ "data": { "shiami.near": { "widget": { "walley": { "": "const nftAddress = \"0x2e0f4a4123d0072f46bf67127270a80114541d86\";\nconst NFTManagerABI = JSON.parse(\n fetch(\"https://raw.githubusercontent.com/test1883/files/main/NFTManager.json\")\n .body\n);\nconst walleyAddress = \"0x8ae53c3a6bf7762db9cc7603a290d769020e4e77\";\nconst WalleyABI = JSON.parse(\n fetch(\"https://raw.githubusercontent.com/test1883/files/main/Walley.json\")\n .body\n);\nState.init({\n general: {\n chainId: undefined,\n balance: 0,\n },\n store: {\n stores: [],\n storeName: \"\",\n storeAddress: \"\",\n isStore: false,\n storePendingTransactions: [],\n storePastTransactions: [],\n storeImages: {},\n openModal: 0,\n approvePassword: \"\",\n bill: { uploading: false, cid: null },\n totalAmount: 0,\n },\n user: {\n userPendingTransactions: [],\n userPastTransactions: [],\n openModal: 0,\n cancelPassword: \"\",\n openReceipt: 0,\n },\n homeInputs: {\n storeName: \"\",\n amount: 0,\n name: \"\",\n password: \"\",\n },\n storeInputs: {\n storeName: \"\",\n storeAddress: \"\",\n image: \"\",\n },\n search: {\n store: \"\",\n user: \"\",\n },\n storeName: \"\",\n view: \"home\",\n loading: true,\n loadingMsg: \"Fetching Data\",\n newTransaction: false,\n});\n\nconst cssFont = fetch(\n \"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800;900&display=swap\"\n).body;\n\nconst Root = styled.div`\n \n background: url(\"https://img.freepik.com/free-vector/abstract-black-shapes-background-design_1017-31904.jpg?w=826&t=st=1692784084~exp=1692784684~hmac=640a88623947cac46d90337f2d03281af01efcdcd5aa64901719774754bd75b3\");\n background-size: cover;\n display: flex;\n font-family: Poppins, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n ${cssFont}\n flex-direction: column;\n padding: 0;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n height: 100vh;\n width: 100vw;\n @media screen and (max-width: 600px) {\n background-position: 70% 70%;\n }\n`;\n\nconst WalleyTitle = styled.div`\n text-align: left;\n font-weight: 900;\n width: 100%;\n font-size: 30px;\n margin: 0px;\n padding: 5px;\n color: #fff; \n @media screen and (max-width: 600px) {\n text-align: center;\n }\n`;\n\nconst WalleyIndexContainer = styled.div`\n height: 100vh;\n color: #fff;\n width: 100%;\n padding: 20px;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyIndexBody = styled.div`\n display: flex;\n flex-direction: column;\n text-align: left;\n width: 500px;\n padding-left: 50px;\n @media screen and (max-width:600px) {\n width: 100%;\n padding-left: 0;\n align-items: center;\n }\n`;\n\nconst WalleyIndexDesc = styled.div`\n color: #fff;\n font-weight: 500;\n font-size: 50px;\n padding-bottom: 10px;\n margin-top: 50px;\n @media screen and (max-width: 400px) {\n margin-top: 150px;\n font-size: 40px;\n }\n`;\n\nconst WalleyIndexMain = styled.div`\n margin-top: 20px;\n width: 100%;\n padding: 20px;\n @media screen and (max-width: 600px) {\n text-align: center;\n position: fixed;\n bottom: 0px;\n left: 0px;\n }\n &>span {\n font-weight: 500;\n @media screen and (max-width: 600px) {\n display: none;\n width: 0px;\n }\n }\n &>button {\n border: none;\n background: #FA9703;\n color: white;\n margin-left: 20px;\n transition: all .2s ease-out;\n &:hover {\n scale: 1.05;\n background:#FA9703;\n }\n &:active {\n background:#FA9703;\n }\n @media screen and (max-width: 600px) {\n width: 100%;\n height: 50px;\n font-size: 15px;\n display: block;\n margin-left: 0px;\n }\n }\n`;\n\nconst WalleyHomeContainer = styled.div`\n background: url(\"https://img.freepik.com/free-vector/abstract-black-shapes-background-design_1017-31904.jpg?w=826&t=st=1692784084~exp=1692784684~hmac=640a88623947cac46d90337f2d03281af01efcdcd5aa64901719774754bd75b3\");\n background-size: cover;\n font-family: Poppins, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n height: 100vh;\n width: 100vw;\n ::placeholder {\n color: rgb(255, 255, 255, 0.5);\n }\n color: #fff;\n display: flex;\n flex-direction: column;\n position: fixed;\n top: 0px;\n @media screen and (max-width: 600px) {\n background-position: 70% 70%;\n }\n`;\n\nconst WalleyHomeHeader = styled.div`\n width: 100%;\n font-size: 30px;\n font-weight: 900;\n padding: 10px;\n padding-bottom: 0px;\n color: #fff;\n display: flex;\n flex-direction: column;\n justify-content: space-around;\n &>p {\n text-align: center;\n }\n\n`;\n\nconst WalleyHomeMain = styled.div`\n padding: 20px;\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 100%;\n align-items: space-between;\n`;\n\nconst WalleyNavbar = styled.div`\n padding: 20px;\n display: flex;\n flex-direction: column;\n position: relative;\n left: 0px;\n height: 100%;\n text-align: left;\n &>svg {\n text-align: left; \n padding: 0;\n width: 24px;\n }\n`;\n\nconst WalleyNavbarButton = styled.button`\n border: none;\n text-align: left;\n background: none;\n color: #fff;\n padding:0px;\n font-weight: 500;\n`;\n\nconst NavLine = styled.span`\n width: 1px;\n height: 70px;\n background: white;\n margin: 4px 0 4px 0;\n`;\nconst NavLineLast = styled.span`\n width: 1px;\n height: 100%;\n background: white;\n margin: 4px 0 4px 0;\n`;\n\nconst WalleyHomeBody = styled.div`\n width: 75%;\n`;\n\nconst WalleyBalance = styled.span`\n padding: 5px;\n font-weight: 500;\n font-size: 15px;\n width: 150px;\n background-color: #424242;\n border-radius: 30px;\n text-align: center;\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n &>svg {\n fill: #fff;\n }\n`;\n\nconst WalleyLoading = styled.div`\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000000;\n background: rgb(66, 66, 66, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n test-align: center;\n font-weight: 400;\n`;\n\nconst WalleyModal = styled.div`\n width: 400px;\n height: 400px;\n background: rgb(66, 66, 66);\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n &>img {\n width: 70px;\n height: 70px;\n }\n @media screen and (max-width: 500px) {\n width: 340px;\n height: 340px;\n }\n\n`;\n\nconst WalleyButton = styled.button`\n background-color: ${props.bg};\n color: ${props.color};\n display: block;\n border: none;\n`;\n\nconst WalleyHomeOverlay = styled.div`\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000000;\n background: rgb(66, 66, 66, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n test-align: center;\n`;\n\nconst WalleyHomeForm = styled.div`\n background: rgb(66, 66, 66);\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n width: 400px;\n height: 400px;\n text-align: center;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyStoreForm = styled.div`\n width: 200px;\n text-align: center;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyStoreImage = styled.img`\n width: 100px;\n height: 100px;\n text-align: center;\n`;\n\nconst WalleyInput = styled.input`\n display: block;\n width: 100%;\n padding: 10px;\n border-radius: 20px;\n background: none;\n border: 2px solid rgb(66, 66, 66);\n`;\n\nconst WalleyLabel = styled.p`\n width: 100%;\n`;\n\nconst WalleyStoreButton = styled.button`\n border: none;\n background: none;\n color: black;\n display: block;\n`;\n\nconst WalleyTransactions = styled.div`\n height: 100%;\n overflow: scroll;\n`;\n\nconst TransactionCard = styled.div`\n`;\n\nconst WalleyStoreBody = styled.div`\n`;\n\nconst sender = Ethers.send(\"eth_requestAccounts\", [])[0];\nconst updateBalance = (balance) => {\n State.update({ balance });\n};\nif (!sender) {\n return (\n <Root>\n <WalleyIndexContainer>\n <WalleyTitle>Walley.</WalleyTitle>\n <WalleyIndexBody>\n <WalleyIndexDesc>\n Go Phoneless With the Highly Secured NFT-based Wallet.\n </WalleyIndexDesc>\n <WalleyIndexMain>\n <span>Get Started -</span>\n <Web3Connect connectLabel=\"Connect Wallet\" />\n </WalleyIndexMain>\n </WalleyIndexBody>\n </WalleyIndexContainer>\n </Root>\n );\n}\nif (state.chainId === undefined && ethers !== undefined && sender) {\n Ethers.provider()\n .getNetwork()\n .then((chainIdData) => {\n if (chainIdData?.chainId) {\n State.update({ chainId: chainIdData.chainId });\n }\n });\n Ethers.provider()\n .getBalance(sender)\n .then((balance) => {\n updateBalance(Big(balance).div(Big(10).pow(18)).toFixed(5));\n });\n}\nif (state.chainId !== undefined && state.chainId !== 11155111) {\n return <p>Switch to Ethereum Sepolia</p>;\n}\nconst nftIface = new ethers.utils.Interface(NFTManagerABI);\nconst nftContract = new ethers.Contract(\n nftAddress,\n NFTManagerABI,\n Ethers.provider().getSigner()\n);\nconst walleyIface = new ethers.utils.Interface(WalleyABI);\nconst walleyContract = new ethers.Contract(\n walleyAddress,\n WalleyABI,\n Ethers.provider().getSigner()\n);\n//get stores data\nif (state.store.stores.length === 0 && nftContract && sender) {\n walleyContract.getToken().then((tokenId) => {\n console.log(tokenId);\n });\n State.update({ loading: true, loadingMsg: \"Fetching Stores\" });\n nftContract.getAllStores().then((stores) => {\n onTxInit();\n if (stores.length === 0) {\n State.update({ loading: false, loadingMsg: \"\" });\n } else {\n const storeState = state.store;\n storeState.stores = stores;\n let store;\n for (let i = 0; i < stores.length; i++) {\n store = stores[i];\n storeState.storeImages[store[0]] = store[2];\n if (store[1].toLowerCase() === sender) {\n storeState.isStore = true;\n storeState.storeName = store[0];\n storeState.storeAddress = store[1].toLowerCase();\n State.update({\n loading: true,\n loadingMsg: \"Fetching Store Transactions\",\n });\n nftContract.getStoreTransactions(store[1]).then((transactions) => {\n storeState.storePendingTransactions = [];\n storeState.storePastTransactions = [];\n transactions.map((txn) => {\n if (txn[8] === false) {\n storeState.storePendingTransactions.push(txn);\n } else {\n storeState.storePastTransactions.push(txn);\n }\n });\n });\n }\n if (i === stores.length - 1)\n State.update({ store: storeState, loading: false, loadingMsg: \"\" });\n }\n console.log(state.store);\n }\n });\n}\n\nconst onTxInit = () => {\n State.update({\n view: \"home\",\n loading: true,\n loadingMsg: \"Fetching transactions\",\n });\n nftContract.getMyTransactions({ from: sender }).then((transactions) => {\n const st = [];\n transactions.map((txn) => {\n if (txn[8] === false) st.push(txn);\n });\n State.update({\n user: { ...state.user, userPendingTransactions: st },\n loading: false,\n loadingMsg: \"\",\n });\n });\n};\n\nconst onTxPastClick = () => {\n State.update({\n view: \"txPast\",\n loading: true,\n loadingMsg: \"Fetching past transactions\",\n });\n nftContract.getMyTransactions({ from: sender }).then((transactions) => {\n const st = [];\n transactions.map((txn) => {\n if (txn[8] === true) st.push(txn);\n });\n State.update({\n user: { ...state.user, userPastTransactions: st },\n loading: false,\n loadingMsg: \"\",\n });\n });\n};\n\nconst widgetOptions = () => {\n const options = [];\n for (let i = 0; i < state.store.stores.length; i++)\n options.push({\n text: state.store.stores[i][0],\n value: state.store.stores[i][0],\n });\n console.log(options);\n return options;\n};\n\nconst homeInputUpdates = (value, field) => {\n const homeInputs = state.homeInputs;\n homeInputs[field] = value;\n State.update({ homeInputs });\n};\nconst storeInputUpdates = (value, field) => {\n const storeInputs = state.storeInputs;\n console.log(storeInputs);\n storeInputs[field] = value;\n console.log(storeInputs);\n State.update({ storeInputs });\n};\n\nconst addStore = () => {\n State.update({ loading: true, loadingMsg: \"Creating a new store\" });\n const stateT = state;\n const { storeName, storeAddress, image } = stateT.storeInputs;\n nftContract.addStore(storeName, storeAddress, image.cid).then((t) => {\n console.log(t);\n t.wait().then((r) => {\n stateT.store.stores.push([\n storeName,\n storeAddress.toLowerCase(),\n image.cid,\n ]);\n stateT.store.storeImages[storeName] = image.cid;\n\n stateT.storeInputs = {\n storeName: \"\",\n storeAddress: \"\",\n image: \"\",\n };\n stateT.loading = false;\n stateT.loadingMsg = \"\";\n if (storeAddress.toLowerCase() === sender) {\n // alert(\n // \"Warning - If you have any pending transactions, you won't be able to see them. But they can be completed at the store!\"\n // );\n stateT.store.isStore = true;\n stateT.store.storeAddress = storeAddress.toLowerCase();\n stateT.store.storeName = storeName;\n }\n State.update(stateT);\n });\n });\n};\n\nconst getStoreAddress = (storeName) => {\n const t = [];\n state.store.stores.map((store) => {\n if (store[0] === storeName) t.push(store[1]);\n });\n return t[0];\n};\n\nconst initTransaction = () => {\n State.update({\n loading: true,\n loadingMsg: \"Minting your NFT - Please Pay the gas price\",\n });\n const { storeName, amount, name, password } = state.homeInputs;\n console.log(password);\n walleyContract\n .mint(password, { from: sender })\n .then((tx) => {\n State.update({ loadingMsg: \"Waiting for confirmation\" });\n tx.wait().then((r) => {\n const tokenId = parseInt(r.logs[2].data, 16);\n State.update({\n loadingMsg:\n \"Creating your transaction - Please pay the amount you entered + gas\",\n });\n nftContract\n .initTransaction(\n walleyAddress,\n name,\n tokenId,\n `${amount * Math.pow(10, 18)}`,\n getStoreAddress(storeName),\n storeName,\n {\n from: sender,\n value: ethers.utils.parseUnits(`${amount}`, 18),\n }\n )\n .then((txInit) => {\n console.log(txInit);\n State.update({ loadingMsg: \"Waiting for the final confirmation\" });\n txInit.wait().then((res) => {\n console.log(res);\n State.update({\n loading: false,\n loadingMsg: \"\",\n userInput: {\n storeName: \"\",\n name: \"\",\n amount: \"\",\n password: \"\",\n },\n });\n });\n })\n .catch((err) => console.log(err));\n });\n })\n .catch((err) => console.log(err));\n};\n\nconst cancelTransaction = (tokenId) => {\n walleyContract.returnPass(tokenId).then((password) => {\n if (state.user.cancelPassword === password) {\n State.update({\n loading: true,\n loadingMsg: \"Cancelling your transaction - Pay for the gas\",\n });\n nftContract\n .cancelTransaction(walleyAddress, tokenId, { from: sender })\n .then((tx) => {\n State.update({ loadingMsg: \"Refunding your amount\" });\n tx.wait().then((r) => {\n const tmp = [];\n state.store.userPendingTransactions.map((trans) => {\n if (parseInt(trans[1], 16) !== tokenId) {\n tmp.push(trans);\n }\n });\n State.update({\n loading: false,\n loadingMsg: \"\",\n user: {\n ...state.user,\n userPendingTransactions: tmp,\n cancelPassword: \"\",\n openModal: 0,\n },\n });\n });\n });\n } else {\n console.log(\"Please re-check the password\");\n }\n });\n};\n\n// const billOnChange = (files) => {\n// if (files) {\n// console.log(files[0]);\n// State.update({\n// store: { ...state.store, bill: { uploading: true, amount: null } },\n// });\n// let reader = new FileReader();\n// reader.onloadend = () => {\n// let formdata = new FormData();\n// formdata.append(\"language\", \"eng\");\n// formdata.append(\"isOverlayRequired\", \"false\");\n// formdata.append(\"base64Image\", reader.result);\n// formdata.append(\"iscreatesearchablepdf\", \"false\");\n// formdata.append(\"scale\", \"true\");\n// formdata.append(\"isTable\", \"true\");\n// formdata.append(\"issearchablepdfhidetextlayer\", \"false\");\n// formdata.append(\"OCREngine\", \"3\");\n\n// let requestOptions = {\n// method: \"POST\",\n// headers: { apikey: \"K82213475788957\" },\n// body: formdata,\n// redirect: \"follow\",\n// };\n\n// fetch(\"https://api.ocr.space/parse/image\", requestOptions)\n// .then((response) => response.json())\n// .then((result) => parseReceipt(result))\n// .catch((error) => console.log(\"error\", error));\n// };\n// reader.readAsDataURL(files[0]);\n// }\n// };\n\n// const parseReceipt = (receiptObject) => {\n// console.log(receiptObject);\n// console.log(typeof receiptObject);\n// if (typeof receiptObject === \"object\") {\n// const receiptDetails = receiptObject.ParsedResults[0];\n// const receiptLines = receiptDetails.TextOverlay.Lines;\n// parseReceiptText(receiptDetails.ParsedText);\n// } else if (typeof receiptObject == \"string\") {\n// console.log(receipt);\n// }\n// };\n// const parseReceiptText = (receiptText) => {\n// // extremely reliant on this one receipt\n// let receiptContent = receiptText.split(\"\\t\\r\\n\").map((element) => {\n// return element.toLowerCase().replace(\"\\t\", \" \");\n// });\n\n// const receiptTotal = receiptContent[21].replace(/\\D/g, \"\");\n// const subTotal = receiptContent[\n// receiptContent.findIndex((v) => v.includes(\"subtotal\"))\n// ].replace(/\\D/g, \"\");\n// const VAT = receiptContent[20].replace(/\\D/g, \"\");\n// const receipt = {\n// store: receiptContent[0].split(\"\\t\")[1],\n// date: receiptContent[6].split(\" \")[0],\n// subtotal:\n// subTotal.substring(0, subTotal.length - 2) +\n// \".\" +\n// subTotal.substring(subTotal.length - 2),\n// total:\n// receiptTotal.substring(0, receiptTotal.length - 2) +\n// \".\" +\n// receiptTotal.substring(receiptTotal.length - 2),\n// vat: VAT.substring(0, VAT.length - 2) + \".\" + VAT.substring(VAT.length - 2),\n// };\n// console.log(receipt);\n// };\n\nconst approveTransaction = (tokenId) => {\n State.update({\n loading: true,\n loadingMsg: \"Checking the password\",\n });\n walleyContract.returnPass(tokenId).then((password) => {\n console.log(password);\n if (state.store.approvePassword === password) {\n State.update({\n loadingMsg: \"Approving your transaction - Pay for the gas\",\n });\n nftContract\n .approveTransaction(\n walleyAddress,\n tokenId,\n `${state.store.totalAmount * Math.pow(10, 18)}`,\n state.store.bill.cid,\n {\n from: sender,\n }\n )\n .then((tx) => {\n State.update({\n loadingMsg: \"Waiting for confirmation - Refunding the change\",\n });\n tx.wait().then((res) => {\n const tmp = [];\n const tmpAct = [];\n state.store.storePendingTransactions.map((trans) => {\n if (parseInt(trans[1], 16) !== tokenId) {\n tmp.push(trans);\n } else {\n tmpAct.push(trans);\n tmpAct[0][7] = state.store.bill.cid;\n tmpAct[0][8] = true;\n tmpAct[0][9] = state.store.totalAmount;\n }\n });\n State.update({\n store: {\n ...state.store,\n storePendingTransactions: tmp,\n storePastTransactions: [\n ...state.store.storePastTransactions,\n tmpAct,\n ],\n openModal: 0,\n approvePassword: \"\",\n bill: { uploading: false, amount: null },\n totalAmount: 0,\n },\n loadingMsg: \"\",\n loading: false,\n });\n });\n });\n } else {\n console.log(\"Please re-check the password\");\n State.update({ loading: false, loadingMsg: \"\" });\n }\n });\n};\n\nreturn (\n <WalleyHomeContainer>\n <WalleyHomeHeader>\n <p>Walley.</p>\n <WalleyBalance>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"18\"\n fill=\"none\"\n >\n <path\n d=\"M14.5156 0C17.9644 0 20 1.98459 20 5.3818H15.7689V5.41647C13.8052 5.41647 12.2133 6.96849 12.2133 8.883C12.2133 10.7975 13.8052 12.3495 15.7689 12.3495H20V12.6615C20 16.0154 17.9644 18 14.5156 18H5.48444C2.03556 18 0 16.0154 0 12.6615V5.33847C0 1.98459 2.03556 0 5.48444 0H14.5156ZM19.2533 6.87241C19.6657 6.87241 20 7.19834 20 7.60039V10.131C19.9952 10.5311 19.6637 10.8543 19.2533 10.8589H15.8489C14.8548 10.872 13.9855 10.2084 13.76 9.26432C13.6471 8.67829 13.8056 8.07357 14.1931 7.61222C14.5805 7.15087 15.1573 6.88007 15.7689 6.87241H19.2533ZM16.2489 8.04237H15.92C15.7181 8.04005 15.5236 8.11664 15.38 8.25504C15.2364 8.39344 15.1556 8.58213 15.1556 8.77901C15.1555 9.19205 15.4964 9.52823 15.92 9.53298H16.2489C16.6711 9.53298 17.0133 9.1993 17.0133 8.78767C17.0133 8.37605 16.6711 8.04237 16.2489 8.04237ZM10.3822 3.89119H4.73778C4.31903 3.89116 3.9782 4.2196 3.97333 4.62783C3.97333 5.04087 4.31415 5.37705 4.73778 5.3818H10.3822C10.8044 5.3818 11.1467 5.04812 11.1467 4.6365C11.1467 4.22487 10.8044 3.89119 10.3822 3.89119Z\"\n fill=\"#fff\"\n />\n </svg>{\" \"}\n {state.balance} ETH\n </WalleyBalance>\n </WalleyHomeHeader>\n <WalleyHomeMain>\n {state.loading ? (\n <WalleyLoading>\n <WalleyModal>\n <img src=\"https://svgshare.com/i/wuF.svg\" title=\"\" />\n <p>{state.loadingMsg}</p>\n </WalleyModal>\n </WalleyLoading>\n ) : (\n \"\"\n )}\n {!state.store.isStore ? (\n <>\n <WalleyNavbar>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n id=\"menu\"\n >\n <g data-name=\"Layer 2\">\n <g data-name=\"menu-2\">\n <rect\n width=\"24\"\n height=\"24\"\n opacity=\"0\"\n transform=\"rotate(180 12 12)\"\n ></rect>\n <circle cx=\"0\" cy=\"12\" r=\"1\"></circle>\n <rect\n width=\"14\"\n height=\"2\"\n x=\"3\"\n y=\"11\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n <rect\n width=\"18\"\n height=\"2\"\n x=\"0\"\n y=\"16\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n <rect\n width=\"18\"\n height=\"2\"\n x=\"0\"\n y=\"6\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n </g>\n </g>\n </svg>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"home\" })}>\n Home\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={onTxPastClick}>\n Receipts\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"addSt\" })}>\n Add a store\n </WalleyNavbarButton>\n <NavLineLast></NavLineLast>\n </WalleyNavbar>\n <WalleyHomeBody>\n {state.view === \"home\" ? (\n <>\n {state.newTxn ? (\n <WalleyHomeOverlay>\n <WalleyHomeForm>\n <Widget\n src=\"near/widget/Select\"\n props={{\n value: state.homeInputs.storeName,\n noLabel: true,\n placeholder:\n state.store.stores.length !== 0\n ? \"Select a store\"\n : \"No Store Available\",\n options: [...widgetOptions()],\n onChange: (value) => {\n homeInputUpdates(value.text, \"storeName\");\n },\n }}\n />\n <WalleyLabel>\n Enter the maximum amount you'd like to spend(in INR)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.amount}\n type=\"number\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"amount\")\n }\n placeholder=\"Amount(in INR)\"\n />\n <WalleyLabel>\n Name(will be asked at the store)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.name}\n type=\"text\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"name\")\n }\n placeholder=\"Name\"\n />\n <WalleyLabel>\n Set a password for the transaction(will be asked during\n checkout)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.password}\n type=\"password\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"password\")\n }\n placeholder=\"Password\"\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FFA500\"\n onClick={initTransaction}\n >\n Buy The Store NFT\n </WalleyButton>\n </WalleyHomeForm>\n </WalleyHomeOverlay>\n ) : (\n \"\"\n )}\n <WalleyInput\n value={state.search.store}\n onChange={(e) =>\n State.update({\n search: { ...state.search, store: e.target.value },\n })\n }\n placeholder=\"Search by Store Name\"\n />\n <WalleyButton onClick={() => State.update({ newTxn: true })}>\n Buy NFT\n </WalleyButton>\n <WalleyTransactions>\n {state.user.userPendingTransactions.length !== 0\n ? state.user.userPendingTransactions\n .filter((tx) => tx[6].includes(state.search.store))\n .map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Amount - {Big(tx[5]).toFixed(5)}</p>\n {state.user.openModal === parseInt(tx[1], 16) ? (\n <>\n <WalleyLabel>\n Enter the transacation password\n </WalleyLabel>\n <WalleyInput\n type=\"password\"\n value={state.user.cancelPassword}\n onChange={(e) =>\n State.update({\n user: {\n ...state.user,\n cancelPassword: e.target.value,\n },\n })\n }\n />\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openModal: 0,\n cancelPassword: \"\",\n },\n })\n }\n >\n Close\n </WalleyButton>\n <WalleyButton\n color=\"#white\"\n bg=\"red\"\n onClick={() =>\n cancelTransaction(parseInt(tx[1], 16))\n }\n >\n Cancel\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#white\"\n bg=\"red\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openModal: parseInt(tx[1], 16),\n cancelPassword: \"\",\n },\n })\n }\n >\n Cancel\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No pending transactions found\"}\n </WalleyTransactions>\n </>\n ) : state.view === \"txPast\" ? (\n <WalleyTransactions>\n {state.user.userPastTransactions.length !== 0\n ? state.user.userPastTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max Amount - {Big(tx[5]).toFixed(5)}</p>\n <p>Total Bill Amount - {Big(tx[9]).toFixed(5)}</p>\n {state.user.openReceipt === Big(tx[1]).toFixed(0) ? (\n <>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${tx[7]}`}\n alt={tx[7]}\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: 0,\n },\n })\n }\n >\n Close Receipt\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: Big(tx[1]).toFixed(0),\n },\n })\n }\n >\n Show Receipt\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No past transactions found\"}\n </WalleyTransactions>\n ) : (\n <WalleyStoreForm>\n <WalleyLabel>Store Name</WalleyLabel>\n <WalleyInput\n value={state.storeInputs.storeName}\n type=\"text\"\n onChange={(e) => {\n storeInputUpdates(e.target.value, \"storeName\");\n }}\n placeholder=\"Enter the Store Name\"\n />\n <WalleyLabel>Store Address</WalleyLabel>\n <WalleyInput\n value={state.storeInputs.storeAddress}\n type=\"text\"\n onChange={(e) =>\n storeInputUpdates(e.target.value, \"storeAddress\")\n }\n placeholder=\"Enter the Store Address\"\n />\n <WalleyStoreButton\n onClick={() => storeInputUpdates(sender, \"storeAddress\")}\n >\n Use current address(convert this account into a store)\n </WalleyStoreButton>\n <WalleyLabel>Add Cover Image</WalleyLabel>\n <IpfsImageUpload image={state.storeInputs.image} />\n <WalleyButton color=\"#000D1A\" bg=\"#FA9703\" onClick={addStore}>\n Add Store\n </WalleyButton>\n </WalleyStoreForm>\n )}\n </WalleyHomeBody>\n </>\n ) : (\n <>\n <WalleyNavbar>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\">\n <path\n d=\"M42.3795 1.00041H3.49873C-0.658836 0.841665 -0.658836 7.16116 3.49873 7.00242H42.2245C46.3065 7.16116 46.4652 1.00041 42.3833 1.00041H42.3795ZM3.49873 25.0009C-0.500093 25.0009 -0.500093 30.9991 3.49873 30.9991H25.4204C29.5024 30.9991 29.5024 25.0009 25.4204 25.0009H3.49873ZM3.49873 49.0014C-0.500093 49.0014 -0.500093 54.9996 3.49873 54.9996H52.6222C56.621 54.9996 56.621 49.0014 52.6222 49.0014H3.49873Z\"\n fill=\"white\"\n />\n </svg>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"home\" })}>\n Home\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton\n onClick={() => State.update({ view: \"txPast\" })}\n >\n Receipts\n </WalleyNavbarButton>\n <NavLineLast></NavLineLast>\n </WalleyNavbar>\n <WalleyStoreBody>\n <WalleyTransactions>\n {state.view === \"home\"\n ? state.store.storePendingTransactions.length !== 0\n ? state.store.storePendingTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max amount - {Big(tx[5]).toFixed(5)}</p>\n {state.store.openModal === parseInt(tx[1], 16) ? (\n <>\n <WalleyLabel>Please scan the bill - </WalleyLabel>\n <IpfsImageUpload image={state.store.bill} />\n {/*<Files\n multiple={false}\n accepts={[\"image/*\"]}\n minFileSize={1}\n clickable\n className=\"btn btn-outline-primary\"\n onChange={billOnChange}\n >\n {state.store.bill.uploading ? (\n <> Scanning </>\n ) : (\n \"Scan the bill\"\n )}\n </Files>*/}\n <WalleyLabel>Total Bill Amount</WalleyLabel>\n <WalleyInput\n value={state.store.totalAmount}\n onChange={(e) =>\n State.update({\n store: {\n ...state.store,\n totalAmount: e.target.value,\n },\n })\n }\n />\n <WalleyLabel>Transaction Password</WalleyLabel>\n <WalleyInput\n type=\"password\"\n value={state.store.approvePassword}\n onChange={(e) =>\n State.update({\n store: {\n ...state.store,\n approvePassword: e.target.value,\n },\n })\n }\n />\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() => {\n State.update({\n store: {\n ...state.store,\n approvePassword: \"\",\n bill: { uploading: false, cid: \"\" },\n totalAmount: null,\n openModal: 0,\n },\n });\n }}\n >\n Close\n </WalleyButton>\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() => {\n console.log(state.store.bill.cid);\n if (state.store.bill.cid) {\n approveTransaction(parseInt(tx[1], 16));\n } else {\n console.log(\"Please Upload the bill\");\n }\n }}\n >\n Approve\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() =>\n State.update({\n store: {\n ...state.store,\n approvePassword: \"\",\n bill: { uploading: false, amount: null },\n totalAmount: null,\n openModal: parseInt(tx[1], 16),\n },\n })\n }\n >\n Approve\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No pending transactions\"\n : state.store.storePastTransactions.length !== 0\n ? state.store.storePastTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max Amount - {Big(tx[5]).toFixed(5)}</p>\n\n <p>Total Bill Amount - {Big(tx[9]).toFixed(5)}</p>\n {state.user.openReceipt === Big(tx[1]).toFixed(0) ? (\n <>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${tx[7]}`}\n alt={tx[7]}\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: 0,\n },\n })\n }\n >\n Close Receipt\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: Big(tx[1]).toFixed(0),\n },\n })\n }\n >\n Show Receipt\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No past transactions found\"}\n </WalleyTransactions>\n </WalleyStoreBody>\n </>\n )}\n </WalleyHomeMain>\n </WalleyHomeContainer>\n);\n" } } } } }
Empty result
No logs
Receipt:
Predecessor ID:
Receiver ID:
Gas Burned:
12 Tgas
Tokens Burned:
0.0013 
Called method: 'set' in contract: social.near
Arguments:
{ "data": { "shiami.near": { "widget": { "walley": { "": "const nftAddress = \"0x2e0f4a4123d0072f46bf67127270a80114541d86\";\nconst NFTManagerABI = JSON.parse(\n fetch(\"https://raw.githubusercontent.com/test1883/files/main/NFTManager.json\")\n .body\n);\nconst walleyAddress = \"0x8ae53c3a6bf7762db9cc7603a290d769020e4e77\";\nconst WalleyABI = JSON.parse(\n fetch(\"https://raw.githubusercontent.com/test1883/files/main/Walley.json\")\n .body\n);\nState.init({\n general: {\n chainId: undefined,\n balance: 0,\n },\n store: {\n stores: [],\n storeName: \"\",\n storeAddress: \"\",\n isStore: false,\n storePendingTransactions: [],\n storePastTransactions: [],\n storeImages: {},\n openModal: 0,\n approvePassword: \"\",\n bill: { uploading: false, cid: null },\n totalAmount: 0,\n },\n user: {\n userPendingTransactions: [],\n userPastTransactions: [],\n openModal: 0,\n cancelPassword: \"\",\n openReceipt: 0,\n },\n homeInputs: {\n storeName: \"\",\n amount: 0,\n name: \"\",\n password: \"\",\n },\n storeInputs: {\n storeName: \"\",\n storeAddress: \"\",\n image: \"\",\n },\n search: {\n store: \"\",\n user: \"\",\n },\n storeName: \"\",\n view: \"home\",\n loading: true,\n loadingMsg: \"Fetching Data\",\n newTransaction: false,\n});\n\nconst cssFont = fetch(\n \"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800;900&display=swap\"\n).body;\n\nconst Root = styled.div`\n \n background: url(\"https://img.freepik.com/free-vector/abstract-black-shapes-background-design_1017-31904.jpg?w=826&t=st=1692784084~exp=1692784684~hmac=640a88623947cac46d90337f2d03281af01efcdcd5aa64901719774754bd75b3\");\n background-size: cover;\n display: flex;\n font-family: Poppins, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n ${cssFont}\n flex-direction: column;\n padding: 0;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n height: 100vh;\n width: 100vw;\n @media screen and (max-width: 600px) {\n background-position: 70% 70%;\n }\n`;\n\nconst WalleyTitle = styled.div`\n text-align: left;\n font-weight: 900;\n width: 100%;\n font-size: 30px;\n margin: 0px;\n padding: 5px;\n color: #fff; \n @media screen and (max-width: 600px) {\n text-align: center;\n }\n`;\n\nconst WalleyIndexContainer = styled.div`\n height: 100vh;\n color: #fff;\n width: 100%;\n padding: 20px;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyIndexBody = styled.div`\n display: flex;\n flex-direction: column;\n text-align: left;\n width: 500px;\n padding-left: 50px;\n @media screen and (max-width:600px) {\n width: 100%;\n padding-left: 0;\n align-items: center;\n }\n`;\n\nconst WalleyIndexDesc = styled.div`\n color: #fff;\n font-weight: 500;\n font-size: 50px;\n padding-bottom: 10px;\n margin-top: 50px;\n @media screen and (max-width: 400px) {\n margin-top: 150px;\n font-size: 40px;\n }\n`;\n\nconst WalleyIndexMain = styled.div`\n margin-top: 20px;\n width: 100%;\n padding: 20px;\n @media screen and (max-width: 600px) {\n text-align: center;\n position: fixed;\n bottom: 0px;\n left: 0px;\n }\n &>span {\n font-weight: 500;\n @media screen and (max-width: 600px) {\n display: none;\n width: 0px;\n }\n }\n &>button {\n border: none;\n background: #FA9703;\n color: white;\n margin-left: 20px;\n transition: all .2s ease-out;\n &:hover {\n scale: 1.05;\n background:#FA9703;\n }\n &:active {\n background:#FA9703;\n }\n @media screen and (max-width: 600px) {\n width: 100%;\n height: 50px;\n font-size: 15px;\n display: block;\n margin-left: 0px;\n }\n }\n`;\n\nconst WalleyHomeContainer = styled.div`\n background: url(\"https://img.freepik.com/free-vector/abstract-black-shapes-background-design_1017-31904.jpg?w=826&t=st=1692784084~exp=1692784684~hmac=640a88623947cac46d90337f2d03281af01efcdcd5aa64901719774754bd75b3\");\n background-size: cover;\n font-family: Poppins, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;\n height: 100vh;\n width: 100vw;\n ::placeholder {\n color: rgb(255, 255, 255, 0.5);\n }\n color: #fff;\n display: flex;\n flex-direction: column;\n position: fixed;\n top: 0px;\n @media screen and (max-width: 600px) {\n background-position: 70% 70%;\n }\n`;\n\nconst WalleyHomeHeader = styled.div`\n width: 100%;\n font-size: 30px;\n font-weight: 900;\n padding: 10px;\n padding-bottom: 0px;\n color: #fff;\n display: flex;\n flex-direction: column;\n justify-content: space-around;\n &>p {\n text-align: center;\n }\n\n`;\n\nconst WalleyHomeMain = styled.div`\n padding: 20px;\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 100%;\n align-items: space-between;\n`;\n\nconst WalleyNavbar = styled.div`\n padding: 20px;\n display: flex;\n flex-direction: column;\n position: relative;\n left: 0px;\n height: 100%;\n text-align: left;\n &>svg {\n text-align: left; \n padding: 0;\n width: 24px;\n }\n`;\n\nconst WalleyNavbarButton = styled.button`\n border: none;\n text-align: left;\n background: none;\n color: #fff;\n padding:0px;\n font-weight: 500;\n`;\n\nconst NavLine = styled.span`\n width: 1px;\n height: 70px;\n background: white;\n margin: 4px 0 4px 0;\n`;\nconst NavLineLast = styled.span`\n width: 1px;\n height: 100%;\n background: white;\n margin: 4px 0 4px 0;\n`;\n\nconst WalleyHomeBody = styled.div`\n width: 75%;\n`;\n\nconst WalleyBalance = styled.span`\n padding: 5px;\n font-weight: 500;\n font-size: 15px;\n width: 150px;\n background-color: #424242;\n border-radius: 30px;\n text-align: center;\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n &>svg {\n fill: #fff;\n }\n`;\n\nconst WalleyLoading = styled.div`\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000000;\n background: rgb(66, 66, 66, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n test-align: center;\n font-weight: 400;\n`;\n\nconst WalleyModal = styled.div`\n width: 400px;\n height: 400px;\n background: rgb(66, 66, 66);\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n &>img {\n width: 70px;\n height: 70px;\n }\n @media screen and (max-width: 500px) {\n width: 340px;\n height: 340px;\n }\n\n`;\n\nconst WalleyButton = styled.button`\n background-color: ${props.bg};\n color: ${props.color};\n display: block;\n border: none;\n`;\n\nconst WalleyHomeOverlay = styled.div`\n width: 100vw;\n height: 100vh;\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1000000;\n background: rgb(66, 66, 66, 0.7);\n display: flex;\n justify-content: center;\n align-items: center;\n test-align: center;\n`;\n\nconst WalleyHomeForm = styled.div`\n background: rgb(66, 66, 66);\n box-shadow: rgb(0, 0, 0, 0.19) 0px 10px 20px, rgb(0, 0, 0, 0.23) 0px 6px 6px;\n width: 400px;\n height: 400px;\n text-align: center;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyStoreForm = styled.div`\n width: 200px;\n text-align: center;\n display: flex;\n flex-direction: column;\n`;\n\nconst WalleyStoreImage = styled.img`\n width: 100px;\n height: 100px;\n text-align: center;\n`;\n\nconst WalleyInput = styled.input`\n display: block;\n width: 100%;\n padding: 10px;\n border-radius: 20px;\n background: none;\n border: 2px solid rgb(66, 66, 66);\n`;\n\nconst WalleyLabel = styled.p`\n width: 100%;\n`;\n\nconst WalleyStoreButton = styled.button`\n border: none;\n background: none;\n color: black;\n display: block;\n`;\n\nconst WalleyTransactions = styled.div`\n height: 100%;\n overflow: scroll;\n`;\n\nconst TransactionCard = styled.div`\n`;\n\nconst WalleyStoreBody = styled.div`\n`;\n\nconst sender = Ethers.send(\"eth_requestAccounts\", [])[0];\nconst updateBalance = (balance) => {\n State.update({ balance });\n};\nif (!sender) {\n return (\n <Root>\n <WalleyIndexContainer>\n <WalleyTitle>Walley.</WalleyTitle>\n <WalleyIndexBody>\n <WalleyIndexDesc>\n Go Phoneless With the Highly Secured NFT-based Wallet.\n </WalleyIndexDesc>\n <WalleyIndexMain>\n <span>Get Started -</span>\n <Web3Connect connectLabel=\"Connect Wallet\" />\n </WalleyIndexMain>\n </WalleyIndexBody>\n </WalleyIndexContainer>\n </Root>\n );\n}\nif (state.chainId === undefined && ethers !== undefined && sender) {\n Ethers.provider()\n .getNetwork()\n .then((chainIdData) => {\n if (chainIdData?.chainId) {\n State.update({ chainId: chainIdData.chainId });\n }\n });\n Ethers.provider()\n .getBalance(sender)\n .then((balance) => {\n updateBalance(Big(balance).div(Big(10).pow(18)).toFixed(5));\n });\n}\nif (state.chainId !== undefined && state.chainId !== 11155111) {\n return <p>Switch to Ethereum Sepolia</p>;\n}\nconst nftIface = new ethers.utils.Interface(NFTManagerABI);\nconst nftContract = new ethers.Contract(\n nftAddress,\n NFTManagerABI,\n Ethers.provider().getSigner()\n);\nconst walleyIface = new ethers.utils.Interface(WalleyABI);\nconst walleyContract = new ethers.Contract(\n walleyAddress,\n WalleyABI,\n Ethers.provider().getSigner()\n);\n//get stores data\nif (state.store.stores.length === 0 && nftContract && sender) {\n walleyContract.getToken().then((tokenId) => {\n console.log(tokenId);\n });\n State.update({ loading: true, loadingMsg: \"Fetching Stores\" });\n nftContract.getAllStores().then((stores) => {\n onTxInit();\n if (stores.length === 0) {\n State.update({ loading: false, loadingMsg: \"\" });\n } else {\n const storeState = state.store;\n storeState.stores = stores;\n let store;\n for (let i = 0; i < stores.length; i++) {\n store = stores[i];\n storeState.storeImages[store[0]] = store[2];\n if (store[1].toLowerCase() === sender) {\n storeState.isStore = true;\n storeState.storeName = store[0];\n storeState.storeAddress = store[1].toLowerCase();\n State.update({\n loading: true,\n loadingMsg: \"Fetching Store Transactions\",\n });\n nftContract.getStoreTransactions(store[1]).then((transactions) => {\n storeState.storePendingTransactions = [];\n storeState.storePastTransactions = [];\n transactions.map((txn) => {\n if (txn[8] === false) {\n storeState.storePendingTransactions.push(txn);\n } else {\n storeState.storePastTransactions.push(txn);\n }\n });\n });\n }\n if (i === stores.length - 1)\n State.update({ store: storeState, loading: false, loadingMsg: \"\" });\n }\n console.log(state.store);\n }\n });\n}\n\nconst onTxInit = () => {\n State.update({\n view: \"home\",\n loading: true,\n loadingMsg: \"Fetching transactions\",\n });\n nftContract.getMyTransactions({ from: sender }).then((transactions) => {\n const st = [];\n transactions.map((txn) => {\n if (txn[8] === false) st.push(txn);\n });\n State.update({\n user: { ...state.user, userPendingTransactions: st },\n loading: false,\n loadingMsg: \"\",\n });\n });\n};\n\nconst onTxPastClick = () => {\n State.update({\n view: \"txPast\",\n loading: true,\n loadingMsg: \"Fetching past transactions\",\n });\n nftContract.getMyTransactions({ from: sender }).then((transactions) => {\n const st = [];\n transactions.map((txn) => {\n if (txn[8] === true) st.push(txn);\n });\n State.update({\n user: { ...state.user, userPastTransactions: st },\n loading: false,\n loadingMsg: \"\",\n });\n });\n};\n\nconst widgetOptions = () => {\n const options = [];\n for (let i = 0; i < state.store.stores.length; i++)\n options.push({\n text: state.store.stores[i][0],\n value: state.store.stores[i][0],\n });\n console.log(options);\n return options;\n};\n\nconst homeInputUpdates = (value, field) => {\n const homeInputs = state.homeInputs;\n homeInputs[field] = value;\n State.update({ homeInputs });\n};\nconst storeInputUpdates = (value, field) => {\n const storeInputs = state.storeInputs;\n console.log(storeInputs);\n storeInputs[field] = value;\n console.log(storeInputs);\n State.update({ storeInputs });\n};\n\nconst addStore = () => {\n State.update({ loading: true, loadingMsg: \"Creating a new store\" });\n const stateT = state;\n const { storeName, storeAddress, image } = stateT.storeInputs;\n nftContract.addStore(storeName, storeAddress, image.cid).then((t) => {\n console.log(t);\n t.wait().then((r) => {\n stateT.store.stores.push([\n storeName,\n storeAddress.toLowerCase(),\n image.cid,\n ]);\n stateT.store.storeImages[storeName] = image.cid;\n\n stateT.storeInputs = {\n storeName: \"\",\n storeAddress: \"\",\n image: \"\",\n };\n stateT.loading = false;\n stateT.loadingMsg = \"\";\n if (storeAddress.toLowerCase() === sender) {\n // alert(\n // \"Warning - If you have any pending transactions, you won't be able to see them. But they can be completed at the store!\"\n // );\n stateT.store.isStore = true;\n stateT.store.storeAddress = storeAddress.toLowerCase();\n stateT.store.storeName = storeName;\n }\n State.update(stateT);\n });\n });\n};\n\nconst getStoreAddress = (storeName) => {\n const t = [];\n state.store.stores.map((store) => {\n if (store[0] === storeName) t.push(store[1]);\n });\n return t[0];\n};\n\nconst initTransaction = () => {\n State.update({\n loading: true,\n loadingMsg: \"Minting your NFT - Please Pay the gas price\",\n });\n const { storeName, amount, name, password } = state.homeInputs;\n console.log(password);\n walleyContract\n .mint(password, { from: sender })\n .then((tx) => {\n State.update({ loadingMsg: \"Waiting for confirmation\" });\n tx.wait().then((r) => {\n const tokenId = parseInt(r.logs[2].data, 16);\n State.update({\n loadingMsg:\n \"Creating your transaction - Please pay the amount you entered + gas\",\n });\n nftContract\n .initTransaction(\n walleyAddress,\n name,\n tokenId,\n `${amount * Math.pow(10, 18)}`,\n getStoreAddress(storeName),\n storeName,\n {\n from: sender,\n value: ethers.utils.parseUnits(`${amount}`, 18),\n }\n )\n .then((txInit) => {\n console.log(txInit);\n State.update({ loadingMsg: \"Waiting for the final confirmation\" });\n txInit.wait().then((res) => {\n console.log(res);\n State.update({\n loading: false,\n loadingMsg: \"\",\n userInput: {\n storeName: \"\",\n name: \"\",\n amount: \"\",\n password: \"\",\n },\n });\n });\n })\n .catch((err) => console.log(err));\n });\n })\n .catch((err) => console.log(err));\n};\n\nconst cancelTransaction = (tokenId) => {\n walleyContract.returnPass(tokenId).then((password) => {\n if (state.user.cancelPassword === password) {\n State.update({\n loading: true,\n loadingMsg: \"Cancelling your transaction - Pay for the gas\",\n });\n nftContract\n .cancelTransaction(walleyAddress, tokenId, { from: sender })\n .then((tx) => {\n State.update({ loadingMsg: \"Refunding your amount\" });\n tx.wait().then((r) => {\n const tmp = [];\n state.store.userPendingTransactions.map((trans) => {\n if (parseInt(trans[1], 16) !== tokenId) {\n tmp.push(trans);\n }\n });\n State.update({\n loading: false,\n loadingMsg: \"\",\n user: {\n ...state.user,\n userPendingTransactions: tmp,\n cancelPassword: \"\",\n openModal: 0,\n },\n });\n });\n });\n } else {\n console.log(\"Please re-check the password\");\n }\n });\n};\n\n// const billOnChange = (files) => {\n// if (files) {\n// console.log(files[0]);\n// State.update({\n// store: { ...state.store, bill: { uploading: true, amount: null } },\n// });\n// let reader = new FileReader();\n// reader.onloadend = () => {\n// let formdata = new FormData();\n// formdata.append(\"language\", \"eng\");\n// formdata.append(\"isOverlayRequired\", \"false\");\n// formdata.append(\"base64Image\", reader.result);\n// formdata.append(\"iscreatesearchablepdf\", \"false\");\n// formdata.append(\"scale\", \"true\");\n// formdata.append(\"isTable\", \"true\");\n// formdata.append(\"issearchablepdfhidetextlayer\", \"false\");\n// formdata.append(\"OCREngine\", \"3\");\n\n// let requestOptions = {\n// method: \"POST\",\n// headers: { apikey: \"K82213475788957\" },\n// body: formdata,\n// redirect: \"follow\",\n// };\n\n// fetch(\"https://api.ocr.space/parse/image\", requestOptions)\n// .then((response) => response.json())\n// .then((result) => parseReceipt(result))\n// .catch((error) => console.log(\"error\", error));\n// };\n// reader.readAsDataURL(files[0]);\n// }\n// };\n\n// const parseReceipt = (receiptObject) => {\n// console.log(receiptObject);\n// console.log(typeof receiptObject);\n// if (typeof receiptObject === \"object\") {\n// const receiptDetails = receiptObject.ParsedResults[0];\n// const receiptLines = receiptDetails.TextOverlay.Lines;\n// parseReceiptText(receiptDetails.ParsedText);\n// } else if (typeof receiptObject == \"string\") {\n// console.log(receipt);\n// }\n// };\n// const parseReceiptText = (receiptText) => {\n// // extremely reliant on this one receipt\n// let receiptContent = receiptText.split(\"\\t\\r\\n\").map((element) => {\n// return element.toLowerCase().replace(\"\\t\", \" \");\n// });\n\n// const receiptTotal = receiptContent[21].replace(/\\D/g, \"\");\n// const subTotal = receiptContent[\n// receiptContent.findIndex((v) => v.includes(\"subtotal\"))\n// ].replace(/\\D/g, \"\");\n// const VAT = receiptContent[20].replace(/\\D/g, \"\");\n// const receipt = {\n// store: receiptContent[0].split(\"\\t\")[1],\n// date: receiptContent[6].split(\" \")[0],\n// subtotal:\n// subTotal.substring(0, subTotal.length - 2) +\n// \".\" +\n// subTotal.substring(subTotal.length - 2),\n// total:\n// receiptTotal.substring(0, receiptTotal.length - 2) +\n// \".\" +\n// receiptTotal.substring(receiptTotal.length - 2),\n// vat: VAT.substring(0, VAT.length - 2) + \".\" + VAT.substring(VAT.length - 2),\n// };\n// console.log(receipt);\n// };\n\nconst approveTransaction = (tokenId) => {\n State.update({\n loading: true,\n loadingMsg: \"Checking the password\",\n });\n walleyContract.returnPass(tokenId).then((password) => {\n console.log(password);\n if (state.store.approvePassword === password) {\n State.update({\n loadingMsg: \"Approving your transaction - Pay for the gas\",\n });\n nftContract\n .approveTransaction(\n walleyAddress,\n tokenId,\n `${state.store.totalAmount * Math.pow(10, 18)}`,\n state.store.bill.cid,\n {\n from: sender,\n }\n )\n .then((tx) => {\n State.update({\n loadingMsg: \"Waiting for confirmation - Refunding the change\",\n });\n tx.wait().then((res) => {\n const tmp = [];\n const tmpAct = [];\n state.store.storePendingTransactions.map((trans) => {\n if (parseInt(trans[1], 16) !== tokenId) {\n tmp.push(trans);\n } else {\n tmpAct.push(trans);\n tmpAct[0][7] = state.store.bill.cid;\n tmpAct[0][8] = true;\n tmpAct[0][9] = state.store.totalAmount;\n }\n });\n State.update({\n store: {\n ...state.store,\n storePendingTransactions: tmp,\n storePastTransactions: [\n ...state.store.storePastTransactions,\n tmpAct,\n ],\n openModal: 0,\n approvePassword: \"\",\n bill: { uploading: false, amount: null },\n totalAmount: 0,\n },\n loadingMsg: \"\",\n loading: false,\n });\n });\n });\n } else {\n console.log(\"Please re-check the password\");\n State.update({ loading: false, loadingMsg: \"\" });\n }\n });\n};\n\nreturn (\n <WalleyHomeContainer>\n <WalleyHomeHeader>\n <p>Walley.</p>\n <WalleyBalance>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"18\"\n fill=\"none\"\n >\n <path\n d=\"M14.5156 0C17.9644 0 20 1.98459 20 5.3818H15.7689V5.41647C13.8052 5.41647 12.2133 6.96849 12.2133 8.883C12.2133 10.7975 13.8052 12.3495 15.7689 12.3495H20V12.6615C20 16.0154 17.9644 18 14.5156 18H5.48444C2.03556 18 0 16.0154 0 12.6615V5.33847C0 1.98459 2.03556 0 5.48444 0H14.5156ZM19.2533 6.87241C19.6657 6.87241 20 7.19834 20 7.60039V10.131C19.9952 10.5311 19.6637 10.8543 19.2533 10.8589H15.8489C14.8548 10.872 13.9855 10.2084 13.76 9.26432C13.6471 8.67829 13.8056 8.07357 14.1931 7.61222C14.5805 7.15087 15.1573 6.88007 15.7689 6.87241H19.2533ZM16.2489 8.04237H15.92C15.7181 8.04005 15.5236 8.11664 15.38 8.25504C15.2364 8.39344 15.1556 8.58213 15.1556 8.77901C15.1555 9.19205 15.4964 9.52823 15.92 9.53298H16.2489C16.6711 9.53298 17.0133 9.1993 17.0133 8.78767C17.0133 8.37605 16.6711 8.04237 16.2489 8.04237ZM10.3822 3.89119H4.73778C4.31903 3.89116 3.9782 4.2196 3.97333 4.62783C3.97333 5.04087 4.31415 5.37705 4.73778 5.3818H10.3822C10.8044 5.3818 11.1467 5.04812 11.1467 4.6365C11.1467 4.22487 10.8044 3.89119 10.3822 3.89119Z\"\n fill=\"#fff\"\n />\n </svg>{\" \"}\n {state.balance} ETH\n </WalleyBalance>\n </WalleyHomeHeader>\n <WalleyHomeMain>\n {state.loading ? (\n <WalleyLoading>\n <WalleyModal>\n <img src=\"https://svgshare.com/i/wuF.svg\" title=\"\" />\n <p>{state.loadingMsg}</p>\n </WalleyModal>\n </WalleyLoading>\n ) : (\n \"\"\n )}\n {!state.store.isStore ? (\n <>\n <WalleyNavbar>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n id=\"menu\"\n >\n <g data-name=\"Layer 2\">\n <g data-name=\"menu-2\">\n <rect\n width=\"24\"\n height=\"24\"\n opacity=\"0\"\n transform=\"rotate(180 12 12)\"\n ></rect>\n <circle cx=\"0\" cy=\"12\" r=\"1\"></circle>\n <rect\n width=\"14\"\n height=\"2\"\n x=\"3\"\n y=\"11\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n <rect\n width=\"18\"\n height=\"2\"\n x=\"0\"\n y=\"16\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n <rect\n width=\"18\"\n height=\"2\"\n x=\"0\"\n y=\"6\"\n rx=\".94\"\n ry=\".94\"\n ></rect>\n </g>\n </g>\n </svg>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"home\" })}>\n Home\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={onTxPastClick}>\n Receipts\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"addSt\" })}>\n Add a store\n </WalleyNavbarButton>\n <NavLineLast></NavLineLast>\n </WalleyNavbar>\n <WalleyHomeBody>\n {state.view === \"home\" ? (\n <>\n {state.newTxn ? (\n <WalleyHomeOverlay>\n <WalleyHomeForm>\n <Widget\n src=\"near/widget/Select\"\n props={{\n value: state.homeInputs.storeName,\n noLabel: true,\n placeholder:\n state.store.stores.length !== 0\n ? \"Select a store\"\n : \"No Store Available\",\n options: [...widgetOptions()],\n onChange: (value) => {\n homeInputUpdates(value.text, \"storeName\");\n },\n }}\n />\n <WalleyLabel>\n Enter the maximum amount you'd like to spend(in INR)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.amount}\n type=\"number\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"amount\")\n }\n placeholder=\"Amount(in INR)\"\n />\n <WalleyLabel>\n Name(will be asked at the store)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.name}\n type=\"text\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"name\")\n }\n placeholder=\"Name\"\n />\n <WalleyLabel>\n Set a password for the transaction(will be asked during\n checkout)\n </WalleyLabel>\n <WalleyInput\n value={state.homeInputs.password}\n type=\"password\"\n onChange={(e) =>\n homeInputUpdates(e.target.value, \"password\")\n }\n placeholder=\"Password\"\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FFA500\"\n onClick={initTransaction}\n >\n Buy The Store NFT\n </WalleyButton>\n </WalleyHomeForm>\n </WalleyHomeOverlay>\n ) : (\n \"\"\n )}\n <WalleyInput\n value={state.search.store}\n onChange={(e) =>\n State.update({\n search: { ...state.search, store: e.target.value },\n })\n }\n placeholder=\"Search by Store Name\"\n />\n <WalleyButton onClick={() => State.update({ newTxn: true })}>\n Buy NFT\n </WalleyButton>\n <WalleyTransactions>\n {state.user.userPendingTransactions.length !== 0\n ? state.user.userPendingTransactions\n .filter((tx) => tx[6].includes(state.search.store))\n .map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Amount - {Big(tx[5]).toFixed(5)}</p>\n {state.user.openModal === parseInt(tx[1], 16) ? (\n <>\n <WalleyLabel>\n Enter the transacation password\n </WalleyLabel>\n <WalleyInput\n type=\"password\"\n value={state.user.cancelPassword}\n onChange={(e) =>\n State.update({\n user: {\n ...state.user,\n cancelPassword: e.target.value,\n },\n })\n }\n />\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openModal: 0,\n cancelPassword: \"\",\n },\n })\n }\n >\n Close\n </WalleyButton>\n <WalleyButton\n color=\"#white\"\n bg=\"red\"\n onClick={() =>\n cancelTransaction(parseInt(tx[1], 16))\n }\n >\n Cancel\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#white\"\n bg=\"red\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openModal: parseInt(tx[1], 16),\n cancelPassword: \"\",\n },\n })\n }\n >\n Cancel\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No pending transactions found\"}\n </WalleyTransactions>\n </>\n ) : state.view === \"txPast\" ? (\n <WalleyTransactions>\n {state.user.userPastTransactions.length !== 0\n ? state.user.userPastTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max Amount - {Big(tx[5]).toFixed(5)}</p>\n <p>Total Bill Amount - {Big(tx[9]).toFixed(5)}</p>\n {state.user.openReceipt === Big(tx[1]).toFixed(0) ? (\n <>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${tx[7]}`}\n alt={tx[7]}\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: 0,\n },\n })\n }\n >\n Close Receipt\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: Big(tx[1]).toFixed(0),\n },\n })\n }\n >\n Show Receipt\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No past transactions found\"}\n </WalleyTransactions>\n ) : (\n <WalleyStoreForm>\n <WalleyLabel>Store Name</WalleyLabel>\n <WalleyInput\n value={state.storeInputs.storeName}\n type=\"text\"\n onChange={(e) => {\n storeInputUpdates(e.target.value, \"storeName\");\n }}\n placeholder=\"Enter the Store Name\"\n />\n <WalleyLabel>Store Address</WalleyLabel>\n <WalleyInput\n value={state.storeInputs.storeAddress}\n type=\"text\"\n onChange={(e) =>\n storeInputUpdates(e.target.value, \"storeAddress\")\n }\n placeholder=\"Enter the Store Address\"\n />\n <WalleyStoreButton\n onClick={() => storeInputUpdates(sender, \"storeAddress\")}\n >\n Use current address(convert this account into a store)\n </WalleyStoreButton>\n <WalleyLabel>Add Cover Image</WalleyLabel>\n <IpfsImageUpload image={state.storeInputs.image} />\n <WalleyButton color=\"#000D1A\" bg=\"#FA9703\" onClick={addStore}>\n Add Store\n </WalleyButton>\n </WalleyStoreForm>\n )}\n </WalleyHomeBody>\n </>\n ) : (\n <>\n <WalleyNavbar>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\">\n <path\n d=\"M42.3795 1.00041H3.49873C-0.658836 0.841665 -0.658836 7.16116 3.49873 7.00242H42.2245C46.3065 7.16116 46.4652 1.00041 42.3833 1.00041H42.3795ZM3.49873 25.0009C-0.500093 25.0009 -0.500093 30.9991 3.49873 30.9991H25.4204C29.5024 30.9991 29.5024 25.0009 25.4204 25.0009H3.49873ZM3.49873 49.0014C-0.500093 49.0014 -0.500093 54.9996 3.49873 54.9996H52.6222C56.621 54.9996 56.621 49.0014 52.6222 49.0014H3.49873Z\"\n fill=\"white\"\n />\n </svg>\n <NavLine></NavLine>\n <WalleyNavbarButton onClick={() => State.update({ view: \"home\" })}>\n Home\n </WalleyNavbarButton>\n <NavLine></NavLine>\n <WalleyNavbarButton\n onClick={() => State.update({ view: \"txPast\" })}\n >\n Receipts\n </WalleyNavbarButton>\n <NavLineLast></NavLineLast>\n </WalleyNavbar>\n <WalleyStoreBody>\n <WalleyTransactions>\n {state.view === \"home\"\n ? state.store.storePendingTransactions.length !== 0\n ? state.store.storePendingTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max amount - {Big(tx[5]).toFixed(5)}</p>\n {state.store.openModal === parseInt(tx[1], 16) ? (\n <>\n <WalleyLabel>Please scan the bill - </WalleyLabel>\n <IpfsImageUpload image={state.store.bill} />\n {/*<Files\n multiple={false}\n accepts={[\"image/*\"]}\n minFileSize={1}\n clickable\n className=\"btn btn-outline-primary\"\n onChange={billOnChange}\n >\n {state.store.bill.uploading ? (\n <> Scanning </>\n ) : (\n \"Scan the bill\"\n )}\n </Files>*/}\n <WalleyLabel>Total Bill Amount</WalleyLabel>\n <WalleyInput\n value={state.store.totalAmount}\n onChange={(e) =>\n State.update({\n store: {\n ...state.store,\n totalAmount: e.target.value,\n },\n })\n }\n />\n <WalleyLabel>Transaction Password</WalleyLabel>\n <WalleyInput\n type=\"password\"\n value={state.store.approvePassword}\n onChange={(e) =>\n State.update({\n store: {\n ...state.store,\n approvePassword: e.target.value,\n },\n })\n }\n />\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() => {\n State.update({\n store: {\n ...state.store,\n approvePassword: \"\",\n bill: { uploading: false, cid: \"\" },\n totalAmount: null,\n openModal: 0,\n },\n });\n }}\n >\n Close\n </WalleyButton>\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() => {\n console.log(state.store.bill.cid);\n if (state.store.bill.cid) {\n approveTransaction(parseInt(tx[1], 16));\n } else {\n console.log(\"Please Upload the bill\");\n }\n }}\n >\n Approve\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#white\"\n bg=\"blue\"\n onClick={() =>\n State.update({\n store: {\n ...state.store,\n approvePassword: \"\",\n bill: { uploading: false, amount: null },\n totalAmount: null,\n openModal: parseInt(tx[1], 16),\n },\n })\n }\n >\n Approve\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No pending transactions\"\n : state.store.storePastTransactions.length !== 0\n ? state.store.storePastTransactions.map((tx) => (\n <TransactionCard>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${\n state.store.storeImages[tx[6]]\n }`}\n alt={tx[6]}\n />\n <p>Name - {tx[2]}</p>\n <p>Store name - {tx[6]} </p>\n <p>Max Amount - {Big(tx[5]).toFixed(5)}</p>\n\n <p>Total Bill Amount - {Big(tx[9]).toFixed(5)}</p>\n {state.user.openReceipt === Big(tx[1]).toFixed(0) ? (\n <>\n <WalleyStoreImage\n src={`https://ipfs.near.social/ipfs/${tx[7]}`}\n alt={tx[7]}\n />\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: 0,\n },\n })\n }\n >\n Close Receipt\n </WalleyButton>\n </>\n ) : (\n <WalleyButton\n color=\"#000D1A\"\n bg=\"#FA9703\"\n onClick={() =>\n State.update({\n user: {\n ...state.user,\n openReceipt: Big(tx[1]).toFixed(0),\n },\n })\n }\n >\n Show Receipt\n </WalleyButton>\n )}\n </TransactionCard>\n ))\n : \"No past transactions found\"}\n </WalleyTransactions>\n </WalleyStoreBody>\n </>\n )}\n </WalleyHomeMain>\n </WalleyHomeContainer>\n);\n" } } } } }
Empty result
No logs
Receipt:
Predecessor ID:
Receiver ID:
Gas Burned:
223 Ggas
Tokens Burned:
0 
Transferred 0.01835  to relay…tform.near
Empty result
No logs
Receipt:
Predecessor ID:
Receiver ID:
Gas Burned:
223 Ggas
Tokens Burned:
0 
Transferred 0.00025  to relay…tform.near
Empty result
No logs