diff --git a/csharp/src/Workflow.Solana/Helpers/EventDecoder.cs b/csharp/src/Workflow.Solana/Helpers/EventDecoder.cs index c6f5fbdc..a3a5bdfc 100644 --- a/csharp/src/Workflow.Solana/Helpers/EventDecoder.cs +++ b/csharp/src/Workflow.Solana/Helpers/EventDecoder.cs @@ -8,6 +8,7 @@ using Train.Solver.Infrastructure.Abstractions.Models; using Train.Solver.Workflow.Abstractions.Models; using Train.Solver.Workflow.Solana.Programs.HTLCProgram; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram; namespace Train.Solver.Blockchain.Solana.Helpers; @@ -34,9 +35,11 @@ public static async Task GetBlockEventsAsync( { var htlcTokenContractAddress = network.HTLCTokenContractAddress; + var htlcNativeContractAddress = network.HTLCNativeContractAddress; + var trackedBlockEvents = blockResponseResult.Result.Transactions .Where(transaction => transaction.Transaction.Message.Instructions - .Any(instruction => instruction.ProgramId == htlcTokenContractAddress)) + .Any(instruction => instruction.ProgramId == htlcTokenContractAddress || instruction.ProgramId == htlcNativeContractAddress)) .ToList(); foreach (var transaction in trackedBlockEvents) @@ -47,11 +50,15 @@ public static async Task GetBlockEventsAsync( var isLockEvent = transaction.Meta.LogMessages .Any(x => x.Contains(SolanaConstants.HtlcConstants.addLockEventPrefixPattern)); + var contractAddress = transaction.Transaction.Message.Instructions.Any(x => x.ProgramId == htlcTokenContractAddress) ? + htlcTokenContractAddress : + htlcNativeContractAddress; + var accountForSimulation = solverAccounts.First(); if (isCommitEvent) { - var prefixPattern = "Program return: " + htlcTokenContractAddress + " "; + var prefixPattern = "Program return: " + contractAddress + " "; var logResult = transaction.Meta.LogMessages.Where(s => s.StartsWith(prefixPattern)) .Select(s => s.Substring(prefixPattern.Length)) @@ -63,6 +70,7 @@ public static async Task GetBlockEventsAsync( var commitEvent = await DeserializeCommitEventDataAsync( rpcClient, network, + contractAddress, id, accountForSimulation); @@ -106,7 +114,7 @@ public static async Task GetBlockEventsAsync( if (isLockEvent) { - var prefixPattern = "Program return: " + htlcTokenContractAddress + " "; + var prefixPattern = "Program return: " + contractAddress + " "; var logResult = transaction.Meta.LogMessages.Where(s => s.StartsWith(prefixPattern)) .Select(s => s.Substring(prefixPattern.Length)) @@ -118,6 +126,7 @@ public static async Task GetBlockEventsAsync( var addLockMessageResult = await DeserializeAddLockEventDataAsync( rpcClient, network, + contractAddress, id, accountForSimulation); @@ -139,6 +148,7 @@ public static async Task GetBlockEventsAsync( private static async Task DeserializeCommitEventDataAsync( IRpcClient rpcClient, DetailedNetworkDto network, + string contractAddress, string commitId, string solverAccount) { @@ -152,7 +162,7 @@ private static async Task DeserializeCommitEventData .SetFeePayer(new PublicKey(solverAccount)); builder.SetGetDetailsInstruction( - new PublicKey(network.HTLCTokenContractAddress), + new PublicKey(contractAddress), commitId.HexToByteArray()); var latestBlockHashResponse = await rpcClient.GetLatestBlockHashAsync(); @@ -191,6 +201,7 @@ private static async Task DeserializeCommitEventData private static async Task DeserializeAddLockEventDataAsync( IRpcClient rpcClient, DetailedNetworkDto network, + string contractAddress, string commitId, string solverAccount) { @@ -205,10 +216,8 @@ private static async Task DeserializeCommitEventData var builder = new TransactionBuilder() .SetFeePayer(new PublicKey(solverAccount)); - var htlcContractAddress = network.HTLCTokenContractAddress; - builder.SetGetDetailsInstruction( - new PublicKey(htlcContractAddress), + new PublicKey(contractAddress), commitId.HexToByteArray()); var latestBlockHashResponse = await rpcClient.GetLatestBlockHashAsync(); diff --git a/csharp/src/Workflow.Solana/Helpers/SolanaTransactionBuilder.cs b/csharp/src/Workflow.Solana/Helpers/SolanaTransactionBuilder.cs index 2a639d4d..d79c3459 100644 --- a/csharp/src/Workflow.Solana/Helpers/SolanaTransactionBuilder.cs +++ b/csharp/src/Workflow.Solana/Helpers/SolanaTransactionBuilder.cs @@ -14,6 +14,9 @@ using Train.Solver.Workflow.Abstractions.Models; using Train.Solver.Workflow.Solana.Programs.HTLCProgram; using Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSplProgram.Models; namespace Train.Solver.Workflow.Solana.Helpers; @@ -59,18 +62,11 @@ public static async Task BuildHTLCLockTransactionAsync( var builder = new TransactionBuilder() .SetFeePayer(new PublicKey(solverAccount)); - await GetOrCreateAssociatedTokenAccount( - rpcClient, - builder, - currency, - new PublicKey(solverAccount), - new PublicKey(solverAccount)); - if (isNative) { builder.SetSolLockTransactionInstruction( new PublicKey(htlcContractAddress), - new HTLCSplLockRequest + new HTLCSolLockRequest { Id = request.CommitId.HexToByteArray(), Hashlock = request.Hashlock.HexToByteArray(), @@ -88,6 +84,13 @@ await GetOrCreateAssociatedTokenAccount( } else { + await GetOrCreateAssociatedTokenAccount( + rpcClient, + builder, + currency, + new PublicKey(solverAccount), + new PublicKey(solverAccount)); + builder.SetSplLockTransactionInstruction( new PublicKey(htlcContractAddress), new HTLCSplLockRequest @@ -183,27 +186,43 @@ public static async Task BuildHTLCRedeemTransactionAsync( var builder = new TransactionBuilder() .SetFeePayer(new PublicKey(solverAccount)); - await GetOrCreateAssociatedTokenAccount( - rpcClient, - builder, - currency, - new PublicKey(solverAccount), - new PublicKey(solverAccount)); + if (isNative) + { + builder.SetSolRedeemTransactionInstruction( + new PublicKey(htlcContractAddress), + new HTLCSolRedeemRequest + { + Id = request.CommitId.HexToByteArray(), + Secret = BigInteger.Parse(request.Secret).ToHexBigInteger().HexValue.HexToByteArray(), + SignerPublicKey = new PublicKey(solverAccount), + ReceiverPublicKey = new PublicKey(request.DestinationAddress), + SenderPublicKey = new PublicKey(request.SenderAddress), + }); + } + else + { + await GetOrCreateAssociatedTokenAccount( + rpcClient, + builder, + currency, + new PublicKey(solverAccount), + new PublicKey(solverAccount)); - builder.SetRedeemTransactionInstruction( - new PublicKey(htlcContractAddress), - new HTLCRedeemRequest - { - Id = request.CommitId.HexToByteArray(), - Secret = BigInteger.Parse(request.Secret).ToHexBigInteger().HexValue.HexToByteArray(), - SourceTokenPublicKey = new PublicKey(currency.Contract), - SignerPublicKey = new PublicKey(solverAccount), - ReceiverPublicKey = new PublicKey(request.DestinationAddress), - SenderPublicKey = new PublicKey(request.SenderAddress), - RewardPublicKey = request.DestinationAddress == solverAccount ? - new PublicKey(request.DestinationAddress) : - new PublicKey(request.SenderAddress), - }); + builder.SetSplRedeemTransactionInstruction( + new PublicKey(htlcContractAddress), + new HTLCSplRedeemRequest + { + Id = request.CommitId.HexToByteArray(), + Secret = BigInteger.Parse(request.Secret).ToHexBigInteger().HexValue.HexToByteArray(), + SourceTokenPublicKey = new PublicKey(currency.Contract), + SignerPublicKey = new PublicKey(solverAccount), + ReceiverPublicKey = new PublicKey(request.DestinationAddress), + SenderPublicKey = new PublicKey(request.SenderAddress), + RewardPublicKey = request.DestinationAddress == solverAccount ? + new PublicKey(request.DestinationAddress) : + new PublicKey(request.SenderAddress), + }); + } var latestBlockResult = await rpcClient.GetLatestBlockHashAsync(); @@ -268,22 +287,36 @@ public static async Task BuildHTLCRefundTransactionAsync( var builder = new TransactionBuilder() .SetFeePayer(new PublicKey(solverAccount)); - await GetOrCreateAssociatedTokenAccount( - rpcClient, - builder, - currency, - new PublicKey(request.DestinationAddress), - new PublicKey(solverAccount)); + if (isNative) + { + builder.SetSolRefundTransactionInstruction( + new PublicKey(htlcContractAddress), + new HtlcSolRefundRequest + { + Id = request.CommitId.HexToByteArray(), + SignerPublicKey = new PublicKey(solverAccount), + ReceiverPublicKey = new PublicKey(request.DestinationAddress) + }); + } + else + { + await GetOrCreateAssociatedTokenAccount( + rpcClient, + builder, + currency, + new PublicKey(request.DestinationAddress), + new PublicKey(solverAccount)); - builder.SetRefundTransactionInstruction( - new PublicKey(htlcContractAddress), - new HTLCRefundRequest - { - Id = request.CommitId.HexToByteArray(), - SourceTokenPublicKey = new PublicKey(currency.Contract), - SignerPublicKey = new PublicKey(solverAccount), - ReceiverPublicKey = new PublicKey(request.DestinationAddress) - }); + builder.SetSplRefundTransactionInstruction( + new PublicKey(htlcContractAddress), + new HtlcSplRefundRequest + { + Id = request.CommitId.HexToByteArray(), + SourceTokenPublicKey = new PublicKey(currency.Contract), + SignerPublicKey = new PublicKey(solverAccount), + ReceiverPublicKey = new PublicKey(request.DestinationAddress) + }); + } var latestBlockHashResponse = await rpcClient.GetLatestBlockHashAsync(); @@ -422,7 +455,7 @@ public static async Task BuildHTLCAddlockSigTransactionAs builder.SetAddLockSigInstruction( new PublicKey(htlcContractAddress), - new HTLCAddlocksigRequest + new HtlcAddlocksigRequest { AddLockSigMessageRequest = new() { diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSolPdaResponse.cs b/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSolPdaResponse.cs deleted file mode 100644 index 2a698235..00000000 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSolPdaResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Solnet.Wallet; - -namespace Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; - -public class HTLCSolPdaResponse -{ - public required PublicKey HtlcPublicKey { get; set; } = null!; -} diff --git a/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HTLCSolProgram.cs b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HTLCSolProgram.cs new file mode 100644 index 00000000..986c4a42 --- /dev/null +++ b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HTLCSolProgram.cs @@ -0,0 +1,91 @@ +using Solnet.Rpc.Builders; +using Solnet.Wallet; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; + +namespace Train.Solver.Workflow.Solana.Programs.HtlcSolProgram; + +public static class HtlcSolProgram +{ + public static TransactionBuilder SetSolLockTransactionInstruction( + this TransactionBuilder builder, + PublicKey htlcProgramIdKey, + HTLCSolLockRequest htlcLockRequest) + { + var pdaParams = GetSolHtlcPdaParams(htlcLockRequest.Id, htlcProgramIdKey); + + var lockData = new HtlcSolInstructionDataBuilder().CreateSolLockData(htlcLockRequest); + var lockRewardData = new HtlcSolInstructionDataBuilder().CreateLockRewardData(htlcLockRequest); + + builder.AddInstruction(new() + { + ProgramId = htlcProgramIdKey, + Keys = HtlcSolInstructionKeyProvider.CreateSolLockAccountKeys(htlcLockRequest, pdaParams), + Data = lockData + }); + + builder.AddInstruction(new() + { + ProgramId = htlcProgramIdKey, + Keys = HtlcSolInstructionKeyProvider.CreateSolLockRewardAccountKeys(htlcLockRequest, pdaParams), + Data = lockRewardData + }); + return builder; + } + + public static TransactionBuilder SetSolRedeemTransactionInstruction( + this TransactionBuilder builder, + PublicKey htlcProgramIdKey, + HTLCSolRedeemRequest redeemRequest) + { + var pdaParams = GetSolHtlcPdaParams(redeemRequest.Id, htlcProgramIdKey); + + var redeemData = new HtlcSolInstructionDataBuilder().CreateSolRedeemData(redeemRequest); + + builder.AddInstruction(new() + { + ProgramId = htlcProgramIdKey, + Keys = HtlcSolInstructionKeyProvider.CreateSolRedeemAccountKeys(redeemRequest, pdaParams), + Data = redeemData + }); + + return builder; + } + + public static TransactionBuilder SetSolRefundTransactionInstruction( + this TransactionBuilder builder, + PublicKey htlcProgramIdKey, + HtlcSolRefundRequest htlcRefundRequest) + { + var pdaParams = GetSolHtlcPdaParams(htlcRefundRequest.Id, htlcProgramIdKey); + + var refundData = new HtlcSolInstructionDataBuilder().CreateSolRefundData(htlcRefundRequest); + + builder.AddInstruction(new() + { + ProgramId = htlcProgramIdKey, + Keys = HtlcSolInstructionKeyProvider.SetSolRefundAccountKeys(htlcRefundRequest, pdaParams), + Data = refundData + }); + + return builder; + } + + private static HtlcSolPdaResponse GetSolHtlcPdaParams( + byte[] Id, + PublicKey htlcProgramIdKey) + { + var htlc = PublicKey.TryFindProgramAddress( + new List() + { + Id + }, + htlcProgramIdKey, + out PublicKey htlcPubKey, + out _); + + return new() + { + HtlcPublicKey = htlcPubKey + }; + } +} diff --git a/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HtlcSolInstructionDataBuilder.cs b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HtlcSolInstructionDataBuilder.cs new file mode 100644 index 00000000..6001ea15 --- /dev/null +++ b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HtlcSolInstructionDataBuilder.cs @@ -0,0 +1,133 @@ +using Solnet.Programs.Utilities; +using Solnet.Wallet; +using System.Numerics; +using System.Text; +using Train.Solver.Blockchain.Solana.Helpers; +using Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; + +namespace Train.Solver.Workflow.Solana.Programs.HtlcSolProgram; + +public class HtlcSolInstructionDataBuilder +{ + private List Fields { get; set; } = new(); + + private void SetFieldData(string property, int span, Action encoderFunc) + { + Fields.Add(new FieldEncoder.Field + { + Property = property, + Span = span, + EncoderFunc = encoderFunc + }); + } + + public byte[] CreateSolLockData( + HTLCSolLockRequest lockRequest) + { + var destinationAssetData = Encoding.UTF8.GetBytes(lockRequest.DestinationAsset); + var destionationAddressData = Encoding.UTF8.GetBytes(lockRequest.DestinationAddress); + var destinationNetworkData = Encoding.UTF8.GetBytes(lockRequest.DestinationNetwork); + var sourceAssetData = Encoding.UTF8.GetBytes(lockRequest.SourceAsset); + + SetFieldData("id", lockRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + SetFieldData("hashlock", lockRequest.Hashlock.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + SetFieldData("timelock", 8, (v, buf, off) => buf.WriteBigInt((BigInteger)v, off, 8, isUnsigned: true, isBigEndian: false)); + SetFieldData("amount", 8, (v, buf, off) => buf.WriteBigInt((BigInteger)v, off, 8, isUnsigned: true, isBigEndian: false)); + SetFieldData("destinationNetwork", destinationNetworkData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("destinationAddress", destionationAddressData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("destinationAsset", destinationAssetData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("sourceAsset", sourceAssetData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("receiver", 32, (v, buf, off) => buf.WritePubKey((PublicKey)v, off)); + + var instructionExecutionOrder = new Dictionary + { + { "id", lockRequest.Id}, + { "hashlock", lockRequest.Hashlock}, + { "timelock", lockRequest.Timelock}, + { "amount", lockRequest.Amount}, + { "destinationNetwork", destinationNetworkData }, + { "destinationAddress", destionationAddressData }, + { "destinationAsset", destinationAssetData }, + { "sourceAsset", sourceAssetData }, + { "receiver", lockRequest.ReceiverPublicKey }, + }; + + return BuildInstructionData( + instructionExecutionOrder, + FieldEncoder.Sighash(SolanaConstants.LockSighash)); + } + + public byte[] CreateLockRewardData( + HTLCSolLockRequest lockRequest) + { + SetFieldData("id", lockRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + SetFieldData("rewardTimelock", 8, (v, buf, off) => buf.WriteBigInt((BigInteger)v, off, 8, isUnsigned: true, isBigEndian: false)); + SetFieldData("reward", 8, (v, buf, off) => buf.WriteBigInt((BigInteger)v, off, 8, isUnsigned: true, isBigEndian: false)); + + var instructionExecutionOrder = new Dictionary + { + { "id", lockRequest.Id}, + { "rewardTimelock", lockRequest.RewardTimelock}, + { "reward", lockRequest.Reward}, + }; + + return BuildInstructionData( + instructionExecutionOrder, + FieldEncoder.Sighash(SolanaConstants.LockRewardSighash)); + } + + public byte[] CreateSolRedeemData(HTLCSolRedeemRequest redeemRequest) + { + SetFieldData("id", redeemRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + SetFieldData("secret", redeemRequest.Secret.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + + var instructionExecutionOrder = new Dictionary + { + { "id", redeemRequest.Id}, + { "secret", redeemRequest.Secret}, + }; + + return BuildInstructionData( + instructionExecutionOrder, + FieldEncoder.Sighash(SolanaConstants.RedeemSighash)); + } + + public byte[] CreateRefundData( + HtlcSplRefundRequest refundRequest, + HTLCSplPdaResponse htlcPdaResponse) + { + SetFieldData("id", refundRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + SetFieldData("htlcBump", 1, (v, buf, off) => buf.WriteU8((byte)v, off)); + + var instructionExecutionOrder = new Dictionary + { + { "id", refundRequest.Id }, + { "htlcBump", htlcPdaResponse.HtlcBump } + }; + + return BuildInstructionData( + instructionExecutionOrder, + FieldEncoder.Sighash(SolanaConstants.RefundSighash)); + } + + public byte[] CreateSolRefundData(HtlcSolRefundRequest refundRequest) + { + SetFieldData("id", refundRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + + var instructionExecutionOrder = new Dictionary + { + { "id", refundRequest.Id }, + }; + + return BuildInstructionData( + instructionExecutionOrder, + FieldEncoder.Sighash(SolanaConstants.RefundSighash)); + } + + private byte[] BuildInstructionData(Dictionary instructionExecutionOrder, byte[] descriminator) + { + return FieldEncoder.Encode(Fields, instructionExecutionOrder, descriminator); + } +} diff --git a/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HtlcSolInstructionKeyProvider.cs b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HtlcSolInstructionKeyProvider.cs new file mode 100644 index 00000000..4526cf96 --- /dev/null +++ b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/HtlcSolInstructionKeyProvider.cs @@ -0,0 +1,102 @@ +using Solnet.Programs; +using Solnet.Rpc.Models; +using Solnet.Wallet; +using Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; + +namespace Train.Solver.Workflow.Solana.Programs.HtlcSolProgram; + +public static class HtlcSolInstructionKeyProvider +{ + public static List CreateSolLockAccountKeys( + HTLCSolLockRequest htlcLockRequest, + HtlcSolPdaResponse htlcPdaResponse) + { + var keys = new List() + { + AccountMeta.Writable(publicKey: htlcLockRequest.SignerPublicKey, isSigner: true), + AccountMeta.Writable(publicKey: htlcPdaResponse.HtlcPublicKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SystemProgram.ProgramIdKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SysVars.RentKey, isSigner: false) + }; + + return keys; + } + + public static IList CreateSolLockRewardAccountKeys(HTLCSolLockRequest htlcLockRequest, HtlcSolPdaResponse htlcPdaResponse) + { + var keys = new List() + { + AccountMeta.Writable(publicKey: htlcLockRequest.SignerPublicKey, isSigner: true), + AccountMeta.Writable(publicKey: htlcPdaResponse.HtlcPublicKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SystemProgram.ProgramIdKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SysVars.RentKey, isSigner: false) + }; + + return keys; + } + + public static List SetSolRefundAccountKeys( + HtlcSplRefundRequest refundRequest, + HTLCSplPdaResponse htlcPdaResponse) + { + var keys = new List() + { + AccountMeta.Writable(publicKey: refundRequest.SignerPublicKey, isSigner: true), + AccountMeta.Writable(publicKey: htlcPdaResponse.HtlcPublicKey, isSigner: false), + AccountMeta.Writable(publicKey: htlcPdaResponse.HtlcTokenAccount, isSigner: false), + AccountMeta.Writable(publicKey: refundRequest.ReceiverPublicKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: refundRequest.SourceTokenPublicKey, isSigner: false), + AccountMeta.Writable(publicKey: AssociatedTokenAccountProgram.DeriveAssociatedTokenAccount(refundRequest.ReceiverPublicKey, refundRequest.SourceTokenPublicKey), isSigner: false), + AccountMeta.ReadOnly(publicKey: SystemProgram.ProgramIdKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: TokenProgram.ProgramIdKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SysVars.RentKey, isSigner: false) + }; + + return keys; + } + + public static List CreateSolRedeemAccountKeys( + HTLCSolRedeemRequest htlcRedeemRequest, + HtlcSolPdaResponse htlcPdaResponse) + { + var keys = new List() + { + AccountMeta.Writable(publicKey: htlcRedeemRequest.SignerPublicKey, isSigner: true), + AccountMeta.Writable(publicKey: htlcRedeemRequest.SenderPublicKey, isSigner: false), + AccountMeta.Writable(publicKey: htlcRedeemRequest.ReceiverPublicKey, isSigner: false), + AccountMeta.Writable(publicKey: htlcPdaResponse.HtlcPublicKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SystemProgram.ProgramIdKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SysVars.RentKey, isSigner: false) + }; + + return keys; + } + + public static List SetSolRefundAccountKeys( + HtlcSolRefundRequest refundRequest, + HtlcSolPdaResponse htlcPdaResponse) + { + var keys = new List() + { + AccountMeta.Writable(publicKey: refundRequest.SignerPublicKey, isSigner: true), + AccountMeta.Writable(publicKey: htlcPdaResponse.HtlcPublicKey, isSigner: false), + AccountMeta.Writable(publicKey: refundRequest.ReceiverPublicKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SystemProgram.ProgramIdKey, isSigner: false), + AccountMeta.ReadOnly(publicKey: SysVars.RentKey, isSigner: false) + }; + + return keys; + } + + public static List CreateGetDetailsAccountKeys(PublicKey htlcPubKey) + { + var keys = new List + { + AccountMeta.ReadOnly(publicKey: htlcPubKey, isSigner: false) + }; + + return keys; + } +} diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSolLockRequest.cs b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HTLCSolLockRequest.cs similarity index 92% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSolLockRequest.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HTLCSolLockRequest.cs index 3173ec29..e793ad46 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSolLockRequest.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HTLCSolLockRequest.cs @@ -1,7 +1,7 @@ using Solnet.Wallet; using System.Numerics; -namespace Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; +namespace Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; public class HTLCSolLockRequest { @@ -28,4 +28,4 @@ public class HTLCSolLockRequest public required BigInteger Reward { get; set; } public required BigInteger RewardTimelock { get; set; } -} +} \ No newline at end of file diff --git a/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolPdaResponse.cs b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolPdaResponse.cs new file mode 100644 index 00000000..d60cd922 --- /dev/null +++ b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolPdaResponse.cs @@ -0,0 +1,8 @@ +using Solnet.Wallet; + +namespace Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; + +public class HtlcSolPdaResponse +{ + public required PublicKey HtlcPublicKey { get; set; } = null!; +} \ No newline at end of file diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCRedeemRequest.cs b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolRedeemRequest.cs similarity index 57% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCRedeemRequest.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolRedeemRequest.cs index e3b5707c..82292e44 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCRedeemRequest.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolRedeemRequest.cs @@ -1,20 +1,16 @@ using Solnet.Wallet; -namespace Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; +namespace Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; -public class HTLCRedeemRequest +public class HTLCSolRedeemRequest { public byte[] Id { get; set; } = null!; public byte[] Secret { get; set; } = null!; - public PublicKey SourceTokenPublicKey { get; set; } = null!; - public PublicKey ReceiverPublicKey { get; set; } = null!; public PublicKey SignerPublicKey { get; set; } = null!; public PublicKey SenderPublicKey { get; set; } = null!; - - public PublicKey RewardPublicKey { get; set; } = null!; } diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCRefundRequest.cs b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolRefundRequest.cs similarity index 54% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCRefundRequest.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolRefundRequest.cs index dd650dbf..d7cb1279 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCRefundRequest.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSolProgram/Models/HtlcSolRefundRequest.cs @@ -1,14 +1,12 @@ using Solnet.Wallet; -namespace Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; +namespace Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; -public class HTLCRefundRequest +public class HtlcSolRefundRequest { public byte[] Id { get; set; } = null!; public PublicKey SignerPublicKey { get; set; } = null!; public PublicKey ReceiverPublicKey { get; set; } = null!; - - public PublicKey SourceTokenPublicKey { get; set; } = null!; } diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/HTLCProgram.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HTLCSplProgram.cs similarity index 50% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/HTLCProgram.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HTLCSplProgram.cs index 58dafed8..0813cdc0 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/HTLCProgram.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HTLCSplProgram.cs @@ -5,26 +5,27 @@ using Train.Solver.Blockchain.Solana.Programs.HTLCProgram; using Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; using Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSplProgram.Models; namespace Train.Solver.Workflow.Solana.Programs.HTLCProgram; -public static class HTLCProgram +public static class HTLCSplProgram { public static TransactionBuilder SetSplLockTransactionInstruction( this TransactionBuilder builder, PublicKey htlcProgramIdKey, HTLCSplLockRequest htlcLockRequest) { - var htlcPdaParams = GetSPLHtlcPdaParams(htlcLockRequest.Id, htlcProgramIdKey); + var htlcPdaParams = GetSplHtlcPdaParams(htlcLockRequest.Id, htlcProgramIdKey); - var lockData = new HtlcInstructionDataBuilder().CreateLockData(htlcLockRequest); - var lockRewardData = new HtlcInstructionDataBuilder().CreateLockRewardData(htlcLockRequest); + var lockData = new HtlcSplInstructionDataBuilder().CreateSplLockData(htlcLockRequest); + var lockRewardData = new HtlcSplInstructionDataBuilder().CreateLockRewardData(htlcLockRequest); // Add Lock instruction builder.AddInstruction(new() { ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.CreateSplLockAccountKeys(htlcLockRequest, htlcPdaParams), + Keys = HtlcSplInstructionKeyProvider.CreateSplLockAccountKeys(htlcLockRequest, htlcPdaParams), Data = lockData }); @@ -32,71 +33,45 @@ public static TransactionBuilder SetSplLockTransactionInstruction( builder.AddInstruction(new() { ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.CreateLockRewardAccountKeys(htlcLockRequest, htlcPdaParams), + Keys = HtlcSplInstructionKeyProvider.CreateLockRewardAccountKeys(htlcLockRequest, htlcPdaParams), Data = lockRewardData }); return builder; } - public static TransactionBuilder SetSolLockTransactionInstruction( + public static TransactionBuilder SetSplRedeemTransactionInstruction( this TransactionBuilder builder, PublicKey htlcProgramIdKey, - HTLCSolLockRequest htlcLockRequest) + HTLCSplRedeemRequest redeemRequest) { - var pdaParams = GetSolHtlcParams(htlcLockRequest.Id, htlcProgramIdKey); + var pdaParams = GetSplHtlcPdaParams(redeemRequest.Id, htlcProgramIdKey); - var lockData = new HtlcInstructionDataBuilder().CreateLockData(htlcLockRequest); - var lockRewardData = new HtlcInstructionDataBuilder().CreateLockRewardData(htlcLockRequest); + var redeemData = new HtlcSplInstructionDataBuilder().CreateRedeemData(redeemRequest, pdaParams); builder.AddInstruction(new() { ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.CreateSolLockAccountKeys(htlcLockRequest, pdaParams), - Data = lockData - }); - - builder.AddInstruction(new() - { - ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.CreateSolLockRewardAccountKeys(htlcLockRequest, pdaParams), - Data = lockRewardData - }); - return builder; - } - - public static TransactionBuilder SetRedeemTransactionInstruction( - this TransactionBuilder builder, - PublicKey htlcProgramIdKey, - HTLCRedeemRequest redeemRequest) - { - var pdaParams = GetSPLHtlcPdaParams(redeemRequest.Id, htlcProgramIdKey); - - var redeemData = new HtlcInstructionDataBuilder().CreateRedeemData(redeemRequest, pdaParams); - - builder.AddInstruction(new() - { - ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.CreateRedeemAccountKeys(redeemRequest, pdaParams), + Keys = HtlcSplInstructionKeyProvider.CreateRedeemAccountKeys(redeemRequest, pdaParams), Data = redeemData }); return builder; } - - public static TransactionBuilder SetRefundTransactionInstruction( + + public static TransactionBuilder SetSplRefundTransactionInstruction( this TransactionBuilder builder, PublicKey htlcProgramIdKey, - HTLCRefundRequest htlcRefundRequest) + HtlcSplRefundRequest htlcRefundRequest) { - var pdaParams = GetSPLHtlcPdaParams(htlcRefundRequest.Id, htlcProgramIdKey); + var pdaParams = GetSplHtlcPdaParams(htlcRefundRequest.Id, htlcProgramIdKey); - var refundData = new HtlcInstructionDataBuilder().CreateRefundData(htlcRefundRequest, pdaParams); + var refundData = new HtlcSplInstructionDataBuilder().CreateSplRefundData(htlcRefundRequest, pdaParams); builder.AddInstruction(new() { ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.SetRefundAccountKeys(htlcRefundRequest, pdaParams), + Keys = HtlcSplInstructionKeyProvider.SetSplRefundAccountKeys(htlcRefundRequest, pdaParams), Data = refundData }); @@ -106,11 +81,11 @@ public static TransactionBuilder SetRefundTransactionInstruction( public static TransactionBuilder SetAddLockSigInstruction( this TransactionBuilder builder, PublicKey htlcProgramIdKey, - HTLCAddlocksigRequest htlcAddlocksigRequest) + HtlcAddlocksigRequest htlcAddlocksigRequest) { - var pdaParams = GetSPLHtlcPdaParams(htlcAddlocksigRequest.AddLockSigMessageRequest.Id, htlcProgramIdKey); + var pdaParams = GetSplHtlcPdaParams(htlcAddlocksigRequest.AddLockSigMessageRequest.Id, htlcProgramIdKey); var message = Ed25519Program.CreateAddLockSigMessage(htlcAddlocksigRequest.AddLockSigMessageRequest); - var addLockSigData = new HtlcInstructionDataBuilder().CreateAddLockSigData(htlcAddlocksigRequest, pdaParams); + var addLockSigData = new HtlcSplInstructionDataBuilder().CreateAddLockSigData(htlcAddlocksigRequest, pdaParams); builder.CreateEd25519Instruction( htlcAddlocksigRequest.AddLockSigMessageRequest.SignerPublicKey, @@ -120,7 +95,7 @@ public static TransactionBuilder SetAddLockSigInstruction( builder.AddInstruction(new() { ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.CreateAddLockSigAccountKeys(htlcAddlocksigRequest, pdaParams), + Keys = HtlcSplInstructionKeyProvider.CreateAddLockSigAccountKeys(htlcAddlocksigRequest, pdaParams), Data = addLockSigData }); @@ -132,21 +107,21 @@ public static TransactionBuilder SetGetDetailsInstruction( PublicKey htlcProgramIdKey, byte[] id) { - var pdaParams = GetSPLHtlcPdaParams(id, htlcProgramIdKey); + var pdaParams = GetSplHtlcPdaParams(id, htlcProgramIdKey); - var getDetailsData = new HtlcInstructionDataBuilder().CreateGetDetailsData(pdaParams, id); + var getDetailsData = new HtlcSplInstructionDataBuilder().CreateGetDetailsData(pdaParams, id); builder.AddInstruction(new() { ProgramId = htlcProgramIdKey, - Keys = HtlcInstructionKeyProvider.CreateGetDetailsAccountKeys(pdaParams.HtlcPublicKey), + Keys = HtlcSplInstructionKeyProvider.CreateGetDetailsAccountKeys(pdaParams.HtlcPublicKey), Data = getDetailsData }); return builder; } - private static HTLCSplPdaResponse GetSPLHtlcPdaParams( + private static HTLCSplPdaResponse GetSplHtlcPdaParams( byte[] Id, PublicKey htlcProgramIdKey) { @@ -176,23 +151,4 @@ private static HTLCSplPdaResponse GetSPLHtlcPdaParams( HtlcBump = htlcBump }; } - - private static HTLCSolPdaResponse GetSolHtlcParams( - byte[] Id, - PublicKey htlcProgramIdKey) - { - var htlc = PublicKey.TryFindProgramAddress( - new List() - { - Id - }, - htlcProgramIdKey, - out PublicKey htlcPubKey, - out _); - - return new() - { - HtlcPublicKey = htlcPubKey - }; - } } diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/HtlcInstructionDataBuilder.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HtlcSplInstructionDataBuilder.cs similarity index 72% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/HtlcInstructionDataBuilder.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HtlcSplInstructionDataBuilder.cs index 4e93a791..a8618d4e 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/HtlcInstructionDataBuilder.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HtlcSplInstructionDataBuilder.cs @@ -5,10 +5,12 @@ using Train.Solver.Blockchain.Solana.Helpers; using Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; using Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSplProgram.Models; namespace Train.Solver.Blockchain.Solana.Programs.HTLCProgram; -public class HtlcInstructionDataBuilder +public class HtlcSplInstructionDataBuilder { private List Fields { get; set; } = new(); @@ -22,7 +24,7 @@ private void SetFieldData(string property, int span, Action }); } - public byte[] CreateLockData( + public byte[] CreateSplLockData( HTLCSolLockRequest lockRequest) { var destinationAssetData = Encoding.UTF8.GetBytes(lockRequest.DestinationAsset); @@ -58,6 +60,42 @@ public byte[] CreateLockData( FieldEncoder.Sighash(SolanaConstants.LockSighash)); } + public byte[] CreateSolLockData( + HTLCSolLockRequest lockRequest) + { + var destinationAssetData = Encoding.UTF8.GetBytes(lockRequest.DestinationAsset); + var destionationAddressData = Encoding.UTF8.GetBytes(lockRequest.DestinationAddress); + var destinationNetworkData = Encoding.UTF8.GetBytes(lockRequest.DestinationNetwork); + var sourceAssetData = Encoding.UTF8.GetBytes(lockRequest.SourceAsset); + + SetFieldData("id", lockRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + SetFieldData("hashlock", lockRequest.Hashlock.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); + SetFieldData("timelock", 8, (v, buf, off) => buf.WriteBigInt((BigInteger)v, off, 8, isUnsigned: true, isBigEndian: false)); + SetFieldData("amount", 8, (v, buf, off) => buf.WriteBigInt((BigInteger)v, off, 8, isUnsigned: true, isBigEndian: false)); + SetFieldData("destinationNetwork", destinationNetworkData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("destinationAddress", destionationAddressData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("destinationAsset", destinationAssetData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("sourceAsset", sourceAssetData.Length + 4, (v, buf, off) => FieldEncoder.EncodeByteArrayWithLength((byte[])v, buf, ref off)); + SetFieldData("receiver", 32, (v, buf, off) => buf.WritePubKey((PublicKey)v, off)); + + var instructionExecutionOrder = new Dictionary + { + { "id", lockRequest.Id}, + { "hashlock", lockRequest.Hashlock}, + { "timelock", lockRequest.Timelock}, + { "amount", lockRequest.Amount}, + { "destinationNetwork", destinationNetworkData }, + { "destinationAddress", destionationAddressData }, + { "destinationAsset", destinationAssetData }, + { "sourceAsset", sourceAssetData }, + { "receiver", lockRequest.ReceiverPublicKey }, + }; + + return BuildInstructionData( + instructionExecutionOrder, + FieldEncoder.Sighash(SolanaConstants.LockSighash)); + } + public byte[] CreateLockRewardData( HTLCSolLockRequest lockRequest) { @@ -78,7 +116,7 @@ public byte[] CreateLockRewardData( } public byte[] CreateRedeemData( - HTLCRedeemRequest redeemRequest, + HTLCSplRedeemRequest redeemRequest, HTLCSplPdaResponse htlcPdaResponse) { SetFieldData("id", redeemRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); @@ -98,8 +136,8 @@ public byte[] CreateRedeemData( FieldEncoder.Sighash(SolanaConstants.RedeemSighash)); } - public byte[] CreateRefundData( - HTLCRefundRequest refundRequest, + public byte[] CreateSplRefundData( + HtlcSplRefundRequest refundRequest, HTLCSplPdaResponse htlcPdaResponse) { SetFieldData("id", refundRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); @@ -135,7 +173,7 @@ public byte[] CreateGetDetailsData( } public byte[] CreateAddLockSigData( - HTLCAddlocksigRequest addLockSigRequest, + HtlcAddlocksigRequest addLockSigRequest, HTLCSplPdaResponse htlcPdaResponse) { SetFieldData("id", addLockSigRequest.AddLockSigMessageRequest.Id.Length, (v, buf, off) => FieldEncoder.EncodeByteArray((byte[])v, buf, ref off)); diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/HtlcInstructionKeyProvider.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HtlcSplInstructionKeyProvider.cs similarity index 93% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/HtlcInstructionKeyProvider.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HtlcSplInstructionKeyProvider.cs index 87c1fa31..52aecf4a 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/HtlcInstructionKeyProvider.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/HtlcSplInstructionKeyProvider.cs @@ -4,10 +4,12 @@ using Train.Solver.Blockchain.Solana.Helpers; using Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; using Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; +using Train.Solver.Workflow.Solana.Programs.HtlcSplProgram.Models; namespace Train.Solver.Blockchain.Solana.Programs.HTLCProgram; -public static class HtlcInstructionKeyProvider +public static class HtlcSplInstructionKeyProvider { public static List CreateSplLockAccountKeys( HTLCSplLockRequest htlcLockRequest, @@ -30,7 +32,7 @@ public static List CreateSplLockAccountKeys( public static List CreateSolLockAccountKeys( HTLCSolLockRequest htlcLockRequest, - HTLCSolPdaResponse htlcPdaResponse) + HtlcSolPdaResponse htlcPdaResponse) { var keys = new List() { @@ -60,7 +62,7 @@ public static IList CreateLockRewardAccountKeys(HTLCSplLockRequest return keys; } - public static IList CreateSolLockRewardAccountKeys(HTLCSolLockRequest htlcLockRequest, HTLCSolPdaResponse htlcPdaResponse) + public static IList CreateSolLockRewardAccountKeys(HTLCSolLockRequest htlcLockRequest, HtlcSolPdaResponse htlcPdaResponse) { var keys = new List() { @@ -73,8 +75,8 @@ public static IList CreateSolLockRewardAccountKeys(HTLCSolLockReque return keys; } - public static List SetRefundAccountKeys( - HTLCRefundRequest refundRequest, + public static List SetSplRefundAccountKeys( + HtlcSplRefundRequest refundRequest, HTLCSplPdaResponse htlcPdaResponse) { var keys = new List() @@ -94,7 +96,7 @@ public static List SetRefundAccountKeys( } public static List CreateRedeemAccountKeys( - HTLCRedeemRequest htlcRedeemRequest, + HTLCSplRedeemRequest htlcRedeemRequest, HTLCSplPdaResponse htlcPdaResponse) { var keys = new List() @@ -128,7 +130,7 @@ public static List CreateGetDetailsAccountKeys(PublicKey htlcPubKey } public static List CreateAddLockSigAccountKeys( - HTLCAddlocksigRequest hTLCAddlocksigRequest, + HtlcAddlocksigRequest hTLCAddlocksigRequest, HTLCSplPdaResponse htlcPdaResponse) { var keys = new List diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCAddlocksigRequest.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcAddlocksigRequest.cs similarity index 72% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCAddlocksigRequest.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcAddlocksigRequest.cs index e654bb97..7b93bde6 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCAddlocksigRequest.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcAddlocksigRequest.cs @@ -1,9 +1,9 @@ using Solnet.Wallet; using Train.Solver.Blockchain.Solana.Models; -namespace Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; +namespace Train.Solver.Workflow.Solana.Programs.HtlcSplProgram.Models; -public class HTLCAddlocksigRequest +public class HtlcAddlocksigRequest { public SolanaAddLockSigMessageRequest AddLockSigMessageRequest { get; set; } = null!; diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSplLockRequest.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplLockRequest.cs similarity index 76% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSplLockRequest.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplLockRequest.cs index 9927a698..3a56022d 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSplLockRequest.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplLockRequest.cs @@ -1,4 +1,5 @@ using Solnet.Wallet; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; namespace Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; diff --git a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSplPdaResponse.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplPdaResponse.cs similarity index 62% rename from csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSplPdaResponse.cs rename to csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplPdaResponse.cs index 86d0c75e..ac608c5a 100644 --- a/csharp/src/Workflow.Solana/Programs/HTLCProgram/Models/HTLCSplPdaResponse.cs +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplPdaResponse.cs @@ -1,8 +1,9 @@ using Solnet.Wallet; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; namespace Train.Solver.Workflow.Solana.Programs.HTLCProgram.Models; -public class HTLCSplPdaResponse : HTLCSolPdaResponse +public class HTLCSplPdaResponse : HtlcSolPdaResponse { public PublicKey HtlcTokenAccount { get; set; } = null!; diff --git a/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplRedeemRequest.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplRedeemRequest.cs new file mode 100644 index 00000000..a7ab5b32 --- /dev/null +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplRedeemRequest.cs @@ -0,0 +1,13 @@ +using Solnet.Wallet; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; + +namespace Train.Solver.Workflow.Solana.Programs.HtlcSplProgram.Models; + +public class HTLCSplRedeemRequest : HTLCSolRedeemRequest +{ + public PublicKey SourceTokenPublicKey { get; set; } = null!; + + public PublicKey RewardPublicKey { get; set; } = null!; + + public PublicKey ReceiverPublicKey { get; set; } = null!; +} diff --git a/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplRefundRequest.cs b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplRefundRequest.cs new file mode 100644 index 00000000..d1354eb4 --- /dev/null +++ b/csharp/src/Workflow.Solana/Programs/HtlcSplProgram/Models/HtlcSplRefundRequest.cs @@ -0,0 +1,9 @@ +using Solnet.Wallet; +using Train.Solver.Workflow.Solana.Programs.HtlcSolProgram.Models; + +namespace Train.Solver.Blockchain.Solana.Programs.HTLCProgram.Models; + +public class HtlcSplRefundRequest : HtlcSolRefundRequest +{ + public PublicKey SourceTokenPublicKey { get; set; } = null!; +}