diff --git a/src/modules/proxy/services/proxy-farm/proxy.farm.transactions.service.ts b/src/modules/proxy/services/proxy-farm/proxy.farm.transactions.service.ts index 2693d035a..a2ef2c767 100644 --- a/src/modules/proxy/services/proxy-farm/proxy.farm.transactions.service.ts +++ b/src/modules/proxy/services/proxy-farm/proxy.farm.transactions.service.ts @@ -1,12 +1,12 @@ import { Injectable } from '@nestjs/common'; -import { constantsConfig, mxConfig, gasConfig } from '../../../../config'; +import { constantsConfig, gasConfig } from '../../../../config'; import { - BigUIntValue, + Address, BytesValue, - TypedValue, + Token, + TokenTransfer, U64Value, -} from '@multiversx/sdk-core/out/smartcontracts/typesystem'; -import { Address, Interaction, TokenTransfer } from '@multiversx/sdk-core'; +} from '@multiversx/sdk-core'; import { TransactionModel } from '../../../../models/transaction.model'; import BigNumber from 'bignumber.js'; @@ -35,6 +35,7 @@ import { } from '@multiversx/sdk-exchange'; import { FarmAbiServiceV2 } from 'src/modules/farm/v2/services/farm.v2.abi.service'; import { ContextGetterService } from 'src/services/context/context.getter.service'; +import { TransactionOptions } from 'src/modules/common/transaction.options'; @Injectable() export class ProxyFarmTransactionsService { @@ -54,41 +55,41 @@ export class ProxyFarmTransactionsService { proxyAddress: string, args: EnterFarmProxyArgs, ): Promise { - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); const version = farmVersion(args.farmAddress); - const endpointArgs = [ - BytesValue.fromHex(new Address(args.farmAddress).hex()), - ]; - const interaction: Interaction = - version === FarmVersion.V1_2 - ? args.lockRewards - ? contract.methodsExplicit.enterFarmAndLockRewardsProxy( - endpointArgs, - ) - : contract.methodsExplicit.enterFarmProxy(endpointArgs) - : contract.methodsExplicit.enterFarmProxy(endpointArgs); + const functionName = + version === FarmVersion.V1_2 && args.lockRewards + ? 'enterFarmAndLockRewardsProxy' + : 'enterFarmProxy'; const gasLimit = args.tokens.length > 1 ? gasConfig.proxy.farms[version].enterFarm.withTokenMerge : gasConfig.proxy.farms[version].enterFarm.default; - const mappedPayments = args.tokens.map((token) => - TokenTransfer.metaEsdtFromBigInteger( - token.tokenID, - token.nonce, - new BigNumber(token.amount), - ), + + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasLimit, + function: functionName, + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(args.farmAddress).toHex(), + ), + ], + tokenTransfers: args.tokens.map( + (token) => + new TokenTransfer({ + token: new Token({ + identifier: token.tokenID, + nonce: BigInt(token.nonce), + }), + amount: BigInt(token.amount), + }), + ), + }), ); - return interaction - .withMultiESDTNFTTransfer(mappedPayments) - .withSender(Address.fromString(sender)) - .withGasLimit(gasLimit) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); } async exitFarmProxy( @@ -96,30 +97,30 @@ export class ProxyFarmTransactionsService { proxyAddress: string, args: ExitFarmProxyArgs, ): Promise { - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); - - const endpointArgs: TypedValue[] = [ - BytesValue.fromHex(new Address(args.farmAddress).hex()), - ]; - const gasLimit = await this.getExitFarmProxyGasLimit(args); - return contract.methodsExplicit - .exitFarmProxy(endpointArgs) - .withSingleESDTNFTTransfer( - TokenTransfer.metaEsdtFromBigInteger( - args.wrappedFarmTokenID, - args.wrappedFarmTokenNonce, - new BigNumber(args.amount), - ), - ) - .withSender(Address.fromString(sender)) - .withGasLimit(gasLimit) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasLimit, + function: 'exitFarmProxy', + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(args.farmAddress).toHex(), + ), + ], + tokenTransfers: [ + new TokenTransfer({ + token: new Token({ + identifier: args.wrappedFarmTokenID, + nonce: BigInt(args.wrappedFarmTokenNonce), + }), + amount: BigInt(args.amount), + }), + ], + }), + ); } async claimFarmRewardsProxy( @@ -127,14 +128,6 @@ export class ProxyFarmTransactionsService { proxyAddress: string, args: ClaimFarmRewardsProxyArgs, ): Promise { - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); - - const endpointArgs = [ - BytesValue.fromHex(new Address(args.farmAddress).hex()), - ]; - const version = farmVersion(args.farmAddress); const type = version === FarmVersion.V1_2 @@ -150,20 +143,28 @@ export class ProxyFarmTransactionsService { gasConfig.proxy.farms[version][type].claimRewards + lockedAssetCreateGas; - return contract.methodsExplicit - .claimRewardsProxy(endpointArgs) - .withSingleESDTNFTTransfer( - TokenTransfer.metaEsdtFromBigInteger( - args.wrappedFarmTokenID, - args.wrappedFarmTokenNonce, - new BigNumber(args.amount), - ), - ) - .withSender(Address.fromString(sender)) - .withGasLimit(gasLimit) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasLimit, + function: 'claimRewardsProxy', + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(args.farmAddress).toHex(), + ), + ], + tokenTransfers: [ + new TokenTransfer({ + token: new Token({ + identifier: args.wrappedFarmTokenID, + nonce: BigInt(args.wrappedFarmTokenNonce), + }), + amount: BigInt(args.amount), + }), + ], + }), + ); } async compoundRewardsProxy( @@ -171,30 +172,30 @@ export class ProxyFarmTransactionsService { proxyAddress: string, args: CompoundRewardsProxyArgs, ): Promise { - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); - - const endpointArgs = [ - BytesValue.fromHex(new Address(args.farmAddress).hex()), - ]; - const version = farmVersion(args.farmAddress); - return contract.methodsExplicit - .compoundRewardsProxy(endpointArgs) - .withSingleESDTNFTTransfer( - TokenTransfer.metaEsdtFromBigInteger( - args.tokenID, - args.tokenNonce, - new BigNumber(args.amount), - ), - ) - .withSender(Address.fromString(sender)) - .withGasLimit(gasConfig.proxy.farms[version].compoundRewards) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasConfig.proxy.farms[version].compoundRewards, + function: 'compoundRewardsProxy', + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(args.farmAddress).toHex(), + ), + ], + tokenTransfers: [ + new TokenTransfer({ + token: new Token({ + identifier: args.tokenID, + nonce: BigInt(args.tokenNonce), + }), + amount: BigInt(args.amount), + }), + ], + }), + ); } async migrateToNewFarmProxy( @@ -202,29 +203,30 @@ export class ProxyFarmTransactionsService { proxyAddress: string, args: ExitFarmProxyArgs, ): Promise { - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); - - const endpointArgs = [ - BytesValue.fromHex(new Address(args.farmAddress).hex()), - ]; const version = farmVersion(args.farmAddress); - return contract.methodsExplicit - .migrateV1_2Position(endpointArgs) - .withSingleESDTNFTTransfer( - TokenTransfer.metaEsdtFromBigInteger( - args.wrappedFarmTokenID, - args.wrappedFarmTokenNonce, - new BigNumber(args.amount), - ), - ) - .withSender(Address.fromString(sender)) - .withGasLimit(gasConfig.proxy.farms[version].migrateToNewFarm) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasConfig.proxy.farms[version].migrateToNewFarm, + function: 'migrateV1_2Position', + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(args.farmAddress).toHex(), + ), + ], + tokenTransfers: [ + new TokenTransfer({ + token: new Token({ + identifier: args.wrappedFarmTokenID, + nonce: BigInt(args.wrappedFarmTokenNonce), + }), + amount: BigInt(args.amount), + }), + ], + }), + ); } async mergeWrappedFarmTokens( @@ -240,30 +242,31 @@ export class ProxyFarmTransactionsService { throw new Error('Number of merge tokens exeeds maximum gas limit!'); } - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); - - const endpointArgs = [ - BytesValue.fromHex(new Address(farmAddress).hex()), - ]; const gasLimit = gasConfig.proxy.farms.defaultMergeWFMT * tokens.length; - const mappedPayments = tokens.map((token) => - TokenTransfer.metaEsdtFromBigInteger( - token.tokenID, - token.nonce, - new BigNumber(token.amount), - ), - ); - return contract.methodsExplicit - .mergeWrappedFarmTokens(endpointArgs) - .withMultiESDTNFTTransfer(mappedPayments) - .withSender(Address.fromString(sender)) - .withGasLimit(gasLimit) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasLimit, + function: 'mergeWrappedFarmTokens', + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(farmAddress).toHex(), + ), + ], + tokenTransfers: tokens.map( + (token) => + new TokenTransfer({ + token: new Token({ + identifier: token.tokenID, + nonce: BigInt(token.nonce), + }), + amount: BigInt(token.amount), + }), + ), + }), + ); } async migrateTotalFarmPosition( @@ -328,25 +331,24 @@ export class ProxyFarmTransactionsService { payment: InputTokenModel, lockEpochs: number, ): Promise { - const contract = await this.mxProxy.getProxyDexSmartContract( + return await this.mxProxy.getProxyDexSmartContractTransaction( proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasConfig.proxy.pairs.increaseEnergy, + function: 'increaseProxyFarmTokenEnergy', + arguments: [new U64Value(new BigNumber(lockEpochs))], + tokenTransfers: [ + new TokenTransfer({ + token: new Token({ + identifier: payment.tokenID, + nonce: BigInt(payment.nonce), + }), + amount: BigInt(payment.amount), + }), + ], + }), ); - return contract.methodsExplicit - .increaseProxyFarmTokenEnergy([ - new U64Value(new BigNumber(lockEpochs)), - ]) - .withSingleESDTNFTTransfer( - TokenTransfer.metaEsdtFromBigInteger( - payment.tokenID, - payment.nonce, - new BigNumber(payment.amount), - ), - ) - .withSender(Address.fromString(sender)) - .withGasLimit(gasConfig.proxy.pairs.increaseEnergy) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); } private async getExitFarmProxyGasLimit( diff --git a/src/modules/proxy/services/proxy-pair/proxy.pair.transactions.service.ts b/src/modules/proxy/services/proxy-pair/proxy.pair.transactions.service.ts index 1026b2ea6..b474aee69 100644 --- a/src/modules/proxy/services/proxy-pair/proxy.pair.transactions.service.ts +++ b/src/modules/proxy/services/proxy-pair/proxy.pair.transactions.service.ts @@ -1,12 +1,13 @@ import { Injectable } from '@nestjs/common'; import { constantsConfig, mxConfig, gasConfig } from 'src/config'; import { + Address, BigUIntValue, BytesValue, - TypedValue, + Token, + TokenTransfer, U64Value, -} from '@multiversx/sdk-core/out/smartcontracts/typesystem'; -import { Address, TokenTransfer } from '@multiversx/sdk-core'; +} from '@multiversx/sdk-core'; import { TransactionModel } from 'src/models/transaction.model'; import BigNumber from 'bignumber.js'; import { PairService } from 'src/modules/pair/services/pair.service'; @@ -21,6 +22,7 @@ import { WrapAbiService } from 'src/modules/wrapping/services/wrap.abi.service'; import { PairAbiService } from 'src/modules/pair/services/pair.abi.service'; import { ErrorLoggerAsync } from '@multiversx/sdk-nestjs-common'; import { ProxyAbiServiceV2 } from 'src/modules/proxy/v2/services/proxy.v2.abi.service'; +import { TransactionOptions } from 'src/modules/common/transaction.options'; @Injectable() export class ProxyPairTransactionsService { @@ -84,9 +86,6 @@ export class ProxyPairTransactionsService { proxyAddress, ); - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); const amount0 = new BigNumber(liquidityTokens[0].amount); const amount1 = new BigNumber(liquidityTokens[1].amount); @@ -97,33 +96,36 @@ export class ProxyPairTransactionsService { .multipliedBy(1 - args.tolerance) .integerValue(); - const endpointArgs: TypedValue[] = [ - BytesValue.fromHex(new Address(args.pairAddress).hex()), - new BigUIntValue(amount0Min), - new BigUIntValue(amount1Min), - ]; - const gasLimit = liquidityTokens.length > 2 ? gasConfig.proxy.pairs.addLiquidity.withTokenMerge : gasConfig.proxy.pairs.addLiquidity.default; - const mappedPayments: TokenTransfer[] = liquidityTokens.map( - (inputToken) => - TokenTransfer.metaEsdtFromBigInteger( - inputToken.tokenID, - inputToken.nonce, - new BigNumber(inputToken.amount), + + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasLimit, + function: 'addLiquidityProxy', + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(args.pairAddress).toHex(), + ), + new BigUIntValue(amount0Min), + new BigUIntValue(amount1Min), + ], + tokenTransfers: liquidityTokens.map( + (inputToken) => + new TokenTransfer({ + token: new Token({ + identifier: inputToken.tokenID, + nonce: BigInt(inputToken.nonce), + }), + amount: BigInt(inputToken.amount), + }), ), + }), ); - - return contract.methodsExplicit - .addLiquidityProxy(endpointArgs) - .withMultiESDTNFTTransfer(mappedPayments) - .withSender(Address.fromString(sender)) - .withGasLimit(gasLimit) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); } async removeLiquidityProxy( @@ -132,22 +134,16 @@ export class ProxyPairTransactionsService { args: RemoveLiquidityProxyArgs, ): Promise { const transactions = []; - const [ - wrappedTokenID, - firstTokenID, - secondTokenID, - liquidityPosition, - contract, - ] = await Promise.all([ - this.wrapAbi.wrappedEgldTokenID(), - this.pairAbi.firstTokenID(args.pairAddress), - this.pairAbi.secondTokenID(args.pairAddress), - this.pairService.getLiquidityPosition( - args.pairAddress, - args.liquidity, - ), - this.mxProxy.getProxyDexSmartContract(proxyAddress), - ]); + const [wrappedTokenID, firstTokenID, secondTokenID, liquidityPosition] = + await Promise.all([ + this.wrapAbi.wrappedEgldTokenID(), + this.pairAbi.firstTokenID(args.pairAddress), + this.pairAbi.secondTokenID(args.pairAddress), + this.pairService.getLiquidityPosition( + args.pairAddress, + args.liquidity, + ), + ]); const amount0Min = new BigNumber( liquidityPosition.firstTokenAmount.toString(), ) @@ -159,28 +155,33 @@ export class ProxyPairTransactionsService { .multipliedBy(1 - args.tolerance) .integerValue(); - const endpointArgs = [ - BytesValue.fromHex(new Address(args.pairAddress).hex()), - new BigUIntValue(amount0Min), - new BigUIntValue(amount1Min), - ]; + const removeLiquidityTransaction = + await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasConfig.proxy.pairs.removeLiquidity, + function: 'removeLiquidityProxy', + arguments: [ + BytesValue.fromHex( + Address.newFromBech32(args.pairAddress).toHex(), + ), + new BigUIntValue(amount0Min), + new BigUIntValue(amount1Min), + ], + tokenTransfers: [ + new TokenTransfer({ + token: new Token({ + identifier: args.wrappedLpTokenID, + nonce: BigInt(args.wrappedLpTokenNonce), + }), + amount: BigInt(args.liquidity), + }), + ], + }), + ); - transactions.push( - contract.methodsExplicit - .removeLiquidityProxy(endpointArgs) - .withSingleESDTNFTTransfer( - TokenTransfer.metaEsdtFromBigInteger( - args.wrappedLpTokenID, - args.wrappedLpTokenNonce, - new BigNumber(args.liquidity), - ), - ) - .withSender(Address.fromString(sender)) - .withGasLimit(gasConfig.proxy.pairs.removeLiquidity) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(), - ); + transactions.push(removeLiquidityTransaction); switch (wrappedTokenID) { case firstTokenID: @@ -215,26 +216,26 @@ export class ProxyPairTransactionsService { throw new Error('Number of merge tokens exeeds maximum gas limit!'); } - const contract = await this.mxProxy.getProxyDexSmartContract( - proxyAddress, - ); const gasLimit = gasConfig.proxy.pairs.defaultMergeWLPT * tokens.length; - const mappedPayments = tokens.map((token) => - TokenTransfer.metaEsdtFromBigInteger( - token.tokenID, - token.nonce, - new BigNumber(token.amount), - ), - ); - return contract.methodsExplicit - .mergeWrappedLpTokens() - .withMultiESDTNFTTransfer(mappedPayments) - .withSender(Address.fromString(sender)) - .withGasLimit(gasLimit) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); + return await this.mxProxy.getProxyDexSmartContractTransaction( + proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasLimit, + function: 'mergeWrappedLpTokens', + tokenTransfers: tokens.map( + (token) => + new TokenTransfer({ + token: new Token({ + identifier: token.tokenID, + nonce: BigInt(token.nonce), + }), + amount: BigInt(token.amount), + }), + ), + }), + ); } async increaseProxyPairTokenEnergy( @@ -243,25 +244,24 @@ export class ProxyPairTransactionsService { payment: InputTokenModel, lockEpochs: number, ): Promise { - const contract = await this.mxProxy.getProxyDexSmartContract( + return await this.mxProxy.getProxyDexSmartContractTransaction( proxyAddress, + new TransactionOptions({ + sender: sender, + gasLimit: gasConfig.proxy.pairs.increaseEnergy, + function: 'increaseProxyPairTokenEnergy', + arguments: [new U64Value(new BigNumber(lockEpochs))], + tokenTransfers: [ + new TokenTransfer({ + token: new Token({ + identifier: payment.tokenID, + nonce: BigInt(payment.nonce), + }), + amount: BigInt(payment.amount), + }), + ], + }), ); - return contract.methodsExplicit - .increaseProxyPairTokenEnergy([ - new U64Value(new BigNumber(lockEpochs)), - ]) - .withSingleESDTNFTTransfer( - TokenTransfer.metaEsdtFromBigInteger( - payment.tokenID, - payment.nonce, - new BigNumber(payment.amount), - ), - ) - .withSender(Address.fromString(sender)) - .withGasLimit(gasConfig.proxy.pairs.increaseEnergy) - .withChainID(mxConfig.chainID) - .buildTransaction() - .toPlainObject(); } private async convertInputTokenstoESDTTokens( diff --git a/src/services/multiversx-communication/mx.proxy.service.ts b/src/services/multiversx-communication/mx.proxy.service.ts index 47dbcbef0..52889e763 100644 --- a/src/services/multiversx-communication/mx.proxy.service.ts +++ b/src/services/multiversx-communication/mx.proxy.service.ts @@ -188,6 +188,20 @@ export class MXProxyService { ); } + async getProxyDexSmartContractTransaction( + proxyAddress: string, + options: TransactionOptions, + ): Promise { + const version = proxyVersion(proxyAddress); + + return this.getSmartContractTransaction( + proxyAddress, + abiConfig.proxy[version], + 'ProxyDexImpl', + options, + ); + } + async getDistributionSmartContract(): Promise { return this.getSmartContract( scAddress.distributionAddress,