From 664b0ed96a449703f42a22754ce9289cd5679fae Mon Sep 17 00:00:00 2001 From: "Hong Jing (Jingles)" Date: Sat, 3 Aug 2024 12:15:33 +0800 Subject: [PATCH] add metamask support, fixed giftcard, upgrade wallets --- .../components/cardano/mint-mesh-token.tsx | 67 +++++++++++++++++ .../components/sections/live-code-demo.tsx | 17 +++-- .../sections/title-icon-description-body.tsx | 4 +- .../wallets/browserwallet/connect-wallet.tsx | 2 +- .../browserwallet/get-available-wallets.tsx | 75 +++++++++++++++++++ .../apis/wallets/browserwallet/index.tsx | 6 +- .../pages/smart-contracts/escrow/index.tsx | 5 +- .../pages/smart-contracts/giftcard/index.tsx | 2 +- .../smart-contracts/marketplace/index.tsx | 5 +- .../marketplace/list-asset.tsx | 1 + .../payment-splitter/index.tsx | 2 +- .../src/pages/smart-contracts/swap/index.tsx | 5 +- .../pages/smart-contracts/vesting/index.tsx | 2 +- package-lock.json | 65 ++++++++++++---- packages/mesh-contract/src/common.ts | 22 +++--- packages/mesh-contract/src/escrow/offchain.ts | 2 +- .../mesh-contract/src/giftcard/offchain.ts | 16 +++- .../mesh-contract/src/hello-world/offchain.ts | 2 +- .../mesh-contract/src/marketplace/offchain.ts | 2 +- packages/mesh-contract/src/swap/offchain.ts | 2 +- .../mesh-contract/src/vesting/offchain.ts | 2 +- .../mesh-react/src/cardano-wallet/index.tsx | 19 ++--- packages/mesh-react/src/common/button.tsx | 6 ++ .../mesh-react/src/hooks/useWalletList.ts | 5 +- packages/mesh-wallet/package.json | 10 ++- packages/mesh-wallet/src/browser/index.ts | 21 +++++- packages/mesh-wallet/src/browser/metamask.ts | 42 +++++++++++ 27 files changed, 340 insertions(+), 69 deletions(-) create mode 100644 apps/playground/src/components/cardano/mint-mesh-token.tsx create mode 100644 apps/playground/src/pages/apis/wallets/browserwallet/get-available-wallets.tsx create mode 100644 packages/mesh-wallet/src/browser/metamask.ts diff --git a/apps/playground/src/components/cardano/mint-mesh-token.tsx b/apps/playground/src/components/cardano/mint-mesh-token.tsx new file mode 100644 index 000000000..85d7c6018 --- /dev/null +++ b/apps/playground/src/components/cardano/mint-mesh-token.tsx @@ -0,0 +1,67 @@ +import { + AppWallet, + AssetMetadata, + ForgeScript, + Mint, + Transaction, +} from "@meshsdk/core"; +import { useWallet } from "@meshsdk/react"; + +import { demoAssetMetadata, demoMnemonic } from "~/data/cardano"; +import LiveCodeDemo from "../sections/live-code-demo"; +import { getProvider } from "./mesh-wallet"; + +export default function MintMeshToken() { + const { wallet, connected } = useWallet(); + + async function runDemo() { + const blockchainProvider = getProvider(); + const mintingWallet = new AppWallet({ + networkId: 0, + fetcher: blockchainProvider, + submitter: blockchainProvider, + key: { + type: "mnemonic", + words: demoMnemonic, + }, + }); + + const usedAddress = await wallet.getUsedAddresses(); + const address = usedAddress[0]; + const forgingScript = ForgeScript.withOneSignature( + mintingWallet.getPaymentAddress(), + ); + + const tx = new Transaction({ initiator: wallet }); + + const asset: Mint = { + assetName: "MeshToken", + assetQuantity: "1", + metadata: demoAssetMetadata, + label: "721", + recipient: address, + }; + tx.mintAsset(forgingScript, asset); + + const unsignedTx = await tx.build(); + const signedTx = await wallet.signTx(unsignedTx, true); + const signedTx2 = await mintingWallet.signTx(signedTx, true); + const txHash = await wallet.submitTx(signedTx2); + return txHash; + } + + return ( + + ); +} diff --git a/apps/playground/src/components/sections/live-code-demo.tsx b/apps/playground/src/components/sections/live-code-demo.tsx index 882f809cf..9b8ecc522 100644 --- a/apps/playground/src/components/sections/live-code-demo.tsx +++ b/apps/playground/src/components/sections/live-code-demo.tsx @@ -23,6 +23,8 @@ export default function LiveCodeDemo({ runDemoShowBrowseWalletConnect = false, runDemoShowProviderInit = false, runDemoProvider = undefined, + hideDemoButtonIfnotConnected = false, + hideConnectButtonIfConnected = false, }: { children?: React.ReactNode; title: string; @@ -36,6 +38,8 @@ export default function LiveCodeDemo({ runDemoShowBrowseWalletConnect?: boolean; runDemoShowProviderInit?: boolean; runDemoProvider?: string | undefined; + hideDemoButtonIfnotConnected?: boolean; + hideConnectButtonIfConnected?: boolean; }) { const { connected } = useWallet(); const [loading, setLoading] = useState(false); @@ -77,7 +81,7 @@ export default function LiveCodeDemo({ )} - {runCodeFunction && ( + {runCodeFunction && (connected || !hideDemoButtonIfnotConnected) && (
)} - {runDemoShowBrowseWalletConnect && ( -
- -
- )} + {runDemoShowBrowseWalletConnect && + (!connected || !hideConnectButtonIfConnected) && ( +
+ +
+ )} {children && childrenAfterCodeFunctions && (
{children}
diff --git a/apps/playground/src/components/sections/title-icon-description-body.tsx b/apps/playground/src/components/sections/title-icon-description-body.tsx index c19af17c1..e4037c278 100644 --- a/apps/playground/src/components/sections/title-icon-description-body.tsx +++ b/apps/playground/src/components/sections/title-icon-description-body.tsx @@ -15,12 +15,12 @@ export default function TitleIconDescriptionBody({ heroicon?: any; }) { return ( - <> +
{title} {description && {description}}
{children}
- +
); } diff --git a/apps/playground/src/pages/apis/wallets/browserwallet/connect-wallet.tsx b/apps/playground/src/pages/apis/wallets/browserwallet/connect-wallet.tsx index 6e2adf7b2..40b356466 100644 --- a/apps/playground/src/pages/apis/wallets/browserwallet/connect-wallet.tsx +++ b/apps/playground/src/pages/apis/wallets/browserwallet/connect-wallet.tsx @@ -26,7 +26,7 @@ function Left() { dApp to use.

- Query BrowserWallet.getInstalledWallets() to get a list of + Query BrowserWallet.getAvailableWallets() to get a list of available wallets, then provide the wallet name for which wallet the user would like to connect with.

diff --git a/apps/playground/src/pages/apis/wallets/browserwallet/get-available-wallets.tsx b/apps/playground/src/pages/apis/wallets/browserwallet/get-available-wallets.tsx new file mode 100644 index 000000000..c0e9dbb2d --- /dev/null +++ b/apps/playground/src/pages/apis/wallets/browserwallet/get-available-wallets.tsx @@ -0,0 +1,75 @@ +import { BrowserWallet } from "@meshsdk/core"; + +import LiveCodeDemo from "~/components/sections/live-code-demo"; +import TwoColumnsScroll from "~/components/sections/two-columns-scroll"; +import Codeblock from "~/components/text/codeblock"; + +export default function BrowserWalletGetAvailableWallets() { + return ( + + ); +} + +function Left() { + let example = ``; + example += `[\n`; + example += ` {\n`; + example += ` "id": "nufiSnap",\n`; + example += ` "name": "MetaMask",\n`; + example += ` "icon": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI4LjMuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMTguNiAzMTguNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzE4LjYgMzE4LjY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRTI3NjFCO3N0cm9rZTojRTI3NjFCO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9Cgkuc3Qxe2ZpbGw6I0U0NzYxQjtzdHJva2U6I0U0NzYxQjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7fQoJLnN0MntmaWxsOiNEN0MxQjM7c3Ryb2tlOiNEN0MxQjM7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30KCS5zdDN7ZmlsbDojMjMzNDQ3O3N0cm9rZTojMjMzNDQ3O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9Cgkuc3Q0e2ZpbGw6I0NENjExNjtzdHJva2U6I0NENjExNjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7fQoJLnN0NXtmaWxsOiNFNDc1MUY7c3Ryb2tlOiNFNDc1MUY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30KCS5zdDZ7ZmlsbDojRjY4NTFCO3N0cm9rZTojRjY4NTFCO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9Cgkuc3Q3e2ZpbGw6I0MwQUQ5RTtzdHJva2U6I0MwQUQ5RTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7fQoJLnN0OHtmaWxsOiMxNjE2MTY7c3Ryb2tlOiMxNjE2MTY7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30KCS5zdDl7ZmlsbDojNzYzRDE2O3N0cm9rZTojNzYzRDE2O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9Cgkuc3QxMHtmaWxsOiMyMTIxMjE7fQoJLnN0MTF7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojQzZGRjAwO30KCS5zdDEye2ZpbGw6IzBEMUUzMDt9Cgkuc3QxM3tmaWxsOiNGRkZGRkY7fQo8L3N0eWxlPgo8ZyBpZD0iTGF5ZXJfMV8wMDAwMDA5MjQ0OTYwMTMwNjUyMjkxNzI0MDAwMDAwNzE3NTg0ODQ4MTM1NTIzODUzNV8iPgoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTI4My4zLDMxLjZsLTEwNy41LDc5LjhsMTkuOS00Ny4xTDI4My4zLDMxLjZ6Ii8+Cgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMzUuMiwzMS42bDEwNi42LDgwLjZsLTE4LjktNDcuOUwzNS4yLDMxLjZ6IE0yNDQuNiwyMTYuN0wyMTYsMjYwLjVsNjEuMywxNi45bDE3LjYtNTkuN0wyNDQuNiwyMTYuN3oKCQkgTTIzLjgsMjE3LjZsMTcuNSw1OS43bDYxLjMtMTYuOUw3NCwyMTYuN0wyMy44LDIxNy42eiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTk5LjEsMTQyLjZMODIsMTY4LjRsNjAuOCwyLjdsLTIuMi02NS40TDk5LjEsMTQyLjZ6IE0yMTkuNCwxNDIuNkwxNzcuMiwxMDVsLTEuNCw2Ni4xbDYwLjctMi43TDIxOS40LDE0Mi42egoJCSBNMTAyLjYsMjYwLjVsMzYuNS0xNy44bC0zMS41LTI0LjZMMTAyLjYsMjYwLjV6IE0xNzkuNCwyNDIuN2wzNi42LDE3LjhsLTUuMS00Mi41TDE3OS40LDI0Mi43eiIvPgoJPHBhdGggY2xhc3M9InN0MiIgZD0iTTIxNiwyNjAuNWwtMzYuNi0xNy44bDIuOSwyMy45bC0wLjMsMTBMMjE2LDI2MC41eiBNMTAyLjYsMjYwLjVsMzQsMTYuMWwtMC4yLTEwbDIuNy0yMy45TDEwMi42LDI2MC41eiIvPgoJPHBhdGggY2xhc3M9InN0MyIgZD0iTTEzNy4yLDIwMi4zbC0zMC41LTlsMjEuNS05LjhMMTM3LjIsMjAyLjN6IE0xODEuMywyMDIuM2w5LTE4LjhsMjEuNiw5LjhMMTgxLjMsMjAyLjN6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMTAyLjYsMjYwLjVsNS4yLTQzLjlsLTMzLjgsMUwxMDIuNiwyNjAuNXogTTIxMC44LDIxNi43bDUuMiw0My45bDI4LjYtNDIuOUwyMTAuOCwyMTYuN3ogTTIzNi41LDE2OC40CgkJbC02MC43LDIuN2w1LjYsMzEuMmw5LTE4LjhsMjEuNiw5LjhMMjM2LjUsMTY4LjR6IE0xMDYuNywxOTMuM2wyMS42LTkuOGw4LjksMTguOGw1LjctMzEuMmwtNjAuOC0yLjdMMTA2LjcsMTkzLjN6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q1IiBkPSJNODIuMSwxNjguNGwyNS41LDQ5LjdsLTAuOS0yNC43TDgyLjEsMTY4LjR6IE0yMTIsMTkzLjNsLTEuMSwyNC43bDI1LjYtNDkuN0wyMTIsMTkzLjN6IE0xNDIuOSwxNzEuMQoJCWwtNS43LDMxLjJsNy4xLDM2LjhsMS42LTQ4LjVMMTQyLjksMTcxLjF6IE0xNzUuOCwxNzEuMWwtMi45LDE5LjRsMS4zLDQ4LjZsNy4yLTM2LjhMMTc1LjgsMTcxLjF6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMTgxLjQsMjAyLjNsLTcuMiwzNi44bDUuMiwzLjZsMzEuNS0yNC42bDEuMS0yNC43TDE4MS40LDIwMi4zeiBNMTA2LjcsMTkzLjNsMC45LDI0LjdsMzEuNSwyNC42bDUuMi0zLjYKCQlsLTcuMS0zNi44TDEwNi43LDE5My4zeiIvPgoJPHBhdGggY2xhc3M9InN0NyIgZD0iTTE4MiwyNzYuNmwwLjMtMTBsLTIuNy0yLjRoLTQwLjdsLTIuNSwyLjRsMC4yLDEwbC0zNC0xNi4xbDExLjksOS43bDI0LjEsMTYuN0gxODBsMjQuMi0xNi43bDExLjktOS43CgkJTDE4MiwyNzYuNnoiLz4KCTxwYXRoIGNsYXNzPSJzdDgiIGQ9Ik0xNzkuNCwyNDIuN2wtNS4yLTMuNmgtMjkuOWwtNS4yLDMuNmwtMi43LDIzLjlsMi41LTIuNGg0MC43bDIuNywyLjRMMTc5LjQsMjQyLjd6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMjg3LjksMTE2LjZsOS4yLTQ0LjFsLTEzLjctNDAuOWwtMTAzLjksNzcuMWw0MCwzMy44TDI3NiwxNTlsMTIuNS0xNC42bC01LjQtMy45bDguNi03LjlsLTYuNy01LjJsOC42LTYuNgoJCUwyODcuOSwxMTYuNnogTTIxLjYsNzIuNWw5LjIsNDQuMWwtNS44LDQuM2w4LjYsNi42bC02LjYsNS4ybDguNiw3LjlsLTUuNCwzLjlsMTIuNCwxNC42bDU2LjUtMTYuNWw0MC0zMy44TDM1LjIsMzEuNkwyMS42LDcyLjV6IgoJCS8+Cgk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMjc1LjksMTU5LjFsLTU2LjUtMTYuNWwxNy4yLDI1LjhMMjExLDIxOC4xbDMzLjctMC40aDUwLjJMMjc1LjksMTU5LjF6IE05OS4xLDE0Mi42bC01Ni41LDE2LjVsLTE4LjgsNTguNgoJCUg3NGwzMy42LDAuNGwtMjUuNS00OS43TDk5LjEsMTQyLjZ6IE0xNzUuOCwxNzEuMWwzLjYtNjIuM2wxNi40LTQ0LjRoLTcyLjlsMTYuMiw0NC40bDMuOCw2Mi4zbDEuMywxOS43bDAuMSw0OC40aDI5LjlsMC4yLTQ4LjQKCQlMMTc1LjgsMTcxLjF6Ii8+CjwvZz4KPGcgaWQ9IkxheWVyXzJfMDAwMDAwMTg5NDI2NDc1ODI1NTk2Mjk3OTAwMDAwMDQ3MDk1NDU4NDI3Nzk1ODU5MzVfIj4KCTxwYXRoIGNsYXNzPSJzdDEwIiBkPSJNMTgzLjIsMjUwLjNjMC0zNS41LDI4LjgtNjQuMiw2NC4yLTY0LjJjMzUuNSwwLDY0LjMsMjguOCw2NC4zLDY0LjJjMCwzNS41LTI4LjgsNjQuMi02NC4zLDY0LjIKCQlTMTgzLjIsMjg1LjcsMTgzLjIsMjUwLjN6Ii8+Cgk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTI0Ny40LDMwOC41YzI3LjIsMCw1MC0xOC44LDU2LjItNDQuM2gtMTkuNGMtNS42LDE1LTIwLDI1LjYtMzYuOCwyNS42cy0zMS4yLTEwLjYtMzYuOC0yNS42aC0xOS40CgkJQzE5Ny40LDI4OS42LDIyMC4yLDMwOC41LDI0Ny40LDMwOC41eiBNMjQ3LjQsMTkyYzI3LjIsMCw1MCwxOC44LDU2LjIsNDQuM2gtMTkuNGMtNS42LTE1LTIwLTI1LjYtMzYuOC0yNS42cy0zMS4yLDEwLjYtMzYuOCwyNS42CgkJaC0xOS40QzE5Ny40LDIxMC45LDIyMC4yLDE5MiwyNDcuNCwxOTJ6IE0yMzcuMiwyMzYuM2MtMiwwLTMuNywxLjctMy43LDMuN3YyMC41YzAsMi4xLDEuNywzLjcsMy43LDMuN2gyMC40YzIsMCwzLjctMS43LDMuNy0zLjcKCQlWMjQwYzAtMi4xLTEuNy0zLjctMy43LTMuN0gyMzcuMnoiLz4KPC9nPgo8cGF0aCBjbGFzcz0ic3QxMiIgZD0iTTI0Ny41LDMxNC41YzM1LjUsMCw2NC4zLTI4LjgsNjQuMy02NC4zYzAtMzUuNS0yOC44LTY0LjMtNjQuMy02NC4zYy0zNS41LDAtNjQuMywyOC44LTY0LjMsNjQuMwoJQzE4My4yLDI4NS43LDIxMiwzMTQuNSwyNDcuNSwzMTQuNXoiLz4KPGc+Cgk8cGF0aCBkPSJNMjQ2LjMsMjEwLjNjMS45LTEsNC4zLDEuMywzLjMsMy4yYy0wLjYsMS41LTIuOSwyLTQsMC44QzI0NC40LDIxMy4yLDI0NC44LDIxMC45LDI0Ni4zLDIxMC4zTDI0Ni4zLDIxMC4zeiBNMjI1LjYsMjEyLjUKCQljMS4yLTAuNSwyLjcsMC42LDIuNSwxLjhjMC4xLDEuNC0xLjYsMi40LTIuOCwxLjdDMjIzLjgsMjE1LjUsMjI0LDIxMi45LDIyNS42LDIxMi41eiBNMjY4LjEsMjE2LjFjLTEuOC0wLjItMi4xLTMtMC40LTMuNgoJCWMxLjQtMC43LDIuNiwwLjYsMi44LDEuOEMyNzAuMiwyMTUuNCwyNjkuMywyMTYuNCwyNjguMSwyMTYuMXogTTIzMC4zLDIyMS4yYzItMS4yLDQuNywwLjYsNC40LDIuOGMtMC4xLDIuMy0zLjEsMy42LTQuOSwyCgkJQzIyOC4zLDIyNC45LDIyOC41LDIyMi4xLDIzMC4zLDIyMS4yeiBNMjYwLjIsMjIyLjVjMC45LTIuMiw0LjQtMi4zLDUuNC0wLjFjMSwxLjctMC4yLDMuOC0yLDQuMwoJCUMyNjEuMywyMjcuMSwyNTkuMSwyMjQuNiwyNjAuMiwyMjIuNXogTTI0My45LDIyNi41YzAtMS45LDEuNy0zLjMsMy42LTMuNWMxLjIsMC4yLDIuNSwwLjgsMy4xLDJjMSwxLjcsMC4xLDQtMS42LDQuNwoJCWMtMC44LDAuNC0xLjgsMC4zLTIuNiwwLjJDMjQ0LjksMjI5LjQsMjQzLjcsMjI4LjEsMjQzLjksMjI2LjV6IE0yMTMuMSwyMjkuM2MxLjgtMS4xLDQuMiwwLjksMy41LDIuOGMtMC40LDEuNy0yLjYsMi4zLTMuOSwxLjMKCQlDMjExLjMsMjMyLjQsMjExLjUsMjMwLDIxMy4xLDIyOS4zTDIxMy4xLDIyOS4zeiBNMjc5LjIsMjI5LjNjMS41LTEuMiw0LDAuMiwzLjgsMi4xYzAuMSwxLjctMi4xLDMtMy42LDIuMQoJCUMyNzcuOCwyMzIuOCwyNzcuNiwyMzAuMiwyNzkuMiwyMjkuM0wyNzkuMiwyMjkuM3ogTTI1Mi41LDIzMi43YzIuNS0wLjksNS41LDAuMiw2LjksMi40YzEuOSwyLjcsMC45LDYuOC0yLDguMwoJCWMtMywxLjgtNy40LDAuMy04LjYtM0MyNDcuNSwyMzcuNCwyNDkuNCwyMzMuNywyNTIuNSwyMzIuN0wyNTIuNSwyMzIuN3ogTTIzNy44LDIzM2MyLjgtMS4zLDYuNS0wLjIsNy44LDIuNgoJCWMxLjYsMi43LDAuNCw2LjUtMi41LDcuOWMtMi44LDEuNi02LjgsMC40LTguMi0yLjVDMjMzLjUsMjM4LjEsMjM0LjksMjM0LjMsMjM3LjgsMjMzeiBNMjIzLjEsMjM4YzAuMi0xLjgsMS45LTIuOSwzLjYtMwoJCWMwLjksMC4xLDEuNywwLjUsMi4zLDEuMWMwLjYsMC42LDEsMS40LDEuMSwyLjNjLTAuMSwxLjgtMS41LDMuNi0zLjUsMy42QzIyNC42LDI0Mi4xLDIyMi43LDI0MCwyMjMuMSwyMzh6IE0yNjYuNSwyMzUuMwoJCWMyLjItMS4zLDUuMiwwLjYsNS4yLDMuMWMwLjEsMi42LTMuMiw0LjUtNS40LDIuOUMyNjQsMjQwLDI2NC4yLDIzNi40LDI2Ni41LDIzNS4zeiBNMjMxLjksMjQ0LjZjMi42LTAuNyw1LjUsMC41LDYuOCwyLjgKCQljMS40LDIuMywwLjgsNS42LTEuMyw3LjNjLTIuOCwyLjUtNy44LDEuNS05LjMtMS45QzIyNi4zLDI0OS42LDIyOC40LDI0NS40LDIzMS45LDI0NC42TDIzMS45LDI0NC42eiBNMjU5LjcsMjQ0LjYKCQljMi41LTAuNyw1LjQsMC4yLDYuOCwyLjVjMS44LDIuNiwwLjksNi40LTEuNyw4Yy0yLjgsMS45LTcuMSwwLjktOC42LTIuMUMyNTQuMywyNDkuOSwyNTYuMiwyNDUuNSwyNTkuNywyNDQuNnogTTIxNS4zLDI0Ny41CgkJYzIuMi0wLjgsNC43LDEuNiwzLjgsMy43Yy0wLjUsMi0zLjQsMi43LTQuOCwxLjJDMjEyLjYsMjUxLjEsMjEzLjIsMjQ4LjEsMjE1LjMsMjQ3LjV6IE0yNzUuNSwyNTAuNmMwLTAuOSwwLjMtMS43LDAuOS0yLjQKCQljMC42LTAuNywxLjQtMS4xLDIuMy0xLjFjMS41LDAuMiwzLDEuNCwyLjksMy4xYzAuMSwyLjEtMi41LDMuNi00LjQsMi42QzI3Ni4zLDI1Mi40LDI3NS45LDI1MS41LDI3NS41LDI1MC42eiBNMjA0LjQsMjQ4LjYKCQljMS4zLTAuNiwzLDAuNiwyLjcsMmMtMC4xLDEuNy0yLjYsMi4zLTMuNSwwLjlDMjAyLjksMjUwLjUsMjAzLjMsMjQ5LjEsMjA0LjQsMjQ4LjZMMjA0LjQsMjQ4LjZ6IE0yODguNiwyNDguNQoJCWMwLjktMC43LDIuNS0wLjIsMi44LDAuOWMwLjYsMS4yLTAuNSwyLjgtMS45LDIuNkMyODcuNiwyNTIuMiwyODcsMjQ5LjQsMjg4LjYsMjQ4LjV6IE0yMzkuMSwyNTYuNWMzLjUtMC45LDcuMywyLDcuMyw1LjUKCQljMC4yLDMuNi0zLjUsNi44LTcuMSw2Yy0yLjgtMC40LTUtMy4xLTQuOS01LjhDMjM0LjUsMjU5LjUsMjM2LjUsMjU3LDIzOS4xLDI1Ni41eiBNMjUzLDI1Ni40YzMuNi0xLDcuNSwyLDcuNCw1LjYKCQljMC4yLDMuNS0zLjQsNi42LTYuOSw1LjljLTMuMy0wLjQtNS44LTQtNC44LTcuMkMyNDkuMSwyNTguNywyNTAuOSwyNTcsMjUzLDI1Ni40TDI1MywyNTYuNHogTTIyNi4yLDI1OC42CgkJYzIuNS0wLjQsNC44LDIuMywzLjgsNC42Yy0wLjcsMi41LTQuNCwzLjEtNiwxLjFDMjIyLjEsMjYyLjQsMjIzLjUsMjU4LjksMjI2LjIsMjU4LjZ6IE0yNjcsMjU4LjdjMi4yLTAuOSw0LjksMSw0LjcsMy4zCgkJYzAuMSwyLjYtMy4yLDQuNC01LjQsMi45QzI2My45LDI2My42LDI2NC4zLDI1OS42LDI2NywyNTguN3ogTTI3OC40LDI3MGMtMC45LTEuNiwwLjctMy43LDIuNS0zLjRjMC45LDAsMS41LDAuNywyLjEsMS4yCgkJYzAuMSwwLjksMC4zLDIuMS0wLjUsMi44QzI4MS40LDI3MiwyNzksMjcxLjYsMjc4LjQsMjcweiBNMjEzLDI2Ny4xYzEuNy0xLjEsNC4xLDAuNSwzLjcsMi41Yy0wLjIsMS43LTIuNCwyLjctMy44LDEuNwoJCUMyMTEuNCwyNzAuMywyMTEuNSwyNjcuOCwyMTMsMjY3LjF6IE0yNDYsMjcwLjZjMi4yLTAuOSw1LDAuOSw0LjgsMy4zYzAuMiwyLjYtMy4zLDQuNC01LjQsMi45QzI0Mi45LDI3NS40LDI0My4zLDI3MS40LDI0NiwyNzAuNgoJCXogTTIzMC43LDI3NC4xYzEuOS0xLDQuMywwLjcsNC4yLDIuN2MwLjEsMS43LTEuNiwzLjEtMy4zLDIuOWMtMS40LDAtMi4zLTEuMy0yLjgtMi40QzIyOC45LDI3NiwyMjkuNCwyNzQuNiwyMzAuNywyNzQuMQoJCUwyMzAuNywyNzQuMXogTTI2MS42LDI3NC4xYzEuOS0xLjIsNC42LDAuNSw0LjQsMi43YzAsMi4zLTMsMy44LTQuOCwyLjJDMjU5LjUsMjc3LjksMjU5LjcsMjc1LjEsMjYxLjYsMjc0LjF6IE0yNjcsMjg3LjIKCQljLTAuOS0xLjMsMC4xLTIuOCwxLjUtMy4xYzEuMSwwLjIsMi4zLDEsMi4xLDIuM0MyNzAuNCwyODguMSwyNjcuOCwyODguNywyNjcsMjg3LjJMMjY3LDI4Ny4yeiBNMjI0LjMsMjg2LjFjMC4zLTEsMS4yLTIsMi40LTEuNwoJCWMxLjcsMC4xLDIuMywyLjcsMC43LDMuNUMyMjYuMSwyODguOCwyMjQuNSwyODcuNSwyMjQuMywyODYuMXogTTI0NC45LDI4Ny4yYzAuMy0xLjUsMi4zLTIuMiwzLjYtMS40YzAuOSwwLjQsMS4xLDEuMywxLjMsMi4xCgkJYy0wLjEsMC40LTAuMiwwLjgtMC4zLDEuMmMtMC41LDAuNi0xLjIsMS4yLTIuMSwxLjJDMjQ1LjgsMjkwLjYsMjQ0LjMsMjg4LjcsMjQ0LjksMjg3LjJMMjQ0LjksMjg3LjJ6Ii8+CjwvZz4KPHBhdGggY2xhc3M9InN0MTMiIGQ9Ik0yNDYuMywyMTAuM2MxLjktMSw0LjMsMS4zLDMuMywzLjJjLTAuNiwxLjUtMi45LDItNCwwLjhDMjQ0LjQsMjEzLjIsMjQ0LjgsMjEwLjksMjQ2LjMsMjEwLjNMMjQ2LjMsMjEwLjN6CgkgTTIyNS42LDIxMi41YzEuMi0wLjUsMi43LDAuNiwyLjUsMS44YzAuMSwxLjQtMS42LDIuNC0yLjgsMS43QzIyMy44LDIxNS41LDIyNCwyMTIuOSwyMjUuNiwyMTIuNXogTTI2OC4xLDIxNi4xCgljLTEuOC0wLjItMi4xLTMtMC40LTMuNmMxLjQtMC43LDIuNiwwLjYsMi44LDEuOEMyNzAuMiwyMTUuNCwyNjkuMywyMTYuNCwyNjguMSwyMTYuMXogTTIzMC4zLDIyMS4yYzItMS4yLDQuNywwLjYsNC40LDIuOAoJYy0wLjEsMi4zLTMuMSwzLjYtNC45LDJDMjI4LjMsMjI0LjksMjI4LjUsMjIyLjEsMjMwLjMsMjIxLjJ6IE0yNjAuMiwyMjIuNWMwLjktMi4yLDQuNC0yLjMsNS40LTAuMWMxLDEuNy0wLjIsMy44LTIsNC4zCglDMjYxLjMsMjI3LjEsMjU5LjEsMjI0LjYsMjYwLjIsMjIyLjV6IE0yNDMuOSwyMjYuNWMwLTEuOSwxLjctMy4zLDMuNi0zLjVjMS4yLDAuMiwyLjUsMC44LDMuMSwyYzEsMS43LDAuMSw0LTEuNiw0LjcKCWMtMC44LDAuNC0xLjgsMC4zLTIuNiwwLjJDMjQ0LjksMjI5LjQsMjQzLjcsMjI4LjEsMjQzLjksMjI2LjV6IE0yMTMuMSwyMjkuM2MxLjgtMS4xLDQuMiwwLjksMy41LDIuOGMtMC40LDEuNy0yLjYsMi4zLTMuOSwxLjMKCUMyMTEuMywyMzIuNCwyMTEuNSwyMzAsMjEzLjEsMjI5LjNMMjEzLjEsMjI5LjN6IE0yNzkuMiwyMjkuM2MxLjUtMS4yLDQsMC4yLDMuOCwyLjFjMC4xLDEuNy0yLjEsMy0zLjYsMi4xCglDMjc3LjgsMjMyLjgsMjc3LjYsMjMwLjIsMjc5LjIsMjI5LjNMMjc5LjIsMjI5LjN6IE0yNTIuNSwyMzIuN2MyLjUtMC45LDUuNSwwLjIsNi45LDIuNGMxLjksMi43LDAuOSw2LjgtMiw4LjMKCWMtMywxLjgtNy40LDAuMy04LjYtM0MyNDcuNSwyMzcuNCwyNDkuNCwyMzMuNywyNTIuNSwyMzIuN0wyNTIuNSwyMzIuN3ogTTIzNy44LDIzM2MyLjgtMS4zLDYuNS0wLjIsNy44LDIuNgoJYzEuNiwyLjcsMC40LDYuNS0yLjUsNy45Yy0yLjgsMS42LTYuOCwwLjQtOC4yLTIuNUMyMzMuNSwyMzguMSwyMzQuOSwyMzQuMywyMzcuOCwyMzN6IE0yMjMuMSwyMzhjMC4yLTEuOCwxLjktMi45LDMuNi0zCgljMC45LDAuMSwxLjcsMC41LDIuMywxLjFjMC42LDAuNiwxLDEuNCwxLjEsMi4zYy0wLjEsMS44LTEuNSwzLjYtMy41LDMuNkMyMjQuNiwyNDIuMSwyMjIuNywyNDAsMjIzLjEsMjM4eiBNMjY2LjUsMjM1LjMKCWMyLjItMS4zLDUuMiwwLjYsNS4yLDMuMWMwLjEsMi42LTMuMiw0LjUtNS40LDIuOUMyNjQsMjQwLDI2NC4yLDIzNi40LDI2Ni41LDIzNS4zeiBNMjMxLjksMjQ0LjZjMi42LTAuNyw1LjUsMC41LDYuOCwyLjgKCWMxLjQsMi4zLDAuOCw1LjYtMS4zLDcuM2MtMi44LDIuNS03LjgsMS41LTkuMy0xLjlDMjI2LjMsMjQ5LjYsMjI4LjQsMjQ1LjQsMjMxLjksMjQ0LjZMMjMxLjksMjQ0LjZ6IE0yNTkuNywyNDQuNgoJYzIuNS0wLjcsNS40LDAuMiw2LjgsMi41YzEuOCwyLjYsMC45LDYuNC0xLjcsOGMtMi44LDEuOS03LjEsMC45LTguNi0yLjFDMjU0LjMsMjQ5LjksMjU2LjIsMjQ1LjUsMjU5LjcsMjQ0LjZ6IE0yMTUuMywyNDcuNQoJYzIuMi0wLjgsNC43LDEuNiwzLjgsMy43Yy0wLjUsMi0zLjQsMi43LTQuOCwxLjJDMjEyLjYsMjUxLjEsMjEzLjIsMjQ4LjEsMjE1LjMsMjQ3LjV6IE0yNzUuNSwyNTAuNmMwLTAuOSwwLjMtMS43LDAuOS0yLjQKCWMwLjYtMC43LDEuNC0xLjEsMi4zLTEuMWMxLjUsMC4yLDMsMS40LDIuOSwzLjFjMC4xLDIuMS0yLjUsMy42LTQuNCwyLjZDMjc2LjMsMjUyLjQsMjc1LjksMjUxLjUsMjc1LjUsMjUwLjZ6IE0yMDQuNCwyNDguNgoJYzEuMy0wLjYsMywwLjYsMi43LDJjLTAuMSwxLjctMi42LDIuMy0zLjUsMC45QzIwMi45LDI1MC41LDIwMy4zLDI0OS4xLDIwNC40LDI0OC42TDIwNC40LDI0OC42eiBNMjg4LjYsMjQ4LjUKCWMwLjktMC43LDIuNS0wLjIsMi44LDAuOWMwLjYsMS4yLTAuNSwyLjgtMS45LDIuNkMyODcuNiwyNTIuMiwyODcsMjQ5LjQsMjg4LjYsMjQ4LjV6IE0yMzkuMSwyNTYuNWMzLjUtMC45LDcuMywyLDcuMyw1LjUKCWMwLjIsMy42LTMuNSw2LjgtNy4xLDZjLTIuOC0wLjQtNS0zLjEtNC45LTUuOEMyMzQuNSwyNTkuNSwyMzYuNSwyNTcsMjM5LjEsMjU2LjV6IE0yNTMsMjU2LjRjMy42LTEsNy41LDIsNy40LDUuNgoJYzAuMiwzLjUtMy40LDYuNi02LjksNS45Yy0zLjMtMC40LTUuOC00LTQuOC03LjJDMjQ5LjEsMjU4LjcsMjUwLjksMjU3LDI1MywyNTYuNEwyNTMsMjU2LjR6IE0yMjYuMiwyNTguNmMyLjUtMC40LDQuOCwyLjMsMy44LDQuNgoJYy0wLjcsMi41LTQuNCwzLjEtNiwxLjFDMjIyLjEsMjYyLjQsMjIzLjUsMjU4LjksMjI2LjIsMjU4LjZ6IE0yNjcsMjU4LjdjMi4yLTAuOSw0LjksMSw0LjcsMy4zYzAuMSwyLjYtMy4yLDQuNC01LjQsMi45CglDMjYzLjksMjYzLjYsMjY0LjMsMjU5LjYsMjY3LDI1OC43eiBNMjc4LjQsMjcwYy0wLjktMS42LDAuNy0zLjcsMi41LTMuNGMwLjksMCwxLjUsMC43LDIuMSwxLjJjMC4xLDAuOSwwLjMsMi4xLTAuNSwyLjgKCUMyODEuNCwyNzIsMjc5LDI3MS42LDI3OC40LDI3MHogTTIxMywyNjcuMWMxLjctMS4xLDQuMSwwLjUsMy43LDIuNWMtMC4yLDEuNy0yLjQsMi43LTMuOCwxLjdDMjExLjQsMjcwLjMsMjExLjUsMjY3LjgsMjEzLDI2Ny4xegoJIE0yNDYsMjcwLjZjMi4yLTAuOSw1LDAuOSw0LjgsMy4zYzAuMiwyLjYtMy4zLDQuNC01LjQsMi45QzI0Mi45LDI3NS40LDI0My4zLDI3MS40LDI0NiwyNzAuNnogTTIzMC43LDI3NC4xYzEuOS0xLDQuMywwLjcsNC4yLDIuNwoJYzAuMSwxLjctMS42LDMuMS0zLjMsMi45Yy0xLjQsMC0yLjMtMS4zLTIuOC0yLjRDMjI4LjksMjc2LDIyOS40LDI3NC42LDIzMC43LDI3NC4xTDIzMC43LDI3NC4xeiBNMjYxLjYsMjc0LjEKCWMxLjktMS4yLDQuNiwwLjUsNC40LDIuN2MwLDIuMy0zLDMuOC00LjgsMi4yQzI1OS41LDI3Ny45LDI1OS43LDI3NS4xLDI2MS42LDI3NC4xeiBNMjY3LDI4Ny4yYy0wLjktMS4zLDAuMS0yLjgsMS41LTMuMQoJYzEuMSwwLjIsMi4zLDEsMi4xLDIuM0MyNzAuNCwyODguMSwyNjcuOCwyODguNywyNjcsMjg3LjJMMjY3LDI4Ny4yeiBNMjI0LjMsMjg2LjFjMC4zLTEsMS4yLTIsMi40LTEuN2MxLjcsMC4xLDIuMywyLjcsMC43LDMuNQoJQzIyNi4xLDI4OC44LDIyNC41LDI4Ny41LDIyNC4zLDI4Ni4xeiBNMjQ0LjksMjg3LjJjMC4zLTEuNSwyLjMtMi4yLDMuNi0xLjRjMC45LDAuNCwxLjEsMS4zLDEuMywyLjFjLTAuMSwwLjQtMC4yLDAuOC0wLjMsMS4yCgljLTAuNSwwLjYtMS4yLDEuMi0yLjEsMS4yQzI0NS44LDI5MC42LDI0NC4zLDI4OC43LDI0NC45LDI4Ny4yTDI0NC45LDI4Ny4yeiIvPgo8L3N2Zz4K",\n`; + example += ` "version": "1.1.0"\n`; + example += ` },\n`; + example += ` {\n`; + example += ` "name": "eternl",\n`; + example += ` "icon": "data:image/png;base64,ICONBASE64HERE=",\n`; + example += ` "version": "0.1.0"\n`; + example += ` }\n`; + example += `]\n`; + + return ( + <> +

+ Returns a list of wallets available on user's device. Each wallet is an + object with the following properties: +

+
    +
  • + A name is provided to display wallet's name on the user interface. +
  • +
  • + A version is provided to display wallet's version on the user + interface. +
  • +
  • + An icon is provided to display wallet's icon on the user interface. +
  • +
+

Example:

+ + + ); +} + +function Right() { + async function runDemo() { + return await BrowserWallet.getAvailableWallets(); + } + + let codeSnippet = ""; + codeSnippet += `import { BrowserWallet } from '@meshsdk/core';\n\n`; + codeSnippet += `const wallets = await BrowserWallet.getAvailableWallets()`; + + return ( + + ); +} diff --git a/apps/playground/src/pages/apis/wallets/browserwallet/index.tsx b/apps/playground/src/pages/apis/wallets/browserwallet/index.tsx index 935ef35dc..4ab9b7bfb 100644 --- a/apps/playground/src/pages/apis/wallets/browserwallet/index.tsx +++ b/apps/playground/src/pages/apis/wallets/browserwallet/index.tsx @@ -7,10 +7,10 @@ import Metatags from "~/components/site/metatags"; import { metaBrowserwallet } from "~/data/links-wallets"; import BrowserWalletConnectWallet from "./connect-wallet"; import BrowserWalletGetAssets from "./get-assets"; +import BrowserWalletGetAvailableWallets from "./get-available-wallets"; import BrowserWalletGetBalance from "./get-balance"; import BrowserWalletGetChangeAddress from "./get-change-address"; import BrowserWalletGetCollateral from "./get-collateral"; -import BrowserWalletGetInstalledWallets from "./get-installed-wallets"; import BrowserWalletGetLovelace from "./get-lovelace"; import BrowserWalletGetNetworkId from "./get-networkid"; import BrowserWalletGetPolicyIdAssets from "./get-policyid-assets"; @@ -25,7 +25,7 @@ import BrowserWalletSubmitTransaction from "./submit-tx"; const ReactPage: NextPage = () => { const sidebarItems = [ - { label: "Get installed wallets", to: "getInstallWallets" }, + { label: "Get available wallets", to: "getAvailableWallets" }, { label: "Connect wallet", to: "connectWallet" }, { label: "Get balance", to: "getBalance" }, { label: "Get change address", to: "getChangeAddress" }, @@ -76,7 +76,7 @@ const ReactPage: NextPage = () => {

- + diff --git a/apps/playground/src/pages/smart-contracts/escrow/index.tsx b/apps/playground/src/pages/smart-contracts/escrow/index.tsx index 79e1444ce..a9928c5e6 100644 --- a/apps/playground/src/pages/smart-contracts/escrow/index.tsx +++ b/apps/playground/src/pages/smart-contracts/escrow/index.tsx @@ -1,6 +1,7 @@ import type { NextPage } from "next"; import Link from "next/link"; +import MintMeshToken from "~/components/cardano/mint-mesh-token"; import SidebarFullwidth from "~/components/layouts/sidebar-fullwidth"; import TitleIconDescriptionBody from "~/components/sections/title-icon-description-body"; import Metatags from "~/components/site/metatags"; @@ -76,11 +77,13 @@ const ReactPage: NextPage = () => {

Both on-chain and off-chain codes are open-source and available on{" "} - + Mesh Github Repository .

+ + diff --git a/apps/playground/src/pages/smart-contracts/giftcard/index.tsx b/apps/playground/src/pages/smart-contracts/giftcard/index.tsx index c806e018b..2c9c47f56 100644 --- a/apps/playground/src/pages/smart-contracts/giftcard/index.tsx +++ b/apps/playground/src/pages/smart-contracts/giftcard/index.tsx @@ -75,7 +75,7 @@ const ReactPage: NextPage = () => {

Both on-chain and off-chain codes are open-source and available on{" "} - + Mesh Github Repository . diff --git a/apps/playground/src/pages/smart-contracts/marketplace/index.tsx b/apps/playground/src/pages/smart-contracts/marketplace/index.tsx index 7caf6d364..917cb6fa5 100644 --- a/apps/playground/src/pages/smart-contracts/marketplace/index.tsx +++ b/apps/playground/src/pages/smart-contracts/marketplace/index.tsx @@ -1,6 +1,7 @@ import type { NextPage } from "next"; import Link from "next/link"; +import MintMeshToken from "~/components/cardano/mint-mesh-token"; import SidebarFullwidth from "~/components/layouts/sidebar-fullwidth"; import TitleIconDescriptionBody from "~/components/sections/title-icon-description-body"; import Metatags from "~/components/site/metatags"; @@ -102,11 +103,13 @@ const ReactPage: NextPage = () => {

Both on-chain and off-chain codes are open-source and available on{" "} - + Mesh Github Repository .

+ + diff --git a/apps/playground/src/pages/smart-contracts/marketplace/list-asset.tsx b/apps/playground/src/pages/smart-contracts/marketplace/list-asset.tsx index aa7c51070..53d50d007 100644 --- a/apps/playground/src/pages/smart-contracts/marketplace/list-asset.tsx +++ b/apps/playground/src/pages/smart-contracts/marketplace/list-asset.tsx @@ -2,6 +2,7 @@ import { useState } from "react"; import { useWallet } from "@meshsdk/react"; +import MintMeshToken from "~/components/cardano/mint-mesh-token"; import Input from "~/components/form/input"; import InputTable from "~/components/sections/input-table"; import LiveCodeDemo from "~/components/sections/live-code-demo"; diff --git a/apps/playground/src/pages/smart-contracts/payment-splitter/index.tsx b/apps/playground/src/pages/smart-contracts/payment-splitter/index.tsx index 8d68e67cd..f1c2f7ded 100644 --- a/apps/playground/src/pages/smart-contracts/payment-splitter/index.tsx +++ b/apps/playground/src/pages/smart-contracts/payment-splitter/index.tsx @@ -95,7 +95,7 @@ const ReactPage: NextPage = () => {

Both on-chain and off-chain codes are open-source and available on{" "} - + Mesh Github Repository . diff --git a/apps/playground/src/pages/smart-contracts/swap/index.tsx b/apps/playground/src/pages/smart-contracts/swap/index.tsx index 968da425a..4e386a3a2 100644 --- a/apps/playground/src/pages/smart-contracts/swap/index.tsx +++ b/apps/playground/src/pages/smart-contracts/swap/index.tsx @@ -1,6 +1,7 @@ import type { NextPage } from "next"; import Link from "next/link"; +import MintMeshToken from "~/components/cardano/mint-mesh-token"; import SidebarFullwidth from "~/components/layouts/sidebar-fullwidth"; import TitleIconDescriptionBody from "~/components/sections/title-icon-description-body"; import Metatags from "~/components/site/metatags"; @@ -76,11 +77,13 @@ const ReactPage: NextPage = () => {

Both on-chain and off-chain codes are open-source and available on{" "} - + Mesh Github Repository .

+ + diff --git a/apps/playground/src/pages/smart-contracts/vesting/index.tsx b/apps/playground/src/pages/smart-contracts/vesting/index.tsx index 2e17713cf..8c8e639b1 100644 --- a/apps/playground/src/pages/smart-contracts/vesting/index.tsx +++ b/apps/playground/src/pages/smart-contracts/vesting/index.tsx @@ -75,7 +75,7 @@ const ReactPage: NextPage = () => {

Both on-chain and off-chain codes are open-source and available on{" "} - + Mesh Github Repository . diff --git a/package-lock.json b/package-lock.json index 8381022c6..22a436656 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5795,6 +5795,14 @@ "resolved": "packages/mesh-wallet", "link": true }, + "node_modules/@metamask/detect-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@metamask/detect-provider/-/detect-provider-2.0.0.tgz", + "integrity": "sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@microsoft/tsdoc": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", @@ -6080,6 +6088,22 @@ "node": ">= 8" } }, + "node_modules/@nufi/dapp-client-cardano": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@nufi/dapp-client-cardano/-/dapp-client-cardano-0.3.1.tgz", + "integrity": "sha512-9anqGHu+OP0U0po/Rk6thmR+qcgqtRY3bppudC3As0dgXIhSfsWJBKIXw2Q/byCYL5l/GsmyC9XgdEKB7+oVeQ==", + "dependencies": { + "@nufi/dapp-client-core": "0.3.1" + } + }, + "node_modules/@nufi/dapp-client-core": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@nufi/dapp-client-core/-/dapp-client-core-0.3.1.tgz", + "integrity": "sha512-MexKhCE1dZGYTyxZuqQGCaZN0tZW0RyqDY/wzMafwuP5LUKxoxahCJ5U+SF37v4FrrDz6svNddV69aUSMIldag==", + "dependencies": { + "@metamask/detect-provider": "^2.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -8943,6 +8967,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -11877,7 +11902,8 @@ "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/html-escaper": { "version": "2.0.2", @@ -14677,6 +14703,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14688,6 +14715,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -18874,6 +18902,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -18882,12 +18911,14 @@ "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -18896,7 +18927,8 @@ "node_modules/spdx-license-ids": { "version": "3.0.18", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==" + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "dev": true }, "node_modules/split-ca": { "version": "1.0.1", @@ -20469,6 +20501,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -20824,6 +20857,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -20835,7 +20869,8 @@ "node_modules/write-file-atomic/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/ws": { "version": "7.5.10", @@ -21029,7 +21064,7 @@ }, "packages/mesh-common": { "name": "@meshsdk/common", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@emurgo/cip14-js": "3.0.1", @@ -21045,7 +21080,7 @@ }, "packages/mesh-contract": { "name": "@meshsdk/contract", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@meshsdk/common": "*", @@ -21064,7 +21099,7 @@ }, "packages/mesh-core": { "name": "@meshsdk/core", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@meshsdk/common": "*", @@ -21085,7 +21120,7 @@ }, "packages/mesh-core-csl": { "name": "@meshsdk/core-csl", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@meshsdk/common": "*", @@ -21105,7 +21140,7 @@ }, "packages/mesh-core-cst": { "name": "@meshsdk/core-cst", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@cardano-sdk/core": "^0.35.4", @@ -21128,7 +21163,7 @@ }, "packages/mesh-provider": { "name": "@meshsdk/provider", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@meshsdk/common": "*", @@ -21144,7 +21179,7 @@ }, "packages/mesh-react": { "name": "@meshsdk/react", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@meshsdk/common": "*", @@ -21166,7 +21201,7 @@ }, "packages/mesh-transaction": { "name": "@meshsdk/transaction", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@meshsdk/common": "*", @@ -21184,12 +21219,14 @@ }, "packages/mesh-wallet": { "name": "@meshsdk/wallet", - "version": "1.5.32", + "version": "1.6.1", "license": "Apache-2.0", "dependencies": { "@meshsdk/common": "*", "@meshsdk/core-cst": "*", - "@meshsdk/transaction": "*" + "@meshsdk/transaction": "*", + "@nufi/dapp-client-cardano": "^0.3.1", + "@nufi/dapp-client-core": "^0.3.1" }, "devDependencies": { "@meshsdk/typescript-config": "*", diff --git a/packages/mesh-contract/src/common.ts b/packages/mesh-contract/src/common.ts index cb87309ff..5562367f4 100644 --- a/packages/mesh-contract/src/common.ts +++ b/packages/mesh-contract/src/common.ts @@ -164,20 +164,24 @@ export class MeshTxInitiator { }; protected _getUtxoByTxHash = async ( - scriptCbor: string, txHash: string, + scriptCbor?: string, ): Promise => { if (this.fetcher) { const utxos = await this.fetcher?.fetchUTxOs(txHash); - const scriptAddr = v2ScriptToBech32( - scriptCbor, - undefined, - this.networkId, - ); + let scriptUtxo = utxos[0]; - const scriptUtxo = - utxos.filter((utxo) => utxo.output.address === scriptAddr)[0] || - utxos[0]; + if (scriptCbor) { + const scriptAddr = v2ScriptToBech32( + scriptCbor, + undefined, + this.networkId, + ); + scriptUtxo = + utxos.filter((utxo) => utxo.output.address === scriptAddr)[0] || + utxos[0]; + } + return scriptUtxo; } diff --git a/packages/mesh-contract/src/escrow/offchain.ts b/packages/mesh-contract/src/escrow/offchain.ts index 892ed333f..ca1d924a4 100644 --- a/packages/mesh-contract/src/escrow/offchain.ts +++ b/packages/mesh-contract/src/escrow/offchain.ts @@ -249,6 +249,6 @@ export class MeshEscrowContract extends MeshTxInitiator { }; getUtxoByTxHash = async (txHash: string): Promise => { - return await this._getUtxoByTxHash(this.scriptCbor, txHash); + return await this._getUtxoByTxHash(txHash, this.scriptCbor); }; } diff --git a/packages/mesh-contract/src/giftcard/offchain.ts b/packages/mesh-contract/src/giftcard/offchain.ts index dae67bae1..de63b43f2 100644 --- a/packages/mesh-contract/src/giftcard/offchain.ts +++ b/packages/mesh-contract/src/giftcard/offchain.ts @@ -27,12 +27,19 @@ export class MeshGiftCardContract extends MeshTxInitiator { tokenNameHex: string = ""; paramUtxo: UTxO["input"] = { outputIndex: 0, txHash: "" }; - giftCardCbor = (tokenNameHex: string, utxoTxHash: string, utxoTxId: number) => - applyParamsToScript( + giftCardCbor = ( + tokenNameHex: string, + utxoTxHash: string, + utxoTxId: number, + ) => { + console.log("utxoTxHash", utxoTxHash); + console.log("utxoTxHash.length", utxoTxHash.length); + return applyParamsToScript( blueprint.validators[0]!.compiledCode, [builtinByteString(tokenNameHex), txOutRef(utxoTxHash, utxoTxId)], "JSON", ); + }; redeemCbor = (tokenNameHex: string, policyId: string) => applyParamsToScript(blueprint.validators[1]!.compiledCode, [ @@ -120,12 +127,14 @@ export class MeshGiftCardContract extends MeshTxInitiator { }; redeemGiftCard = async (giftCardUtxo: UTxO): Promise => { + console.log('giftCardUtxo', giftCardUtxo) const { utxos, walletAddress, collateral } = await this.getWalletInfoForTx(); const inlineDatum = deserializeDatum( giftCardUtxo.output.plutusData!, ).list; + console.log("inlineDatum", inlineDatum) const paramTxHash = (inlineDatum[0] as BuiltinByteString).bytes; const paramTxId = (inlineDatum[1] as Integer).int as number; const tokenNameHex = (inlineDatum[2] as BuiltinByteString).bytes; @@ -167,8 +176,7 @@ export class MeshGiftCardContract extends MeshTxInitiator { }; getUtxoByTxHash = async (txHash: string): Promise => { - const { redeemScript } = this.getScripts(); - return await this._getUtxoByTxHash(redeemScript, txHash); + return await this._getUtxoByTxHash(txHash); }; private getScripts = () => { diff --git a/packages/mesh-contract/src/hello-world/offchain.ts b/packages/mesh-contract/src/hello-world/offchain.ts index 8cbccf5f1..df9048bef 100644 --- a/packages/mesh-contract/src/hello-world/offchain.ts +++ b/packages/mesh-contract/src/hello-world/offchain.ts @@ -19,6 +19,6 @@ export class MeshHelloWorldContract extends MeshTxInitiator { } getUtxoByTxHash = async (txHash: string): Promise => { - return await this._getUtxoByTxHash(this.scriptCbor, txHash); + return await this._getUtxoByTxHash(txHash, this.scriptCbor); }; } diff --git a/packages/mesh-contract/src/marketplace/offchain.ts b/packages/mesh-contract/src/marketplace/offchain.ts index ab1fc487f..7e943f3cd 100644 --- a/packages/mesh-contract/src/marketplace/offchain.ts +++ b/packages/mesh-contract/src/marketplace/offchain.ts @@ -240,6 +240,6 @@ export class MeshMarketplaceContract extends MeshTxInitiator { }; getUtxoByTxHash = async (txHash: string): Promise => { - return await this._getUtxoByTxHash(this.scriptCbor, txHash); + return await this._getUtxoByTxHash(txHash, this.scriptCbor); }; } diff --git a/packages/mesh-contract/src/swap/offchain.ts b/packages/mesh-contract/src/swap/offchain.ts index 47c608747..934f34363 100644 --- a/packages/mesh-contract/src/swap/offchain.ts +++ b/packages/mesh-contract/src/swap/offchain.ts @@ -134,6 +134,6 @@ export class MeshSwapContract extends MeshTxInitiator { }; getUtxoByTxHash = async (txHash: string): Promise => { - return await this._getUtxoByTxHash(this.scriptCbor, txHash); + return await this._getUtxoByTxHash(txHash, this.scriptCbor); }; } diff --git a/packages/mesh-contract/src/vesting/offchain.ts b/packages/mesh-contract/src/vesting/offchain.ts index dea32460e..c5ebe3c87 100644 --- a/packages/mesh-contract/src/vesting/offchain.ts +++ b/packages/mesh-contract/src/vesting/offchain.ts @@ -112,6 +112,6 @@ export class MeshVestingContract extends MeshTxInitiator { }; getUtxoByTxHash = async (txHash: string): Promise => { - return await this._getUtxoByTxHash(this.scriptCbor, txHash); + return await this._getUtxoByTxHash(txHash, this.scriptCbor); }; } diff --git a/packages/mesh-react/src/cardano-wallet/index.tsx b/packages/mesh-react/src/cardano-wallet/index.tsx index 0e925ce99..a1b15f8a6 100644 --- a/packages/mesh-react/src/cardano-wallet/index.tsx +++ b/packages/mesh-react/src/cardano-wallet/index.tsx @@ -1,10 +1,7 @@ import { useEffect, useState } from "react"; -import { Wallet } from "@meshsdk/common"; -import { BrowserWallet } from "@meshsdk/wallet"; - import Button from "../common/button"; -import { useWallet } from "../hooks"; +import { useWallet, useWalletList } from "../hooks"; import { MenuItem } from "./menu-item"; import { WalletBalance } from "./wallet-balance"; @@ -21,9 +18,9 @@ export const CardanoWallet = ({ }: ButtonProps) => { const [isDarkMode, setIsDarkMode] = useState(false); const [hideMenuList, setHideMenuList] = useState(true); - const [wallets, setWallets] = useState([]); const { connect, connecting, connected, disconnect, name } = useWallet(); + const wallets = useWalletList(); useEffect(() => { if (connected && onConnected) { @@ -31,19 +28,15 @@ export const CardanoWallet = ({ } }, [connected]); - useEffect(() => { - setWallets(BrowserWallet.getInstalledWallets()); - }, []); - useEffect(() => { setIsDarkMode(isDark); }, [isDark]); return (

setHideMenuList(false)} onMouseLeave={() => setHideMenuList(true)} + style={{ width: "min-content", zIndex: 50 }} >
{ - connect(wallet.name); + connect(wallet.id); setHideMenuList(!hideMenuList); }} - active={name === wallet.name} + active={name === wallet.id} /> ))} {/* void; + onMouseEnter?: () => void; + onMouseLeave?: () => void; }) { return ( diff --git a/packages/mesh-react/src/hooks/useWalletList.ts b/packages/mesh-react/src/hooks/useWalletList.ts index 480f01e89..c84bd6465 100644 --- a/packages/mesh-react/src/hooks/useWalletList.ts +++ b/packages/mesh-react/src/hooks/useWalletList.ts @@ -7,7 +7,10 @@ export const useWalletList = () => { const [wallets, setWallets] = useState([]); useEffect(() => { - setWallets(BrowserWallet.getInstalledWallets()); + async function get() { + setWallets(await BrowserWallet.getAvailableWallets()); + } + get(); }, []); return wallets; diff --git a/packages/mesh-wallet/package.json b/packages/mesh-wallet/package.json index 569239dda..c06601ee7 100644 --- a/packages/mesh-wallet/package.json +++ b/packages/mesh-wallet/package.json @@ -29,13 +29,15 @@ "@meshsdk/typescript-config": "*", "eslint": "^8.57.0", "tsup": "^8.0.2", - "typescript": "^5.3.3", - "typedoc": "^0.26.3" + "typedoc": "^0.26.3", + "typescript": "^5.3.3" }, "dependencies": { "@meshsdk/common": "*", "@meshsdk/core-cst": "*", - "@meshsdk/transaction": "*" + "@meshsdk/transaction": "*", + "@nufi/dapp-client-cardano": "^0.3.1", + "@nufi/dapp-client-core": "^0.3.1" }, "prettier": "@meshsdk/prettier-config", "publishConfig": { @@ -49,4 +51,4 @@ "blockchain", "sdk" ] -} \ No newline at end of file +} diff --git a/packages/mesh-wallet/src/browser/index.ts b/packages/mesh-wallet/src/browser/index.ts index 95341f582..71cf48703 100644 --- a/packages/mesh-wallet/src/browser/index.ts +++ b/packages/mesh-wallet/src/browser/index.ts @@ -30,6 +30,7 @@ import { } from "@meshsdk/core-cst"; import { Cardano, WalletInstance } from "../types"; +import { checkIfMetamaskInstalled } from "./metamask"; declare global { interface Window { @@ -69,7 +70,7 @@ export class BrowserWallet implements IInitiator, ISigner, ISubmitter { if (_wallet.apiVersion === undefined) continue; wallets.push({ id: key, - name: _wallet.name, + name: key == "nufiSnap" ? "MetaMask" : _wallet.name, icon: _wallet.icon, version: _wallet.apiVersion, }); @@ -79,6 +80,24 @@ export class BrowserWallet implements IInitiator, ISigner, ISubmitter { return wallets; } + /** + * Returns a list of wallets installed on user's device. Each wallet is an object with the following properties: + * - A name is provided to display wallet's name on the user interface. + * - A version is provided to display wallet's version on the user interface. + * - An icon is provided to display wallet's icon on the user interface. + * + * @returns a list of wallet names + */ + static async getAvailableWallets(nufi?: string): Promise { + if (window === undefined) return []; + + await checkIfMetamaskInstalled(); + + const wallets = BrowserWallet.getInstalledWallets(); + + return wallets; + } + /** * This is the entrypoint to start communication with the user's wallet. The wallet should request the user's permission to connect the web page to the user's wallet, and if permission has been granted, the wallet will be returned and exposing the full API for the dApp to use. * diff --git a/packages/mesh-wallet/src/browser/metamask.ts b/packages/mesh-wallet/src/browser/metamask.ts new file mode 100644 index 000000000..793718929 --- /dev/null +++ b/packages/mesh-wallet/src/browser/metamask.ts @@ -0,0 +1,42 @@ +import { initNufiDappCardanoSdk } from "@nufi/dapp-client-cardano"; +import nufiCoreSdk from "@nufi/dapp-client-core"; + +import { Wallet } from "@meshsdk/common"; + +const nufiDomain: { [key: string]: string } = { + production: "https://wallet.nu.fi", + mainnet: "https://wallet-staging.nu.fi", + preprod: "https://wallet-testnet-staging.nu.fi", + preview: "https://wallet-preview-staging.nu.fi", +}; + +export function checkIfMetamaskInstalled( + network = "preprod", +): Promise { + try { + const _nufiCoreSdk = (nufiCoreSdk as any).default; + + _nufiCoreSdk.init(nufiDomain[network]); + + return new Promise((resolve) => { + _nufiCoreSdk + .getApi() + .isMetamaskInstalled() + .then((isMetamaskInstalled: boolean) => { + if (isMetamaskInstalled) { + initNufiDappCardanoSdk(_nufiCoreSdk, "snap"); + resolve({ + id: "nufiSnap", + name: "MetaMask", + icon: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNjkuMiAxNjMuNzEiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6ICNlMjc2MjU7CiAgICAgIH0KCiAgICAgIC5jbHMtMSwgLmNscy0yLCAuY2xzLTMsIC5jbHMtNCwgLmNscy01LCAuY2xzLTYsIC5jbHMtNywgLmNscy04LCAuY2xzLTkgewogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CgogICAgICAuY2xzLTIgewogICAgICAgIGZpbGw6ICM3NjNlMWE7CiAgICAgIH0KCiAgICAgIC5jbHMtMyB7CiAgICAgICAgZmlsbDogI2MwYWQ5ZTsKICAgICAgfQoKICAgICAgLmNscy00IHsKICAgICAgICBmaWxsOiAjMzQ2OGQxOwogICAgICB9CgogICAgICAuY2xzLTUgewogICAgICAgIGZpbGw6ICNjYzYyMjg7CiAgICAgIH0KCiAgICAgIC5jbHMtNiB7CiAgICAgICAgZmlsbDogI2Y1ODQxZjsKICAgICAgfQoKICAgICAgLmNscy03IHsKICAgICAgICBmaWxsOiAjZDdjMWIzOwogICAgICB9CgogICAgICAuY2xzLTggewogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgZmlsbC1ydWxlOiBldmVub2RkOwogICAgICB9CgogICAgICAuY2xzLTkgewogICAgICAgIGZpbGw6ICMyZjM0M2I7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGlkPSJMYXllcl8xLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMSI+CiAgICA8ZyBpZD0iTU1fSGVhZF9iYWNrZ3JvdW5kX0RvX25vdF9lZGl0XyIgZGF0YS1uYW1lPSJNTSBIZWFkIGJhY2tncm91bmQgKERvIG5vdCBlZGl0KSI+CiAgICAgIDxwYXRoIGNsYXNzPSJjbHMtNiIgZD0iTTE0MS44LDcwLjVsNi45LTguMS0zLTIuMiw0LjgtNC40LTMuNy0yLjgsNC44LTMuNi0zLjEtMi40LDUtMjQuNC03LjYtMjIuNk0xNDUuOSwwbC00OC44LDE4LjFoLTQwLjdMNy42LDBsLjMuMkw3LjYsMCwwLDIyLjZsNS4xLDI0LjQtMy4yLDIuNCw0LjksMy42LTMuNywyLjgsNC44LDQuNC0zLDIuMiw2LjksOC4xTDEuMywxMDIuOWgwbDkuNywzMy4xLDM0LjEtOS40di0uMS4xaDBsNi42LDUuNCwxMy41LDkuMmgyMy4xbDEzLjUtOS4yLDYuNi01LjRoMGwzNC4yLDkuNCw5LjgtMzMuMWgwbC0xMC42LTMyLjQiLz4KICAgIDwvZz4KICAgIDxnIGlkPSJMb2dvcyI+CiAgICAgIDxnPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxNDUuOSAwIDg2IDQ0LjEgOTcuMSAxOC4xIDE0NS45IDAiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iNy42IDAgNjcgNDQuNSA1Ni40IDE4LjEgNy42IDAiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iMTI0LjQgMTAyLjMgMTA4LjQgMTI2LjUgMTQyLjYgMTM1LjkgMTUyLjQgMTAyLjggMTI0LjQgMTAyLjMiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iMS4zIDEwMi44IDExIDEzNS45IDQ1LjEgMTI2LjUgMjkuMiAxMDIuMyAxLjMgMTAyLjgiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iNDMuMyA2MS4zIDMzLjggNzUuNiA2Ny42IDc3LjEgNjYuNSA0MC45IDQzLjMgNjEuMyIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxMTAuMyA2MS4zIDg2LjcgNDAuNSA4NiA3Ny4xIDExOS44IDc1LjYgMTEwLjMgNjEuMyIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSI0NS4xIDEyNi41IDY1LjYgMTE2LjcgNDcuOSAxMDMuMSA0NS4xIDEyNi41Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9Ijg4IDExNi43IDEwOC40IDEyNi41IDEwNS42IDEwMy4xIDg4IDExNi43Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy03IiBwb2ludHM9IjEwOC40IDEyNi41IDg4IDExNi43IDg5LjcgMTI5LjkgODkuNSAxMzUuNSAxMDguNCAxMjYuNSIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtNyIgcG9pbnRzPSI0NS4xIDEyNi41IDY0LjEgMTM1LjUgNjQgMTI5LjkgNjUuNiAxMTYuNyA0NS4xIDEyNi41Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy05IiBwb2ludHM9IjY0LjQgOTQuMyA0Ny41IDg5LjQgNTkuNSA4My45IDY0LjQgOTQuMyIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtOSIgcG9pbnRzPSI4OS4xIDk0LjMgOTQuMSA4My45IDEwNi4xIDg5LjQgODkuMSA5NC4zIi8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy01IiBwb2ludHM9IjQ1LjEgMTI2LjUgNDguMSAxMDIuMyAyOS4yIDEwMi44IDQ1LjEgMTI2LjUiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTUiIHBvaW50cz0iMTA1LjUgMTAyLjMgMTA4LjQgMTI2LjUgMTI0LjQgMTAyLjggMTA1LjUgMTAyLjMiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTUiIHBvaW50cz0iMTE5LjggNzUuNiA4NiA3Ny4xIDg5LjEgOTQuMyA5NC4xIDgzLjkgMTA2LjEgODkuNCAxMTkuOCA3NS42Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy01IiBwb2ludHM9IjQ3LjUgODkuNCA1OS41IDgzLjkgNjQuNCA5NC4zIDY3LjYgNzcuMSAzMy44IDc1LjYgNDcuNSA4OS40Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjMzLjggNzUuNiA0Ny45IDEwMy4xIDQ3LjUgODkuNCAzMy44IDc1LjYiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iMTA2LjEgODkuNCAxMDUuNiAxMDMuMSAxMTkuOCA3NS42IDEwNi4xIDg5LjQiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iNjcuNiA3Ny4xIDY0LjQgOTQuMyA2OC40IDExNC43IDY5LjMgODcuOSA2Ny42IDc3LjEiLz4KICAgICAgICA8cG9seWdvbiBjbGFzcz0iY2xzLTEiIHBvaW50cz0iODYgNzcuMSA4NC4zIDg3LjggODUuMSAxMTQuNyA4OS4xIDk0LjMgODYgNzcuMSIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtNiIgcG9pbnRzPSI4OS4xIDk0LjMgODUuMSAxMTQuNyA4OCAxMTYuNyAxMDUuNiAxMDMuMSAxMDYuMSA4OS40IDg5LjEgOTQuMyIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtNiIgcG9pbnRzPSI0Ny41IDg5LjQgNDcuOSAxMDMuMSA2NS42IDExNi43IDY4LjQgMTE0LjcgNjQuNCA5NC4zIDQ3LjUgODkuNCIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMyIgcG9pbnRzPSI4OS41IDEzNS41IDg5LjcgMTI5LjkgODguMSAxMjguNiA2NS40IDEyOC42IDY0IDEyOS45IDY0LjEgMTM1LjUgNDUuMSAxMjYuNSA1MS43IDEzMS45IDY1LjIgMTQxLjIgODguMyAxNDEuMiAxMDEuOCAxMzEuOSAxMDguNCAxMjYuNSA4OS41IDEzNS41Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy05IiBwb2ludHM9Ijg4IDExNi43IDg1LjEgMTE0LjcgNjguNCAxMTQuNyA2NS42IDExNi43IDY0IDEyOS45IDY1LjQgMTI4LjYgODguMSAxMjguNiA4OS43IDEyOS45IDg4IDExNi43Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjE0OC41IDQ3IDE1My41IDIyLjYgMTQ1LjkgMCA4OCA0Mi42IDExMC4zIDYxLjMgMTQxLjggNzAuNSAxNDguNyA2Mi40IDE0NS43IDYwLjIgMTUwLjUgNTUuOSAxNDYuOCA1MyAxNTEuNiA0OS40IDE0OC41IDQ3Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjAgMjIuNiA1LjEgNDcgMS45IDQ5LjQgNi43IDUzLjEgMyA1NS45IDcuOCA2MC4yIDQuOCA2Mi40IDExLjggNzAuNSA0My4zIDYxLjMgNjUuNiA0Mi42IDcuNiAwIDAgMjIuNiIvPgogICAgICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtNiIgcG9pbnRzPSIxNDEuOCA3MC41IDExMC4zIDYxLjMgMTE5LjggNzUuNiAxMDUuNiAxMDMuMSAxMjQuNCAxMDIuOCAxNTIuNCAxMDIuOCAxNDEuOCA3MC41Ii8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy02IiBwb2ludHM9IjQzLjMgNjEuMyAxMS44IDcwLjUgMS4zIDEwMi44IDI5LjIgMTAyLjggNDcuOSAxMDMuMSAzMy44IDc1LjYgNDMuMyA2MS4zIi8+CiAgICAgICAgPHBvbHlnb24gY2xhc3M9ImNscy02IiBwb2ludHM9Ijg2IDc3LjEgODggNDIuNiA5Ny4xIDE4LjEgNTYuNCAxOC4xIDY1LjYgNDIuNiA2Ny42IDc3LjEgNjguNCA4Ny45IDY4LjQgMTE0LjcgODUuMSAxMTQuNyA4NS4yIDg3LjkgODYgNzcuMSIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyBpZD0iY2FyZGFub19hZGEiIGRhdGEtbmFtZT0iY2FyZGFubyBhZGEiPgogICAgICA8ZyBpZD0iY2FyZGFub19hZGEtMiIgZGF0YS1uYW1lPSJjYXJkYW5vIGFkYS0yIj4KICAgICAgICA8Y2lyY2xlIGlkPSJf0K3Qu9C70LjQv9GBXzYiIGRhdGEtbmFtZT0i0K3Qu9C70LjQv9GBIDYiIGNsYXNzPSJjbHMtNCIgY3g9IjEyOC4wNSIgY3k9IjEyMi41NiIgcj0iNDEuMTUiLz4KICAgICAgICA8cGF0aCBpZD0iX9Ct0LvQu9C40L/RgV82X9C60L7Qv9C40Y9fMjkiIGRhdGEtbmFtZT0i0K3Qu9C70LjQv9GBIDYg0LrQvtC/0LjRjyAyOSIgY2xhc3M9ImNscy04IiBkPSJNMTIzLjQ2LDEwOS45M2MyLjI1LDAsNC4wNywxLjgyLDQuMDcsNC4wNywwLDIuMjUtMS44Miw0LjA3LTQuMDcsNC4wNy0yLjI1LDAtNC4wNy0xLjgyLTQuMDctNC4wNywwLTIuMjUsMS44Mi00LjA3LDQuMDctNC4wN1pNMTMzLjI4LDEwOS45M2MyLjI1LDAsNC4wNywxLjgyLDQuMDcsNC4wNywwLDIuMjUtMS44Miw0LjA3LTQuMDcsNC4wNy0yLjI1LDAtNC4wNy0xLjgyLTQuMDctNC4wNywwLTIuMjUsMS44Mi00LjA3LDQuMDctNC4wN2gwWk0xMzMuMjgsMTI3LjA1YzIuMjUsMCw0LjA3LDEuODIsNC4wNyw0LjA3LDAsMi4yNS0xLjgyLDQuMDctNC4wNyw0LjA3LTIuMjUsMC00LjA3LTEuODItNC4wNy00LjA3LDAtMi4yNSwxLjgyLTQuMDcsNC4wNy00LjA3aDAsMFpNMTIzLjQ2LDEyNy4wNWMyLjI1LDAsNC4wNywxLjgyLDQuMDcsNC4wNywwLDIuMjUtMS44Miw0LjA3LTQuMDcsNC4wNy0yLjI1LDAtNC4wNy0xLjgyLTQuMDctNC4wNywwLTIuMjUsMS44Mi00LjA3LDQuMDctNC4wN1pNMTE4LjQxLDExOC42M2MyLjI1LDAsNC4wNywxLjgyLDQuMDcsNC4wNywwLDIuMjUtMS44Miw0LjA3LTQuMDcsNC4wNy0yLjI1LDAtNC4wNy0xLjgyLTQuMDctNC4wNywwLTIuMjUsMS44Mi00LjA3LDQuMDctNC4wN2gwWk0xMzguMzMsMTE4LjYzYzIuMjUsMCw0LjA3LDEuODIsNC4wNyw0LjA3LDAsMi4yNS0xLjgyLDQuMDctNC4wNyw0LjA3LTIuMjUsMC00LjA3LTEuODItNC4wNy00LjA3LDAtMi4yNSwxLjgyLTQuMDcsNC4wNy00LjA3aDBaTTE0Mi45NiwxMTEuNjJjMS4zOSwwLDIuNTIsMS4xMywyLjUyLDIuNTMsMCwxLjM5LTEuMTMsMi41Mi0yLjUzLDIuNTItMS4zOSwwLTIuNTItMS4xMy0yLjUyLTIuNTJzMS4xMy0yLjUyLDIuNTItMi41MmgwWk0xNDIuOTYsMTI4LjQ1YzEuMzksMCwyLjUyLDEuMTMsMi41MiwyLjUzLDAsMS4zOS0xLjEzLDIuNTItMi41MywyLjUyLTEuMzksMC0yLjUyLTEuMTMtMi41Mi0yLjUyczEuMTMtMi41MiwyLjUyLTIuNTJoMFpNMTEzLjc4LDEyOC40NWMxLjM5LDAsMi41MiwxLjEzLDIuNTIsMi41MywwLDEuMzktMS4xMywyLjUyLTIuNTMsMi41Mi0xLjM5LDAtMi41Mi0xLjEzLTIuNTItMi41MiwwLTEuMzksMS4xMy0yLjUyLDIuNTMtMi41MmgwWk0xMTMuNzgsMTExLjYyYzEuMzksMCwyLjUyLDEuMTMsMi41MiwyLjUzLDAsMS4zOS0xLjEzLDIuNTItMi41MywyLjUyLTEuMzksMC0yLjUyLTEuMTMtMi41Mi0yLjUyLDAtMS4zOSwxLjEzLTIuNTIsMi41My0yLjUyaDBaTTEyOC4zNywxMDMuMmMxLjM5LDAsMi41MiwxLjEzLDIuNTIsMi41MywwLDEuMzktMS4xMywyLjUyLTIuNTMsMi41Mi0xLjM5LDAtMi41Mi0xLjEzLTIuNTItMi41MnMxLjEzLTIuNTIsMi41Mi0yLjUyaDBaTTEyOC4zNywxMzYuODZjMS4zOSwwLDIuNTIsMS4xMywyLjUyLDIuNTMsMCwxLjM5LTEuMTMsMi41Mi0yLjUzLDIuNTItMS4zOSwwLTIuNTItMS4xMy0yLjUyLTIuNTJzMS4xMy0yLjUyLDIuNTItMi41MmgwWk0xMzkuMTcsMTM5LjM5YzEuMTYsMCwyLjEuOTQsMi4xLDIuMSwwLDEuMTYtLjk0LDIuMS0yLjEsMi4xLTEuMTYsMC0yLjEtLjk0LTIuMS0yLjFzLjk0LTIuMSwyLjEtMi4xaDBaTTExNy41NywxMzkuMzljMS4xNiwwLDIuMS45NCwyLjEsMi4xLDAsMS4xNi0uOTQsMi4xLTIuMSwyLjEtMS4xNiwwLTIuMS0uOTQtMi4xLTIuMXMuOTQtMi4xLDIuMS0yLjFoMFpNMTE3LjU3LDEwMS41MmMxLjE2LDAsMi4xLjk0LDIuMSwyLjEsMCwxLjE2LS45NCwyLjEtMi4xLDIuMS0xLjE2LDAtMi4xLS45NC0yLjEtMi4xcy45NC0yLjEsMi4xLTIuMWgwWk0xMzkuMTcsMTAxLjUyYzEuMTYsMCwyLjEuOTQsMi4xLDIuMSwwLDEuMTYtLjk0LDIuMS0yLjEsMi4xLTEuMTYsMC0yLjEtLjk0LTIuMS0yLjFzLjk0LTIuMSwyLjEtMi4xaDBaTTE1MC4xMSwxMjAuMzFjMS4xNiwwLDIuMS45NCwyLjEsMi4xLDAsMS4xNi0uOTQsMi4xLTIuMSwyLjEtMS4xNiwwLTIuMS0uOTQtMi4xLTIuMSwwLTEuMTYuOTQtMi4xLDIuMS0yLjFoMFpNMTA2LjYyLDEyMC4zMWMxLjE2LDAsMi4xLjk0LDIuMSwyLjEsMCwxLjE2LS45NCwyLjEtMi4xLDIuMS0xLjE2LDAtMi4xLS45NC0yLjEtMi4xcy45NC0yLjEsMi4xLTIuMWgwWk0xMDUuMDgsMTA3LjQxYy45MywwLDEuNjguNzUsMS42OCwxLjY4cy0uNzUsMS42OC0xLjY4LDEuNjgtMS42OC0uNzUtMS42OC0xLjY4aDBjMC0uOTMuNzUtMS42OCwxLjY4LTEuNjhoMFpNMTA1LjA4LDEzNC4zNGMuOTMsMCwxLjY4Ljc1LDEuNjgsMS42OHMtLjc1LDEuNjgtMS42OCwxLjY4LTEuNjgtLjc1LTEuNjgtMS42OGgwYzAtLjkzLjc1LTEuNjgsMS42OC0xLjY4aDBaTTE1MS42NiwxMzQuMzRjLjkzLDAsMS42OC43NSwxLjY4LDEuNjgsMCwuOTMtLjc1LDEuNjgtMS42OCwxLjY4cy0xLjY4LS43NS0xLjY4LTEuNjhoMGMwLS45My43NS0xLjY4LDEuNjgtMS42OGgwWk0xNTEuNjYsMTA3LjQxYy45MywwLDEuNjguNzUsMS42OCwxLjY4LDAsLjkzLS43NSwxLjY4LTEuNjgsMS42OHMtMS42OC0uNzUtMS42OC0xLjY4aDBjMC0uOTMuNzUtMS42OCwxLjY4LTEuNjhoMFpNMTI4LjM3LDkzLjk0Yy45MywwLDEuNjguNzUsMS42OCwxLjY4LDAsLjkzLS43NSwxLjY4LTEuNjgsMS42OC0uOTMsMC0xLjY4LS43NS0xLjY4LTEuNjhoMGMwLS45My43NS0xLjY4LDEuNjgtMS42OGgwWk0xMjguMzcsMTQ3LjhjLjkzLDAsMS42OC43NSwxLjY4LDEuNjgsMCwuOTMtLjc1LDEuNjgtMS42OCwxLjY4LS45MywwLTEuNjgtLjc1LTEuNjgtMS42OHMuNzUtMS42OCwxLjY4LTEuNjhoMFpNMTQzLjI0LDE0Ni42OGMuNzcsMCwxLjQuNjMsMS40LDEuNCwwLC43Ny0uNjMsMS40LTEuNCwxLjRzLTEuNC0uNjMtMS40LTEuNGgwYzAtLjc3LjYzLTEuNCwxLjQtMS40Wk0xMTMuNSwxNDYuNjhjLjc3LDAsMS40LjYzLDEuNCwxLjRzLS42MywxLjQtMS40LDEuNC0xLjQtLjYzLTEuNC0xLjRoMGMwLS43Ny42My0xLjQsMS40LTEuNFpNMTEzLjUsOTUuNjNjLjc3LDAsMS40LjYzLDEuNCwxLjRzLS42MywxLjQtMS40LDEuNC0xLjQtLjYzLTEuNC0xLjRoMGMwLS43Ny42My0xLjQsMS40LTEuNGgwWk0xNDMuMjQsOTUuNjNjLjc3LDAsMS40LjYzLDEuNCwxLjQsMCwuNzctLjYzLDEuNC0xLjQsMS40cy0xLjQtLjYzLTEuNC0xLjRoMGMwLS43Ny42My0xLjQsMS40LTEuNGgwWk0xNTcuODMsMTIxLjE2Yy43NywwLDEuNC42MywxLjQsMS40LDAsLjc3LS42MywxLjQtMS40LDEuNHMtMS40LS42My0xLjQtMS40aDBjMC0uNzguNjMtMS40LDEuNC0xLjRoMFpNOTguOTEsMTIxLjE2Yy43NywwLDEuNC42MywxLjQsMS40cy0uNjMsMS40LTEuNCwxLjQtMS40LS42My0xLjQtMS40aDBjMC0uNzguNjMtMS40LDEuNC0xLjRoMFoiLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+", + version: "version", + }); + } else { + resolve(undefined); + } + }); + }); + } catch (err) { + return Promise.resolve(undefined); + } +}