Skip to content

Commit

Permalink
Merge pull request #49 from multiversx/TOOL-441-relayed-v3
Browse files Browse the repository at this point in the history
Example(s) for relayed V3
  • Loading branch information
andreibancioiu authored Jan 30, 2025
2 parents 98ebead + 02072b2 commit 44874e5
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 25 deletions.
6 changes: 6 additions & 0 deletions signing-providers/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ <h3>[🌐] Web Wallet URL</h3>
<button class="btn btn-info" onclick="webWallet.loginWithToken()">Login with token</button>
<button class="btn btn-info" onclick="webWallet.signTransaction()">Sign transaction</button>
<button class="btn btn-info" onclick="webWallet.signTransactions()">Sign transactions</button>
<button class="btn btn-info" onclick="webWallet.signRelayedTransaction()">Sign relayed transaction</button>
<button class="btn btn-info" onclick="webWallet.signMessage()">Sign
message</button>
<button class="btn btn-info" onclick="webWallet.logout()">Logout</button>
Expand All @@ -39,6 +40,11 @@ <h5>Extract data from URL (query string)</h5>
<button class="btn btn-info" onclick="webWallet.showMessageSignature()">Show message
signature</button>
</div>
<div class="mt-4">
<h5>Broadcast</h5>

<button class="btn btn-info" onclick="webWallet.sendSignedTransactions()">Send signed transactions</button>
</div>
</div>
</div>

Expand Down
42 changes: 21 additions & 21 deletions signing-providers/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions signing-providers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
},
"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",
"@multiversx/sdk-native-auth-client": "1.0.9",
"@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",
"@multiversx/sdk-webview-provider": "2.0.0-alpha.0",
"protobufjs": "^7.4.0",
"punycode": "2.3.0",
Expand Down
67 changes: 65 additions & 2 deletions signing-providers/src/web-wallet.js
Original file line number Diff line number Diff line change
@@ -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 = "";
}

Expand Down Expand Up @@ -107,6 +108,44 @@ 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 = {
// 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];

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));
Expand All @@ -124,6 +163,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.")
Expand All @@ -142,11 +193,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;
}

Expand Down

0 comments on commit 44874e5

Please sign in to comment.