From d63626edefeec0a5b47edaa4677030fc76209da8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Mon, 27 Jan 2025 21:22:14 +0200 Subject: [PATCH 1/3] Example for relayed V3 (web wallet provider). --- signing-providers/index.html | 6 +++ signing-providers/package-lock.json | 42 +++++++++---------- signing-providers/package.json | 4 +- signing-providers/src/web-wallet.js | 64 ++++++++++++++++++++++++++++- 4 files changed, 91 insertions(+), 25 deletions(-) diff --git a/signing-providers/index.html b/signing-providers/index.html index b6ddfbf..6a195bd 100644 --- a/signing-providers/index.html +++ b/signing-providers/index.html @@ -23,6 +23,7 @@

[🌐] Web Wallet URL

+ @@ -39,6 +40,11 @@
Extract data from URL (query string)
+
+
Broadcast
+ + +
diff --git a/signing-providers/package-lock.json b/signing-providers/package-lock.json index ba7afd1..3f901de 100644 --- a/signing-providers/package-lock.json +++ b/signing-providers/package-lock.json @@ -8,7 +8,7 @@ "name": "examples", "version": "0.0.1", "dependencies": { - "@multiversx/sdk-core": "13.15.0", + "@multiversx/sdk-core": "13.17.1", "@multiversx/sdk-dapp-utils": "0.1.0", "@multiversx/sdk-extension-provider": "4.0.0", "@multiversx/sdk-hw-provider": "7.0.0", @@ -16,7 +16,7 @@ "@multiversx/sdk-wallet-connect-provider": "5.0.0", "@multiversx/sdk-web-wallet-cross-window-provider": "2.0.1", "@multiversx/sdk-web-wallet-iframe-provider": "2.0.0", - "@multiversx/sdk-web-wallet-provider": "4.0.0", + "@multiversx/sdk-web-wallet-provider": "4.1.0-beta.1", "@multiversx/sdk-webview-provider": "2.0.0-alpha.0", "protobufjs": "^7.4.0", "punycode": "2.3.0", @@ -460,9 +460,9 @@ } }, "node_modules/@multiversx/sdk-core": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-13.15.0.tgz", - "integrity": "sha512-5RRLMxSDd0XZGopIrPsWLbA8nWxC7WQYjea8/jPvkRApLyggheQU8gaC6ZSgSE0EBrSHl+oC3+YH8nbVayZ2gw==", + "version": "13.17.1", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-13.17.1.tgz", + "integrity": "sha512-ZqT/uhKBRM5XWZBLodpcLypCE5L6vjXENFnVl4PurTQNkOo8X6sFhKGdHzMeKUIDrMkXuRAQXlCRp1Us9qk4Lg==", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", "@noble/ed25519": "1.7.3", @@ -625,14 +625,14 @@ } }, "node_modules/@multiversx/sdk-web-wallet-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.0.0.tgz", - "integrity": "sha512-jcAUo1fhSKiFjbOvyRx1z8wz7VdKA/WSKtqoscL/GGqaSWD1f1UYHR9pDlvrswryE/dAZvMG+eqbOLhLxy6srg==", + "version": "4.1.0-beta.1", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.1.0-beta.1.tgz", + "integrity": "sha512-fsr63UIjVsRFQA4e8GU3RT3cNYvkAQcKkCdRcpZk4dPfAtUGI6aQhZAfW+scLXbwBUuX0E+D3YNf9hcZaBCTTw==", "dependencies": { "qs": "6.10.3" }, "peerDependencies": { - "@multiversx/sdk-core": ">= 13.5.0" + "@multiversx/sdk-core": ">= 13.17.1" } }, "node_modules/@multiversx/sdk-webview-provider": { @@ -2395,9 +2395,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5371,9 +5371,9 @@ "optional": true }, "@multiversx/sdk-core": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-13.15.0.tgz", - "integrity": "sha512-5RRLMxSDd0XZGopIrPsWLbA8nWxC7WQYjea8/jPvkRApLyggheQU8gaC6ZSgSE0EBrSHl+oC3+YH8nbVayZ2gw==", + "version": "13.17.1", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-core/-/sdk-core-13.17.1.tgz", + "integrity": "sha512-ZqT/uhKBRM5XWZBLodpcLypCE5L6vjXENFnVl4PurTQNkOo8X6sFhKGdHzMeKUIDrMkXuRAQXlCRp1Us9qk4Lg==", "requires": { "@multiversx/sdk-bls-wasm": "0.3.5", "@multiversx/sdk-transaction-decoder": "1.0.2", @@ -5503,9 +5503,9 @@ } }, "@multiversx/sdk-web-wallet-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.0.0.tgz", - "integrity": "sha512-jcAUo1fhSKiFjbOvyRx1z8wz7VdKA/WSKtqoscL/GGqaSWD1f1UYHR9pDlvrswryE/dAZvMG+eqbOLhLxy6srg==", + "version": "4.1.0-beta.1", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.1.0-beta.1.tgz", + "integrity": "sha512-fsr63UIjVsRFQA4e8GU3RT3cNYvkAQcKkCdRcpZk4dPfAtUGI6aQhZAfW+scLXbwBUuX0E+D3YNf9hcZaBCTTw==", "requires": { "qs": "6.10.3" } @@ -6853,9 +6853,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", diff --git a/signing-providers/package.json b/signing-providers/package.json index 6dc7c52..7b04aac 100644 --- a/signing-providers/package.json +++ b/signing-providers/package.json @@ -8,7 +8,7 @@ }, "author": "MultiversX", "dependencies": { - "@multiversx/sdk-core": "13.15.0", + "@multiversx/sdk-core": "13.17.1", "@multiversx/sdk-dapp-utils": "0.1.0", "@multiversx/sdk-extension-provider": "4.0.0", "@multiversx/sdk-hw-provider": "7.0.0", @@ -16,7 +16,7 @@ "@multiversx/sdk-wallet-connect-provider": "5.0.0", "@multiversx/sdk-web-wallet-cross-window-provider": "2.0.1", "@multiversx/sdk-web-wallet-iframe-provider": "2.0.0", - "@multiversx/sdk-web-wallet-provider": "4.0.0", + "@multiversx/sdk-web-wallet-provider": "4.1.0-beta.1", "@multiversx/sdk-webview-provider": "2.0.0-alpha.0", "protobufjs": "^7.4.0", "punycode": "2.3.0", diff --git a/signing-providers/src/web-wallet.js b/signing-providers/src/web-wallet.js index b682949..d60bd76 100644 --- a/signing-providers/src/web-wallet.js +++ b/signing-providers/src/web-wallet.js @@ -1,13 +1,14 @@ -import { Address, Message, Transaction, TransactionPayload } from "@multiversx/sdk-core"; +import { Address, AddressComputer, ApiNetworkProvider, Message, Transaction, TransactionPayload } from "@multiversx/sdk-core"; import { WalletProvider } from "@multiversx/sdk-web-wallet-provider"; import qs from "qs"; import { createNativeAuthInitialPart, packNativeAuthToken, verifyNativeAuthToken } from "./auth"; -import { CHAIN_ID, WALLET_PROVIDER_URL } from "./config"; +import { API_URL, CHAIN_ID, WALLET_PROVIDER_URL } from "./config"; import { displayOutcome } from "./helpers"; export class WebWallet { constructor() { this.provider = new WalletProvider(WALLET_PROVIDER_URL); + this.apiNetworkProvider = new ApiNetworkProvider(API_URL, { clientName: "multiversx-sdk-js-examples" }); this._address = ""; } @@ -107,6 +108,41 @@ export class WebWallet { await this.provider.signTransactions([firstTransaction, secondTransaction]); } + async signRelayedTransaction() { + const sender = getUrlParams().address; + if (!sender) { + displayOutcome("Try to login first."); + return; + } + + const senderShard = new AddressComputer().getShardOfAddress(Address.newFromBech32(sender)); + const relayer = { + 0: "erd1uv40ahysflse896x4ktnh6ecx43u7cmy9wnxnvcyp7deg299a4sq6vaywa", + 1: "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede", + 2: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8" + }[senderShard]; + + console.log("Relayer shard:", senderShard); + console.log("Relayer:", relayer); + + const senderNonce = await this.recallNonce(sender); + const data = Buffer.from("hello"); + + const transaction = new Transaction({ + nonce: senderNonce, + value: "10000000000000000", + sender: Address.newFromBech32(sender), + receiver: Address.newFromBech32("erd1testnlersh4z0wsv8kjx39me4rmnvjkwu8dsaea7ukdvvc9z396qykv7z7"), + relayer: Address.newFromBech32(relayer), + gasPrice: 1000000000, + gasLimit: 100000 + 1500 * data.length, + data: data, + chainID: CHAIN_ID + }); + + await this.provider.signTransaction(transaction); + } + async showSignedTransactions() { const plainSignedTransactions = this.provider.getTransactionsFromWalletUrl(); alert(JSON.stringify(plainSignedTransactions, null, 4)); @@ -124,6 +160,18 @@ export class WebWallet { } } + async sendSignedTransactions() { + const plainSignedTransactions = this.provider.getTransactionsFromWalletUrl(); + + for (const plainTransaction of plainSignedTransactions) { + const plainTransactionClone = structuredClone(plainTransaction); + plainTransactionClone.data = Buffer.from(plainTransactionClone.data).toString("base64"); + const transaction = Transaction.fromPlainObject(plainTransactionClone); + + await this.apiNetworkProvider.sendTransaction(transaction); + } + } + async signMessage() { if (!this._address) { return displayOutcome("Unable to sign.", "Login & press Show address first.") @@ -142,11 +190,23 @@ export class WebWallet { const signature = this.provider.getMessageSignatureFromWalletUrl(); return displayOutcome("Signature:", signature) } + + async recallNonce(address) { + const accountOnNetwork = await this.apiNetworkProvider.getAccount(Address.newFromBech32(address)); + const nonce = accountOnNetwork.nonce; + + console.log(`recallNonce(), address = ${address}, nonce = ${nonce}`); + + return nonce; + } } function getUrlParams() { const queryString = window.location.search.slice(1); const params = qs.parse(queryString); + + console.log("URL params", params); + return params; } From 5c5744ef1c6f1b71a0b920558ffac4525ce28639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 30 Jan 2025 10:52:13 +0200 Subject: [PATCH 2/3] Newer packages. --- signing-providers/package-lock.json | 14 +++++++------- signing-providers/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/signing-providers/package-lock.json b/signing-providers/package-lock.json index 3f901de..22c61ba 100644 --- a/signing-providers/package-lock.json +++ b/signing-providers/package-lock.json @@ -16,7 +16,7 @@ "@multiversx/sdk-wallet-connect-provider": "5.0.0", "@multiversx/sdk-web-wallet-cross-window-provider": "2.0.1", "@multiversx/sdk-web-wallet-iframe-provider": "2.0.0", - "@multiversx/sdk-web-wallet-provider": "4.1.0-beta.1", + "@multiversx/sdk-web-wallet-provider": "4.1.0", "@multiversx/sdk-webview-provider": "2.0.0-alpha.0", "protobufjs": "^7.4.0", "punycode": "2.3.0", @@ -625,9 +625,9 @@ } }, "node_modules/@multiversx/sdk-web-wallet-provider": { - "version": "4.1.0-beta.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.1.0-beta.1.tgz", - "integrity": "sha512-fsr63UIjVsRFQA4e8GU3RT3cNYvkAQcKkCdRcpZk4dPfAtUGI6aQhZAfW+scLXbwBUuX0E+D3YNf9hcZaBCTTw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.1.0.tgz", + "integrity": "sha512-IZw+1FLrfBYdGjCp7G5zHDRpMMwpwbywzOm3ijGWut0EGySRoKYVEWEacrKiSuP8yAZb81zWEVom1Hl/a/dZfw==", "dependencies": { "qs": "6.10.3" }, @@ -5503,9 +5503,9 @@ } }, "@multiversx/sdk-web-wallet-provider": { - "version": "4.1.0-beta.1", - "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.1.0-beta.1.tgz", - "integrity": "sha512-fsr63UIjVsRFQA4e8GU3RT3cNYvkAQcKkCdRcpZk4dPfAtUGI6aQhZAfW+scLXbwBUuX0E+D3YNf9hcZaBCTTw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@multiversx/sdk-web-wallet-provider/-/sdk-web-wallet-provider-4.1.0.tgz", + "integrity": "sha512-IZw+1FLrfBYdGjCp7G5zHDRpMMwpwbywzOm3ijGWut0EGySRoKYVEWEacrKiSuP8yAZb81zWEVom1Hl/a/dZfw==", "requires": { "qs": "6.10.3" } diff --git a/signing-providers/package.json b/signing-providers/package.json index 7b04aac..b400a5c 100644 --- a/signing-providers/package.json +++ b/signing-providers/package.json @@ -16,7 +16,7 @@ "@multiversx/sdk-wallet-connect-provider": "5.0.0", "@multiversx/sdk-web-wallet-cross-window-provider": "2.0.1", "@multiversx/sdk-web-wallet-iframe-provider": "2.0.0", - "@multiversx/sdk-web-wallet-provider": "4.1.0-beta.1", + "@multiversx/sdk-web-wallet-provider": "4.1.0", "@multiversx/sdk-webview-provider": "2.0.0-alpha.0", "protobufjs": "^7.4.0", "punycode": "2.3.0", From 02072b23afbdfe8e45601163a2fadd1f62337993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 30 Jan 2025 11:10:59 +0200 Subject: [PATCH 3/3] Add some comments / relayer addresses. --- signing-providers/src/web-wallet.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/signing-providers/src/web-wallet.js b/signing-providers/src/web-wallet.js index d60bd76..b25e9b1 100644 --- a/signing-providers/src/web-wallet.js +++ b/signing-providers/src/web-wallet.js @@ -117,8 +117,11 @@ export class WebWallet { const senderShard = new AddressComputer().getShardOfAddress(Address.newFromBech32(sender)); const relayer = { + // https://github.com/multiversx/mx-sdk-testwallets/blob/main/users/mike.pem 0: "erd1uv40ahysflse896x4ktnh6ecx43u7cmy9wnxnvcyp7deg299a4sq6vaywa", + // https://github.com/multiversx/mx-sdk-testwallets/blob/main/users/grace.pem 1: "erd1r69gk66fmedhhcg24g2c5kn2f2a5k4kvpr6jfw67dn2lyydd8cfswy6ede", + // https://github.com/multiversx/mx-sdk-testwallets/blob/main/users/carol.pem 2: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8" }[senderShard];