diff --git a/csharp/src/AdminAPI/Endpoints/NetworkEndpoints.cs b/csharp/src/AdminAPI/Endpoints/NetworkEndpoints.cs index 632631f3..ef945912 100644 --- a/csharp/src/AdminAPI/Endpoints/NetworkEndpoints.cs +++ b/csharp/src/AdminAPI/Endpoints/NetworkEndpoints.cs @@ -2,6 +2,8 @@ using Newtonsoft.Json.Linq; using System.Xml.Linq; using Train.Solver.AdminAPI.Models; +using Train.Solver.Common.Enums; +using Train.Solver.Common.Extensions; using Train.Solver.Data.Abstractions.Entities; using Train.Solver.Data.Abstractions.Repositories; using Train.Solver.Infrastructure.Abstractions.Models; @@ -44,10 +46,10 @@ public static RouteGroupBuilder MapNetworkEndpoints(this RouteGroupBuilder group return group; } - private static async Task GetAllAsync(INetworkRepository repository) + private static async Task GetAllAsync(INetworkRepository repository, NetworkType[]? types) { - var networks = await repository.GetAllAsync(); - return Results.Ok(networks.Select(x=>x.ToDetailedDto())); + var networks = await repository.GetAllAsync(types.IsNullOrEmpty() ? null : types); + return Results.Ok(networks.Select(x => x.ToDetailedDto())); } private static async Task GetAsync( diff --git a/csharp/src/AdminAPI/Endpoints/SwapEndpoints.cs b/csharp/src/AdminAPI/Endpoints/SwapEndpoints.cs index e093237b..d6818e80 100644 --- a/csharp/src/AdminAPI/Endpoints/SwapEndpoints.cs +++ b/csharp/src/AdminAPI/Endpoints/SwapEndpoints.cs @@ -83,6 +83,12 @@ private static async Task RefundAsync( return Results.BadRequest("Swap already refunded"); } + if(swap.Route.SourceToken.Network.Name != request.NetworkName && + swap.Route.DestinationToken.Network.Name != request.NetworkName) + { + return Results.BadRequest("Network name does not match swap source or destination network"); + } + var wallet = await walletRepository.GetAsync(request.Type, request.Address); if (wallet == null) @@ -96,9 +102,9 @@ private static async Task RefundAsync( } var workflowId = await temporalClient.StartWorkflowAsync( - (IRefundWorkflow w) => w.RunAsync(commitId, request.Address, wallet.SignerAgent.Name), + (IRefundWorkflow w) => w.RunAsync(commitId, request.NetworkName, request.Address, wallet.SignerAgent.Name), new(id: TemporalHelper.BuildRefundId(commitId), taskQueue: Constants.CoreTaskQueue)); return Results.Ok(); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/csharp/src/AdminAPI/Models/RefundRequest.cs b/csharp/src/AdminAPI/Models/RefundRequest.cs index 3a44f4bb..3a8427ba 100644 --- a/csharp/src/AdminAPI/Models/RefundRequest.cs +++ b/csharp/src/AdminAPI/Models/RefundRequest.cs @@ -4,6 +4,8 @@ namespace Train.Solver.AdminAPI.Models; public class RefundRequest { + public string NetworkName { get; set; } + public NetworkType Type { get; set; } public string Address { get; set; } diff --git a/csharp/src/Data.Abstractions/Repositories/INetworkRepository.cs b/csharp/src/Data.Abstractions/Repositories/INetworkRepository.cs index d71dfdda..2c39fef7 100644 --- a/csharp/src/Data.Abstractions/Repositories/INetworkRepository.cs +++ b/csharp/src/Data.Abstractions/Repositories/INetworkRepository.cs @@ -9,7 +9,7 @@ public interface INetworkRepository Task GetTokenAsync(string networkName, string symbol); - Task> GetAllAsync(); + Task> GetAllAsync(NetworkType[]? types); Task CreateAsync( string networkName, diff --git a/csharp/src/Data.Npgsql/EFNetworkRepository.cs b/csharp/src/Data.Npgsql/EFNetworkRepository.cs index 3d123257..a6d56d9d 100644 --- a/csharp/src/Data.Npgsql/EFNetworkRepository.cs +++ b/csharp/src/Data.Npgsql/EFNetworkRepository.cs @@ -19,9 +19,10 @@ public class EFNetworkRepository( .FirstOrDefaultAsync(x => x.Name == networkName); } - public async Task> GetAllAsync() + public async Task> GetAllAsync(NetworkType[]? types) { return await dbContext.Networks + .Where(x => types == null || types.Contains(x.Type)) .Include(x => x.Tokens) .ThenInclude(x => x.TokenPrice) .Include(x => x.Nodes) diff --git a/csharp/src/Data.Npgsql/EFSwapRepository.cs b/csharp/src/Data.Npgsql/EFSwapRepository.cs index 48ceb57b..83d9db69 100644 --- a/csharp/src/Data.Npgsql/EFSwapRepository.cs +++ b/csharp/src/Data.Npgsql/EFSwapRepository.cs @@ -142,9 +142,9 @@ private IQueryable GetBaseQuery() => dbContext.Swaps .Include(x => x.Transactions).ThenInclude(x => x.Network.NativeToken!.TokenPrice) .Include(x => x.Route.SourceWallet.SignerAgent) - .Include(x => x.Route.SourceToken.Network) + .Include(x => x.Route.SourceToken.Network.NativeToken) .Include(x => x.Route.SourceToken.TokenPrice) .Include(x => x.Route.DestinationWallet.SignerAgent) - .Include(x => x.Route.DestinationToken.Network) + .Include(x => x.Route.DestinationToken.Network.NativeToken) .Include(x => x.Route.DestinationToken.TokenPrice); } diff --git a/csharp/src/Infrastructure.Abstractions/Models/SwapDto.cs b/csharp/src/Infrastructure.Abstractions/Models/SwapDto.cs index 98f5fdc3..42e565ed 100644 --- a/csharp/src/Infrastructure.Abstractions/Models/SwapDto.cs +++ b/csharp/src/Infrastructure.Abstractions/Models/SwapDto.cs @@ -6,6 +6,8 @@ public class SwapDto { public int Id { get; set; } + public DateTimeOffset Timestamp { get; set; } + public string CommitId { get; set; } = null!; public string Hashlock { get; set; } = null!; diff --git a/csharp/src/Infrastructure/Extensions/MapperExtensions.cs b/csharp/src/Infrastructure/Extensions/MapperExtensions.cs index 1bddff7b..66900211 100644 --- a/csharp/src/Infrastructure/Extensions/MapperExtensions.cs +++ b/csharp/src/Infrastructure/Extensions/MapperExtensions.cs @@ -12,6 +12,7 @@ public static SwapDto ToDto(this Swap swap) { Id = swap.Id, CommitId = swap.CommitId, + Timestamp = swap.CreatedDate, Hashlock = swap.Hashlock, Source = swap.Route.SourceToken.ToWithExtendedNetworkDto(), SourceAmount = BigInteger.Parse(swap.SourceAmount), @@ -36,6 +37,7 @@ public static DetailedSwapDto ToDetailedDto(this Swap swap) { Id = swap.Id, CommitId = swap.CommitId, + Timestamp = swap.CreatedDate, Hashlock = swap.Hashlock, Source = swap.Route.SourceToken.ToWithExtendedNetworkDto(), SourceAmount = BigInteger.Parse(swap.SourceAmount), diff --git a/csharp/src/Workflow.Abstractions/Workflows/IRefundWorkflow.cs b/csharp/src/Workflow.Abstractions/Workflows/IRefundWorkflow.cs index 07fc8f7a..79d92cd6 100644 --- a/csharp/src/Workflow.Abstractions/Workflows/IRefundWorkflow.cs +++ b/csharp/src/Workflow.Abstractions/Workflows/IRefundWorkflow.cs @@ -1,5 +1,4 @@ - -using Temporalio.Workflows; +using Temporalio.Workflows; namespace Train.Solver.Workflow.Abstractions.Workflows; @@ -7,5 +6,5 @@ namespace Train.Solver.Workflow.Abstractions.Workflows; public interface IRefundWorkflow { [WorkflowRun] - Task RunAsync(string commitId, string fromAddress, string signerAgentName); + Task RunAsync(string commitId, string networkName, string fromAddress, string signerAgentName); } \ No newline at end of file diff --git a/csharp/src/Workflow.Common/Helpers/TemporalHelper.cs b/csharp/src/Workflow.Common/Helpers/TemporalHelper.cs index 848db74e..5a6cda60 100644 --- a/csharp/src/Workflow.Common/Helpers/TemporalHelper.cs +++ b/csharp/src/Workflow.Common/Helpers/TemporalHelper.cs @@ -23,9 +23,6 @@ public static async Task ExecuteChildTransactionProcessorWorkflowAsync< return await handle.GetResultAsync().ConfigureAwait(true); } - public static ActivityOptions DefaultActivityOptions(string? summary = null) => - DefaultActivityOptions(null, summary); - public static ActivityOptions DefaultActivityOptions(NetworkType networkType, string? summary = null) => DefaultActivityOptions(networkType.ToString(), summary); diff --git a/csharp/src/Workflow.EVM/Helpers/EVMTransactionBuilder.cs b/csharp/src/Workflow.EVM/Helpers/EVMTransactionBuilder.cs index 157dd8ef..7eb71ba0 100644 --- a/csharp/src/Workflow.EVM/Helpers/EVMTransactionBuilder.cs +++ b/csharp/src/Workflow.EVM/Helpers/EVMTransactionBuilder.cs @@ -31,7 +31,7 @@ public static PrepareTransactionDto BuildApproveTransaction(DetailedNetworkDto n ? network.HTLCNativeContractAddress : network.HTLCTokenContractAddress; - if (currency.Symbol != nativeCurrency.Symbol) + if (!isNative) { var response = new PrepareTransactionDto { diff --git a/csharp/src/Workflow.Swap/Workflows/RefundWorkflow.cs b/csharp/src/Workflow.Swap/Workflows/RefundWorkflow.cs index bb6d9e6a..1367637f 100644 --- a/csharp/src/Workflow.Swap/Workflows/RefundWorkflow.cs +++ b/csharp/src/Workflow.Swap/Workflows/RefundWorkflow.cs @@ -14,16 +14,20 @@ namespace Train.Solver.Workflow.Swap.Workflows; public class RefundWorkflow : IRefundWorkflow { [WorkflowRun] - public async Task RunAsync(string commitId, string fromAddress, string signerAgentName) + public async Task RunAsync(string commitId, string networkName, string fromAddress, string signerAgentName) { var swap = await ExecuteActivityAsync( (ISwapActivities x) => x.GetSwapAsync(commitId), DefaultActivityOptions(Constants.CoreTaskQueue)); var network = await ExecuteActivityAsync( - (INetworkActivities x) => x.GetNetworkAsync(swap.Destination.Network.Name), + (INetworkActivities x) => x.GetNetworkAsync(networkName), DefaultActivityOptions(Constants.CoreTaskQueue)); + var asset = swap.Destination.Network.Name == network.Name + ? swap.Destination.Token.Symbol + : swap.Source.Token.Symbol; + var signerAgent = await ExecuteActivityAsync( (IWalletActivities x) => x.GetSignerAgentAsync(signerAgentName), DefaultActivityOptions(Constants.CoreTaskQueue)); @@ -35,7 +39,7 @@ public async Task RunAsync(string commitId, string fromAddress, string signerAge PrepareArgs = new HTLCRefundTransactionPrepareRequest { CommitId = swap.CommitId, - Asset = swap.Destination.Token.Symbol, + Asset = asset, }.ToJson(), Type = TransactionType.HTLCRefund, Network = network, diff --git a/csharp/src/Workflow.Swap/Workflows/SwapWorkflow.cs b/csharp/src/Workflow.Swap/Workflows/SwapWorkflow.cs index ff5d89b5..5145ec37 100644 --- a/csharp/src/Workflow.Swap/Workflows/SwapWorkflow.cs +++ b/csharp/src/Workflow.Swap/Workflows/SwapWorkflow.cs @@ -188,6 +188,13 @@ await ExecuteTransactionAsync(new TransactionRequest() throw new ApplicationFailureException("Timelock remaining time is less than min acceptable value"); } + var remainingTimePeriodBetweenAddLockSigAndSolverLockInSeconds = _lpTimeLock.ToUnixTimeSeconds() - _htlcAddLockSigMessage.Timelock; + + if (remainingTimePeriodBetweenAddLockSigAndSolverLockInSeconds < _minAcceptableTimelockPeriod.TotalSeconds) + { + throw new ApplicationFailureException("Timelock remaining time is less than solver lock"); + } + await ExecuteTransactionAsync(new TransactionRequest() { PrepareArgs = new AddLockSigTransactionPrepareRequest diff --git a/csharp/src/Workflow.Swap/Workflows/TransactionBuilderWorkflow.cs b/csharp/src/Workflow.Swap/Workflows/TransactionBuilderWorkflow.cs index 7efb97b9..2d311a48 100644 --- a/csharp/src/Workflow.Swap/Workflows/TransactionBuilderWorkflow.cs +++ b/csharp/src/Workflow.Swap/Workflows/TransactionBuilderWorkflow.cs @@ -3,6 +3,7 @@ using Train.Solver.Infrastructure.Abstractions.Models; using Train.Solver.Workflow.Abstractions.Activities; using Train.Solver.Workflow.Abstractions.Models; +using Train.Solver.Workflow.Common; using Train.Solver.Workflow.Common.Helpers; using static Temporalio.Workflows.Workflow; @@ -16,7 +17,7 @@ public async Task RunAsync(PrepareTransactionRequest requ { var network = await ExecuteActivityAsync( (INetworkActivities x) => x.GetNetworkAsync(request.NetworkName), - TemporalHelper.DefaultActivityOptions()); + TemporalHelper.DefaultActivityOptions(Constants.CoreTaskQueue)); var buildTransaction = await ExecuteActivityAsync( (IBlockchainActivities x) => x.BuildTransactionAsync(new() diff --git a/js/src/Blockchain/Blockchain.Abstraction/Models/EventModels/HTLCBlockEventResposne.ts b/js/src/Blockchain/Blockchain.Abstraction/Models/EventModels/HTLCBlockEventResposne.ts index 67015a55..ebee7129 100644 --- a/js/src/Blockchain/Blockchain.Abstraction/Models/EventModels/HTLCBlockEventResposne.ts +++ b/js/src/Blockchain/Blockchain.Abstraction/Models/EventModels/HTLCBlockEventResposne.ts @@ -15,6 +15,7 @@ export interface HTLCCommitEventMessage { destinationNetwork: string; destinationAsset: string; timeLock: number; + tokenContract?: string; } export interface HTLCLockEventMessage { diff --git a/js/src/Blockchain/Blockchain.Fuel/Activities/FuelBlockchainActivities.ts b/js/src/Blockchain/Blockchain.Fuel/Activities/FuelBlockchainActivities.ts index 96bf73a4..944005b0 100644 --- a/js/src/Blockchain/Blockchain.Fuel/Activities/FuelBlockchainActivities.ts +++ b/js/src/Blockchain/Blockchain.Fuel/Activities/FuelBlockchainActivities.ts @@ -5,7 +5,7 @@ import { GetTransactionRequest } from "../../Blockchain.Abstraction/Models/Recei import { TransactionResponse } from "../../Blockchain.Abstraction/Models/ReceiptModels/TransactionResponse"; import { TransactionBuilderRequest } from "../../Blockchain.Abstraction/Models/TransactionBuilderModels/TransactionBuilderRequest"; import { PrepareTransactionResponse } from "../../Blockchain.Abstraction/Models/TransactionBuilderModels/TransferBuilderResponse"; -import { BigNumberCoder, Provider, Wallet, Signer, sha256, DateTime, bn, hashMessage, B256Coder, concat, Address, isTransactionTypeScript, transactionRequestify, ScriptTransactionRequest } from "fuels"; +import { BigNumberCoder, Provider, Wallet, Signer, sha256, DateTime, bn, hashMessage, B256Coder, concat, Address, isTransactionTypeScript, transactionRequestify, ScriptTransactionRequest, AssetId } from "fuels"; import { TransactionStatus } from '../../Blockchain.Abstraction/Models/TransacitonModels/TransactionStatus'; import { TransactionType } from "../../Blockchain.Abstraction/Models/TransacitonModels/TransactionType"; import { IFuelBlockchainActivities } from "./IFuelBlockchainActivities"; @@ -118,7 +118,7 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { return result; } - public async getTransaction(request: GetTransactionRequest): Promise { + public async GetTransaction(request: GetTransactionRequest): Promise { const provider = new Provider(request.network.nodes[0].url); const transaction = await provider.getTransactionResponse(request.transactionHash); @@ -149,7 +149,7 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { return transactionResponse; } - public async publishTransaction(request: FuelPublishTransactionRequest): Promise { + public async PublishTransaction(request: FuelPublishTransactionRequest): Promise { let result: string; try { @@ -183,11 +183,13 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { } } - public async composeRawTransaction(request: FuelComposeTransactionRequest): Promise { + public async ComposeRawTransaction(request: FuelComposeTransactionRequest): Promise { try { const provider = new Provider(request.network.nodes[0].url); const wallet = Wallet.fromAddress(request.fromAddress, provider); const requestData = JSON.parse(request.callData); + const token = request.network.tokens.find(t => t.symbol === request.callDataAsset); + const nativeToken = request.network.nativeToken; const isTxnTypeScript = isTransactionTypeScript(JSON.parse(request.callData)); @@ -196,16 +198,33 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { } const txRequest = ScriptTransactionRequest.from(transactionRequestify(requestData)); + const isNative = token.symbol === nativeToken.symbol; const coinInputs = txRequest.getCoinInputs(); - if (!coinInputs.length) { + if (isNative && coinInputs.length === 0) { + const balance = await wallet.getCoins(await provider.getBaseAssetId()); for (const coin of balance.coins) { txRequest.addCoinInput(coin); } } + else if (!isNative && coinInputs.length === 0) { + const nativeBalance = await wallet.getCoins(await provider.getBaseAssetId()); + + for (const coin of nativeBalance.coins) { + txRequest.addCoinInput(coin); + } + + const assetId: AssetId = new Address(token.contract).toAssetId(); + + const tokenBalance = await wallet.getCoins(assetId.bits); + + for (const coin of tokenBalance.coins) { + txRequest.addCoinInput(coin); + } + } const estimatedDependencies = await wallet.provider.getTransactionCost(txRequest); @@ -213,7 +232,7 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { txRequest.gasLimit = estimatedDependencies.gasUsed; - await this.ensureSufficientBalance( + await this.EnsureSufficientBalance( { network: request.network, rawData: txRequest, @@ -230,17 +249,19 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { if (error.metadata.logs.includes("Not Future Timelock")) { throw new InvalidTimelockException(`Transaction has an invalid timelock`); } + + throw error; } } - private async ensureSufficientBalance(request: FuelSufficientBalanceRequest): Promise { + private async EnsureSufficientBalance(request: FuelSufficientBalanceRequest): Promise { const nativeAssetId = await request.wallet.provider.getBaseAssetId(); const coinInputs = request.rawData.getCoinInputs(); - const nativeBalance = Number( - coinInputs.find(coin => coin.assetId === nativeAssetId).amount - ); + const nativeBalance = coinInputs + .filter(coin => coin.assetId === nativeAssetId) + .reduce((sum, coin) => sum + Number(coin.amount), 0) const maxFee = Number(request.rawData.maxFee); @@ -261,9 +282,9 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { const topkenAssetId = new Address(token.contract).toAssetId().bits; - const tokenAssetBalance = Number( - coinInputs.find(coin => coin.assetId === topkenAssetId).amount - ); + const tokenAssetBalance = coinInputs + .filter(coin => coin.assetId === topkenAssetId) + .reduce((sum, coin) => sum + Number(coin.amount), 0); if (tokenAssetBalance < request.callDataAmount) { throw new Error(`Insufficient balance for ${request.callDataAsset}`); @@ -275,7 +296,7 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { } } - public async signTransaction(request: FuelSignTransactionRequestModel): Promise { + public async SignTransaction(request: FuelSignTransactionRequestModel): Promise { const treasuryClient = new TreasuryClient(request.signerAgentUrl); @@ -284,7 +305,7 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { return response.signedTxn; } - public async getNextNonce(request: NextNonceRequest): Promise { + public async GetNextNonce(request: NextNonceRequest): Promise { const lockKey = buildLockKey(request.network.name, request.address); const nextNonceKey = buildNextNonceKey(request.network.name, request.address); @@ -315,7 +336,7 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { } } - public async checkCurrentNonce(request: CurrentNonceRequest): Promise { + public async CheckCurrentNonce(request: CurrentNonceRequest): Promise { const currentNonceKey = buildCurrentNonceKey(request.network.name, request.address); const cached = await this.redis.get(currentNonceKey); @@ -332,7 +353,7 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { } - public async updateCurrentNonce(request: CurrentNonceRequest): Promise { + public async UpdateCurrentNonce(request: CurrentNonceRequest): Promise { const lockKey = buildLockKey(request.network.name, request.address); const currentNonceKey = buildCurrentNonceKey(request.network.name, request.address); @@ -354,6 +375,6 @@ export class FuelBlockchainActivities implements IFuelBlockchainActivities { } } -export function formatAddress(address: string): string { +export function FormatAddress(address: string): string { return address.toLowerCase(); } diff --git a/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelEventTracker.ts b/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelEventTracker.ts index 1a7120df..0edde747 100644 --- a/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelEventTracker.ts +++ b/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelEventTracker.ts @@ -5,7 +5,7 @@ import { HTLCBlockEventResponse, HTLCCommitEventMessage, HTLCLockEventMessage } import { TokenCommittedEvent } from "../Models/FuelTokenCommitedEvents"; import { TokenLockedEvent } from "../Models/FuelTokenLockedEvent"; import { DetailedNetworkDto } from "../../../Blockchain.Abstraction/Models/DetailedNetworkDto"; -import { formatAddress } from "../FuelBlockchainActivities"; +import { FormatAddress } from "../FuelBlockchainActivities"; import { ethers } from "ethers"; export default async function TrackBlockEventsAsync( @@ -102,8 +102,17 @@ export default async function TrackBlockEventsAsync( const commitId = ensureHexLength(bn(data.Id).toString(16), 32); const receiverAddress = solverAddresses.find( - x => formatAddress(x) === formatAddress(data.srcReceiver.bits) - ); + x => FormatAddress(x) === FormatAddress(data.srcReceiver.bits)); + + if (!receiverAddress) { + continue; + } + + const tokenContract = data.assetId.bits; + + if (!network.tokens.find(x => x.contract === tokenContract)) { + continue; + } const commitMsg: HTLCCommitEventMessage = { txId: transaction.id, @@ -117,10 +126,10 @@ export default async function TrackBlockEventsAsync( destinationNetwork: data.dstChain.trim(), destinationAsset: data.dstAsset.trim(), timeLock: timelock.toUnixSeconds(), + tokenContract: tokenContract }; response.htlcCommitEventMessages.push(commitMsg); - } else if (transactionSelector === tokenLockAddedSelector) { @@ -134,7 +143,7 @@ export default async function TrackBlockEventsAsync( const timelock = DateTime.fromTai64(data.timelock); const hashlock = ensureHexLength(bn(data.hashlock).toString(16), 32) const commitId = ensureHexLength(bn(data.Id).toString(16), 32); - + const lockMsg: HTLCLockEventMessage = { txId: transaction.id, commitId: commitId, diff --git a/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelTransactionBuilder.ts b/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelTransactionBuilder.ts index 7f290978..7c29ca02 100644 --- a/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelTransactionBuilder.ts +++ b/js/src/Blockchain/Blockchain.Fuel/Activities/Helper/FuelTransactionBuilder.ts @@ -5,7 +5,7 @@ import { HTLCRedeemTransactionPrepareRequest } from "../../../Blockchain.Abstrac import { HTLCRefundTransactionPrepareRequest } from "../../../Blockchain.Abstraction/Models/TransactionBuilderModels/HTLCRefundTransactionPrepareRequest"; import { HTLCCommitTransactionPrepareRequest } from "../../../Blockchain.Abstraction/Models/TransactionBuilderModels/HTLCCommitTransactionPrepareRequest"; import { PrepareTransactionResponse } from "../../../Blockchain.Abstraction/Models/TransactionBuilderModels/TransferBuilderResponse"; -import { Address, AssetId, B256Address, bn, Contract, DateTime, formatUnits, Provider, ScriptTransactionRequest, Wallet } from "fuels"; +import { Address, AssetId, bn, Contract, DateTime, Provider, ScriptTransactionRequest, Wallet } from "fuels"; import abi from '../ABIs/train.json'; import { DetailedNetworkDto } from "../../../Blockchain.Abstraction/Models/DetailedNetworkDto"; import { TransferPrepareRequest } from "../../../Blockchain.Abstraction/Models/TransactionBuilderModels/TransferPrepareRequest"; @@ -39,7 +39,7 @@ export async function createRefundCallData(network: DetailedNetworkDto, args: st data: JSON.stringify(txRequest), amount: "0", asset: network.nativeToken.symbol, - callDataAsset: token.symbol, + callDataAsset: network.nativeToken.symbol, callDataAmount: "0", toAddress: htlcContractAddress, }; @@ -68,6 +68,7 @@ export async function createCommitCallData(network: DetailedNetworkDto, args: st const provider = new Provider(network.nodes[0].url); const contractInstance = new Contract(htlcContractAddress, abi, provider); const receiverAddress = { bits: commitRequest.receiver }; + const assetId: AssetId = new Address(token.contract).toAssetId(); const callConfig = contractInstance.functions .commit( @@ -82,7 +83,7 @@ export async function createCommitCallData(network: DetailedNetworkDto, args: st receiverAddress, DateTime.fromUnixSeconds(commitRequest.timelock).toTai64()) .callParams({ - forward: [Number(commitRequest.amount), await provider.getBaseAssetId()] + forward: [Number(commitRequest.amount), assetId.bits] }) .txParams({ maxFee: bn(1000000), @@ -129,7 +130,7 @@ export async function createRedeemCallData(network: DetailedNetworkDto, args: st data: JSON.stringify(txRequest), amount: "0", asset: network.nativeToken.symbol, - callDataAsset: token.symbol, + callDataAsset: network.nativeToken.symbol, callDataAmount: "0", toAddress: htlcContractAddress, }; @@ -154,9 +155,7 @@ export async function createLockCallData(network: DetailedNetworkDto, args: stri const receiverAddress = { bits: lockRequest.receiver }; - const b256: B256Address = token.contract; - const address: Address = Address.fromB256(b256); - const assetId: AssetId = address.toAssetId(); + const assetId: AssetId = new Address(token.contract).toAssetId(); const sendAmount = Number(lockRequest.amount) + Number(lockRequest.reward); const callConfig = contractInstance.functions @@ -225,7 +224,7 @@ export async function createAddLockSigCallData(network: DetailedNetworkDto, args data: JSON.stringify(txRequest), amount: "0", asset: network.nativeToken.symbol, - callDataAsset: token.symbol, + callDataAsset: network.nativeToken.symbol, callDataAmount: "0", toAddress: htlcContractAddress, }; diff --git a/js/src/Blockchain/Blockchain.Fuel/Activities/IFuelBlockchainActivities.ts b/js/src/Blockchain/Blockchain.Fuel/Activities/IFuelBlockchainActivities.ts index 55fcf937..26950591 100644 --- a/js/src/Blockchain/Blockchain.Fuel/Activities/IFuelBlockchainActivities.ts +++ b/js/src/Blockchain/Blockchain.Fuel/Activities/IFuelBlockchainActivities.ts @@ -8,18 +8,18 @@ import { NextNonceRequest } from "../../Blockchain.Abstraction/Models/NonceModel import { CurrentNonceRequest } from "../../Blockchain.Abstraction/Models/NonceModels/CurrentNonceRequest"; export interface IFuelBlockchainActivities extends IBlockchainActivities { - getTransaction(request: GetTransactionRequest): Promise; + GetTransaction(request: GetTransactionRequest): Promise; - publishTransaction(request: FuelPublishTransactionRequest): Promise; + PublishTransaction(request: FuelPublishTransactionRequest): Promise; - composeRawTransaction(request: FuelComposeTransactionRequest): Promise; + ComposeRawTransaction(request: FuelComposeTransactionRequest): Promise; - signTransaction(request: FuelSignTransactionRequestModel): Promise; + SignTransaction(request: FuelSignTransactionRequestModel): Promise; - getNextNonce(request: NextNonceRequest): Promise; + GetNextNonce(request: NextNonceRequest): Promise; - checkCurrentNonce(request: CurrentNonceRequest): Promise; + CheckCurrentNonce(request: CurrentNonceRequest): Promise; - updateCurrentNonce(request: CurrentNonceRequest) : Promise; + UpdateCurrentNonce(request: CurrentNonceRequest) : Promise; } \ No newline at end of file diff --git a/js/src/Blockchain/Blockchain.Fuel/Activities/Models/FuelTokenCommitedEvents.ts b/js/src/Blockchain/Blockchain.Fuel/Activities/Models/FuelTokenCommitedEvents.ts index e6bca6cb..4f0315f5 100644 --- a/js/src/Blockchain/Blockchain.Fuel/Activities/Models/FuelTokenCommitedEvents.ts +++ b/js/src/Blockchain/Blockchain.Fuel/Activities/Models/FuelTokenCommitedEvents.ts @@ -1,17 +1,16 @@ export interface TokenCommittedEvent { - Id: string; - dstChain: string; - dstAddress: string; - dstAsset: string; - srcAsset: string; - amount: string; - timelock: string; - srcReceiver: AddressBits; - sender: AddressBits; - } + Id: string; + dstChain: string; + dstAddress: string; + dstAsset: string; + srcAsset: string; + amount: string; + timelock: string; + srcReceiver: AddressBits; + sender: AddressBits; + assetId: AddressBits; +} - interface AddressBits{ - bits: string; - } - - \ No newline at end of file +interface AddressBits { + bits: string; +} diff --git a/js/src/Blockchain/Blockchain.Fuel/Workflows/FuelTransactionProcessor.ts b/js/src/Blockchain/Blockchain.Fuel/Workflows/FuelTransactionProcessor.ts index c65d8fdc..eba3cc9c 100644 --- a/js/src/Blockchain/Blockchain.Fuel/Workflows/FuelTransactionProcessor.ts +++ b/js/src/Blockchain/Blockchain.Fuel/Workflows/FuelTransactionProcessor.ts @@ -35,14 +35,14 @@ export async function FuelTransactionProcessor( context: TransactionExecutionContext ): Promise { - const nextNonce = await defaultActivities.getNextNonce({ + const nextNonce = await defaultActivities.GetNextNonce({ address: request.fromAddress, network: request.network }); try { - await defaultActivities.checkCurrentNonce( + await defaultActivities.CheckCurrentNonce( { address: request.fromAddress, network: request.network, @@ -57,7 +57,7 @@ export async function FuelTransactionProcessor( type: request.type, }); - const rawTx = await nonRetryableActivities.composeRawTransaction({ + const rawTx = await nonRetryableActivities.ComposeRawTransaction({ network: request.network, fromAddress: request.fromAddress, callData: preparedTransaction.data, @@ -65,7 +65,7 @@ export async function FuelTransactionProcessor( callDataAmount: Number(preparedTransaction.callDataAmount), }); - const signedRawData = await defaultActivities.signTransaction( + const signedRawData = await defaultActivities.SignTransaction( { signerAgentUrl: request.signerAgentUrl, networkType: NetworkType[request.network.type], @@ -78,12 +78,12 @@ export async function FuelTransactionProcessor( ); // sign transaction - const publishedTransaction = await nonRetryableActivities.publishTransaction({ + const publishedTransaction = await nonRetryableActivities.PublishTransaction({ network: request.network, signedRawData: signedRawData }); - const transactionResponse = await defaultActivities.getTransaction({ + const transactionResponse = await defaultActivities.GetTransaction({ network: request.network, transactionHash: publishedTransaction, }); @@ -91,7 +91,7 @@ export async function FuelTransactionProcessor( transactionResponse.asset = preparedTransaction.callDataAsset; transactionResponse.amount = preparedTransaction.callDataAmount.toString(); - await defaultActivities.updateCurrentNonce( + await defaultActivities.UpdateCurrentNonce( { address: request.fromAddress, network: request.network, @@ -104,7 +104,7 @@ export async function FuelTransactionProcessor( } catch (error) { - await defaultActivities.updateCurrentNonce( + await defaultActivities.UpdateCurrentNonce( { address: request.fromAddress, network: request.network,