From 8df2c3cd34f7878d52509937bea86b700eb60c80 Mon Sep 17 00:00:00 2001 From: Davit Mandzikyan Date: Wed, 26 Mar 2025 23:59:32 +0400 Subject: [PATCH] Create request models. --- .../IStarknetBlockchainActivities.cs | 1 - .../StarknetPublishTransactionRequest .ts | 9 ++ .../StarknetActivities/StarknetActivities.ts | 117 ++++++++---------- js/src/TemporalWorker/Worker.ts | 2 +- .../Model/AllowanceModels/AllowanceRequest.ts | 6 + .../BalanceRequestModels/BalanceRequest.ts | 6 + .../SufficientBalanceRequest.ts | 5 + .../lib/Model/GetFeesModels/GetFeesRequest.ts | 3 +- .../AddLockSignatureRequest.ts | 1 + .../TransactionBuilderRequest.ts | 7 ++ 10 files changed, 92 insertions(+), 65 deletions(-) create mode 100644 js/src/Activities/StarknetActivities/Models/StarknetPublishTransactionRequest .ts create mode 100644 js/src/lib/Model/AllowanceModels/AllowanceRequest.ts create mode 100644 js/src/lib/Model/BalanceRequestModels/BalanceRequest.ts create mode 100644 js/src/lib/Model/BalanceRequestModels/SufficientBalanceRequest.ts create mode 100644 js/src/lib/Model/TransactionBuilderModels/TransactionBuilderRequest.ts diff --git a/csharp/src/WorkflowRunner.Starknet/Activities/IStarknetBlockchainActivities.cs b/csharp/src/WorkflowRunner.Starknet/Activities/IStarknetBlockchainActivities.cs index 82aa3b86..b531d02c 100644 --- a/csharp/src/WorkflowRunner.Starknet/Activities/IStarknetBlockchainActivities.cs +++ b/csharp/src/WorkflowRunner.Starknet/Activities/IStarknetBlockchainActivities.cs @@ -1,7 +1,6 @@ using Train.Solver.Blockchains.Starknet.Models; using Train.Solver.Core.Abstractions; using Train.Solver.Core.Abstractions.Models; -using Train.Solver.Core.Workflows.Activities; namespace Train.Solver.Blockchains.Starknet.Activities; diff --git a/js/src/Activities/StarknetActivities/Models/StarknetPublishTransactionRequest .ts b/js/src/Activities/StarknetActivities/Models/StarknetPublishTransactionRequest .ts new file mode 100644 index 00000000..68d22eae --- /dev/null +++ b/js/src/Activities/StarknetActivities/Models/StarknetPublishTransactionRequest .ts @@ -0,0 +1,9 @@ +import { Fee } from "../../../lib/Model/GetFeesModels/GetFeesResponse"; + +export interface StarknetPublishTransactionRequest { + networkName: string; + fromAddress: string; + callData: string; + nonce: string; + fee: Fee; + } \ No newline at end of file diff --git a/js/src/Activities/StarknetActivities/StarknetActivities.ts b/js/src/Activities/StarknetActivities/StarknetActivities.ts index d815d560..bc5aabf7 100644 --- a/js/src/Activities/StarknetActivities/StarknetActivities.ts +++ b/js/src/Activities/StarknetActivities/StarknetActivities.ts @@ -14,6 +14,10 @@ import { AddLockSignatureRequest } from "../../lib/Model/TransactionBuilderModel import { StarknetTransactionBuilder } from "./Helper/StarknetTransactionBuilder"; import { CalcV2InvokeTxHashArgs } from "../../lib/Model/WithdrawalModels/TransactioCalculationType"; import { TransactionType } from "../../lib/Model/TransactionTypes/TransactionType"; +import { StarknetPublishTransactionRequest } from "./Models/StarknetPublishTransactionRequest "; +import { SufficientBalanceRequest } from "../../lib/Model/BalanceRequestModels/SufficientBalanceRequest"; +import { AllowanceRequest } from "../../lib/Model/AllowanceModels/AllowanceRequest"; +import { TransactionBuilderRequest } from "../../lib/Model/TransactionBuilderModels/TransactionBuilderRequest"; export class StarknetActivities { @@ -23,45 +27,40 @@ export class StarknetActivities { readonly FeeDecimals = 18; readonly FEE_ESTIMATE_MULTIPLIER = BigInt(4); - public async StarknetPublishTransactionAsync( - fromAddress: string, - networkName: string, - nonce?: string, - callData?: string, - fee?: Fee): Promise { + public async StarknetPublishTransactionAsync(request: StarknetPublishTransactionRequest): Promise { let result: string; const network = await this.dbContext.Networks .createQueryBuilder("network") .leftJoinAndSelect("network.nodes", "n") - .where("UPPER(network.name) = UPPER(:nName)", { nName: networkName }) + .where("UPPER(network.name) = UPPER(:nName)", { nName: request.networkName }) .getOneOrFail(); const node = network.nodes.find(n => n.type === NodeType.Primary); if (!node) { - throw new Error(`Primary node not found for network ${networkName}`); + throw new Error(`Primary node not found for network ${request.networkName}`); } - const privateKey = await new PrivateKeyRepository().getAsync(fromAddress); + const privateKey = await new PrivateKeyRepository().getAsync(request.fromAddress); const provider = new RpcProvider({ nodeUrl: node.url }); - const account = new Account(provider, fromAddress, privateKey, '1'); + const account = new Account(provider, request.fromAddress, privateKey, '1'); - var transferCall: Call = JSON.parse(callData); + var transferCall: Call = JSON.parse(request.callData); const compiledCallData = transaction.getExecuteCalldata([transferCall], await account.getCairoVersion()); const args: CalcV2InvokeTxHashArgs = { - senderAddress: fromAddress, + senderAddress: request.fromAddress, version: ETransactionVersion2.V1, compiledCalldata: compiledCallData, - maxFee: fee.FixedFeeData.FeeInWei, + maxFee: request.fee.FixedFeeData.FeeInWei, chainId: network.chainId as constants.StarknetChainId, - nonce: nonce + nonce: request.nonce }; const calcualtedTxHash = await hash.calculateInvokeTransactionHash(args); @@ -72,8 +71,8 @@ export class StarknetActivities { [transferCall], undefined, { - maxFee: fee.FixedFeeData.FeeInWei, - nonce: nonce + maxFee: request.fee.FixedFeeData.FeeInWei, + nonce: request.nonce }, ); @@ -96,8 +95,7 @@ export class StarknetActivities { } } - public async StarknetBuildTransactionAsync( - networkName: string, transactionType: TransactionType, args: string): Promise { + public async StarknetBuildTransactionAsync(request: TransactionBuilderRequest): Promise { try { const network = await this.dbContext.Networks @@ -105,24 +103,24 @@ export class StarknetActivities { .leftJoinAndSelect("network.nodes", "n") .leftJoinAndSelect("network.tokens", "t") .leftJoinAndSelect("network.contracts", "c") - .where("UPPER(network.name) = UPPER(:nName)", { nName: networkName }) + .where("UPPER(network.name) = UPPER(:nName)", { nName: request.NetworkName }) .getOneOrFail(); - switch (transactionType) { + switch (request.TransactionType) { case TransactionType.HTLCLock: - return StarknetTransactionBuilder.CreateLockCallData(network, args); + return StarknetTransactionBuilder.CreateLockCallData(network, request.Args); case TransactionType.HTLCRedeem: - return StarknetTransactionBuilder.CreateRedeemCallData(network, args); + return StarknetTransactionBuilder.CreateRedeemCallData(network, request.Args); case TransactionType.HTLCRefund: - return StarknetTransactionBuilder.CreateRefundCallData(network, args); + return StarknetTransactionBuilder.CreateRefundCallData(network,request.Args); case TransactionType.HTLCAddLockSig: - return StarknetTransactionBuilder.CreateAddLockSigCallData(network, args); + return StarknetTransactionBuilder.CreateAddLockSigCallData(network, request.Args); case TransactionType.Approve: - return StarknetTransactionBuilder.CreateApproveCallData(network, args); + return StarknetTransactionBuilder.CreateApproveCallData(network, request.Args); case TransactionType.Transfer: - return StarknetTransactionBuilder.CreateTransferCallData(network, args); + return StarknetTransactionBuilder.CreateTransferCallData(network, request.Args); default: - throw new Error(`Unknown function name ${transactionType}`); + throw new Error(`Unknown function name ${request.TransactionType}`); } } catch (error) { @@ -130,26 +128,26 @@ export class StarknetActivities { } } - public async StarknetEnsureSufficientBalanceAsync(networkName: string, address: string, asset: string, amount: number): Promise { + public async StarknetEnsureSufficientBalanceAsync(request: SufficientBalanceRequest): Promise { try { const network = await this.dbContext.Networks .createQueryBuilder("network") .leftJoinAndSelect("network.nodes", "n") .leftJoinAndSelect("network.tokens", "t") - .where("UPPER(network.name) = UPPER(:nName)", { nName: networkName }) + .where("UPPER(network.name) = UPPER(:nName)", { nName: request.NetworkName }) .getOneOrFail(); const node = network.nodes.find(n => n.type === NodeType.Primary); if (!node) { - throw new Error(`Primary node not found for network ${networkName}`); + throw new Error(`Primary node not found for network ${request.NetworkName}`); } - const token = network.tokens.find(t => t.asset === asset); + const token = network.tokens.find(t => t.asset === request.Asset); if (!token) { - throw new Error(`Token not found for network ${networkName} and asset ${asset}`); + throw new Error(`Token not found for network ${request.NetworkName} and asset ${request.Asset}`); } const provider = new RpcProvider({ @@ -158,12 +156,12 @@ export class StarknetActivities { const erc20 = new Contract(erc20Json as Abi, token.tokenContract, provider); - const balanceResult = await erc20.balanceOf(address); + const balanceResult = await erc20.balanceOf(request.Address); const balanceInWei = BigNumber.from(uint256.uint256ToBN(balanceResult.balance as any).toString()).toString(); const balance = Number(utils.formatUnits(balanceInWei, token.decimals)); - if (balance <= amount) { - throw new Error(`Insufficient balance on ${address}. Balance is less than ${amount}`); + if (balance <= request.Amount) { + throw new Error(`Insufficient balance on ${request.Address}. Balance is less than ${request.Amount}`); } } catch (error) { @@ -171,44 +169,39 @@ export class StarknetActivities { } } - public async StarknetSimulateTransactionAsync( - fromAddress: string, - networkName: string, - nonce?: string, - callData?: string, - fee?: Fee): Promise { + public async StarknetSimulateTransactionAsync(request: StarknetPublishTransactionRequest): Promise { const network = await this.dbContext.Networks .createQueryBuilder("network") .leftJoinAndSelect("network.nodes", "n") - .where("UPPER(network.name) = UPPER(:nName)", { nName: networkName }) + .where("UPPER(network.name) = UPPER(:nName)", { nName: request.networkName }) .getOneOrFail(); const node = network.nodes.find(n => n.type === NodeType.Primary); if (!node) { - throw new Error(`Primary node not found for network ${networkName}`); + throw new Error(`Primary node not found for network ${request.networkName}`); } - const privateKey = await new PrivateKeyRepository().getAsync(fromAddress); + const privateKey = await new PrivateKeyRepository().getAsync(request.fromAddress); const provider = new RpcProvider({ nodeUrl: node.url }); - const account = new Account(provider, fromAddress, privateKey, '1'); + const account = new Account(provider, request.fromAddress, privateKey, '1'); - var transferCall: Call = JSON.parse(callData); + var transferCall: Call = JSON.parse(request.callData); const compiledCallData = transaction.getExecuteCalldata([transferCall], await account.getCairoVersion()); const args: CalcV2InvokeTxHashArgs = { - senderAddress: fromAddress, + senderAddress: request.fromAddress, version: ETransactionVersion2.V1, compiledCalldata: compiledCallData, - maxFee: fee.FixedFeeData.FeeInWei, + maxFee: request.fee.FixedFeeData.FeeInWei, chainId: network.chainId as constants.StarknetChainId, - nonce: nonce + nonce: request.nonce }; const calcualtedTxHash = await hash.calculateInvokeTransactionHash(args); @@ -222,7 +215,7 @@ export class StarknetActivities { } ], { - nonce: nonce + nonce: request.nonce }); return calcualtedTxHash; @@ -244,18 +237,18 @@ export class StarknetActivities { } } - public async StarknetEstimateFeeAsync(networkName: string, feeRequest: GetFeesRequest): Promise { + public async StarknetEstimateFeeAsync(feeRequest: GetFeesRequest): Promise { try { const network = await this.dbContext.Networks .createQueryBuilder("network") .leftJoinAndSelect("network.nodes", "n") - .where("UPPER(network.name) = UPPER(:nName)", { nName: networkName }) + .where("UPPER(network.name) = UPPER(:nName)", { nName: feeRequest.NetworkName }) .getOneOrFail(); const node = network.nodes.find(n => n.type === NodeType.Primary); if (!node) { - throw new Error(`Primary node not found for network ${networkName}`); + throw new Error(`Primary node not found for network ${feeRequest.NetworkName}`); } const privateKey = await new PrivateKeyRepository().getAsync(feeRequest.FromAddress); @@ -296,19 +289,19 @@ export class StarknetActivities { } } - public async StarknetValidateAddLockSignatureAsync( networkName: string, request: AddLockSignatureRequest): Promise { + public async StarknetValidateAddLockSignatureAsync(request: AddLockSignatureRequest): Promise { try { const network = await this.dbContext.Networks .createQueryBuilder("network") .leftJoinAndSelect("network.nodes", "n") - .where("UPPER(network.name) = UPPER(:nName)", { nName: networkName }) + .where("UPPER(network.name) = UPPER(:nName)", { nName: request.NetworkName }) .getOneOrFail(); const node = network.nodes.find(n => n.type === NodeType.Primary); if (!node) { - throw new Error(`Primary node not found for network ${networkName}`); + throw new Error(`Primary node not found for network ${request.NetworkName}`); } const provider = new RpcProvider({ @@ -362,7 +355,7 @@ export class StarknetActivities { } } - public async StarknetGetSpenderAllowanceAsync(networkName: string ,ownerAddress: string ,spenderAddress: string ,asset: string ): Promise { + public async StarknetGetSpenderAllowanceAsync(request: AllowanceRequest): Promise { try { @@ -370,25 +363,25 @@ export class StarknetActivities { .createQueryBuilder("network") .leftJoinAndSelect("network.nodes", "n") .leftJoinAndSelect("network.tokens", "t") - .where("UPPER(network.name) = UPPER(:nName)", { nName: networkName }) + .where("UPPER(network.name) = UPPER(:nName)", { nName: request.NetworkName }) .getOneOrFail(); const node = network.nodes.find(n => n.type === NodeType.Primary); if (!node) { - throw new Error(`Primary node not found for network ${networkName}`); + throw new Error(`Primary node not found for network ${request.NetworkName}`); } - const token = network.tokens.find(t => t.asset === asset); + const token = network.tokens.find(t => t.asset === request.Asset); if (!token) { - throw new Error(`Token not found for network ${networkName} and asset ${asset}`); + throw new Error(`Token not found for network ${request.NetworkName} and asset ${request.Asset}`); } const provider = new RpcProvider({ nodeUrl: node.url }); const { abi: tokenAbi } = await provider.getClassAt(token.tokenContract); const ercContract = new Contract(tokenAbi, token.tokenContract, provider); - var response: BigInt = await ercContract.allowance(ownerAddress, spenderAddress); + var response: BigInt = await ercContract.allowance(request.OwnerAddress, request.SpenderAddress); return Number(utils.formatUnits(response.toString(), token.decimals)) } diff --git a/js/src/TemporalWorker/Worker.ts b/js/src/TemporalWorker/Worker.ts index ee77321b..212e4a2c 100644 --- a/js/src/TemporalWorker/Worker.ts +++ b/js/src/TemporalWorker/Worker.ts @@ -22,7 +22,7 @@ async function run() { const worker = await Worker.create({ namespace: 'atomic', - taskQueue: 'atomicJs', + taskQueue: 'Starknet', activities: activities, connection, }); diff --git a/js/src/lib/Model/AllowanceModels/AllowanceRequest.ts b/js/src/lib/Model/AllowanceModels/AllowanceRequest.ts new file mode 100644 index 00000000..300edb6a --- /dev/null +++ b/js/src/lib/Model/AllowanceModels/AllowanceRequest.ts @@ -0,0 +1,6 @@ +export interface AllowanceRequest{ + NetworkName: string; + OwnerAddress: string; + SpenderAddress: string; + Asset: string; + } \ No newline at end of file diff --git a/js/src/lib/Model/BalanceRequestModels/BalanceRequest.ts b/js/src/lib/Model/BalanceRequestModels/BalanceRequest.ts new file mode 100644 index 00000000..d841c4fe --- /dev/null +++ b/js/src/lib/Model/BalanceRequestModels/BalanceRequest.ts @@ -0,0 +1,6 @@ +export interface BalanceRequest { + NetworkName: string; + Address: string; + Asset: string; + } + \ No newline at end of file diff --git a/js/src/lib/Model/BalanceRequestModels/SufficientBalanceRequest.ts b/js/src/lib/Model/BalanceRequestModels/SufficientBalanceRequest.ts new file mode 100644 index 00000000..aa0076ca --- /dev/null +++ b/js/src/lib/Model/BalanceRequestModels/SufficientBalanceRequest.ts @@ -0,0 +1,5 @@ +import { BalanceRequest } from "./BalanceRequest"; + +export interface SufficientBalanceRequest extends BalanceRequest { + Amount: number; + } \ No newline at end of file diff --git a/js/src/lib/Model/GetFeesModels/GetFeesRequest.ts b/js/src/lib/Model/GetFeesModels/GetFeesRequest.ts index 3131c3cb..4465647a 100644 --- a/js/src/lib/Model/GetFeesModels/GetFeesRequest.ts +++ b/js/src/lib/Model/GetFeesModels/GetFeesRequest.ts @@ -1,6 +1,7 @@ export interface GetFeesRequest { + NetworkName: string, ToAddress: string, - amount: number, + Amount: number, FromAddress: string, Asset: string, CallData?: string diff --git a/js/src/lib/Model/TransactionBuilderModels/AddLockSignatureRequest.ts b/js/src/lib/Model/TransactionBuilderModels/AddLockSignatureRequest.ts index 34c86644..b7d9e66a 100644 --- a/js/src/lib/Model/TransactionBuilderModels/AddLockSignatureRequest.ts +++ b/js/src/lib/Model/TransactionBuilderModels/AddLockSignatureRequest.ts @@ -1,4 +1,5 @@ export interface AddLockSignatureModel { + NetworkName: string; R?: string; S?: string; V?: string; diff --git a/js/src/lib/Model/TransactionBuilderModels/TransactionBuilderRequest.ts b/js/src/lib/Model/TransactionBuilderModels/TransactionBuilderRequest.ts new file mode 100644 index 00000000..7805623a --- /dev/null +++ b/js/src/lib/Model/TransactionBuilderModels/TransactionBuilderRequest.ts @@ -0,0 +1,7 @@ +import { TransactionType } from "../TransactionTypes/TransactionType"; + +export interface TransactionBuilderRequest { + TransactionType: TransactionType; + NetworkName: string; + Args: string; +} \ No newline at end of file