Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
ebc73da
integrate gas limit estimator into transaction factories
popenta Jul 16, 2025
d7e3bc3
remove transaction builder
popenta Jul 16, 2025
2f4307b
remove comment
popenta Jul 16, 2025
f63437b
Merge branch 'main' into gas-limit-estimator
popenta Jul 16, 2025
3ab3112
fix imports
popenta Jul 16, 2025
a18640c
Merge branch 'main' into gas-limit-estimator
popenta Jul 17, 2025
6a7631c
fixes after review
popenta Jul 17, 2025
7cc757a
add guardian arg for account txs factory
popenta Jul 17, 2025
0b5050f
add gas limit arg for sc factory
popenta Jul 17, 2025
3601d0a
make gasLimit optional for multisig factory
popenta Jul 17, 2025
6231c80
fixes after reviews
popenta Jul 18, 2025
453232e
remove interaction and smart contract
popenta Jul 21, 2025
5c13171
initialize factories & contollers with gas estimator through entrypoint
popenta Jul 21, 2025
0dd75d0
make transaction factories methods async
popenta Jul 21, 2025
5282fbe
fixes and cookbook update
popenta Jul 21, 2025
86f6643
add extra gas for guarded unguardAccount transaction
popenta Jul 22, 2025
858dd2c
fixes after review
popenta Jul 22, 2025
32cfa40
Merge branch 'main' into gas-limit-estimator
popenta Jul 23, 2025
8729682
fixes after review
popenta Jul 23, 2025
6715383
fix typo
popenta Jul 23, 2025
cf44b68
Merge pull request #640 from multiversx/merge-main-in-feat-23-07
popenta Jul 23, 2025
f06f7fb
Merge branch 'feat/next' into gas-limit-estimator
popenta Jul 23, 2025
e0d849c
Merge pull request #635 from multiversx/gas-limit-estimator
popenta Jul 23, 2025
da3700d
switch to options for entrypoint constructor
popenta Jul 23, 2025
49f39eb
generate cookbook
popenta Jul 23, 2025
80bc089
Merge pull request #641 from multiversx/update-entrypoints
popenta Jul 23, 2025
c6a8c59
Remove deprecated code
danielailie Jul 23, 2025
0afb316
Merge branch 'feat/next' into TOOL-645-remove-deprecated-code-for-v-15
danielailie Jul 23, 2025
a3a4ff2
update error message
popenta Jul 23, 2025
ac75948
Fix deploy and upgrade tests
danielailie Jul 23, 2025
6786566
Merge pull request #643 from multiversx/update-error-message-gas-comp…
popenta Jul 23, 2025
a18a65b
Code review follow up
danielailie Jul 24, 2025
2d2be5f
Merge branch 'feat/next' into TOOL-645-remove-deprecated-code-for-v-15
danielailie Jul 24, 2025
992af33
Remove legacy var
danielailie Jul 24, 2025
9c7eab5
Merge pull request #642 from multiversx/TOOL-645-remove-deprecated-co…
danielailie Jul 24, 2025
c82ded4
Merge branch 'main' into Merge-main-in-next-branch
danielailie Jul 24, 2025
009ba80
Merge pull request #645 from multiversx/Merge-main-in-next-branch
danielailie Jul 24, 2025
6fc6789
Add actual implementation for load abi and load bytecode
danielailie Jul 24, 2025
9a31c58
Fix abi path
danielailie Jul 24, 2025
bcabbdd
Fix documentation
danielailie Jul 25, 2025
5b875d8
Bump version
danielailie Jul 25, 2025
0d7b3ff
patch estimate gas endpoints
popenta Jul 25, 2025
fb22dc0
fixes and add test
popenta Jul 25, 2025
8d5f178
fix path inconsistency
danielailie Jul 25, 2025
c988575
add more asserts
popenta Jul 25, 2025
8a7adf9
Merge pull request #646 from multiversx/TOOL-647-update-documentation…
danielailie Jul 25, 2025
dfd071d
Merge branch 'feat/next' into gas-estimator-fixes
popenta Jul 25, 2025
e4eb233
Merge pull request #647 from multiversx/gas-estimator-fixes
popenta Jul 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cookbook/accountManagement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ import { Account, Address, DevnetEntrypoint } from "../src"; // md-ignore
const filePath = path.join("../src", "testdata", "testwallets", "alice.pem");
const alice = await Account.newFromPem(filePath);

const transaction = await factory.createTransactionForUnguardingAccount(alice.address);
const transaction = await factory.createTransactionForUnguardingAccount(alice.address, {});

// fetch the nonce of the network // md-as-comment
alice.nonce = await entrypoint.recallAccountNonce(alice.address);
Expand Down
134 changes: 100 additions & 34 deletions cookbook/cookbook.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions cookbook/entrypoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ import { DevnetEntrypoint } from "../src"; // md-ignore
// If you'd like to connect to a third-party API, you can specify the url parameter:

// ```js
const apiEntrypoint = new DevnetEntrypoint("https://custom-multiversx-devnet-api.com");
const apiEntrypoint = new DevnetEntrypoint({ url: "https://custom-multiversx-devnet-api.com" });
// ```

// #### Using a Proxy

// By default, the DevnetEntrypoint uses the standard API. However, you can create a custom entrypoint that interacts with a proxy by specifying the kind parameter:

// ```js
const customEntrypoint = new DevnetEntrypoint("https://devnet-gateway.multiversx.com", "proxy");
const customEntrypoint = new DevnetEntrypoint({ url: "https://devnet-gateway.multiversx.com", kind: "proxy" });
// ```
})().catch((e) => {
console.log({ e });
Expand Down
12 changes: 6 additions & 6 deletions cookbook/generate.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import re
from pathlib import Path
from typing import Dict, List
from typing import List

current_dir = Path(__file__).parent.absolute()

Expand Down Expand Up @@ -32,7 +32,7 @@

# we don't want this ceremonial piece of code to show up in the rendered cookbook
TO_REMOVE = [
"""(async () => {""",
"""(async () => {""",
"""})().catch((e) => {
console.log({ e });
});"""]
Expand All @@ -59,12 +59,12 @@ def main():
def render_file(input_file: Path) -> List[str]:
input_text = input_file.read_text()

for item in TO_REMOVE:
for item in TO_REMOVE:
input_text = input_text.replace(item, "")

input_lines = input_text.splitlines()
start = input_lines.index(DIRECTIVE_START)

input_lines = input_lines[start:]
output_lines: List[str] = []

Expand All @@ -86,9 +86,9 @@ def render_file(input_file: Path) -> List[str]:

if is_comment and not should_keep_as_comment:
line = line.strip().strip("/").strip()
else:
else:
if line.startswith(TO_UNINDENT_SPACE):
line = line[len(TO_UNINDENT_SPACE):]
line = line[len(TO_UNINDENT_SPACE):]



Expand Down
4 changes: 2 additions & 2 deletions cookbook/governance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ import { Account, DevnetEntrypoint, GovernanceTransactionsOutcomeParser, Vote }

const commitHash = "1db734c0315f9ec422b88f679ccfe3e0197b9d67";

const transaction = factory.createTransactionForNewProposal(alice.address, {
const transaction = await factory.createTransactionForNewProposal(alice.address, {
commitHash: commitHash,
startVoteEpoch: 10,
endVoteEpoch: 15,
Expand Down Expand Up @@ -127,7 +127,7 @@ import { Account, DevnetEntrypoint, GovernanceTransactionsOutcomeParser, Vote }
const filePath = path.join("../src", "testdata", "testwallets", "alice.pem");
const alice = await Account.newFromPem(filePath);

const transaction = factory.createTransactionForVoting(alice.address, {
const transaction = await factory.createTransactionForVoting(alice.address, {
proposalNonce: 1,
vote: Vote.YES,
});
Expand Down
34 changes: 24 additions & 10 deletions cookbook/multisig.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import * as fs from "fs"; // md-ignore
import path from "path"; // md-ignore
import { Account, Address, DevnetEntrypoint, TransactionWatcher } from "../src"; // md-ignore
import { MultisigTransactionsOutcomeParser } from "../src/multisig/multisigTransactionsOutcomeParser";
import { loadAbiRegistry, loadContractCode } from "../src/testutils";
import { Abi, Account, Address, DevnetEntrypoint, MultisigTransactionsOutcomeParser, TransactionWatcher } from "../src"; // md-ignore
// md-start
(async () => {
// ### Multisig
Expand All @@ -17,8 +16,11 @@ import { loadAbiRegistry, loadContractCode } from "../src/testutils";
// #### Deploying a Multisig Smart Contract using the controller
// ```js
{
const abi = await loadAbiRegistry("src/testdata/multisig-full.abi.json");
const bytecode = await loadContractCode("src/testdata/multisig-full.wasm");
const jsonContent: string = await fs.promises.readFile("src/testdata/multisig-full.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const bytecode = await fs.promises.readFile("src/testdata/multisig-full.wasm");

// create the entrypoint and the multisig controller // md-as-comment
const entrypoint = new DevnetEntrypoint();
Expand Down Expand Up @@ -53,8 +55,11 @@ import { loadAbiRegistry, loadContractCode } from "../src/testutils";
// #### Deploying a Multisig Smart Contract using the factory
// ```js
{
const abi = await loadAbiRegistry("src/testdata/multisig-full.abi.json");
const bytecode = await loadContractCode("src/testdata/multisig-full.wasm");
const jsonContent: string = await fs.promises.readFile("src/testdata/multisig-full.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const bytecode = await fs.promises.readFile("src/testdata/multisig-full.wasm");

// create the entrypoint and the multisig factory // md-as-comment
const entrypoint = new DevnetEntrypoint();
Expand Down Expand Up @@ -89,9 +94,12 @@ import { loadAbiRegistry, loadContractCode } from "../src/testutils";

// ```js
{
const jsonContent: string = await fs.promises.readFile("src/testdata/multisig-full.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
// create the entrypoint and the multisig controller // md-as-comment
const entrypoint = new DevnetEntrypoint();
const abi = await loadAbiRegistry("src/testdata/multisig-full.abi.json");
const controller = entrypoint.createMultisigController(abi);

const filePath = path.join("../src", "testdata", "testwallets", "alice.pem");
Expand Down Expand Up @@ -126,7 +134,10 @@ import { loadAbiRegistry, loadContractCode } from "../src/testutils";

// ```js
{
const abi = await loadAbiRegistry("src/testdata/multisig-full.abi.json");
const jsonContent: string = await fs.promises.readFile("src/testdata/multisig-full.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));

// create the entrypoint and the multisig factory // md-as-comment
const entrypoint = new DevnetEntrypoint();
Expand Down Expand Up @@ -172,7 +183,10 @@ import { loadAbiRegistry, loadContractCode } from "../src/testutils";

// ```js
{
const abi = await loadAbiRegistry("src/testdata/multisig-full.abi.json");
const jsonContent: string = await fs.promises.readFile("src/testdata/multisig-full.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));

// create the entrypoint and the multisig controller // md-as-comment
const entrypoint = new DevnetEntrypoint();
Expand Down
74 changes: 52 additions & 22 deletions cookbook/smartContracts.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import axios from "axios"; // md-ignore
import { promises } from "fs"; // md-ignore
import * as fs from "fs"; // md-ignore
import path from "path"; // md-ignore
import {
Abi,
Expand All @@ -20,7 +20,6 @@ import {
U32Value,
U64Value,
} from "../src"; // md-ignore
import { loadAbiRegistry } from "../src/testutils";
// md-start
(async () => {
// ### Smart Contracts
Expand All @@ -33,9 +32,8 @@ import { loadAbiRegistry } from "../src/testutils";
// #### Loading the ABI from a file
// ```js
{
let abiJson = await promises.readFile("../src/testData/adder.abi.json", { encoding: "utf8" });
let abiObj = JSON.parse(abiJson);
let abi = Abi.create(abiObj);
let abiJson = await fs.promises.readFile("../src/testdata/adder.abi.json", { encoding: "utf8" });
const abi = Abi.create(JSON.parse(abiJson));
}
// ```

Expand Down Expand Up @@ -104,9 +102,12 @@ import { loadAbiRegistry } from "../src/testutils";
sender.nonce = await entrypoint.recallAccountNonce(sender.address);

// load the contract bytecode
const bytecode = await promises.readFile("../src/testData/adder.wasm");
const bytecode = await fs.promises.readFile("../src/testdata/adder.wasm");
// load the abi file
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));

const controller = entrypoint.createSmartContractController(abi);

Expand Down Expand Up @@ -142,8 +143,10 @@ import { loadAbiRegistry } from "../src/testutils";
// ```js
{
// We use the transaction hash we got when broadcasting the transaction

const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const entrypoint = new DevnetEntrypoint();
const controller = entrypoint.createSmartContractController(abi);
const outcome = await controller.awaitCompletedDeploy("txHash"); // waits for transaction completion and parses the result
Expand Down Expand Up @@ -176,7 +179,7 @@ import { loadAbiRegistry } from "../src/testutils";
{
const entrypoint = new DevnetEntrypoint();
const factory = entrypoint.createSmartContractTransactionsFactory();
const bytecode = await promises.readFile("../contracts/adder.wasm");
const bytecode = await fs.promises.readFile("../contracts/adder.wasm");

// For deploy arguments, use "TypedValue" objects if you haven't provided an ABI to the factory: // md-as-comment
let args: any[] = [new BigUIntValue(42)];
Expand All @@ -185,7 +188,7 @@ import { loadAbiRegistry } from "../src/testutils";

const filePath = path.join("../src", "testdata", "testwallets", "alice.pem");
const alice = await Account.newFromPem(filePath);
const deployTransaction = factory.createTransactionForDeploy(alice.address, {
const deployTransaction = await factory.createTransactionForDeploy(alice.address, {
bytecode: bytecode,
gasLimit: 6000000n,
arguments: args,
Expand All @@ -209,7 +212,7 @@ import { loadAbiRegistry } from "../src/testutils";
const factory = entrypoint.createSmartContractTransactionsFactory();

// load the contract bytecode
const bytecode = await promises.readFile("../src/testData/adder.wasm");
const bytecode = await fs.promises.readFile("../src/testdata/adder.wasm");

// For deploy arguments, use "TypedValue" objects if you haven't provided an ABI to the factory: // md-as-comment
let args: any[] = [new BigUIntValue(42)];
Expand Down Expand Up @@ -265,7 +268,10 @@ import { loadAbiRegistry } from "../src/testutils";
sender.nonce = await entrypoint.recallAccountNonce(sender.address);

// load the abi file
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const controller = entrypoint.createSmartContractController(abi);

const contractAddress = Address.newFromBech32("erd1qqqqqqqqqqqqqpgq7cmfueefdqkjsnnjnwydw902v8pwjqy3d8ssd4meug");
Expand Down Expand Up @@ -317,7 +323,10 @@ import { loadAbiRegistry } from "../src/testutils";
sender.nonce = await entrypoint.recallAccountNonce(sender.address);

// load the abi file
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));

// get the smart contracts controller
const controller = entrypoint.createSmartContractController(abi);
Expand Down Expand Up @@ -407,7 +416,10 @@ import { loadAbiRegistry } from "../src/testutils";
{
// load the abi file
const entrypoint = new DevnetEntrypoint();
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const parser = new SmartContractTransactionsOutcomeParser({ abi });
const txHash = "b3ae88ad05c464a74db73f4013de05abcfcb4fb6647c67a262a6cfdf330ef4a9";
const transactionOnNetwork = await entrypoint.getTransaction(txHash);
Expand All @@ -426,7 +438,10 @@ import { loadAbiRegistry } from "../src/testutils";
{
// load the abi files
const entrypoint = new DevnetEntrypoint();
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const parser = new TransactionEventsParser({ abi });
const txHash = "b3ae88ad05c464a74db73f4013de05abcfcb4fb6647c67a262a6cfdf330ef4a9";
const transactionOnNetwork = await entrypoint.getTransaction(txHash);
Expand All @@ -441,7 +456,10 @@ import { loadAbiRegistry } from "../src/testutils";
// Let's encode a struct called EsdtTokenPayment (of [multisig](https://github.com/multiversx/mx-contracts-rs/tree/main/contracts/multisig) contract) into binary data.
// ```js
{
const abi = await loadAbiRegistry("../src/testdata/multisig-full.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/multisig-full.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const paymentType = abi.getStruct("EsdtTokenPayment");
const codec = new BinaryCodec();

Expand All @@ -460,7 +478,10 @@ import { loadAbiRegistry } from "../src/testutils";
// Now let's decode a struct using the ABI.
// ```js
{
const abi = await loadAbiRegistry("../src/testdata/multisig-full.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/multisig-full.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));
const actionStructType = abi.getEnum("Action");
const data = Buffer.from(
"0500000000000000000500d006f73c4221216fa679bc559005584c4f1160e569e1000000012a0000000003616464000000010000000107",
Expand All @@ -483,7 +504,10 @@ import { loadAbiRegistry } from "../src/testutils";
{
const entrypoint = new DevnetEntrypoint();
const contractAddress = Address.newFromBech32("erd1qqqqqqqqqqqqqpgq7cmfueefdqkjsnnjnwydw902v8pwjqy3d8ssd4meug");
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));

// create the controller
const controller = entrypoint.createSmartContractController(abi);
Expand All @@ -501,7 +525,10 @@ import { loadAbiRegistry } from "../src/testutils";
const entrypoint = new DevnetEntrypoint();

// load the abi
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));

// the contract address we'll query
const contractAddress = Address.newFromBech32("erd1qqqqqqqqqqqqqpgq7cmfueefdqkjsnnjnwydw902v8pwjqy3d8ssd4meug");
Expand Down Expand Up @@ -534,13 +561,16 @@ import { loadAbiRegistry } from "../src/testutils";
sender.nonce = await entrypoint.recallAccountNonce(sender.address);

// load the abi
const abi = await loadAbiRegistry("../src/testdata/adder.abi.json");
const jsonContent: string = await fs.promises.readFile("../src/testdata/adder.abi.json", {
encoding: "utf8",
});
const abi = Abi.create(JSON.parse(jsonContent));

// create the controller
const controller = entrypoint.createSmartContractController(abi);

// load the contract bytecode; this is the new contract code, the one we want to upgrade to
const bytecode = await promises.readFile("../src/testData/adder.wasm");
const bytecode = await fs.promises.readFile("../src/testdata/adder.wasm");

// For deploy arguments, use "TypedValue" objects if you haven't provided an ABI to the factory: // md-as-comment
let args: any[] = [new U32Value(42)];
Expand Down
Loading
Loading