public void CanValidateCETSigs() { var offer = Parse <Messages.Offer>("Data/Offer2.json"); var accept = Parse <Messages.Accept>("Data/Accept2.json"); var sign = Parse <Messages.Sign>("Data/Sign2.json"); var funding = Transaction.Parse("02000000000102118df2c93e3be1f05af4fe16ba82eab135ba624bb96db5b218222ad7f99f1c400000000000ffffffff9ff82cc6f2509b2bc9f0d56fa37bea855d40b74cd2633e75ca343469508e892d0000000000ffffffff0372dc010000000000220020a9dbe7e77d7f966d4b8ab36d576e19f4c392caf039ea5e53a0078d771a3e92eefb2a042a01000000160014ec8d64ed4742016d12deac1106577f94747f09f41b5afa2f01000000160014c22a6d286c108ad458ba60e00576859a78ae8de002473044022071e5e088ba8e4434ab044350448479561ad8179bf2a88789a9459215bcf610c80220128535940b083dca52791f373b6474dd24f3a9096c039411943ffcff6fb293a801210333dea605a7d2c223de68c1189bd5e171cb94bd35712122eff08a9cdbed5dca8d02473044022059d6a3ae8cee036998065d2139459a029c4d925f952a860434910b12f9e9a3a002205871d75c28b8486caa90a6d44c3ae59eeb98bbbc90990f5b510466178eb80d9c01210310f8a8f195fe3167af0db8c6bb208e9a8ac075c99276a0150c1d374d0d13d26a00000000", Network.Main); var cet = Transaction.Parse("020000000001016b3ea350dfa327d9c4c030fc3e2e49c04aae28d6020f1624202c57bf620dddbc0000000000feffffff01a08601000000000016001404bea358f0a1c3bdabe6148fd2ea44838110ef830400483045022100c3d1901ae606851946edaaa007cc5ed3ba05a1a812e76d8e4f5a3b034fe11dd4022063d51c44bc8a78ee752e735e3c84be2329e0eb15022db552a1181eaf1edb7dff0147304402205f5ba5027909abef13c61bc604eb2deaf223549213c6c7c9456d972ae1badf800220348bf4918b01bea8ee69d104a60254ad23159654a8f8b31e43da1fc53603c2390147522102d63fec4b8a6705a34b32e5476a5a07c20774fe2abcf88eeea320c9714bc3010e21038b22637639db00f3dd5d8c46644b61954a01362bc92a87eb136bd6ba80c1f12852ae64000000", Network.Main); RemoveSigs(cet); RemoveSigs(funding); foreach (var isInitiator in new[] { true, false }) { var b = new DLCTransactionBuilder(isInitiator, offer, accept, sign, funding, Network.RegTest); var actualCet = b.BuildCET(offer.ContractInfo[1].Outcome); Assert.Equal(cet.ToString(), actualCet.ToString()); Assert.True(b.VerifyRemoteCetSigs(isInitiator ? accept.CetSigs.OutcomeSigs : sign.CetSigs.OutcomeSigs)); Assert.True(b.VerifyRemoteRefundSignature()); b = new DLCTransactionBuilder(isInitiator, offer, accept, sign, Network.RegTest); var actualFunding = b.GetFundingTransaction(); RemoveSigs(actualFunding); Assert.Equal(funding.ToString(), actualFunding.ToString()); } }
public async Task dlc_test() { await foreach (var vector in DLCTestVector.ReadVectors()) { Assert.Equal(vector.ExpectedOfferTLV, Encoders.Hex.EncodeData(vector.Offer.ToTLV())); var accept = new Accept(); accept.TemporaryContractId = vector.Offer.GetTemporaryContractId(); vector.FillFundingInformation(accept, "acceptParams"); accept.PubKeys.FundingKey = vector.AcceptPrivateKey.PubKey; var acceptor = new DLCTransactionBuilder(false, null, null, null, Network.RegTest); acceptor.Accept(vector.Offer, accept.TotalCollateral); Assert.True(acceptor.State.TemporaryContractId); var builtAccept = acceptor.FundAccept(vector.AcceptPrivateKey, accept.CreateSetupPSBT(Network.RegTest)); accept.CetSigs = builtAccept.CetSigs; // this signature is non deterministic... accept.CetSigs.RefundSig = Accept.ParseFromTLV(vector.ExpectedAcceptTLV, Network.RegTest).CetSigs.RefundSig; Assert.Equal(vector.ExpectedAcceptTLV, Encoders.Hex.EncodeData(accept.ToTLV())); var actualFundingTransaction = acceptor.GetFundingTransaction(); var actualRefundTransaction = acceptor.BuildRefund(); var actualCETs = new Transaction[vector.Offer.ContractInfo.Length]; for (int i = 0; i < vector.Offer.ContractInfo.Length; i++) { actualCETs[i] = acceptor.BuildCET(vector.Offer.ContractInfo[i].Outcome); } var offerer = new DLCTransactionBuilder(true, vector.Offer, null, null, Network.RegTest); offerer.Sign1(accept); var fundingPSBT = offerer.GetFundingPSBT(); FillSignatures(fundingPSBT, vector.SignedTxs.FundingTx); var sign = offerer.Sign2(vector.OfferPrivateKey, fundingPSBT); // this signature is non deterministic... sign.CetSigs.RefundSig = Sign.ParseFromTLV(vector.ExpectedSignTLV, Network.RegTest).CetSigs.RefundSig; Assert.Equal(vector.ExpectedSignTLV, Encoders.Hex.EncodeData(sign.ToTLV())); Assert.Equal( RemoveForDebug(vector.UnsignedTxs.FundingTx.ToString()), RemoveForDebug(actualFundingTransaction.ToString())); Assert.Equal( RemoveForDebug(vector.UnsignedTxs.RefundTx.ToString()), RemoveForDebug(actualRefundTransaction.ToString())); for (int i = 0; i < actualCETs.Length; i++) { Assert.Equal( RemoveForDebug(vector.UnsignedTxs.Cets[i].ToString()), RemoveForDebug(actualCETs[i].ToString())); } Assert.NotNull(offerer.State.ContractId); Assert.Equal(offerer.State.ContractId, acceptor.State.ContractId); Assert.False(offerer.State.TemporaryContractId); } }