diff --git a/apps/playground/src/components/cardano/connect-browser-wallet.tsx b/apps/playground/src/components/cardano/connect-browser-wallet.tsx index 0bddcc518..9175f9288 100644 --- a/apps/playground/src/components/cardano/connect-browser-wallet.tsx +++ b/apps/playground/src/components/cardano/connect-browser-wallet.tsx @@ -45,6 +45,11 @@ export function CommonCardanoWallet() { networkId: 0, provider: provider, }} + // webauthn={{ + // networkId: 0, + // provider: provider, + // url: "http://localhost:3000", + // }} /> ); } diff --git a/apps/playground/src/pages/apis/txbuilder/governance/vote-delegation.tsx b/apps/playground/src/pages/apis/txbuilder/governance/vote-delegation.tsx index c878b6179..83888aed3 100644 --- a/apps/playground/src/pages/apis/txbuilder/governance/vote-delegation.tsx +++ b/apps/playground/src/pages/apis/txbuilder/governance/vote-delegation.tsx @@ -1,6 +1,5 @@ import { useState } from "react"; -import { keepRelevant, Quantity, Unit } from "@meshsdk/core"; import { useWallet } from "@meshsdk/react"; import Input from "~/components/form/input"; @@ -36,8 +35,8 @@ function Left() { codeTx += ` },\n`; codeTx += ` rewardAddress,\n`; codeTx += ` )\n`; - codeTx += ` .changeAddress(changeAddress)`; - codeTx += ` .selectUtxos(utxos, "keepRelevant", "10000000")\n`; + codeTx += ` .changeAddress(changeAddress)\n`; + codeTx += ` .selectUtxos(utxos, "keepRelevant", "10000000")`; let codeBuildSign = ``; codeBuildSign += `const unsignedTx = await txBuilder.complete();\n`; @@ -129,7 +128,7 @@ function Right() { codeSnippet += `txBuilder\n`; codeSnippet += ` .voteDelegationCertificate(\n`; codeSnippet += ` {\n`; - codeSnippet += ` dRepId: drepid,\n`; + codeSnippet += ` dRepId: '${drepid}',\n`; codeSnippet += ` },\n`; codeSnippet += ` rewardAddress,\n`; codeSnippet += ` )\n`; diff --git a/apps/playground/src/pages/apis/wallets/meshwallet/load-wallet.tsx b/apps/playground/src/pages/apis/wallets/meshwallet/load-wallet.tsx index caabb6553..15d9eec39 100644 --- a/apps/playground/src/pages/apis/wallets/meshwallet/load-wallet.tsx +++ b/apps/playground/src/pages/apis/wallets/meshwallet/load-wallet.tsx @@ -242,8 +242,8 @@ function Right( }); setWallet(_wallet); - const address = _wallet.getChangeAddress(); - setResponseAddress(address); + const addresses = _wallet.getAddresses(); + setResponseAddress(JSON.stringify(addresses, null, 2)); } } catch (error) { setResponseError(`${error}`); @@ -262,8 +262,8 @@ function Right( }); setWallet(_wallet); - const address = _wallet.getChangeAddress(); - setResponseAddress(address); + const addresses = _wallet.getAddresses(); + setResponseAddress(JSON.stringify(addresses, null, 2)); } catch (error) { setResponseError(`${error}`); } @@ -283,8 +283,8 @@ function Right( }); setWallet(_wallet); - const address = _wallet.getChangeAddress(); - setResponseAddress(address); + const addresses = _wallet.getAddresses(); + setResponseAddress(JSON.stringify(addresses, null, 2)); } catch (error) { setResponseError(`${error}`); } @@ -302,8 +302,8 @@ function Right( }); setWallet(_wallet); - const address = _wallet.getChangeAddress(); - setResponseAddress(address); + const addresses = _wallet.getAddresses(); + setResponseAddress(JSON.stringify(addresses, null, 2)); } catch (error) { setResponseError(`${error}`); } @@ -362,7 +362,7 @@ function Right( response={responseAddress} label="Load wallet and get address" /> - + diff --git a/apps/playground/src/pages/sitemap.xml.ts b/apps/playground/src/pages/sitemap.xml.ts index 3504d3393..1fb2acb75 100644 --- a/apps/playground/src/pages/sitemap.xml.ts +++ b/apps/playground/src/pages/sitemap.xml.ts @@ -30,15 +30,22 @@ function SiteMap() {} function addLinks(pagesUrls: string[], pages: MenuItem[]) { pages.forEach((api) => { - pagesUrls.push(api.link); + pushLink(pagesUrls, api.link); if (api.items) { api.items.forEach((item) => { - pagesUrls.push(item.link); + pushLink(pagesUrls, item.link); }); } }); } +function pushLink(pagesUrls: string[], link: string) { + if (link.includes("http") && !link.includes("meshjs.dev")) { + return; + } + pagesUrls.push(link); +} + export async function getServerSideProps({ res }: { res: any }) { const pagesUrls: string[] = []; diff --git a/package-lock.json b/package-lock.json index b0e32e558..623ac6e4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13429,6 +13429,29 @@ } } }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz", + "integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-menu": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.4.tgz", @@ -14529,6 +14552,12 @@ "node": ">=10.0.0" } }, + "node_modules/@simplewebauthn/browser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.0.0.tgz", + "integrity": "sha512-7d/+gxoFoDQxq2EkLl/PuTIQ/rnSrA3bmr8L2Ij7bRyicJoCJX/NDGUNExyctB9nSDrEkkcrJMDkwpCYOGU3Lg==", + "license": "MIT" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -18424,6 +18453,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", @@ -22492,6 +22522,7 @@ "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==", + "dev": true, "license": "ISC" }, "node_modules/html-escaper": { @@ -24304,6 +24335,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -25923,6 +25955,7 @@ "version": "4.2.8", "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=8" @@ -26357,6 +26390,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, "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", @@ -26369,6 +26403,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver" @@ -31912,6 +31947,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -31922,12 +31958,14 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, "license": "CC-BY-3.0" }, "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, "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -31938,6 +31976,7 @@ "version": "3.0.20", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, "license": "CC0-1.0" }, "node_modules/speed-limiter": { @@ -34340,6 +34379,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, "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", @@ -35322,6 +35362,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, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", @@ -35335,6 +35376,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { @@ -35719,6 +35761,7 @@ "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.1", "@radix-ui/react-tooltip": "^1.1.4", "class-variance-authority": "^0.7.1", "tailwind-merge": "^2.6.0", @@ -35804,7 +35847,8 @@ "@meshsdk/core-cst": "1.8.4", "@meshsdk/transaction": "1.8.4", "@nufi/dapp-client-cardano": "0.3.5", - "@nufi/dapp-client-core": "0.3.5" + "@nufi/dapp-client-core": "0.3.5", + "@simplewebauthn/browser": "^13.0.0" }, "devDependencies": { "@meshsdk/configs": "*", diff --git a/packages/mesh-provider/src/hydra/transactions/commit-utxo.ts b/packages/mesh-provider/src/hydra/transactions/commit-utxo.ts deleted file mode 100644 index 71011f8f3..000000000 --- a/packages/mesh-provider/src/hydra/transactions/commit-utxo.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Asset, UTxO } from "@meshsdk/core"; -import { csl } from "@meshsdk/core-csl"; - -export async function commitUtxo(utxo: UTxO) { - const txBuilder = csl.TransactionBuilder.new( - csl.TransactionBuilderConfigBuilder.new() - .fee_algo(csl.LinearFee.new(csl.BigNum.zero(), csl.BigNum.zero())) - .pool_deposit(csl.BigNum.from_str("500000000")) - .key_deposit(csl.BigNum.from_str("2000000")) - .max_value_size(5000) - .max_tx_size(16384) - .coins_per_utxo_byte(csl.BigNum.zero()) - .ex_unit_prices( - csl.ExUnitPrices.new( - csl.UnitInterval.new(csl.BigNum.zero(), csl.BigNum.one()), - csl.UnitInterval.new(csl.BigNum.zero(), csl.BigNum.one()), - ), - ) - .ref_script_coins_per_byte( - csl.UnitInterval.new(csl.BigNum.zero(), csl.BigNum.one()), - ) - .deduplicate_explicit_ref_inputs_with_regular_inputs(true) - .build(), - ); -} diff --git a/packages/mesh-react/package.json b/packages/mesh-react/package.json index 94a042891..9e321b16f 100644 --- a/packages/mesh-react/package.json +++ b/packages/mesh-react/package.json @@ -36,6 +36,7 @@ "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.1", "@radix-ui/react-tooltip": "^1.1.4", "class-variance-authority": "^0.7.1", "tailwindcss-animate": "^1.0.7", diff --git a/packages/mesh-react/src/cardano-wallet/data.ts b/packages/mesh-react/src/cardano-wallet/data.ts index c03e80e1b..9e5ee1547 100644 --- a/packages/mesh-react/src/cardano-wallet/data.ts +++ b/packages/mesh-react/src/cardano-wallet/data.ts @@ -11,4 +11,9 @@ export const screens = { subtitle: "Instantly create a new burner wallet. No seed phrase required, keys are generated on your device.", }, + webauthn: { + title: "Passkey", + subtitle: + "Derive self-custody wallet on Chrome, Safari, or Firefox browsers on Android, iOS, macOS, and Windows devices, or using password managers.", + }, }; diff --git a/packages/mesh-react/src/cardano-wallet/index.tsx b/packages/mesh-react/src/cardano-wallet/index.tsx index e79bbc5fd..383c99ecf 100644 --- a/packages/mesh-react/src/cardano-wallet/index.tsx +++ b/packages/mesh-react/src/cardano-wallet/index.tsx @@ -19,6 +19,7 @@ import { screens } from "./data"; import ScreenBurner from "./screen-burner"; import ScreenMain from "./screen-main"; import ScreenP2P from "./screen-p2p"; +import ScreenWebauthn from "./screen-webauthn"; interface ButtonProps { label?: string; @@ -39,6 +40,11 @@ interface ButtonProps { networkId: 0 | 1; provider: IFetcher & ISubmitter; }; + webauthn?: { + networkId: 0 | 1; + provider: IFetcher & ISubmitter; + url: string; + }; } export const CardanoWallet = ({ @@ -49,13 +55,14 @@ export const CardanoWallet = ({ metamask = undefined, cardanoPeerConnect = undefined, burnerWallet = undefined, + webauthn = undefined, }: ButtonProps) => { const [open, setOpen] = useState(false); const [screen, setScreen] = useState("main"); const { wallet, connected } = useWallet(); useEffect(() => { - if (connected && wallet) { + if (connected) { if (onConnected) onConnected(); } }, [connected, wallet]); @@ -86,6 +93,7 @@ export const CardanoWallet = ({ setScreen={setScreen} cardanoPeerConnect={cardanoPeerConnect != undefined} burnerWallet={burnerWallet != undefined} + webauthn={webauthn != undefined} /> )} {screen == "p2p" && ( @@ -101,7 +109,14 @@ export const CardanoWallet = ({ setOpen={setOpen} /> )} - + {screen == "webauthn" && webauthn && ( + + )}