diff --git a/package-lock.json b/package-lock.json index 28ac6bdd1..73f49d64b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@multiversx/sdk-core", - "version": "13.17.1", + "version": "14.0.0-beta.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@multiversx/sdk-core", - "version": "13.17.1", + "version": "14.0.0-beta.0", "license": "MIT", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", @@ -1779,10 +1779,11 @@ } }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -6586,9 +6587,9 @@ } }, "elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "requires": { "bn.js": "^4.11.9", diff --git a/package.json b/package.json index fa4d76b4a..42dee64ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@multiversx/sdk-core", - "version": "13.17.1", + "version": "14.0.0-beta.0", "description": "MultiversX SDK for JavaScript and TypeScript", "author": "MultiversX", "homepage": "https://multiversx.com", diff --git a/src/abi/interaction.spec.ts b/src/abi/interaction.spec.ts index d00d31b18..40a3c361b 100644 --- a/src/abi/interaction.spec.ts +++ b/src/abi/interaction.spec.ts @@ -6,7 +6,7 @@ import { SmartContractQueryResponse } from "../core/smartContractQuery"; import { Token, TokenTransfer } from "../core/tokens"; import { Transaction } from "../core/transaction"; import { SmartContractController } from "../smartContracts"; -import { loadAbiRegistry, MockNetworkProvider, setupUnitTestWatcherTimeouts } from "../testutils"; +import { loadAbiRegistry, MockNetworkProvider } from "../testutils"; import { getTestWalletsPath } from "../testutils/utils"; import { ContractFunction } from "./function"; import { Interaction } from "./interaction"; @@ -204,8 +204,7 @@ describe("test smart contract interactor", function () { }); it("should interact with 'answer'", async function () { - setupUnitTestWatcherTimeouts(); - + this.timeout(30000); let abiRegistry = await loadAbiRegistry("src/testdata/answer.abi.json"); let contract = new SmartContract({ address: dummyAddress, abi: abiRegistry }); let controller = new SmartContractController({ chainID: "D", networkProvider: provider, abi: abiRegistry }); @@ -270,8 +269,7 @@ describe("test smart contract interactor", function () { }); it("should interact with 'counter'", async function () { - setupUnitTestWatcherTimeouts(); - + this.timeout(30000); let abi = await loadAbiRegistry("src/testdata/counter.abi.json"); let contract = new SmartContract({ address: dummyAddress, abi: abi }); let controller = new SmartContractController({ chainID: "D", networkProvider: provider, abi: abi }); @@ -339,8 +337,7 @@ describe("test smart contract interactor", function () { }); it("should interact with 'lottery-esdt'", async function () { - setupUnitTestWatcherTimeouts(); - + this.timeout(30000); let abiRegistry = await loadAbiRegistry("src/testdata/lottery-esdt.abi.json"); let contract = new SmartContract({ address: dummyAddress, abi: abiRegistry }); let controller = new SmartContractController({ chainID: "D", networkProvider: provider, abi: abiRegistry }); diff --git a/src/abi/smartContract.local.net.spec.ts b/src/abi/smartContract.local.net.spec.ts index 24482aa2b..9e97bbfb6 100644 --- a/src/abi/smartContract.local.net.spec.ts +++ b/src/abi/smartContract.local.net.spec.ts @@ -34,20 +34,23 @@ describe("test on local testnet", function () { bob = await Account.newFromPem(`${getTestWalletsPath()}/bob.pem`); carol = await Account.newFromPem(`${getTestWalletsPath()}/carol.pem`); - watcher = new TransactionWatcher({ - getTransaction: async (hash: string) => { - return await provider.getTransaction(hash); + watcher = new TransactionWatcher( + { + getTransaction: async (hash: string) => { + return await provider.getTransaction(hash); + }, }, - }); + { + pollingIntervalMilliseconds: 5000, + timeoutMilliseconds: 50000, + }, + ); parser = new SmartContractTransactionsOutcomeParser(); }); it("counter: should deploy, then simulate transactions using SmartContractTransactionsFactory", async function () { this.timeout(60000); - TransactionWatcher.DefaultPollingInterval = 5000; - TransactionWatcher.DefaultTimeout = 50000; - let network = await provider.getNetworkConfig(); const config = new TransactionsFactoryConfig({ chainID: network.chainID }); @@ -121,9 +124,6 @@ describe("test on local testnet", function () { it("counter: should deploy, call and query contract using SmartContractTransactionsFactory", async function () { this.timeout(80000); - TransactionWatcher.DefaultPollingInterval = 5000; - TransactionWatcher.DefaultTimeout = 50000; - let network = await provider.getNetworkConfig(); const config = new TransactionsFactoryConfig({ chainID: network.chainID }); @@ -187,9 +187,6 @@ describe("test on local testnet", function () { it("erc20: should deploy, call and query contract using SmartContractTransactionsFactory", async function () { this.timeout(60000); - TransactionWatcher.DefaultPollingInterval = 5000; - TransactionWatcher.DefaultTimeout = 50000; - let network = await provider.getNetworkConfig(); const config = new TransactionsFactoryConfig({ chainID: network.chainID }); @@ -277,10 +274,6 @@ describe("test on local testnet", function () { it("lottery: should deploy, call and query contract using SmartContractTransactionsFactory", async function () { this.timeout(60000); - - TransactionWatcher.DefaultPollingInterval = 5000; - TransactionWatcher.DefaultTimeout = 50000; - let network = await provider.getNetworkConfig(); alice.nonce = (await provider.getAccount(alice.address)).nonce; diff --git a/src/abi/smartContract.spec.ts b/src/abi/smartContract.spec.ts index c53bee3e7..e2a10d45e 100644 --- a/src/abi/smartContract.spec.ts +++ b/src/abi/smartContract.spec.ts @@ -4,13 +4,7 @@ import { Address } from "../core/address"; import { TransactionComputer } from "../core/transactionComputer"; import { TransactionStatus } from "../core/transactionStatus"; import { TransactionWatcher } from "../core/transactionWatcher"; -import { - getTestWalletsPath, - MarkCompleted, - MockNetworkProvider, - setupUnitTestWatcherTimeouts, - Wait, -} from "../testutils"; +import { getTestWalletsPath, MarkCompleted, MockNetworkProvider, Wait } from "../testutils"; import { Code } from "./code"; import { ContractFunction } from "./function"; import { SmartContract } from "./smartContract"; @@ -41,8 +35,10 @@ describe("test contract", () => { }); it("should deploy", async () => { - setupUnitTestWatcherTimeouts(); - let watcher = new TransactionWatcher(provider); + let watcher = new TransactionWatcher(provider, { + pollingIntervalMilliseconds: 42, + timeoutMilliseconds: 42 * 42, + }); let contract = new SmartContract(); let deployTransaction = contract.deploy({ @@ -87,8 +83,10 @@ describe("test contract", () => { }); it("should call", async () => { - setupUnitTestWatcherTimeouts(); - let watcher = new TransactionWatcher(provider); + let watcher = new TransactionWatcher(provider, { + pollingIntervalMilliseconds: 42, + timeoutMilliseconds: 42 * 42, + }); let contract = new SmartContract({ address: new Address("erd1qqqqqqqqqqqqqpgqak8zt22wl2ph4tswtyc39namqx6ysa2sd8ss4xmlj3"), @@ -154,8 +152,10 @@ describe("test contract", () => { }); it("should upgrade", async () => { - setupUnitTestWatcherTimeouts(); - let watcher = new TransactionWatcher(provider); + let watcher = new TransactionWatcher(provider, { + pollingIntervalMilliseconds: 42, + timeoutMilliseconds: 42 * 42, + }); let contract = new SmartContract(); contract.setAddress(Address.newFromBech32("erd1qqqqqqqqqqqqqpgq3ytm9m8dpeud35v3us20vsafp77smqghd8ss4jtm0q")); diff --git a/src/abi/smartContractResults.local.net.spec.ts b/src/abi/smartContractResults.local.net.spec.ts index e8a3411ef..b66dbbd51 100644 --- a/src/abi/smartContractResults.local.net.spec.ts +++ b/src/abi/smartContractResults.local.net.spec.ts @@ -17,11 +17,17 @@ describe("fetch transactions from local testnet", function () { before(async function () { alice = await Account.newFromPem(`${getTestWalletsPath()}/alice.pem`); - watcher = new TransactionWatcher({ - getTransaction: async (hash: string) => { - return await provider.getTransaction(hash); + watcher = new TransactionWatcher( + { + getTransaction: async (hash: string) => { + return await provider.getTransaction(hash); + }, }, - }); + { + pollingIntervalMilliseconds: 5000, + timeoutMilliseconds: 50000, + }, + ); parser = new SmartContractTransactionsOutcomeParser(); }); @@ -29,9 +35,6 @@ describe("fetch transactions from local testnet", function () { it("counter smart contract", async function () { this.timeout(60000); - TransactionWatcher.DefaultPollingInterval = 5000; - TransactionWatcher.DefaultTimeout = 50000; - let network = await provider.getNetworkConfig(); alice.nonce = (await provider.getAccount(alice.address)).nonce; @@ -78,9 +81,6 @@ describe("fetch transactions from local testnet", function () { it("interact with counter smart contract using SmartContractTransactionsFactory", async function () { this.timeout(60000); - TransactionWatcher.DefaultPollingInterval = 5000; - TransactionWatcher.DefaultTimeout = 50000; - let network = await provider.getNetworkConfig(); const config = new TransactionsFactoryConfig({ chainID: network.chainID }); diff --git a/src/accountManagement/accountController.ts b/src/accountManagement/accountController.ts index f7a67eef6..e4cb9c455 100644 --- a/src/accountManagement/accountController.ts +++ b/src/accountManagement/accountController.ts @@ -1,4 +1,5 @@ import { IAccount } from "../accounts/interfaces"; +import { Address } from "../core"; import { Transaction } from "../core/transaction"; import { TransactionComputer } from "../core/transactionComputer"; import { TransactionsFactoryConfig } from "../core/transactionsFactoryConfig"; @@ -19,10 +20,12 @@ export class AccountController { async createTransactionForSavingKeyValue( sender: IAccount, nonce: bigint, - options: SaveKeyValueInput, + options: SaveKeyValueInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSavingKeyValue(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -32,28 +35,40 @@ export class AccountController { async createTransactionForSettingGuardian( sender: IAccount, nonce: bigint, - options: SetGuardianInput, + options: SetGuardianInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingGuardian(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); return transaction; } - async createTransactionForGuardingAccount(sender: IAccount, nonce: bigint): Promise { + async createTransactionForGuardingAccount( + sender: IAccount, + nonce: bigint, + options: { relayer?: Address }, + ): Promise { const transaction = this.factory.createTransactionForGuardingAccount(sender.address); - + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); return transaction; } - async createTransactionForUnguardingAccount(sender: IAccount, nonce: bigint): Promise { + async createTransactionForUnguardingAccount( + sender: IAccount, + nonce: bigint, + options: { guardian: Address; relayer?: Address }, + ): Promise { const transaction = this.factory.createTransactionForUnguardingAccount(sender.address); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); diff --git a/src/core/transactionWatcher.ts b/src/core/transactionWatcher.ts index 3442b117b..08defcb89 100644 --- a/src/core/transactionWatcher.ts +++ b/src/core/transactionWatcher.ts @@ -1,5 +1,4 @@ import { AsyncTimer } from "./asyncTimer"; -import { HEX_TRANSACTION_HASH_LENGTH } from "./constants"; import { Err, ErrExpectedTransactionEventsNotFound, @@ -14,20 +13,13 @@ import { TransactionStatus } from "./transactionStatus"; export type PredicateIsAwaitedStatus = (status: TransactionStatus) => boolean; -/** - * Internal interface: a transaction, as seen from the perspective of a {@link TransactionWatcher}. - */ -interface ITransaction { - getHash(): { hex(): string }; -} - /** * TransactionWatcher allows one to continuously watch (monitor), by means of polling, the status of a given transaction. */ export class TransactionWatcher { - static DefaultPollingInterval: number = 6000; - static DefaultTimeout: number = TransactionWatcher.DefaultPollingInterval * 15; - static DefaultPatience: number = 0; + private static DefaultPollingInterval: number = 6000; + private static DefaultTimeout: number = TransactionWatcher.DefaultPollingInterval * 15; + private static DefaultPatience: number = 0; static NoopOnStatusReceived = (_: TransactionStatus) => {}; @@ -64,11 +56,10 @@ export class TransactionWatcher { * Waits until the transaction reaches the "pending" status. * @param txHash The hex-encoded transaction hash */ - public async awaitPending(transactionOrTxHash: ITransaction | string): Promise { + public async awaitPending(txHash: string): Promise { const isPending = (transaction: TransactionOnNetwork) => transaction.status.isPending(); const doFetch = async () => { - const hash = this.transactionOrTxHashToTxHash(transactionOrTxHash); - return await this.fetcher.getTransaction(hash); + return await this.fetcher.getTransaction(txHash); }; const errorProvider = () => new ErrExpectedTransactionStatusNotReached(); @@ -79,24 +70,20 @@ export class TransactionWatcher { * Waits until the transaction is completely processed. * @param txHash The hex-encoded transaction hash */ - public async awaitCompleted(transactionOrTxHash: ITransaction | string): Promise { + public async awaitCompleted(txhash: string): Promise { const isCompleted = (transactionOnNetwork: TransactionOnNetwork) => { return transactionOnNetwork.status.isCompleted(); }; const doFetch = async () => { - const hash = this.transactionOrTxHashToTxHash(transactionOrTxHash); - return await this.fetcher.getTransaction(hash); + return await this.fetcher.getTransaction(txhash); }; const errorProvider = () => new ErrExpectedTransactionStatusNotReached(); return this.awaitConditionally(isCompleted, doFetch, errorProvider); } - public async awaitAllEvents( - transactionOrTxHash: ITransaction | string, - events: string[], - ): Promise { + public async awaitAllEvents(txHash: string, events: string[]): Promise { const foundAllEvents = (transactionOnNetwork: TransactionOnNetwork) => { const allEventIdentifiers = this.getAllTransactionEvents(transactionOnNetwork).map( (event) => event.identifier, @@ -106,18 +93,14 @@ export class TransactionWatcher { }; const doFetch = async () => { - const hash = this.transactionOrTxHashToTxHash(transactionOrTxHash); - return await this.fetcher.getTransaction(hash); + return await this.fetcher.getTransaction(txHash); }; const errorProvider = () => new ErrExpectedTransactionEventsNotFound(); return this.awaitConditionally(foundAllEvents, doFetch, errorProvider); } - public async awaitAnyEvent( - transactionOrTxHash: ITransaction | string, - events: string[], - ): Promise { + public async awaitAnyEvent(txHash: string, events: string[]): Promise { const foundAnyEvent = (transactionOnNetwork: TransactionOnNetwork) => { const allEventIdentifiers = this.getAllTransactionEvents(transactionOnNetwork).map( (event) => event.identifier, @@ -127,8 +110,7 @@ export class TransactionWatcher { }; const doFetch = async () => { - const hash = this.transactionOrTxHashToTxHash(transactionOrTxHash); - return await this.fetcher.getTransaction(hash); + return await this.fetcher.getTransaction(txHash); }; const errorProvider = () => new ErrExpectedTransactionEventsNotFound(); @@ -136,31 +118,17 @@ export class TransactionWatcher { } public async awaitOnCondition( - transactionOrTxHash: ITransaction | string, + txHash: string, condition: (data: TransactionOnNetwork) => boolean, ): Promise { const doFetch = async () => { - const hash = this.transactionOrTxHashToTxHash(transactionOrTxHash); - return await this.fetcher.getTransaction(hash); + return await this.fetcher.getTransaction(txHash); }; const errorProvider = () => new ErrExpectedTransactionStatusNotReached(); return this.awaitConditionally(condition, doFetch, errorProvider); } - private transactionOrTxHashToTxHash(transactionOrTxHash: ITransaction | string): string { - const hash = - typeof transactionOrTxHash === "string" ? transactionOrTxHash : transactionOrTxHash.getHash().hex(); - - if (hash.length !== HEX_TRANSACTION_HASH_LENGTH) { - throw new Err( - `Invalid transaction hash length. The length of a hex encoded hash should be ${HEX_TRANSACTION_HASH_LENGTH}.`, - ); - } - - return hash; - } - protected async awaitConditionally( isSatisfied: (data: TData) => boolean, doFetch: () => Promise, diff --git a/src/delegation/delegationController.ts b/src/delegation/delegationController.ts index 1d21ce731..f0c0f0f3e 100644 --- a/src/delegation/delegationController.ts +++ b/src/delegation/delegationController.ts @@ -1,4 +1,5 @@ import { IAccount } from "../accounts/interfaces"; +import { Address } from "../core"; import { Transaction } from "../core/transaction"; import { TransactionComputer } from "../core/transactionComputer"; import { TransactionOnNetwork } from "../core/transactionOnNetwork"; @@ -27,10 +28,12 @@ export class DelegationController { async createTransactionForNewDelegationContract( sender: IAccount, nonce: bigint, - options: resources.NewDelegationContractInput, + options: resources.NewDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForNewDelegationContract(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -49,10 +52,12 @@ export class DelegationController { async createTransactionForAddingNodes( sender: IAccount, nonce: bigint, - options: resources.AddNodesInput, + options: resources.AddNodesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForAddingNodes(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -62,10 +67,12 @@ export class DelegationController { async createTransactionForRemovingNodes( sender: IAccount, nonce: bigint, - options: resources.ManageNodesInput, + options: resources.ManageNodesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForRemovingNodes(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -75,10 +82,12 @@ export class DelegationController { async createTransactionForStakingNodes( sender: IAccount, nonce: bigint, - options: resources.ManageNodesInput, + options: resources.ManageNodesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForStakingNodes(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -88,10 +97,12 @@ export class DelegationController { async createTransactionForUnbondingNodes( sender: IAccount, nonce: bigint, - options: resources.ManageNodesInput, + options: resources.ManageNodesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnbondingNodes(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -101,10 +112,12 @@ export class DelegationController { async createTransactionForUnstakingNodes( sender: IAccount, nonce: bigint, - options: resources.ManageNodesInput, + options: resources.ManageNodesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnstakingNodes(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -114,10 +127,12 @@ export class DelegationController { async createTransactionForUnjailingNodes( sender: IAccount, nonce: bigint, - options: resources.UnjailingNodesInput, + options: resources.UnjailingNodesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnjailingNodes(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -127,10 +142,12 @@ export class DelegationController { async createTransactionForChangingServiceFee( sender: IAccount, nonce: bigint, - options: resources.ChangeServiceFee, + options: resources.ChangeServiceFee & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForChangingServiceFee(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -140,10 +157,12 @@ export class DelegationController { async createTransactionForModifyingDelegationCap( sender: IAccount, nonce: bigint, - options: resources.ModifyDelegationCapInput, + options: resources.ModifyDelegationCapInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForModifyingDelegationCap(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -153,10 +172,12 @@ export class DelegationController { async createTransactionForSettingAutomaticActivation( sender: IAccount, nonce: bigint, - options: resources.ManageDelegationContractInput, + options: resources.ManageDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingAutomaticActivation(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -166,10 +187,12 @@ export class DelegationController { async createTransactionForUnsettingAutomaticActivation( sender: IAccount, nonce: bigint, - options: resources.ManageDelegationContractInput, + options: resources.ManageDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnsettingAutomaticActivation(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -179,13 +202,15 @@ export class DelegationController { async createTransactionForSettingCapCheckOnRedelegateRewards( sender: IAccount, nonce: bigint, - options: resources.ManageDelegationContractInput, + options: resources.ManageDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingCapCheckOnRedelegateRewards( sender.address, options, ); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -195,13 +220,15 @@ export class DelegationController { async createTransactionForUnsettingCapCheckOnRedelegateRewards( sender: IAccount, nonce: bigint, - options: resources.ManageDelegationContractInput, + options: resources.ManageDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnsettingCapCheckOnRedelegateRewards( sender.address, options, ); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -211,10 +238,12 @@ export class DelegationController { async createTransactionForSettingMetadata( sender: IAccount, nonce: bigint, - options: resources.SetContractMetadataInput, + options: resources.SetContractMetadataInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingMetadata(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -224,10 +253,12 @@ export class DelegationController { async createTransactionForDelegating( sender: IAccount, nonce: bigint, - options: resources.DelegateActionsInput, + options: resources.DelegateActionsInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForDelegating(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -237,10 +268,12 @@ export class DelegationController { async createTransactionForClaimingRewards( sender: IAccount, nonce: bigint, - options: resources.ManageDelegationContractInput, + options: resources.ManageDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForClaimingRewards(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -250,10 +283,12 @@ export class DelegationController { async createTransactionForRedelegatingRewards( sender: IAccount, nonce: bigint, - options: resources.ManageDelegationContractInput, + options: resources.ManageDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForRedelegatingRewards(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -263,10 +298,12 @@ export class DelegationController { async createTransactionForUndelegating( sender: IAccount, nonce: bigint, - options: resources.DelegateActionsInput, + options: resources.DelegateActionsInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUndelegating(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -276,11 +313,14 @@ export class DelegationController { async createTransactionForWithdrawing( sender: IAccount, nonce: bigint, - options: resources.ManageDelegationContractInput, + options: resources.ManageDelegationContractInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForWithdrawing(sender.address, options); transaction.nonce = nonce; + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); + transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); return transaction; diff --git a/src/entrypoints/entrypoints.spec.ts b/src/entrypoints/entrypoints.spec.ts index efaf9ba4b..742bb3cd8 100644 --- a/src/entrypoints/entrypoints.spec.ts +++ b/src/entrypoints/entrypoints.spec.ts @@ -6,7 +6,7 @@ import { Address } from "../core"; import { loadAbiRegistry } from "../testutils"; import { DevnetEntrypoint } from "./entrypoints"; -describe("TestEntrypoint", () => { +describe("TestEntrypoint", function () { const entrypoint = new DevnetEntrypoint(); before(async function () {}); @@ -32,10 +32,35 @@ describe("TestEntrypoint", () => { ); }); + it("native transfer with guardian and relayer", async () => { + const controller = entrypoint.createTransfersController(); + const filePath = path.join("src", "testdata", "testwallets"); + const sender = await Account.newFromPem(path.join(filePath, "alice.pem")); + const grace = await Account.newFromPem(path.join(filePath, "grace.pem")); + sender.nonce = 77777n; + + const transaction = await controller.createTransactionForTransfer( + sender, + BigInt(sender.getNonceThenIncrement().valueOf()), + { + receiver: sender.address, + nativeAmount: BigInt(0), + data: Buffer.from("hello"), + guardian: grace.address, + relayer: grace.address, + }, + ); + assert.deepEqual(transaction.guardian, grace.address); + assert.deepEqual(transaction.relayer, grace.address); + assert.deepEqual(transaction.guardianSignature, new Uint8Array()); + + assert.deepEqual(transaction.relayerSignature, new Uint8Array()); + }); + it("contract flow", async function () { this.timeout(30000); const abi = await loadAbiRegistry("src/testdata/adder.abi.json"); - const filePath = path.join("src", "testdata", "testwallets", "alice.pem"); + const filePath = path.join("src", "testdata", "testwallets", "grace.pem"); const sender = await Account.newFromPem(filePath); sender.nonce = await entrypoint.recallAccountNonce(sender.address); diff --git a/src/networkProviders/config.ts b/src/networkProviders/config.ts index 8239bfda9..c43ac48bd 100644 --- a/src/networkProviders/config.ts +++ b/src/networkProviders/config.ts @@ -1,6 +1,6 @@ import { IPagination } from "./interface"; -const JSONbig = require("json-bigint")({ constructorAction: 'ignore' }); +const JSONbig = require("json-bigint")({ constructorAction: "ignore" }); export const defaultAxiosConfig = { timeout: 5000, @@ -8,11 +8,11 @@ export const defaultAxiosConfig = { transformResponse: [ function (data: any) { return JSONbig.parse(data); - } - ] + }, + ], }; export const defaultPagination: IPagination = { from: 0, - size: 100 + size: 100, }; diff --git a/src/networkProviders/networkProviderConfig.ts b/src/networkProviders/networkProviderConfig.ts index b66bffbcc..6d1260e43 100644 --- a/src/networkProviders/networkProviderConfig.ts +++ b/src/networkProviders/networkProviderConfig.ts @@ -1,4 +1,4 @@ -import { AxiosRequestConfig } from 'axios'; +import { AxiosRequestConfig } from "axios"; export interface NetworkProviderConfig extends AxiosRequestConfig { clientName?: string; diff --git a/src/networkProviders/serialization.spec.ts b/src/networkProviders/serialization.spec.ts index 6ffc83096..217a0e071 100644 --- a/src/networkProviders/serialization.spec.ts +++ b/src/networkProviders/serialization.spec.ts @@ -8,9 +8,8 @@ describe("test JSON serialization", function () { }); it("should deserialize", async function () { - const JSONbig = require("json-bigint")({ constructorAction: 'ignore' }); + const JSONbig = require("json-bigint")({ constructorAction: "ignore" }); const data = `{"Costum":{"foo_constructor":1}}`; JSONbig.parse(data); }); }); - diff --git a/src/smartContracts/smartContractController.ts b/src/smartContracts/smartContractController.ts index 01a8327b1..5a7be445d 100644 --- a/src/smartContracts/smartContractController.ts +++ b/src/smartContracts/smartContractController.ts @@ -1,5 +1,6 @@ import { AbiRegistry, ArgSerializer, isTyped, NativeSerializer } from "../abi"; import { IAccount } from "../accounts/interfaces"; +import { Address } from "../core"; import { Err, ErrSmartContractQuery } from "../core/errors"; import { SmartContractQuery, SmartContractQueryInput, SmartContractQueryResponse } from "../core/smartContractQuery"; import { Transaction } from "../core/transaction"; @@ -35,10 +36,12 @@ export class SmartContractController { async createTransactionForDeploy( sender: IAccount, nonce: bigint, - options: resources.ContractDeployInput, + options: resources.ContractDeployInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForDeploy(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -57,10 +60,12 @@ export class SmartContractController { async createTransactionForUpgrade( sender: IAccount, nonce: bigint, - options: resources.ContractUpgradeInput, + options: resources.ContractUpgradeInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUpgrade(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -70,10 +75,12 @@ export class SmartContractController { async createTransactionForExecute( sender: IAccount, nonce: bigint, - options: resources.ContractExecuteInput, + options: resources.ContractExecuteInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForExecute(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); diff --git a/src/testutils/utils.ts b/src/testutils/utils.ts index e91531f5c..ce2f96c1a 100644 --- a/src/testutils/utils.ts +++ b/src/testutils/utils.ts @@ -4,7 +4,6 @@ import { resolve } from "path"; import { AbiRegistry, Code, SmartContract, TypedValue } from "../abi"; import { Account } from "../accounts"; import { Transaction } from "../core/transaction"; -import { TransactionWatcher } from "../core/transactionWatcher"; import { getAxios } from "../core/utils"; export async function prepareDeployment(obj: { @@ -81,11 +80,6 @@ export function isOnBrowserTests() { return isOnTests; } -export function setupUnitTestWatcherTimeouts() { - TransactionWatcher.DefaultPollingInterval = 42; - TransactionWatcher.DefaultTimeout = 42 * 42; -} - export function createAccountBalance(egld: number): bigint { return BigInt(egld.toString() + "0".repeat(18)); } diff --git a/src/tokenManagement/tokenManagementController.ts b/src/tokenManagement/tokenManagementController.ts index a3a3bfd77..e63821477 100644 --- a/src/tokenManagement/tokenManagementController.ts +++ b/src/tokenManagement/tokenManagementController.ts @@ -1,4 +1,5 @@ import { IAccount } from "../accounts/interfaces"; +import { Address } from "../core"; import { Transaction } from "../core/transaction"; import { TransactionComputer } from "../core/transactionComputer"; import { TransactionOnNetwork } from "../core/transactionOnNetwork"; @@ -27,10 +28,12 @@ export class TokenManagementController { async createTransactionForIssuingFungible( sender: IAccount, nonce: bigint, - options: resources.IssueFungibleInput, + options: resources.IssueFungibleInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForIssuingFungible(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -49,10 +52,12 @@ export class TokenManagementController { async createTransactionForIssuingSemiFungible( sender: IAccount, nonce: bigint, - options: resources.IssueSemiFungibleInput, + options: resources.IssueSemiFungibleInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForIssuingSemiFungible(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -71,10 +76,12 @@ export class TokenManagementController { async createTransactionForIssuingNonFungible( sender: IAccount, nonce: bigint, - options: resources.IssueNonFungibleInput, + options: resources.IssueNonFungibleInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForIssuingNonFungible(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -93,10 +100,12 @@ export class TokenManagementController { async createTransactionForRegisteringMetaEsdt( sender: IAccount, nonce: bigint, - options: resources.RegisterMetaESDTInput, + options: resources.RegisterMetaESDTInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForRegisteringMetaESDT(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -115,10 +124,12 @@ export class TokenManagementController { async createTransactionForRegisteringAndSettingRoles( sender: IAccount, nonce: bigint, - options: resources.RegisterRolesInput, + options: resources.RegisterRolesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForRegisteringAndSettingRoles(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -137,10 +148,12 @@ export class TokenManagementController { async createTransactionForSetBurnRoleGlobally( sender: IAccount, nonce: bigint, - options: resources.BurnRoleGloballyInput, + options: resources.BurnRoleGloballyInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingBurnRoleGlobally(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -159,10 +172,12 @@ export class TokenManagementController { async createTransactionForUnsettingBurnRoleGlobally( sender: IAccount, nonce: bigint, - options: resources.BurnRoleGloballyInput, + options: resources.BurnRoleGloballyInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnsettingBurnRoleGlobally(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -181,10 +196,12 @@ export class TokenManagementController { async createTransactionForSettingSpecialRoleOnFungibleToken( sender: IAccount, nonce: bigint, - options: resources.FungibleSpecialRoleInput, + options: resources.FungibleSpecialRoleInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingSpecialRoleOnFungibleToken(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -203,13 +220,15 @@ export class TokenManagementController { async createTransactionForSettingSpecialRoleOnSemiFungibleToken( sender: IAccount, nonce: bigint, - options: resources.SemiFungibleSpecialRoleInput, + options: resources.SemiFungibleSpecialRoleInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingSpecialRoleOnSemiFungibleToken( sender.address, options, ); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -228,13 +247,15 @@ export class TokenManagementController { async createTransactionForSettingSpecialRoleOnNonFungibleToken( sender: IAccount, nonce: bigint, - options: resources.SpecialRoleInput, + options: resources.SpecialRoleInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingSpecialRoleOnNonFungibleToken( sender.address, options, ); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -253,10 +274,12 @@ export class TokenManagementController { async createTransactionForCreatingNft( sender: IAccount, nonce: bigint, - options: resources.MintInput, + options: resources.MintInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForCreatingNFT(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -275,10 +298,12 @@ export class TokenManagementController { async createTransactionForPausing( sender: IAccount, nonce: bigint, - options: resources.PausingInput, + options: resources.PausingInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForPausing(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -297,10 +322,12 @@ export class TokenManagementController { async createTransactionForUnpausing( sender: IAccount, nonce: bigint, - options: resources.PausingInput, + options: resources.PausingInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnpausing(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -319,10 +346,12 @@ export class TokenManagementController { async createTransactionForFreezing( sender: IAccount, nonce: bigint, - options: resources.ManagementInput, + options: resources.ManagementInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForFreezing(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -341,10 +370,12 @@ export class TokenManagementController { async createTransactionForUnFreezing( sender: IAccount, nonce: bigint, - options: resources.ManagementInput, + options: resources.ManagementInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUnfreezing(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -363,10 +394,12 @@ export class TokenManagementController { async createTransactionForWiping( sender: IAccount, nonce: bigint, - options: resources.ManagementInput, + options: resources.ManagementInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForWiping(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -385,10 +418,12 @@ export class TokenManagementController { async createTransactionForLocaMinting( sender: IAccount, nonce: bigint, - options: resources.LocalMintInput, + options: resources.LocalMintInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForLocalMint(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -407,10 +442,12 @@ export class TokenManagementController { async createTransactionForLocalBurning( sender: IAccount, nonce: bigint, - options: resources.LocalBurnInput, + options: resources.LocalBurnInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForLocalBurning(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -429,10 +466,12 @@ export class TokenManagementController { async createTransactionForUpdatingAttributes( sender: IAccount, nonce: bigint, - options: resources.UpdateAttributesInput, + options: resources.UpdateAttributesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUpdatingAttributes(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -451,10 +490,12 @@ export class TokenManagementController { async createTransactionForAddingQuantity( sender: IAccount, nonce: bigint, - options: resources.UpdateQuantityInput, + options: resources.UpdateQuantityInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForAddingQuantity(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -473,10 +514,12 @@ export class TokenManagementController { async createTransactionForBurningQuantity( sender: IAccount, nonce: bigint, - options: resources.UpdateQuantityInput, + options: resources.UpdateQuantityInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForBurningQuantity(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -495,10 +538,12 @@ export class TokenManagementController { async createTransactionForModifyingRoyalties( sender: IAccount, nonce: bigint, - options: resources.ModifyRoyaltiesInput, + options: resources.ModifyRoyaltiesInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForModifyingRoyalties(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -517,10 +562,12 @@ export class TokenManagementController { async createTransactionForSettingNewUris( sender: IAccount, nonce: bigint, - options: resources.SetNewUriInput, + options: resources.SetNewUriInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForSettingNewUris(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -539,10 +586,12 @@ export class TokenManagementController { async createTransactionForModifyingCreator( sender: IAccount, nonce: bigint, - options: resources.SetNewUriInput, + options: resources.SetNewUriInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForModifyingCreator(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -561,10 +610,12 @@ export class TokenManagementController { async createTransactionForUpdatingMetadata( sender: IAccount, nonce: bigint, - options: resources.SetNewUriInput, + options: resources.SetNewUriInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForModifyingCreator(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -583,10 +634,12 @@ export class TokenManagementController { async createTransactionForMetadataRecreate( sender: IAccount, nonce: bigint, - options: resources.SetNewUriInput, + options: resources.SetNewUriInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForMetadataRecreate(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -605,10 +658,12 @@ export class TokenManagementController { async createTransactionForChangingTokenToDynamic( sender: IAccount, nonce: bigint, - options: resources.SetNewUriInput, + options: resources.SetNewUriInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForChangingTokenToDynamic(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -627,10 +682,12 @@ export class TokenManagementController { async createTransactionForUpdatingTokenId( sender: IAccount, nonce: bigint, - options: resources.UpdateTokenIDInput, + options: resources.UpdateTokenIDInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForUpdatingTokenId(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -645,10 +702,12 @@ export class TokenManagementController { async createTransactionForRegisteringDynamicToken( sender: IAccount, nonce: bigint, - options: resources.RegisteringDynamicTokenInput, + options: resources.RegisteringDynamicTokenInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForRegisteringDynamicToken(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -667,10 +726,12 @@ export class TokenManagementController { async createTransactionForRegisteringDynamicTokenAndSettingRoles( sender: IAccount, nonce: bigint, - options: resources.RegisteringDynamicTokenInput, + options: resources.RegisteringDynamicTokenInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForRegisteringDynamicAndSettingRoles(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); diff --git a/src/transfers/transfersControllers.ts b/src/transfers/transfersControllers.ts index cb9316be0..55f5d446d 100644 --- a/src/transfers/transfersControllers.ts +++ b/src/transfers/transfersControllers.ts @@ -1,4 +1,5 @@ import { IAccount } from "../accounts/interfaces"; +import { Address } from "../core"; import { Transaction } from "../core/transaction"; import { TransactionComputer } from "../core/transactionComputer"; import { TransactionsFactoryConfig } from "../core/transactionsFactoryConfig"; @@ -17,10 +18,12 @@ export class TransfersController { async createTransactionForNativeTokenTransfer( sender: IAccount, nonce: bigint, - options: resources.NativeTokenTransferInput, + options: resources.NativeTokenTransferInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForNativeTokenTransfer(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -30,10 +33,12 @@ export class TransfersController { async createTransactionForEsdtTokenTransfer( sender: IAccount, nonce: bigint, - options: resources.CustomTokenTransferInput, + options: resources.CustomTokenTransferInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForESDTTokenTransfer(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction)); @@ -43,10 +48,12 @@ export class TransfersController { async createTransactionForTransfer( sender: IAccount, nonce: bigint, - options: resources.CreateTransferTransactionInput, + options: resources.CreateTransferTransactionInput & { guardian?: Address; relayer?: Address }, ): Promise { const transaction = this.factory.createTransactionForTransfer(sender.address, options); + transaction.guardian = options.guardian ?? Address.empty(); + transaction.relayer = options.relayer ?? Address.empty(); transaction.nonce = nonce; transaction.signature = await sender.sign(this.txComputer.computeBytesForSigning(transaction));