From 4205fb589e69c574365924bce19be747840b0db4 Mon Sep 17 00:00:00 2001 From: "Hong Jing (Jingles)" Date: Tue, 3 Sep 2024 11:27:24 +0800 Subject: [PATCH] update docs and fix drepid --- apps/playground/src/data/links-data.ts | 5 +- .../src/pages/apis/txbuilder/basics/index.tsx | 3 + .../basics/multisig-native-script.tsx | 208 ++++++++++++++++++ .../pages/apis/txbuilder/basics/multisig.tsx | 12 +- .../src/pages/apis/txbuilder/common.tsx | 1 + package-lock.json | 72 +++--- packages/mesh-wallet/src/browser/index.ts | 13 +- 7 files changed, 264 insertions(+), 50 deletions(-) create mode 100644 apps/playground/src/pages/apis/txbuilder/basics/multisig-native-script.tsx diff --git a/apps/playground/src/data/links-data.ts b/apps/playground/src/data/links-data.ts index 62097829..4cdb826d 100644 --- a/apps/playground/src/data/links-data.ts +++ b/apps/playground/src/data/links-data.ts @@ -27,7 +27,6 @@ export const metaDataJson = { link: "/apis/data/json", icon: Bars3Icon, }; -// todoß export const metaDataValue = { title: "Value", desc: "Manipulate Cardano Value Easily", @@ -52,8 +51,8 @@ export const linksData: MenuItem[] = [ metaDataMesh, metaDataJson, metaDataValue, - // metaDataCbor, - // metaDataUtils, + // metaDataCbor, // todo + // metaDataUtils, // todo ]; export const metaData = { diff --git a/apps/playground/src/pages/apis/txbuilder/basics/index.tsx b/apps/playground/src/pages/apis/txbuilder/basics/index.tsx index 735bc0a6..b1a9544b 100644 --- a/apps/playground/src/pages/apis/txbuilder/basics/index.tsx +++ b/apps/playground/src/pages/apis/txbuilder/basics/index.tsx @@ -15,12 +15,14 @@ import TxbuilderSendValues from "./send-values"; import TxbuilderSetNetwork from "./set-network"; import TxbuilderSetRequiredSigners from "./set-required-signers"; import TxbuilderSetTime from "./set-time"; +import TxbuilderMultisigNativeScript from "./multisig-native-script"; const ReactPage: NextPage = () => { const sidebarItems = [ { label: "Initialize Tx Builder", to: "initializeTxbuilder" }, { label: "Send value", to: "sendValue" }, { label: "Multi-signature", to: "multisig" }, + // { label: "Multisig native script", to: "multisigNativeScript" }, { label: "Build with object", to: "buildWithObject" }, { label: "Coin selection", to: "coinSelection" }, { label: "Set metadata", to: "cip20" }, @@ -68,6 +70,7 @@ const ReactPage: NextPage = () => { {/* */} + {/* */} {/* */} diff --git a/apps/playground/src/pages/apis/txbuilder/basics/multisig-native-script.tsx b/apps/playground/src/pages/apis/txbuilder/basics/multisig-native-script.tsx new file mode 100644 index 00000000..94239d49 --- /dev/null +++ b/apps/playground/src/pages/apis/txbuilder/basics/multisig-native-script.tsx @@ -0,0 +1,208 @@ +import { + AppWallet, + deserializeAddress, + ForgeScript, + MeshTxBuilder, + MeshWallet, + NativeScript, + resolveScriptHash, + serializeNativeScript, + stringToHex, +} from "@meshsdk/core"; +import { useWallet } from "@meshsdk/react"; + +import { getProvider } from "~/components/cardano/mesh-wallet"; +import LiveCodeDemo from "~/components/sections/live-code-demo"; +import TwoColumnsScroll from "~/components/sections/two-columns-scroll"; +import Codeblock from "~/components/text/codeblock"; +import { demoAssetMetadata, demoMnemonic } from "~/data/cardano"; +import { getTxBuilder } from "../common"; + +// const scriptAddress = +// "addr_test1vpd5480qj5jj4pnjwq9yxnac8l9dw2k3y6gz2cpp6jawzwq838jl8"; +// const scriptCbor = +// "8201828200581c556f3a70b8a68081cf36c918dd9933abdca34f20fc534499c817182b8200581c5867c3b8e27840f556ac268b781578b14c5661fc63ee720dbeab663f"; + +export default function TxbuilderMultisigNativeScript() { + return ( + + ); +} + +function Left() { + let codeTx = ``; + + return ( + <> +

+ + + ); +} + +function Right() { + const { wallet, connected } = useWallet(); + + function getMeshWallet() { + const blockchainProvider = getProvider(); + + const wallet = new MeshWallet({ + networkId: 0, + fetcher: blockchainProvider, + submitter: blockchainProvider, + key: { + type: "mnemonic", + words: "solution,".repeat(24).split(",").slice(0, 24), + }, + }); + + const walletAddress = wallet.getChangeAddress(); + + const { pubKeyHash: keyHash } = deserializeAddress(walletAddress); + return { wallet, keyHash, walletAddress }; + } + + async function getScript() { + if (!connected) return; + + // first wallet + const walletAddress = (await wallet.getUsedAddresses())[0]; + if (!walletAddress) return; + const { pubKeyHash: keyHash1 } = deserializeAddress(walletAddress); + // const nativeScriptA: NativeScript = { + // type: "all", + // scripts: [ + // { + // type: "sig", + // keyHash: keyHash, + // }, + // ], + // }; + + // console.log("Native script A"); + // const { address: scriptAddressA, scriptCbor: scriptCborA } = + // serializeNativeScript(nativeScriptA); + // console.log("Script address:", scriptAddressA); + // console.log("Script CBOR:", scriptCborA); + console.log("keyHash1", keyHash1); + + // second wallet + const { keyHash: keyHash2 } = getMeshWallet(); + // const nativeScriptB: NativeScript = { + // type: "all", + // scripts: [ + // { + // type: "sig", + // keyHash: keyHash2, + // }, + // ], + // }; + + // console.log("Native script B"); + // const { address: scriptAddressB, scriptCbor: scriptCborB } = + // serializeNativeScript(nativeScriptB); + // console.log("Script address:", scriptAddressB); + // console.log("Script CBOR:", scriptCborB); + console.log("keyHash2", keyHash2); + + // combine + + // const nativeScript: NativeScript = { + // type: "atLeast", + // required: 2, + // scripts: [nativeScriptA, nativeScriptB], + // }; + const nativeScript: NativeScript = { + type: "all", + scripts: [ + { + type: "sig", + keyHash: keyHash1, + }, + { + type: "sig", + keyHash: keyHash2, + }, + ], + }; + + console.log("Native script combine"); + const { address: scriptAddress, scriptCbor } = + serializeNativeScript(nativeScript); + console.log("Script address:", scriptAddress); + console.log("Script CBOR:", scriptCbor); + + return { scriptAddress, scriptCbor: scriptCbor! }; + } + + async function runDemo() { + if (!connected) return; + + const script = await getScript(); + if (!script) return; + const { scriptAddress, scriptCbor } = script; + + const blockchainProvider = getProvider(); + const utxos = await blockchainProvider.fetchAddressUTxOs(scriptAddress); + + if (utxos.length === 0) { + console.log("No utxos"); + return; + } + const utxo = utxos[0]!; + console.log("utxo", utxo); + + // const walletAddress = (await wallet.getUsedAddresses())[0]; + // if (!walletAddress) return; + // const { pubKeyHash: keyHash1 } = deserializeAddress(walletAddress); + const { wallet: walletB, keyHash: keyHash2 } = getMeshWallet(); + + const txBuilder = getTxBuilder(); + + const unsignedTx = await txBuilder + .txIn( + utxo.input.txHash, + utxo.input.outputIndex, + utxo.output.amount, + utxo.output.address, + ) + .txInScript(scriptCbor) + .txOut( + "addr_test1vpvx0sacufuypa2k4sngk7q40zc5c4npl337uusdh64kv0c7e4cxr", + [{ unit: "lovelace", quantity: "2000000" }], + ) + .changeAddress(scriptAddress) + .selectUtxosFrom(utxos) + .complete(); + + console.log("unsignedTx", unsignedTx); + + const signedTx1 = await wallet.signTx(unsignedTx, true); + const signedTx2 = await walletB.signTx(signedTx1, true); + + const txHash = await wallet.submitTx(signedTx2); + console.log("txHash", txHash); + return txHash; + } + + let codeSnippet = ``; + + return ( + + ); +} diff --git a/apps/playground/src/pages/apis/txbuilder/basics/multisig.tsx b/apps/playground/src/pages/apis/txbuilder/basics/multisig.tsx index 1056ebbe..f8297619 100644 --- a/apps/playground/src/pages/apis/txbuilder/basics/multisig.tsx +++ b/apps/playground/src/pages/apis/txbuilder/basics/multisig.tsx @@ -1,5 +1,5 @@ import { - AppWallet, + MeshWallet, ForgeScript, resolveScriptHash, stringToHex, @@ -64,7 +64,7 @@ function Right() { async function runDemo() { const blockchainProvider = getProvider(); - const mintingWallet = new AppWallet({ + const mintingWallet = new MeshWallet({ networkId: 0, fetcher: blockchainProvider, submitter: blockchainProvider, @@ -74,7 +74,7 @@ function Right() { }, }); const forgingScript = ForgeScript.withOneSignature( - mintingWallet.getPaymentAddress(), + mintingWallet.getChangeAddress(), ); const assetName = "MeshToken"; const policyId = resolveScriptHash(forgingScript); @@ -99,8 +99,8 @@ function Right() { return txHash; } - let codeSnippet = `import { AppWallet, ForgeScript, Mint, Transaction } from '@meshsdk/core';\n\n`; - codeSnippet += `const mintingWallet = new AppWallet({\n`; + let codeSnippet = `import { MeshWallet, ForgeScript, Mint, Transaction } from '@meshsdk/core';\n\n`; + codeSnippet += `const mintingWallet = new MeshWallet({\n`; codeSnippet += ` networkId: 0,\n`; codeSnippet += ` fetcher: blockchainProvider,\n`; codeSnippet += ` submitter: blockchainProvider,\n`; @@ -111,7 +111,7 @@ function Right() { codeSnippet += `});\n`; codeSnippet += `\n`; codeSnippet += `const forgingScript = ForgeScript.withOneSignature(\n`; - codeSnippet += ` mintingWallet.getPaymentAddress(),\n`; + codeSnippet += ` mintingWallet.getChangeAddress(),\n`; codeSnippet += `);\n`; codeSnippet += `\n`; codeSnippet += `const assetName = "MeshToken";\n`; diff --git a/apps/playground/src/pages/apis/txbuilder/common.tsx b/apps/playground/src/pages/apis/txbuilder/common.tsx index 5d3d8830..b949cbf9 100644 --- a/apps/playground/src/pages/apis/txbuilder/common.tsx +++ b/apps/playground/src/pages/apis/txbuilder/common.tsx @@ -7,6 +7,7 @@ export function getTxBuilder() { const txBuilder = new MeshTxBuilder({ fetcher: blockchainProvider, evaluator: blockchainProvider, + verbose: true, }); txBuilder.setNetwork("preprod"); return txBuilder; diff --git a/package-lock.json b/package-lock.json index c277b7ce..984b0b97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22364,7 +22364,7 @@ }, "packages/mesh-common": { "name": "@meshsdk/common", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { "bech32": "^2.0.0", @@ -22381,14 +22381,14 @@ }, "packages/mesh-contract": { "name": "@meshsdk/contract", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.6.14", - "@meshsdk/core": "1.6.14", - "@meshsdk/core-csl": "1.6.14", - "@meshsdk/core-cst": "1.6.14", - "@meshsdk/transaction": "1.6.14" + "@meshsdk/common": "1.7.0", + "@meshsdk/core": "1.7.0", + "@meshsdk/core-csl": "1.7.0", + "@meshsdk/core-cst": "1.7.0", + "@meshsdk/transaction": "1.7.0" }, "devDependencies": { "@meshsdk/configs": "*", @@ -22399,16 +22399,16 @@ }, "packages/mesh-core": { "name": "@meshsdk/core", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.6.14", - "@meshsdk/core-csl": "1.6.14", - "@meshsdk/core-cst": "1.6.14", - "@meshsdk/provider": "1.6.14", - "@meshsdk/react": "1.6.14", - "@meshsdk/transaction": "1.6.14", - "@meshsdk/wallet": "1.6.14" + "@meshsdk/common": "1.7.0", + "@meshsdk/core-csl": "1.7.0", + "@meshsdk/core-cst": "1.7.0", + "@meshsdk/provider": "1.7.0", + "@meshsdk/react": "1.7.0", + "@meshsdk/transaction": "1.7.0", + "@meshsdk/wallet": "1.7.0" }, "devDependencies": { "@meshsdk/configs": "*", @@ -22419,10 +22419,10 @@ }, "packages/mesh-core-csl": { "name": "@meshsdk/core-csl", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.6.14", + "@meshsdk/common": "1.7.0", "@sidan-lab/sidan-csl-rs-browser": "0.8.0", "@sidan-lab/sidan-csl-rs-nodejs": "0.8.0", "json-bigint": "^1.0.0" @@ -22438,7 +22438,7 @@ }, "packages/mesh-core-cst": { "name": "@meshsdk/core-cst", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { "@cardano-sdk/core": "^0.35.4", @@ -22447,7 +22447,7 @@ "@harmoniclabs/cbor": "1.3.0", "@harmoniclabs/plutus-data": "1.2.4", "@harmoniclabs/uplc": "1.2.4", - "@meshsdk/common": "1.6.14", + "@meshsdk/common": "1.7.0", "@stricahq/bip32ed25519": "^1.1.0", "@stricahq/cbors": "^1.0.0", "pbkdf2": "^3.1.2" @@ -22464,11 +22464,11 @@ }, "packages/mesh-provider": { "name": "@meshsdk/provider", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.6.14", - "@meshsdk/core-cst": "1.6.14", + "@meshsdk/common": "1.7.0", + "@meshsdk/core-cst": "1.7.0", "axios": "^1.7.2" }, "devDependencies": { @@ -22480,12 +22480,12 @@ }, "packages/mesh-react": { "name": "@meshsdk/react", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.6.14", - "@meshsdk/transaction": "1.6.14", - "@meshsdk/wallet": "1.6.14", + "@meshsdk/common": "1.7.0", + "@meshsdk/transaction": "1.7.0", + "@meshsdk/wallet": "1.7.0", "react": "^18.2.0" }, "devDependencies": { @@ -22500,12 +22500,12 @@ }, "packages/mesh-transaction": { "name": "@meshsdk/transaction", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.6.14", - "@meshsdk/core-csl": "1.6.14", - "@meshsdk/core-cst": "1.6.14", + "@meshsdk/common": "1.7.0", + "@meshsdk/core-csl": "1.7.0", + "@meshsdk/core-cst": "1.7.0", "json-bigint": "^1.0.0" }, "devDependencies": { @@ -22518,13 +22518,13 @@ }, "packages/mesh-wallet": { "name": "@meshsdk/wallet", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { - "@meshsdk/common": "1.6.14", - "@meshsdk/core-csl": "1.6.14", - "@meshsdk/core-cst": "1.6.14", - "@meshsdk/transaction": "1.6.14", + "@meshsdk/common": "1.7.0", + "@meshsdk/core-csl": "1.7.0", + "@meshsdk/core-cst": "1.7.0", + "@meshsdk/transaction": "1.7.0", "@nufi/dapp-client-cardano": "^0.3.1", "@nufi/dapp-client-core": "^0.3.1" }, @@ -22538,7 +22538,7 @@ }, "scripts/mesh-cli": { "name": "meshjs", - "version": "1.6.14", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { "chalk": "5.3.0", diff --git a/packages/mesh-wallet/src/browser/index.ts b/packages/mesh-wallet/src/browser/index.ts index e618b2e7..b3f74359 100644 --- a/packages/mesh-wallet/src/browser/index.ts +++ b/packages/mesh-wallet/src/browser/index.ts @@ -12,6 +12,7 @@ import { UTxO, Wallet, } from "@meshsdk/common"; +import { csl } from "@meshsdk/core-csl"; import { Address, addressToBech32, @@ -473,16 +474,18 @@ export class BrowserWallet implements IInitiator, ISigner, ISubmitter { if (this._walletInstance.cip95 === undefined) return undefined; const dRepKey = await this._walletInstance.cip95.getPubDRepKey(); - const { dRepKeyHex, dRepIDHash } = - await BrowserWallet.dRepKeyToDRepID(dRepKey); + const { dRepIDHash } = await BrowserWallet.dRepKeyToDRepID(dRepKey); - const networkId = await this.getNetworkId(); - const dRepId = buildDRepID(dRepKeyHex, networkId); + // const networkId = await this.getNetworkId(); + // const dRepId = buildDRepID(dRepKey, networkId); // todo: this is not correct + + const csldRepIdKeyHash = csl.PublicKey.from_hex(dRepKey).hash(); + const dRepId = csldRepIdKeyHash.to_bech32("drep"); return { pubDRepKey: dRepKey, dRepIDHash: dRepIDHash, - dRepIDBech32: dRepId, // todo to check + dRepIDBech32: dRepId, }; } catch (e) { console.error(e);