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 00000000..85d7c601 --- /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 882f809c..9b8ecc52 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 c19af17c..e4037c27 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 6e2adf7b..40b35646 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 00000000..c0e9dbb2 --- /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 935ef35d..4ab9b7bf 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 79e1444c..a9928c5e 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 c806e018..2c9c47f5 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 7caf6d36..917cb6fa 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 aa7c5107..53d50d00 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 8d68e67c..f1c2f7de 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 968da425..4e386a3a 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 2e17713c..8c8e639b 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 8381022c..22a43665 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 cb87309f..5562367f 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 892ed333..ca1d924a 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 dae67bae..de63b43f 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 8cbccf5f..df9048be 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 ab1fc487..7e943f3c 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 47c60874..934f3436 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 dea32460..c5ebe3c8 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 0e925ce9..a1b15f8a 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 480f01e8..c84bd646 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 569239dd..c06601ee 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 95341f58..71cf4870 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 00000000..79371892 --- /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); + } +}