From ea1cba576ace8478794ddf044fea8a690df77c17 Mon Sep 17 00:00:00 2001 From: danielailie Date: Thu, 23 Jan 2025 13:52:33 +0200 Subject: [PATCH 1/2] Add implementation for missing methods on delegation factory --- .../delegationTransactionsFactory.spec.ts | 111 ++++++++++++++++-- .../delegationTransactionsFactory.ts | 84 ++++++++++--- 2 files changed, 170 insertions(+), 25 deletions(-) diff --git a/src/delegation/delegationTransactionsFactory.spec.ts b/src/delegation/delegationTransactionsFactory.spec.ts index a99916bb0..35ca86a77 100644 --- a/src/delegation/delegationTransactionsFactory.spec.ts +++ b/src/delegation/delegationTransactionsFactory.spec.ts @@ -10,7 +10,7 @@ describe("test delegation transactions factory", function () { const delegationFactory = new DelegationTransactionsFactory({ config: config }); it("should create 'Transaction' for new delegation contract", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delagationCap = 5000000000000000000000n; const serviceFee = 10n; const value = 1250000000000000000000n; @@ -37,7 +37,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for adding nodes", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const publicKey = new ValidatorPublicKey( Buffer.from( @@ -76,7 +76,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for removing nodes", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const publicKey = new ValidatorPublicKey( @@ -106,7 +106,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for staking nodes", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const publicKey = new ValidatorPublicKey( Buffer.from( @@ -135,7 +135,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for unbonding nodes", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const publicKey = new ValidatorPublicKey( Buffer.from( @@ -165,7 +165,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for unstaking nodes", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const publicKey = new ValidatorPublicKey( Buffer.from( @@ -244,7 +244,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for changing delegation cap", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const delegationCap = 5000000000000000000000n; @@ -264,7 +264,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for setting automatic activation", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const transaction = delegationFactory.createTransactionForSettingAutomaticActivation(sender, { @@ -282,7 +282,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for unsetting automatic activation", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const transaction = delegationFactory.createTransactionForUnsettingAutomaticActivation(sender, { @@ -300,7 +300,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for setting cap check on redelegate rewards", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const transaction = delegationFactory.createTransactionForSettingCapCheckOnRedelegateRewards(sender, { @@ -318,7 +318,7 @@ describe("test delegation transactions factory", function () { }); it("should create 'Transaction' for unsetting cap check on redelegate rewards", async function () { - const sender = Address.fromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); const transaction = delegationFactory.createTransactionForUnsettingCapCheckOnRedelegateRewards(sender, { @@ -355,4 +355,93 @@ describe("test delegation transactions factory", function () { assert.deepEqual(transaction.data, Buffer.from("setMetaData@6e616d65@77656273697465@6964656e746966696572")); assert.equal(transaction.value, 0n); }); + + it("should create 'Transaction' for delegating", async function () { + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); + + const transaction = delegationFactory.createTransactionForDelegating(sender, { + delegationContract: delegationContract, + amount: 1000000000000000000n, + }); + + assert.deepEqual( + transaction.sender, + Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + ); + assert.deepEqual(transaction.receiver, Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX)); + assert.isDefined(transaction.data); + assert.deepEqual(transaction.data, Buffer.from("delegate")); + assert.equal(transaction.value, 1000000000000000000n); + }); + it("should create 'Transaction' for claiming rewards", async function () { + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); + + const transaction = delegationFactory.createTransactionForClaimingRewards(sender, { + delegationContract: delegationContract, + }); + + assert.deepEqual( + transaction.sender, + Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + ); + assert.deepEqual(transaction.receiver, Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX)); + assert.isDefined(transaction.data); + assert.deepEqual(transaction.data, Buffer.from("claimRewards")); + }); + + it("should create 'Transaction' for redelegating rewards", async function () { + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); + + const transaction = delegationFactory.createTransactionForRedelegatingRewards(sender, { + delegationContract: delegationContract, + }); + + assert.deepEqual( + transaction.sender, + Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + ); + assert.deepEqual(transaction.receiver, Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX)); + assert.isDefined(transaction.data); + assert.deepEqual(transaction.data, Buffer.from("reDelegateRewards")); + }); + + it("should create 'Transaction' for undelegating", async function () { + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); + + const transaction = delegationFactory.createTransactionForUndelegating(sender, { + delegationContract: delegationContract, + amount: 1000000000000000000n, + }); + + assert.deepEqual( + transaction.sender, + Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + ); + assert.deepEqual(transaction.receiver, Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX)); + assert.isDefined(transaction.data); + assert.deepEqual(transaction.data, Buffer.from("unDelegate@0de0b6b3a7640000")); + assert.equal(transaction.value, 0n); + }); + + it("should create 'Transaction' for withdrawing", async function () { + const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); + const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX); + + const transaction = delegationFactory.createTransactionForWithdrawing(sender, { + delegationContract: delegationContract, + }); + + assert.deepEqual( + transaction.sender, + Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + ); + assert.deepEqual(transaction.receiver, Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX)); + assert.isDefined(transaction.data); + assert.deepEqual(transaction.data, Buffer.from("withdraw")); + assert.equal(transaction.value, 0n); + }); }); diff --git a/src/delegation/delegationTransactionsFactory.ts b/src/delegation/delegationTransactionsFactory.ts index 94c688e96..2ee48bd20 100644 --- a/src/delegation/delegationTransactionsFactory.ts +++ b/src/delegation/delegationTransactionsFactory.ts @@ -333,30 +333,86 @@ export class DelegationTransactionsFactory { }).build(); } - createTransactionForWithdrawing(_sender: Address, _options: resources.ManageDelegationContractInput): Transaction { - throw new Error("Method not implemented."); + createTransactionForDelegating(sender: Address, options: resources.DelegateActionsInput): Transaction { + const dataParts = ["delegate"]; + const gasLimit = + this.config.gasLimitDelegationOperations + this.config.additionalGasLimitForDelegationOperations; + + return new TransactionBuilder({ + config: this.config, + sender: sender, + receiver: options.delegationContract, + dataParts: dataParts, + gasLimit: gasLimit, + amount: options.amount, + addDataMovementGas: false, + }).build(); } - createTransactionForUndelegating(_sender: Address, _options: resources.DelegateActionsInput): Transaction { - throw new Error("Method not implemented."); + createTransactionForClaimingRewards( + sender: Address, + options: resources.ManageDelegationContractInput, + ): Transaction { + const dataParts = ["claimRewards"]; + const gasLimit = + this.config.gasLimitDelegationOperations + this.config.additionalGasLimitForDelegationOperations; + + return new TransactionBuilder({ + config: this.config, + sender: sender, + receiver: options.delegationContract, + dataParts: dataParts, + gasLimit: gasLimit, + addDataMovementGas: false, + }).build(); } createTransactionForRedelegatingRewards( - _sender: Address, - _options: resources.ManageDelegationContractInput, + sender: Address, + options: resources.ManageDelegationContractInput, ): Transaction { - throw new Error("Method not implemented."); + const dataParts = ["reDelegateRewards"]; + const gasLimit = + this.config.gasLimitDelegationOperations + this.config.additionalGasLimitForDelegationOperations; + + return new TransactionBuilder({ + config: this.config, + sender: sender, + receiver: options.delegationContract, + dataParts: dataParts, + gasLimit: gasLimit, + addDataMovementGas: false, + }).build(); } - createTransactionForClaimingRewards( - _sender: Address, - _options: resources.ManageDelegationContractInput, - ): Transaction { - throw new Error("Method not implemented."); + createTransactionForUndelegating(sender: Address, options: resources.DelegateActionsInput): Transaction { + const dataParts = ["unDelegate", this.argSerializer.valuesToStrings([new BigUIntValue(options.amount)])[0]]; + const gasLimit = + this.config.gasLimitDelegationOperations + this.config.additionalGasLimitForDelegationOperations; + + return new TransactionBuilder({ + config: this.config, + sender: sender, + receiver: options.delegationContract, + dataParts: dataParts, + gasLimit: gasLimit, + addDataMovementGas: false, + }).build(); } - createTransactionForDelegating(_sender: Address, _options: resources.DelegateActionsInput): Transaction { - throw new Error("Method not implemented."); + createTransactionForWithdrawing(sender: Address, options: resources.ManageDelegationContractInput): Transaction { + const dataParts = ["withdraw"]; + const gasLimit = + this.config.gasLimitDelegationOperations + this.config.additionalGasLimitForDelegationOperations; + + return new TransactionBuilder({ + config: this.config, + sender: sender, + receiver: options.delegationContract, + dataParts: dataParts, + gasLimit: gasLimit, + addDataMovementGas: false, + }).build(); } private computeExecutionGasLimitForNodesManagement(numNodes: number): bigint { From 91e47503c3ee5422ac440c828b1c08eea89d0b88 Mon Sep 17 00:00:00 2001 From: danielailie Date: Thu, 23 Jan 2025 15:01:00 +0200 Subject: [PATCH 2/2] Add new line --- src/delegation/delegationTransactionsFactory.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/delegation/delegationTransactionsFactory.spec.ts b/src/delegation/delegationTransactionsFactory.spec.ts index 35ca86a77..338571359 100644 --- a/src/delegation/delegationTransactionsFactory.spec.ts +++ b/src/delegation/delegationTransactionsFactory.spec.ts @@ -374,6 +374,7 @@ describe("test delegation transactions factory", function () { assert.deepEqual(transaction.data, Buffer.from("delegate")); assert.equal(transaction.value, 1000000000000000000n); }); + it("should create 'Transaction' for claiming rewards", async function () { const sender = Address.newFromBech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"); const delegationContract = Address.newFromHex(DELEGATION_MANAGER_SC_ADDRESS_HEX);